From a21992e0cb715d16396f88d09dfc8ac737a94477 Mon Sep 17 00:00:00 2001 From: karubabu Date: Tue, 24 Mar 2020 07:27:26 +0900 Subject: [PATCH] Add callbacks for clipboard access. --- libskk/context.vala | 24 +++++++++ libskk/state.vala | 22 ++++++++ tests/basic.c | 53 +++++++++++++++++++ .../rules/test-selection/keymap/default.json | 12 +++++ .../keymap/hankaku-katakana.json | 10 ++++ .../rules/test-selection/keymap/hiragana.json | 11 ++++ .../rules/test-selection/keymap/katakana.json | 10 ++++ tests/rules/test-selection/keymap/latin.json | 5 ++ .../test-selection/keymap/wide-latin.json | 5 ++ tests/rules/test-selection/metadata.json | 4 ++ .../test-selection/rom-kana/default.json | 3 ++ 11 files changed, 159 insertions(+) create mode 100644 tests/rules/test-selection/keymap/default.json create mode 100644 tests/rules/test-selection/keymap/hankaku-katakana.json create mode 100644 tests/rules/test-selection/keymap/hiragana.json create mode 100644 tests/rules/test-selection/keymap/katakana.json create mode 100644 tests/rules/test-selection/keymap/latin.json create mode 100644 tests/rules/test-selection/keymap/wide-latin.json create mode 100644 tests/rules/test-selection/metadata.json create mode 100644 tests/rules/test-selection/rom-kana/default.json diff --git a/libskk/context.vala b/libskk/context.vala index 3d0009ca..7f6328a3 100644 --- a/libskk/context.vala +++ b/libskk/context.vala @@ -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); @@ -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) { @@ -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); } /** @@ -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) { diff --git a/libskk/state.vala b/libskk/state.vala index 1788951c..b2f07b5f 100644 --- a/libskk/state.vala +++ b/libskk/state.vala @@ -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 (); @@ -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; @@ -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 (); @@ -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: @@ -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); @@ -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); diff --git a/tests/basic.c b/tests/basic.c index 421a7ec5..d17b464d 100644 --- a/tests/basic.c +++ b/tests/basic.c @@ -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; @@ -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); diff --git a/tests/rules/test-selection/keymap/default.json b/tests/rules/test-selection/keymap/default.json new file mode 100644 index 00000000..e8593262 --- /dev/null +++ b/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" + } + } +} diff --git a/tests/rules/test-selection/keymap/hankaku-katakana.json b/tests/rules/test-selection/keymap/hankaku-katakana.json new file mode 100644 index 00000000..e2a65cac --- /dev/null +++ b/tests/rules/test-selection/keymap/hankaku-katakana.json @@ -0,0 +1,10 @@ +{ + "include": [ + "default" + ], + "define": { + "keymap": { + "Q": "start-preedit" + } + } +} diff --git a/tests/rules/test-selection/keymap/hiragana.json b/tests/rules/test-selection/keymap/hiragana.json new file mode 100644 index 00000000..19eaa0cd --- /dev/null +++ b/tests/rules/test-selection/keymap/hiragana.json @@ -0,0 +1,11 @@ +{ + "include": [ + "default" + ], + "define": { + "keymap": { + "Q": "start-preedit", + "C-j": "commit" + } + } +} diff --git a/tests/rules/test-selection/keymap/katakana.json b/tests/rules/test-selection/keymap/katakana.json new file mode 100644 index 00000000..e2a65cac --- /dev/null +++ b/tests/rules/test-selection/keymap/katakana.json @@ -0,0 +1,10 @@ +{ + "include": [ + "default" + ], + "define": { + "keymap": { + "Q": "start-preedit" + } + } +} diff --git a/tests/rules/test-selection/keymap/latin.json b/tests/rules/test-selection/keymap/latin.json new file mode 100644 index 00000000..096ffe43 --- /dev/null +++ b/tests/rules/test-selection/keymap/latin.json @@ -0,0 +1,5 @@ +{ + "include": [ + "default" + ] +} diff --git a/tests/rules/test-selection/keymap/wide-latin.json b/tests/rules/test-selection/keymap/wide-latin.json new file mode 100644 index 00000000..096ffe43 --- /dev/null +++ b/tests/rules/test-selection/keymap/wide-latin.json @@ -0,0 +1,5 @@ +{ + "include": [ + "default" + ] +} diff --git a/tests/rules/test-selection/metadata.json b/tests/rules/test-selection/metadata.json new file mode 100644 index 00000000..4b0a8945 --- /dev/null +++ b/tests/rules/test-selection/metadata.json @@ -0,0 +1,4 @@ +{ + "name": "request_selection_text signal test rule", + "description": "Test case for selection signal." +} diff --git a/tests/rules/test-selection/rom-kana/default.json b/tests/rules/test-selection/rom-kana/default.json new file mode 100644 index 00000000..73c8ac69 --- /dev/null +++ b/tests/rules/test-selection/rom-kana/default.json @@ -0,0 +1,3 @@ +{ + "include": ["default/default"] +}