Skip to content

Commit

Permalink
Add callbacks for clipboard access.
Browse files Browse the repository at this point in the history
  • Loading branch information
karubabu committed May 2, 2020
1 parent a910ccd commit 9231259
Show file tree
Hide file tree
Showing 11 changed files with 159 additions and 0 deletions.
24 changes: 24 additions & 0 deletions libskk/context.vala
Expand Up @@ -265,6 +265,10 @@ namespace Skk {
return delete_surrounding_text (offset, nchars);
}

void request_selection_text_cb () {
request_selection_text ();
}

void connect_state_signals (State state) {
state.recursive_edit_start.connect (start_dict_edit);
state.recursive_edit_end.connect (end_dict_edit);
Expand All @@ -274,6 +278,8 @@ namespace Skk {
retrieve_surrounding_text_cb);
state.delete_surrounding_text.connect (
delete_surrounding_text_cb);
state.request_selection_text.connect (
request_selection_text_cb);
}

void disconnect_state_signals (State state) {
Expand All @@ -285,6 +291,8 @@ namespace Skk {
retrieve_surrounding_text_cb);
state.delete_surrounding_text.disconnect (
delete_surrounding_text_cb);
state.request_selection_text.disconnect (
request_selection_text_cb);
}

/**
Expand All @@ -310,6 +318,22 @@ namespace Skk {
public signal bool delete_surrounding_text (int offset,
uint nchars);

public signal void request_selection_text ();

/**
* Set the current selection text.
*
* @param text selection text
*/
public void set_selection_text (string? text) {
var state = state_stack.peek_head ();

if (text == null)
state.selection.erase();
else
state.selection.assign(text);
}

bool select_candidate_in_dictionaries (Candidate candidate) {
bool changed = false;
foreach (var dict in dictionaries) {
Expand Down
22 changes: 22 additions & 0 deletions libskk/state.vala
Expand Up @@ -68,6 +68,7 @@ namespace Skk {
// Used by Context for dict edit.
internal string midasi;

internal StringBuilder selection = new StringBuilder ();
internal StringBuilder output = new StringBuilder ();
internal StringBuilder abbrev = new StringBuilder ();
internal StringBuilder kuten = new StringBuilder ();
Expand Down Expand Up @@ -195,6 +196,7 @@ namespace Skk {
candidates.clear ();
abbrev.erase ();
kuten.erase ();
selection.erase();
auto_start_henkan_keyword = null;
surrounding_text = null;
surrounding_end = 0;
Expand Down Expand Up @@ -371,6 +373,7 @@ namespace Skk {
out uint cursor_pos);
internal signal bool delete_surrounding_text (int offset,
uint nchars);
public signal void request_selection_text ();

internal string get_yomi () {
StringBuilder builder = new StringBuilder ();
Expand Down Expand Up @@ -515,6 +518,13 @@ namespace Skk {
return false;
}

if (command == "register") {
state.request_selection_text();
state.output.append(state.selection.str);
state.selection.erase();
return true;
}

switch (state.input_mode) {
case InputMode.HIRAGANA:
case InputMode.KATAKANA:
Expand Down Expand Up @@ -718,6 +728,12 @@ namespace Skk {
state.reset ();
return state.egg_like_newline;
}
else if (command == "register") {
state.request_selection_text();
state.abbrev.append(state.selection.str);
state.selection.erase();
return true;
}
else if (key.modifiers == 0 &&
0x20 <= key.code && key.code <= 0x7E) {
state.abbrev.append_unichar (key.code);
Expand Down Expand Up @@ -895,6 +911,12 @@ namespace Skk {
return true;
}
}
else if (command == "register") {
state.request_selection_text();
state.rom_kana_converter.output += state.selection.str;
state.selection.erase();
return true;
}

unichar lower_code;
bool is_upper = state.isupper (key, out lower_code);
Expand Down
53 changes: 53 additions & 0 deletions tests/basic.c
Expand Up @@ -396,6 +396,58 @@ surrounding (void) {
destroy_context (context);
}

static void
request_selection_text_cb (SkkContext* self,
gpointer user_data)
{
skk_context_set_selection_text(self, "test message");
}

static void
selection (void) {
SkkContext *context = create_context (TRUE, TRUE);
g_signal_connect (context, "request-selection-text",
G_CALLBACK (request_selection_text_cb), NULL);
const gchar *preedit;
GError *error;
SkkRule *rule;
error = NULL;
SkkTransition transitions[] = {
{ SKK_INPUT_MODE_HIRAGANA, "/ C-y", "▽test message", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "/ C-y C-g", "", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "/ C-y C-j", "", "test message", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "/ t e s t t e x t SPC C-y", "▼testtext【test message】", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "/ t e s t t e x t SPC C-y C-g", "▽testtext", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "/ t e s t t e x t SPC C-y C-j", "", "test message", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "/ t e s t t e x t SPC C-y C-m", "", "test message", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "A a a a SPC C-y", "▼ああああ【test message】", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_KATAKANA, "A a a a SPC C-y", "▼アアアア【test message】", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HANKAKU_KATAKANA, "A a a a SPC C-y", "▼アアアア【test message】", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "A a a a SPC C-y C-m", "", "test message", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "A a a a SPC C-y RET", "", "test message", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_KATAKANA, "A a a a SPC C-y C-m", "", "test message", SKK_INPUT_MODE_KATAKANA },
{ SKK_INPUT_MODE_KATAKANA, "A a a a SPC C-y RET", "", "test message", SKK_INPUT_MODE_KATAKANA },
{ SKK_INPUT_MODE_HANKAKU_KATAKANA, "A a a a SPC C-y C-m", "", "test message", SKK_INPUT_MODE_HANKAKU_KATAKANA },
{ SKK_INPUT_MODE_HANKAKU_KATAKANA, "A a a a SPC C-y RET", "", "test message", SKK_INPUT_MODE_HANKAKU_KATAKANA },
{ SKK_INPUT_MODE_HIRAGANA, "C-y", "", "test message", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_HIRAGANA, "Q C-y", "▽test message", "", SKK_INPUT_MODE_HIRAGANA },
{ SKK_INPUT_MODE_KATAKANA, "C-y", "", "test message", SKK_INPUT_MODE_KATAKANA },
{ SKK_INPUT_MODE_KATAKANA, "Q C-y", "▽test message", "", SKK_INPUT_MODE_KATAKANA },
{ SKK_INPUT_MODE_HANKAKU_KATAKANA, "C-y", "", "test message", SKK_INPUT_MODE_HANKAKU_KATAKANA },
{ SKK_INPUT_MODE_HANKAKU_KATAKANA, "Q C-y", "▽test message", "", SKK_INPUT_MODE_HANKAKU_KATAKANA },
{ SKK_INPUT_MODE_LATIN, "C-y", "", "test message", SKK_INPUT_MODE_LATIN },
{ SKK_INPUT_MODE_WIDE_LATIN, "C-y", "", "test message", SKK_INPUT_MODE_WIDE_LATIN },
{ 0, NULL }
};

rule = skk_rule_new ("test-selection", &error);
g_assert_no_error(error);
skk_context_set_typing_rule(context, rule);
g_object_unref(rule);
check_transitions (context, transitions);
destroy_context(context);
}

static void
start_preedit_no_delete (void) {
SkkContext *context;
Expand Down Expand Up @@ -552,6 +604,7 @@ main (int argc, char **argv) {
context_setup, test_transitions, context_teardown);
g_test_add_func ("/libskk/candidate-list", candidate_list);
g_test_add_func ("/libskk/surrounding", surrounding);
g_test_add_func ("/libskk/selection", selection);
g_test_add_func ("/libskk/start_preedit_no_delete", start_preedit_no_delete);
g_test_add_func ("/libskk/inherit_typing_rule_for_dict_edit", inherit_typing_rule_for_dict_edit);
g_test_add_func ("/libskk/abort_to_latin_commands", abort_to_latin_commands);
Expand Down
12 changes: 12 additions & 0 deletions tests/rules/test-selection/keymap/default.json
@@ -0,0 +1,12 @@
{
"define": {
"keymap": {
"C-g": "abort",
"\n": "commit-unhandled",
"C-m": "commit-unhandled",
"C-y": "register",
" ": "next-candidate",
"/": "abbrev"
}
}
}
10 changes: 10 additions & 0 deletions tests/rules/test-selection/keymap/hankaku-katakana.json
@@ -0,0 +1,10 @@
{
"include": [
"default"
],
"define": {
"keymap": {
"Q": "start-preedit"
}
}
}
11 changes: 11 additions & 0 deletions tests/rules/test-selection/keymap/hiragana.json
@@ -0,0 +1,11 @@
{
"include": [
"default"
],
"define": {
"keymap": {
"Q": "start-preedit",
"C-j": "commit"
}
}
}
10 changes: 10 additions & 0 deletions tests/rules/test-selection/keymap/katakana.json
@@ -0,0 +1,10 @@
{
"include": [
"default"
],
"define": {
"keymap": {
"Q": "start-preedit"
}
}
}
5 changes: 5 additions & 0 deletions tests/rules/test-selection/keymap/latin.json
@@ -0,0 +1,5 @@
{
"include": [
"default"
]
}
5 changes: 5 additions & 0 deletions tests/rules/test-selection/keymap/wide-latin.json
@@ -0,0 +1,5 @@
{
"include": [
"default"
]
}
4 changes: 4 additions & 0 deletions tests/rules/test-selection/metadata.json
@@ -0,0 +1,4 @@
{
"name": "request_selection_text signal test rule",
"description": "Test case for selection signal."
}
3 changes: 3 additions & 0 deletions tests/rules/test-selection/rom-kana/default.json
@@ -0,0 +1,3 @@
{
"include": ["default/default"]
}

0 comments on commit 9231259

Please sign in to comment.