From 7650080736931ab178aebed8e2c9bf133f08ab56 Mon Sep 17 00:00:00 2001 From: fujiwarat Date: Thu, 9 Nov 2023 10:08:59 +0900 Subject: [PATCH] src: Add DeleteSurroundingText to PostProcessKeyEvent DeleteSurroundingText also can be delayed sending to IBus clients. Now surrounding D-Bus methods are added to PostProcessKeyEvent. Fixes: https://github.com/ibus/ibus/commit/38f09c6 BUG=https://github.com/ibus/ibus/issues/2570 --- bus/inputcontext.c | 33 +++++++++++++++++++++++++++++++-- src/ibusinputcontext.c | 23 +++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/bus/inputcontext.c b/bus/inputcontext.c index aecc64f85..64430fe4a 100644 --- a/bus/inputcontext.c +++ b/bus/inputcontext.c @@ -2382,7 +2382,7 @@ _engine_forward_key_event_cb (BusEngineProxy *engine, g_assert (context->queue_during_process_key_event); if (context->processing_key_event && g_queue_get_length ( - context->queue_during_process_key_event) <= MAX_SYNC_DATA) { + context->queue_during_process_key_event) <= MAX_SYNC_DATA) { SyncForwardingData *data; IBusText *text = ibus_text_new_from_printf ("%u,%u,%u", keyval, keycode, state); @@ -2420,6 +2420,21 @@ _engine_delete_surrounding_text_cb (BusEngineProxy *engine, g_assert (context->engine == engine); + if (context->processing_key_event && g_queue_get_length ( + context->queue_during_process_key_event) <= MAX_SYNC_DATA) { + SyncForwardingData *data; + IBusText *text = ibus_text_new_from_printf ("%d,%u", + offset_from_cursor, nchars); + if (g_queue_get_length (context->queue_during_process_key_event) + == MAX_SYNC_DATA) { + g_warning ("Exceed max number of sync process_key_event data"); + } + data = g_slice_new (SyncForwardingData); + data->key = 'd'; + data->text = g_object_ref (text); + g_queue_push_tail (context->queue_during_process_key_event, data); + return; + } bus_input_context_emit_signal (context, "DeleteSurroundingText", g_variant_new ("(iu)", @@ -2442,6 +2457,20 @@ _engine_require_surrounding_text_cb (BusEngineProxy *engine, g_assert (context->engine == engine); + if (context->processing_key_event && g_queue_get_length ( + context->queue_during_process_key_event) <= MAX_SYNC_DATA) { + SyncForwardingData *data; + IBusText *text = ibus_text_new_from_static_string (""); + if (g_queue_get_length (context->queue_during_process_key_event) + == MAX_SYNC_DATA) { + g_warning ("Exceed max number of post process_key_event data"); + } + data = g_slice_new (SyncForwardingData); + data->key = 'r'; + data->text = text; + g_queue_push_tail (context->queue_during_process_key_event, data); + return; + } bus_input_context_emit_signal (context, "RequireSurroundingText", NULL, @@ -3158,7 +3187,7 @@ bus_input_context_commit_text_use_extension (BusInputContext *context, if (use_extension && context->emoji_extension) { bus_panel_proxy_commit_text_received (context->emoji_extension, text); } else if (context->processing_key_event && g_queue_get_length ( - context->queue_during_process_key_event) <= MAX_SYNC_DATA) { + context->queue_during_process_key_event) <= MAX_SYNC_DATA) { SyncForwardingData *data; if (g_queue_get_length (context->queue_during_process_key_event) == MAX_SYNC_DATA) { diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c index def23b258..c6a030fec 100644 --- a/src/ibusinputcontext.c +++ b/src/ibusinputcontext.c @@ -1406,6 +1406,7 @@ ibus_input_context_set_post_process_key_event (IBusInputContext *context, void ibus_input_context_post_process_key_event (IBusInputContext *context) { + IBusInputContextPrivate *priv; GVariant *cached_var_post; gboolean enable = FALSE; GVariant *result; @@ -1418,6 +1419,7 @@ ibus_input_context_post_process_key_event (IBusInputContext *context) g_assert (IBUS_IS_INPUT_CONTEXT (context)); + priv = IBUS_INPUT_CONTEXT_GET_PRIVATE (IBUS_INPUT_CONTEXT (context)); cached_var_post = g_dbus_proxy_get_cached_property ((GDBusProxy *)context, "EffectivePostProcessKeyEvent"); @@ -1479,6 +1481,27 @@ ibus_input_context_post_process_key_event (IBusInputContext *context) state | IBUS_FORWARD_MASK); break; } + case 'r': { + priv->needs_surrounding_text = TRUE; + g_signal_emit (context, + context_signals[REQUIRE_SURROUNDING_TEXT], 0); + break; + } + case 'd': { + gchar **array = NULL; + gint offset_from_cursor; + guint nchars; + array = g_strsplit (text->text, ",", -1); + offset_from_cursor = g_ascii_strtoll (array[0], NULL, 10); + nchars = g_ascii_strtoull (array[1], NULL, 10); + g_strfreev (array); + g_signal_emit (context, + context_signals[DELETE_SURROUNDING_TEXT], + 0, + offset_from_cursor, + nchars); + break; + } default: g_warning ("%s: Type '%c' is not supported.", G_STRFUNC, type); }