Skip to content

Commit

Permalink
src: Add DeleteSurroundingText to PostProcessKeyEvent
Browse files Browse the repository at this point in the history
DeleteSurroundingText also can be delayed sending to IBus clients.
Now surrounding D-Bus methods are added to PostProcessKeyEvent.

Fixes: 38f09c6

BUG=#2570
  • Loading branch information
fujiwarat committed Nov 9, 2023
1 parent 197dba7 commit 7650080
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 2 deletions.
33 changes: 31 additions & 2 deletions bus/inputcontext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)",
Expand All @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down
23 changes: 23 additions & 0 deletions src/ibusinputcontext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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");
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 7650080

Please sign in to comment.