From aa8a6c3f8a2969735978254d2b3cfe986a08bc25 Mon Sep 17 00:00:00 2001 From: Takao Fujiwara Date: Wed, 12 Jul 2023 09:29:03 +0900 Subject: [PATCH] Fix sync ibus_input_context_process_key_event() #3 --- ibus-HEAD.patch | 1691 +++++++++++++++++++++++++++-------------------- ibus.spec | 5 +- 2 files changed, 967 insertions(+), 729 deletions(-) diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch index fcbc386..8953954 100644 --- a/ibus-HEAD.patch +++ b/ibus-HEAD.patch @@ -2336,43 +2336,20 @@ index 68dde2f3..fee0b3ee 100644 -- 2.41.0 -From a73ea2c335145cd5d00ebfade83204d055aa268c Mon Sep 17 00:00:00 2001 +From 139e0be07bfbc96d5ff95e5f5ebd760fbc7d94c0 Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Sun, 9 Jul 2023 18:46:21 +0900 -Subject: [PATCH 1/2] src: Fix sync ibus_input_context_process_key_event() +Date: Wed, 12 Jul 2023 07:39:27 +0900 +Subject: [PATCH 1/3] bus: Apply code style to inputcontext.c -The synchronous "ProcessKeyEvent" D-Bus method cannot receive -"CommitText" and "ForwardKeyEvent" D-Bus signals during calling the method. -To resolve the issue, now -ibus_input_context_set_post_process_key_event() and -ibus_input_context_post_process_key_event() are added newly. - -ibus_input_context_post_process_key_event() retries "CommitText" and -"ForwardKeyEvent" D-Bus signals during calling the "ProcessKeyEvent" D-Bus -method and ibus-daemon does not handle those signals. - -BUG=https://github.com/ibus/ibus/issues/2486 --- - bus/inputcontext.c | 587 +++++++++++++++++++++++++++--------- - client/gtk2/ibusimcontext.c | 225 ++++++++++---- - src/ibusinputcontext.c | 162 +++++++++- - src/ibusinputcontext.h | 30 +- - 4 files changed, 781 insertions(+), 223 deletions(-) + bus/inputcontext.c | 528 +++++++++++++++++++++++++++------------------ + 1 file changed, 319 insertions(+), 209 deletions(-) diff --git a/bus/inputcontext.c b/bus/inputcontext.c -index e76bbdfc..2110af87 100644 +index e76bbdfc..8aded5d8 100644 --- a/bus/inputcontext.c +++ b/bus/inputcontext.c -@@ -31,6 +31,8 @@ - #include "marshalers.h" - #include "types.h" - -+#define MAX_SYNC_DATA 30 -+ - struct _SetEngineByDescData { - /* context related to the data */ - BusInputContext *context; -@@ -38,13 +40,19 @@ struct _SetEngineByDescData { +@@ -38,7 +38,8 @@ struct _SetEngineByDescData { GTask *task; /* a object to cancel bus_engine_proxy_new call */ GCancellable *cancellable; @@ -2382,69 +2359,201 @@ index e76bbdfc..2110af87 100644 * we cancel the cancellable above as well. */ GCancellable *origin_cancellable; gulong cancelled_handler_id; - }; - typedef struct _SetEngineByDescData SetEngineByDescData; - -+typedef struct _SyncForwardingData { -+ gchar key; -+ IBusText *text; -+} SyncForwardingData; -+ - struct _BusInputContext { - IBusService parent; - -@@ -98,6 +106,9 @@ struct _BusInputContext { - - BusPanelProxy *emoji_extension; - gboolean is_extension_lookup_table; -+ GQueue *queue_during_process_key_event; -+ gboolean use_post_process_key_event; -+ gboolean processing_key_event; - }; - - struct _BusInputContextClass { -@@ -155,6 +166,15 @@ static void bus_input_context_service_method_call - const gchar *method_name, - GVariant *parameters, - GDBusMethodInvocation *invocation); -+static GVariant * -+ bus_input_context_service_get_property -+ (IBusService *service, -+ GDBusConnection *connection, -+ const gchar *sender, -+ const gchar *object_path, -+ const gchar *interface_name, -+ const gchar *property_name, -+ GError **error); - static gboolean bus_input_context_service_set_property - (IBusService *service, - GDBusConnection *connection, -@@ -214,8 +234,11 @@ static const gchar introspection_xml[] = - "" - " " +@@ -211,112 +212,115 @@ static IBusPropList *props_empty = NULL; + * XML will be automatically rejected by the GDBus library (see + * src/ibusservice.c for details.) */ + static const gchar introspection_xml[] = +- "" +- " " ++ "\n" ++ " \n" /* properties */ -+ " \n" - " " +- " " ++ " \n" " \n" -+ " \n" /* methods */ - " " - " " -@@ -223,6 +246,12 @@ static const gchar introspection_xml[] = - " " - " " - " " -+ " " -+ " " -+ " " -+ " " -+ " " -+ " " - " " - " " - " " -@@ -312,11 +341,14 @@ static const gchar introspection_xml[] = +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" + + /* signals */ +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- " " +- ""; ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" ++ "\n"; G_DEFINE_TYPE (BusInputContext, bus_input_context, IBUS_TYPE_SERVICE) @@ -2462,7 +2571,7 @@ index e76bbdfc..2110af87 100644 static void _connection_destroy_cb (BusConnection *connection, -@@ -343,17 +375,23 @@ bus_input_context_class_init (BusInputContextClass *class) +@@ -343,17 +347,21 @@ bus_input_context_class_init (BusInputContextClass *class) ""); g_object_ref_sink (class->default_engine_desc); @@ -2473,8 +2582,6 @@ index e76bbdfc..2110af87 100644 /* override the parent class's implementation. */ IBUS_SERVICE_CLASS (class)->service_method_call = bus_input_context_service_method_call; -+ IBUS_SERVICE_CLASS (class)->service_get_property = -+ bus_input_context_service_get_property; IBUS_SERVICE_CLASS (class)->service_set_property = bus_input_context_service_set_property; - /* register the xml so that bus_ibus_impl_service_method_call will be called on a method call defined in the xml (e.g. 'FocusIn'.) */ @@ -2489,7 +2596,7 @@ index e76bbdfc..2110af87 100644 context_signals[PROCESS_KEY_EVENT] = g_signal_new (I_("process-key-event"), G_TYPE_FROM_CLASS (class), -@@ -576,8 +614,11 @@ bus_input_context_class_init (BusInputContextClass *class) +@@ -576,8 +584,11 @@ bus_input_context_class_init (BusInputContextClass *class) G_TYPE_NONE, 0); @@ -2503,7 +2610,7 @@ index e76bbdfc..2110af87 100644 context_signals[REQUEST_ENGINE] = g_signal_new (I_("request-engine"), G_TYPE_FROM_CLASS (class), -@@ -614,7 +655,8 @@ bus_input_context_class_init (BusInputContextClass *class) +@@ -614,7 +625,8 @@ bus_input_context_class_init (BusInputContextClass *class) text_empty = ibus_text_new_from_string (""); g_object_ref_sink (text_empty); @@ -2513,7 +2620,7 @@ index e76bbdfc..2110af87 100644 g_object_ref_sink (lookup_table_empty); props_empty = ibus_prop_list_new (); g_object_ref_sink (props_empty); -@@ -662,9 +704,10 @@ bus_input_context_destroy (BusInputContext *context) +@@ -662,9 +674,10 @@ bus_input_context_destroy (BusInputContext *context) } if (context->connection) { @@ -2527,7 +2634,7 @@ index e76bbdfc..2110af87 100644 g_object_unref (context->connection); context->connection = NULL; } -@@ -674,7 +717,8 @@ bus_input_context_destroy (BusInputContext *context) +@@ -674,7 +687,8 @@ bus_input_context_destroy (BusInputContext *context) context->client = NULL; } @@ -2537,7 +2644,7 @@ index e76bbdfc..2110af87 100644 } static gboolean -@@ -689,25 +733,30 @@ bus_input_context_send_signal (BusInputContext *context, +@@ -689,25 +703,30 @@ bus_input_context_send_signal (BusInputContext *context, return TRUE; } @@ -2577,81 +2684,7 @@ index e76bbdfc..2110af87 100644 * * Emit the D-Bus signal. */ -@@ -763,6 +812,11 @@ bus_input_context_property_changed (BusInputContext *context, - } - - -+typedef struct _PanelProcessKeyEventData { -+ GDBusMethodInvocation *invocation; -+ BusInputContext *context; -+} PanelProcessKeyEventData; -+ - /** - * _panel_process_key_event_cb: - * -@@ -770,14 +824,21 @@ bus_input_context_property_changed (BusInputContext *context, - * bus_panel_proxy_process_key_event() is finished. - */ - static void --_panel_process_key_event_cb (GObject *source, -- GAsyncResult *res, -- GDBusMethodInvocation *invocation) -+_panel_process_key_event_cb (GObject *source, -+ GAsyncResult *res, -+ PanelProcessKeyEventData *data) - { - GError *error = NULL; - GVariant *value = g_dbus_proxy_call_finish ((GDBusProxy *)source, - res, - &error); -+ GDBusMethodInvocation *invocation; -+ BusInputContext *context; -+ -+ g_assert (data); -+ invocation = data->invocation; -+ context = data->context; -+ g_slice_free (PanelProcessKeyEventData, data); - if (value != NULL) { - g_dbus_method_invocation_return_value (invocation, value); - g_variant_unref (value); -@@ -786,6 +847,7 @@ _panel_process_key_event_cb (GObject *source, - g_dbus_method_invocation_return_gerror (invocation, error); - g_error_free (error); - } -+ context->processing_key_event = FALSE; - } - - typedef struct _ProcessKeyEventData ProcessKeyEventData; -@@ -822,21 +884,27 @@ _ic_process_key_event_reply_cb (GObject *source, - gboolean retval = FALSE; - g_variant_get (value, "(b)", &retval); - if (context->emoji_extension && !retval) { -+ PanelProcessKeyEventData *pdata = -+ g_slice_new (PanelProcessKeyEventData); -+ pdata->invocation = invocation; -+ pdata->context = context; - bus_panel_proxy_process_key_event (context->emoji_extension, - keyval, - keycode, - modifiers, - (GAsyncReadyCallback) - _panel_process_key_event_cb, -- invocation); -+ pdata); - } else { - g_dbus_method_invocation_return_value (invocation, value); -+ context->processing_key_event = FALSE; - } - g_variant_unref (value); - } - else { - g_dbus_method_invocation_return_gerror (invocation, error); - g_error_free (error); -+ context->processing_key_event = FALSE; - } - - g_object_unref (context); -@@ -850,14 +918,16 @@ _ic_process_key_event_reply_cb (GObject *source, +@@ -850,9 +869,9 @@ _ic_process_key_event_reply_cb (GObject *source, * org.freedesktop.IBus.InputContext interface. */ static void @@ -2664,14 +2697,7 @@ index e76bbdfc..2110af87 100644 { guint keyval = IBUS_KEY_VoidSymbol; guint keycode = 0; - guint modifiers = 0; - -+ if (context->use_post_process_key_event) -+ context->processing_key_event = TRUE; - g_variant_get (parameters, "(uuu)", &keyval, &keycode, &modifiers); - if (G_UNLIKELY (!context->has_focus)) { - /* workaround: set focus if context does not have focus */ -@@ -925,7 +995,8 @@ _ic_process_key_event (BusInputContext *context, +@@ -925,7 +944,8 @@ _ic_process_key_event (BusInputContext *context, /** * _ic_set_cursor_location: * @@ -2681,7 +2707,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_set_cursor_location (BusInputContext *context, -@@ -1008,7 +1079,8 @@ _ic_process_hand_writing_event (BusInputContext *context, +@@ -1008,7 +1028,8 @@ _ic_process_hand_writing_event (BusInputContext *context, /* do nothing if it is a fake input context */ if (context->has_focus && context->engine && context->fake == FALSE) { @@ -2691,7 +2717,7 @@ index e76bbdfc..2110af87 100644 } g_dbus_method_invocation_return_value (invocation, NULL); } -@@ -1032,7 +1104,8 @@ _ic_cancel_hand_writing (BusInputContext *context, +@@ -1032,7 +1053,8 @@ _ic_cancel_hand_writing (BusInputContext *context, /** * _ic_focus_in: * @@ -2701,7 +2727,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_focus_in (BusInputContext *context, -@@ -1044,15 +1117,17 @@ _ic_focus_in (BusInputContext *context, +@@ -1044,15 +1066,17 @@ _ic_focus_in (BusInputContext *context, g_dbus_method_invocation_return_value (invocation, NULL); } else { @@ -2722,7 +2748,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_focus_out (BusInputContext *context, -@@ -1064,15 +1139,17 @@ _ic_focus_out (BusInputContext *context, +@@ -1064,15 +1088,17 @@ _ic_focus_out (BusInputContext *context, g_dbus_method_invocation_return_value (invocation, NULL); } else { @@ -2743,7 +2769,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_reset (BusInputContext *context, -@@ -1094,7 +1171,8 @@ _ic_reset (BusInputContext *context, +@@ -1094,7 +1120,8 @@ _ic_reset (BusInputContext *context, /** * _ic_set_capabilities: * @@ -2753,7 +2779,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_set_capabilities (BusInputContext *context, -@@ -1112,7 +1190,8 @@ _ic_set_capabilities (BusInputContext *context, +@@ -1112,7 +1139,8 @@ _ic_set_capabilities (BusInputContext *context, /** * _ic_property_activate: * @@ -2763,7 +2789,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_property_activate (BusInputContext *context, -@@ -1124,7 +1203,9 @@ _ic_property_activate (BusInputContext *context, +@@ -1124,7 +1152,9 @@ _ic_property_activate (BusInputContext *context, g_variant_get (parameters, "(&su)", &prop_name, &prop_state); if (context->engine) { @@ -2774,7 +2800,7 @@ index e76bbdfc..2110af87 100644 } #ifdef OS_CHROMEOS -@@ -1132,9 +1213,12 @@ _ic_property_activate (BusInputContext *context, +@@ -1132,9 +1162,12 @@ _ic_property_activate (BusInputContext *context, * so pass PropertyActivate signal to the focused context. */ else if (context->fake) { @@ -2789,7 +2815,7 @@ index e76bbdfc..2110af87 100644 } #endif -@@ -1164,7 +1248,8 @@ _ic_set_engine_done (BusInputContext *context, +@@ -1164,7 +1197,8 @@ _ic_set_engine_done (BusInputContext *context, /** * _ic_set_engine: * @@ -2799,7 +2825,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_set_engine (BusInputContext *context, -@@ -1205,7 +1290,8 @@ _ic_set_engine (BusInputContext *context, +@@ -1205,7 +1239,8 @@ _ic_set_engine (BusInputContext *context, /** * _ic_get_engine: * @@ -2809,7 +2835,7 @@ index e76bbdfc..2110af87 100644 */ static void _ic_get_engine (BusInputContext *context, -@@ -1218,7 +1304,9 @@ _ic_get_engine (BusInputContext *context, +@@ -1218,7 +1253,9 @@ _ic_get_engine (BusInputContext *context, g_dbus_method_invocation_return_value (invocation, @@ -2820,7 +2846,7 @@ index e76bbdfc..2110af87 100644 } static void -@@ -1270,7 +1358,8 @@ bus_input_context_service_authorized_method (IBusService *service, +@@ -1270,7 +1307,8 @@ bus_input_context_service_authorized_method (IBusService *service, /** * bus_input_context_service_method_call: * @@ -2830,7 +2856,7 @@ index e76bbdfc..2110af87 100644 */ static void bus_input_context_service_method_call (IBusService *service, -@@ -1283,21 +1372,23 @@ bus_input_context_service_method_call (IBusService *service, +@@ -1283,21 +1321,23 @@ bus_input_context_service_method_call (IBusService *service, GDBusMethodInvocation *invocation) { if (g_strcmp0 (interface_name, IBUS_INTERFACE_INPUT_CONTEXT) != 0) { @@ -2864,7 +2890,7 @@ index e76bbdfc..2110af87 100644 } methods [] = { { "ProcessKeyEvent", _ic_process_key_event }, { "SetCursorLocation", _ic_set_cursor_location }, -@@ -1322,7 +1413,9 @@ bus_input_context_service_method_call (IBusService *service, +@@ -1322,7 +1362,9 @@ bus_input_context_service_method_call (IBusService *service, for (i = 0; i < G_N_ELEMENTS (methods); i++) { if (g_strcmp0 (method_name, methods[i].method_name) == 0) { @@ -2875,7 +2901,721 @@ index e76bbdfc..2110af87 100644 return; } } -@@ -1330,17 +1423,109 @@ bus_input_context_service_method_call (IBusService *service, +@@ -1465,15 +1507,23 @@ bus_input_context_focus_in (BusInputContext *context) + ibus_service_get_object_path ((IBusService *)context); + bus_engine_proxy_focus_in (context->engine, path, context->client); + bus_engine_proxy_enable (context->engine); +- bus_engine_proxy_set_capabilities (context->engine, context->capabilities); +- bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h); +- bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints); ++ bus_engine_proxy_set_capabilities (context->engine, ++ context->capabilities); ++ bus_engine_proxy_set_cursor_location (context->engine, ++ context->x, ++ context->y, ++ context->w, ++ context->h); ++ bus_engine_proxy_set_content_type (context->engine, ++ context->purpose, ++ context->hints); + } + + if (context->capabilities & IBUS_CAP_FOCUS) { + g_signal_emit (context, context_signals[FOCUS_IN], 0); + if (context->engine) { +- /* if necessary, emit glib signals to the context object to update panel status. see the comment for PREEDIT_CONDITION ++ /* if necessary, emit glib signals to the context object to update ++ * panel status. see the comment for PREEDIT_CONDITION + * for details. */ + if (context->preedit_visible && !PREEDIT_CONDITION) { + g_signal_emit (context, +@@ -1483,14 +1533,16 @@ bus_input_context_focus_in (BusInputContext *context) + context->preedit_cursor_pos, + context->preedit_visible); + } +- if (context->auxiliary_visible && (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == 0) { ++ if (context->auxiliary_visible && ++ (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == 0) { + g_signal_emit (context, + context_signals[UPDATE_AUXILIARY_TEXT], + 0, + context->auxiliary_text, + context->auxiliary_visible); + } +- if (context->lookup_table_visible && (context->capabilities & IBUS_CAP_LOOKUP_TABLE) == 0) { ++ if (context->lookup_table_visible && ++ (context->capabilities & IBUS_CAP_LOOKUP_TABLE) == 0) { + g_signal_emit (context, + context_signals[UPDATE_LOOKUP_TABLE], + 0, +@@ -1630,14 +1682,17 @@ bus_input_context_property_activate (BusInputContext *context, + g_assert (BUS_IS_INPUT_CONTEXT (context)); + + if (context->engine) { +- bus_engine_proxy_property_activate (context->engine, prop_name, prop_state); ++ bus_engine_proxy_property_activate (context->engine, ++ prop_name, ++ prop_state); + } + } + + /** + * bus_input_context_show_preedit_text: + * +- * Show a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Show a preedit text. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_show_preedit_text (BusInputContext *context, +@@ -1678,7 +1733,8 @@ bus_input_context_show_preedit_text (BusInputContext *context, + /** + * bus_input_context_hide_preedit_text: + * +- * Hide a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Hide a preedit text. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_hide_preedit_text (BusInputContext *context, +@@ -1717,7 +1773,8 @@ bus_input_context_hide_preedit_text (BusInputContext *context, + /** + * bus_input_context_update_auxiliary_text: + * +- * Update an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Update an aux text. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_update_auxiliary_text (BusInputContext *context, +@@ -1730,11 +1787,13 @@ bus_input_context_update_auxiliary_text (BusInputContext *context, + g_object_unref (context->auxiliary_text); + } + +- context->auxiliary_text = (IBusText *) g_object_ref_sink (text ? text : text_empty); ++ context->auxiliary_text = (IBusText *)g_object_ref_sink ( ++ text ? text : text_empty); + context->auxiliary_visible = visible; + + if (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) { +- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text); ++ GVariant *variant = ++ ibus_serializable_serialize ((IBusSerializable *)text); + bus_input_context_emit_signal (context, + "UpdateAuxiliaryText", + g_variant_new ("(vb)", variant, visible), +@@ -1752,7 +1811,8 @@ bus_input_context_update_auxiliary_text (BusInputContext *context, + /** + * bus_input_context_show_auxiliary_text: + * +- * Show an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Show an aux text. Send D-Bus signal to update status of client or send glib ++ * signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_show_auxiliary_text (BusInputContext *context) +@@ -1765,7 +1825,8 @@ bus_input_context_show_auxiliary_text (BusInputContext *context) + + context->auxiliary_visible = TRUE; + +- if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) { ++ if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) ++ == IBUS_CAP_AUXILIARY_TEXT) { + bus_input_context_emit_signal (context, + "ShowAuxiliaryText", + NULL, +@@ -1781,7 +1842,8 @@ bus_input_context_show_auxiliary_text (BusInputContext *context) + /** + * bus_input_context_hide_auxiliary_text: + * +- * Hide an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Hide an aux text. Send D-Bus signal to update status of client or send glib ++ * signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_hide_auxiliary_text (BusInputContext *context) +@@ -1794,7 +1856,8 @@ bus_input_context_hide_auxiliary_text (BusInputContext *context) + + context->auxiliary_visible = FALSE; + +- if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) { ++ if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) ++ == IBUS_CAP_AUXILIARY_TEXT) { + bus_input_context_emit_signal (context, + "HideAuxiliaryText", + NULL, +@@ -1829,11 +1892,13 @@ bus_input_context_update_lookup_table (BusInputContext *context, + g_object_unref (context->lookup_table); + } + +- context->lookup_table = (IBusLookupTable *) g_object_ref_sink (table ? table : lookup_table_empty); ++ context->lookup_table = (IBusLookupTable *)g_object_ref_sink ( ++ table ? table : lookup_table_empty); + context->lookup_table_visible = visible; + + if (context->capabilities & IBUS_CAP_LOOKUP_TABLE) { +- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)table); ++ GVariant *variant = ++ ibus_serializable_serialize ((IBusSerializable *)table); + bus_input_context_emit_signal (context, + "UpdateLookupTable", + g_variant_new ("(vb)", variant, visible), +@@ -1851,7 +1916,8 @@ bus_input_context_update_lookup_table (BusInputContext *context, + /** + * bus_input_context_show_lookup_table: + * +- * Show the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Show the lookup table. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_show_lookup_table (BusInputContext *context) +@@ -1864,7 +1930,8 @@ bus_input_context_show_lookup_table (BusInputContext *context) + + context->lookup_table_visible = TRUE; + +- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { ++ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) ++ == IBUS_CAP_LOOKUP_TABLE) { + bus_input_context_emit_signal (context, + "ShowLookupTable", + NULL, +@@ -1880,7 +1947,8 @@ bus_input_context_show_lookup_table (BusInputContext *context) + /** + * bus_input_context_hide_lookup_table: + * +- * Hide the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Hide the lookup table. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_hide_lookup_table (BusInputContext *context) +@@ -1893,7 +1961,8 @@ bus_input_context_hide_lookup_table (BusInputContext *context) + + context->lookup_table_visible = FALSE; + +- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { ++ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) ++ == IBUS_CAP_LOOKUP_TABLE) { + bus_input_context_emit_signal (context, + "HideLookupTable", + NULL, +@@ -1909,7 +1978,8 @@ bus_input_context_hide_lookup_table (BusInputContext *context) + /** + * bus_input_context_page_up_lookup_table: + * +- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Change cursor position. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_page_up_lookup_table (BusInputContext *context) +@@ -1920,7 +1990,8 @@ bus_input_context_page_up_lookup_table (BusInputContext *context) + return; + } + +- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { ++ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) ++ == IBUS_CAP_LOOKUP_TABLE) { + bus_input_context_emit_signal (context, + "PageUpLookupTable", + NULL, +@@ -1936,7 +2007,8 @@ bus_input_context_page_up_lookup_table (BusInputContext *context) + /** + * bus_input_context_page_down_lookup_table: + * +- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Change cursor position. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_page_down_lookup_table (BusInputContext *context) +@@ -1947,7 +2019,8 @@ bus_input_context_page_down_lookup_table (BusInputContext *context) + return; + } + +- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { ++ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) ++ == IBUS_CAP_LOOKUP_TABLE) { + bus_input_context_emit_signal (context, + "PageDownLookupTable", + NULL, +@@ -1963,7 +2036,8 @@ bus_input_context_page_down_lookup_table (BusInputContext *context) + /** + * bus_input_context_cursor_up_lookup_table: + * +- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Change cursor position. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_cursor_up_lookup_table (BusInputContext *context) +@@ -1974,7 +2048,8 @@ bus_input_context_cursor_up_lookup_table (BusInputContext *context) + return; + } + +- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { ++ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) ++ == IBUS_CAP_LOOKUP_TABLE) { + bus_input_context_emit_signal (context, + "CursorUpLookupTable", + NULL, +@@ -1990,7 +2065,8 @@ bus_input_context_cursor_up_lookup_table (BusInputContext *context) + /** + * bus_input_context_cursor_down_lookup_table: + * +- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Change cursor position. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_cursor_down_lookup_table (BusInputContext *context) +@@ -2001,7 +2077,8 @@ bus_input_context_cursor_down_lookup_table (BusInputContext *context) + return; + } + +- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { ++ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) ++ == IBUS_CAP_LOOKUP_TABLE) { + bus_input_context_emit_signal (context, + "CursorDownLookupTable", + NULL, +@@ -2017,7 +2094,8 @@ bus_input_context_cursor_down_lookup_table (BusInputContext *context) + /** + * bus_input_context_register_properties: + * +- * Register properties. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Register properties. Send D-Bus signal to update status of client or send ++ * glib signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_register_properties (BusInputContext *context, +@@ -2027,7 +2105,8 @@ bus_input_context_register_properties (BusInputContext *context, + g_assert (IBUS_IS_PROP_LIST (props)); + + if (context->capabilities & IBUS_CAP_PROPERTY) { +- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)props); ++ GVariant *variant = ++ ibus_serializable_serialize ((IBusSerializable *)props); + bus_input_context_emit_signal (context, + "RegisterProperties", + g_variant_new ("(v)", variant), +@@ -2044,7 +2123,8 @@ bus_input_context_register_properties (BusInputContext *context, + /** + * bus_input_context_update_property: + * +- * Update property. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. ++ * Update property. Send D-Bus signal to update status of client or send glib ++ * signal to the panel, depending on capabilities of the client. + */ + static void + bus_input_context_update_property (BusInputContext *context, +@@ -2054,7 +2134,8 @@ bus_input_context_update_property (BusInputContext *context, + g_assert (IBUS_IS_PROPERTY (prop)); + + if (context->capabilities & IBUS_CAP_PROPERTY) { +- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)prop); ++ GVariant *variant = ++ ibus_serializable_serialize ((IBusSerializable *)prop); + bus_input_context_emit_signal (context, + "UpdateProperty", + g_variant_new ("(v)", variant), +@@ -2089,7 +2170,8 @@ _engine_destroy_cb (BusEngineProxy *engine, + /** + * _engine_commit_text_cb: + * +- * A function to be called when "commit-text" glib signal is sent to the engine object. ++ * A function to be called when "commit-text" glib signal is sent to the engine ++ * object. + */ + static void + _engine_commit_text_cb (BusEngineProxy *engine, +@@ -2108,7 +2190,8 @@ _engine_commit_text_cb (BusEngineProxy *engine, + /** + * _engine_forward_key_event_cb: + * +- * A function to be called when "forward-key-event" glib signal is sent to the engine object. ++ * A function to be called when "forward-key-event" glib signal is sent to the ++ * engine object. + */ + static void + _engine_forward_key_event_cb (BusEngineProxy *engine, +@@ -2124,14 +2207,16 @@ _engine_forward_key_event_cb (BusEngineProxy *engine, + + bus_input_context_emit_signal (context, + "ForwardKeyEvent", +- g_variant_new ("(uuu)", keyval, keycode, state), ++ g_variant_new ("(uuu)", ++ keyval, keycode, state), + NULL); + } + + /** + * _engine_delete_surrounding_text_cb: + * +- * A function to be called when "delete-surrounding-text" glib signal is sent to the engine object. ++ * A function to be called when "delete-surrounding-text" glib signal is sent ++ * to the engine object. + */ + static void + _engine_delete_surrounding_text_cb (BusEngineProxy *engine, +@@ -2146,14 +2231,16 @@ _engine_delete_surrounding_text_cb (BusEngineProxy *engine, + + bus_input_context_emit_signal (context, + "DeleteSurroundingText", +- g_variant_new ("(iu)", offset_from_cursor, nchars), ++ g_variant_new ("(iu)", ++ offset_from_cursor, nchars), + NULL); + } + + /** + * _engine_require_surrounding_text_cb: + * +- * A function to be called when "require-surrounding-text" glib signal is sent to the engine object. ++ * A function to be called when "require-surrounding-text" glib signal is sent ++ * to the engine object. + */ + static void + _engine_require_surrounding_text_cb (BusEngineProxy *engine, +@@ -2173,7 +2260,8 @@ _engine_require_surrounding_text_cb (BusEngineProxy *engine, + /** + * _engine_update_preedit_text_cb: + * +- * A function to be called when "update-preedit-text" glib signal is sent to the engine object. ++ * A function to be called when "update-preedit-text" glib signal is sent to ++ * the engine object. + */ + static void + _engine_update_preedit_text_cb (BusEngineProxy *engine, +@@ -2197,7 +2285,8 @@ _engine_update_preedit_text_cb (BusEngineProxy *engine, + /** + * _engine_update_auxiliary_text_cb: + * +- * A function to be called when "update-auxiliary-text" glib signal is sent to the engine object. ++ * A function to be called when "update-auxiliary-text" glib signal is sent to ++ * the engine object. + */ + static void + _engine_update_auxiliary_text_cb (BusEngineProxy *engine, +@@ -2217,7 +2306,8 @@ _engine_update_auxiliary_text_cb (BusEngineProxy *engine, + /** + * _engine_update_lookup_table_cb: + * +- * A function to be called when "update-lookup-table" glib signal is sent to the engine object. ++ * A function to be called when "update-lookup-table" glib signal is sent to ++ * the engine object. + */ + static void + _engine_update_lookup_table_cb (BusEngineProxy *engine, +@@ -2237,7 +2327,8 @@ _engine_update_lookup_table_cb (BusEngineProxy *engine, + /** + * _engine_register_properties_cb: + * +- * A function to be called when "register-properties" glib signal is sent to the engine object. ++ * A function to be called when "register-properties" glib signal is sent to ++ * the engine object. + */ + static void + _engine_register_properties_cb (BusEngineProxy *engine, +@@ -2256,7 +2347,8 @@ _engine_register_properties_cb (BusEngineProxy *engine, + /** + * _engine_update_property_cb: + * +- * A function to be called when "update-property" glib signal is sent to the engine object. ++ * A function to be called when "update-property" glib signal is sent to the ++ * engine object. + */ + static void + _engine_update_property_cb (BusEngineProxy *engine, +@@ -2346,10 +2438,11 @@ bus_input_context_new (BusConnection *connection, + + BusInputContext *context = NULL; + if (connection) { +- context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT, +- "object-path", path, +- "connection", bus_connection_get_dbus_connection (connection), +- NULL); ++ context = (BusInputContext *) g_object_new ( ++ BUS_TYPE_INPUT_CONTEXT, ++ "object-path", path, ++ "connection", bus_connection_get_dbus_connection (connection), ++ NULL); + } + else { + context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT, +@@ -2439,28 +2532,37 @@ bus_input_context_disable (BusInputContext *context) + } + } + +-/* A list of signals (and their handler functions) that could be emit by the engine proxy object. */ ++/* A list of signals (and their handler functions) that could be emit by the ++ * engine proxy object. ++ */ + const static struct { + const gchar *name; + GCallback callback; + } engine_signals [] = { + { "commit-text", G_CALLBACK (_engine_commit_text_cb) }, + { "forward-key-event", G_CALLBACK (_engine_forward_key_event_cb) }, +- { "delete-surrounding-text", G_CALLBACK (_engine_delete_surrounding_text_cb) }, +- { "require-surrounding-text", G_CALLBACK (_engine_require_surrounding_text_cb) }, ++ { "delete-surrounding-text", ++ G_CALLBACK (_engine_delete_surrounding_text_cb) }, ++ { "require-surrounding-text", ++ G_CALLBACK (_engine_require_surrounding_text_cb) }, + { "update-preedit-text", G_CALLBACK (_engine_update_preedit_text_cb) }, + { "show-preedit-text", G_CALLBACK (_engine_show_preedit_text_cb) }, + { "hide-preedit-text", G_CALLBACK (_engine_hide_preedit_text_cb) }, +- { "update-auxiliary-text", G_CALLBACK (_engine_update_auxiliary_text_cb) }, ++ { "update-auxiliary-text", ++ G_CALLBACK (_engine_update_auxiliary_text_cb) }, + { "show-auxiliary-text", G_CALLBACK (_engine_show_auxiliary_text_cb) }, + { "hide-auxiliary-text", G_CALLBACK (_engine_hide_auxiliary_text_cb) }, + { "update-lookup-table", G_CALLBACK (_engine_update_lookup_table_cb) }, + { "show-lookup-table", G_CALLBACK (_engine_show_lookup_table_cb) }, + { "hide-lookup-table", G_CALLBACK (_engine_hide_lookup_table_cb) }, +- { "page-up-lookup-table", G_CALLBACK (_engine_page_up_lookup_table_cb) }, +- { "page-down-lookup-table", G_CALLBACK (_engine_page_down_lookup_table_cb) }, +- { "cursor-up-lookup-table", G_CALLBACK (_engine_cursor_up_lookup_table_cb) }, +- { "cursor-down-lookup-table", G_CALLBACK (_engine_cursor_down_lookup_table_cb) }, ++ { "page-up-lookup-table", ++ G_CALLBACK (_engine_page_up_lookup_table_cb) }, ++ { "page-down-lookup-table", ++ G_CALLBACK (_engine_page_down_lookup_table_cb) }, ++ { "cursor-up-lookup-table", ++ G_CALLBACK (_engine_cursor_up_lookup_table_cb) }, ++ { "cursor-down-lookup-table", ++ G_CALLBACK (_engine_cursor_down_lookup_table_cb) }, + { "register-properties", G_CALLBACK (_engine_register_properties_cb) }, + { "update-property", G_CALLBACK (_engine_update_property_cb) }, + { "panel-extension", G_CALLBACK (_engine_panel_extension_cb) }, +@@ -2531,9 +2633,16 @@ bus_input_context_set_engine (BusInputContext *context, + ibus_service_get_object_path ((IBusService *)context); + bus_engine_proxy_focus_in (context->engine, path, context->client); + bus_engine_proxy_enable (context->engine); +- bus_engine_proxy_set_capabilities (context->engine, context->capabilities); +- bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h); +- bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints); ++ bus_engine_proxy_set_capabilities (context->engine, ++ context->capabilities); ++ bus_engine_proxy_set_cursor_location (context->engine, ++ context->x, ++ context->y, ++ context->w, ++ context->h); ++ bus_engine_proxy_set_content_type (context->engine, ++ context->purpose, ++ context->hints); + } + } + g_signal_emit (context, +@@ -2779,7 +2888,8 @@ bus_input_context_set_capabilities (BusInputContext *context, + { + g_assert (BUS_IS_INPUT_CONTEXT (context)); + +- /* If the context does not support IBUS_CAP_FOCUS, then the client application have to handle all information such as ++ /* If the context does not support IBUS_CAP_FOCUS, then the client ++ * application have to handle all information such as + * preedit and auxiliary text. */ + if ((capabilities & IBUS_CAP_FOCUS) == 0) { + capabilities |= (IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_AUXILIARY_TEXT | IBUS_CAP_LOOKUP_TABLE | IBUS_CAP_PROPERTY); +-- +2.41.0 + +From 3670faf74a7b4594ceda3b4a8c01515840cc1991 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Wed, 12 Jul 2023 07:50:22 +0900 +Subject: [PATCH 2/3] src: Fix sync ibus_input_context_process_key_event() + +The synchronous "ProcessKeyEvent" D-Bus method cannot receive +"CommitText" and "ForwardKeyEvent" D-Bus signals during calling the method. +To resolve the issue, now +ibus_input_context_set_post_process_key_event() and +ibus_input_context_post_process_key_event() are added newly. + +ibus_input_context_post_process_key_event() retries "CommitText" and +"ForwardKeyEvent" D-Bus signals during calling the "ProcessKeyEvent" D-Bus +method and ibus-daemon does not handle those signals. + +"Since: 1.5.00" is added in header files to available APIs before 1.5.29 +is released. Will think later how to convert the version comments together +when the new version 1.5.29 is committed. + +BUG=https://github.com/ibus/ibus/issues/2486 +--- + bus/inputcontext.c | 252 ++++++++++++++++++++++++++++++++---- + client/gtk2/ibusimcontext.c | 225 ++++++++++++++++++++++---------- + src/ibusinputcontext.c | 162 +++++++++++++++++++++-- + src/ibusinputcontext.h | 36 +++++- + 4 files changed, 567 insertions(+), 108 deletions(-) + +diff --git a/bus/inputcontext.c b/bus/inputcontext.c +index 8aded5d8..4d1fb041 100644 +--- a/bus/inputcontext.c ++++ b/bus/inputcontext.c +@@ -31,6 +31,8 @@ + #include "marshalers.h" + #include "types.h" + ++#define MAX_SYNC_DATA 30 ++ + struct _SetEngineByDescData { + /* context related to the data */ + BusInputContext *context; +@@ -46,6 +48,11 @@ struct _SetEngineByDescData { + }; + typedef struct _SetEngineByDescData SetEngineByDescData; + ++typedef struct _SyncForwardingData { ++ gchar key; ++ IBusText *text; ++} SyncForwardingData; ++ + struct _BusInputContext { + IBusService parent; + +@@ -99,6 +106,9 @@ struct _BusInputContext { + + BusPanelProxy *emoji_extension; + gboolean is_extension_lookup_table; ++ GQueue *queue_during_process_key_event; ++ gboolean use_post_process_key_event; ++ gboolean processing_key_event; + }; + + struct _BusInputContextClass { +@@ -156,6 +166,15 @@ static void bus_input_context_service_method_call + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation); ++static GVariant * ++ bus_input_context_service_get_property ++ (IBusService *service, ++ GDBusConnection *connection, ++ const gchar *sender, ++ const gchar *object_path, ++ const gchar *interface_name, ++ const gchar *property_name, ++ GError **error); + static gboolean bus_input_context_service_set_property + (IBusService *service, + GDBusConnection *connection, +@@ -215,8 +234,21 @@ static const gchar introspection_xml[] = + "\n" + " \n" + /* properties */ ++ " \n" ++ " \n" ++ " \n" ++ " \n" + " \n" + " \n" ++ " \n" ++ " \n" ++ " \n" ++ " \n" + /* methods */ + " \n" + " \n" +@@ -353,6 +385,8 @@ bus_input_context_class_init (BusInputContextClass *class) + /* override the parent class's implementation. */ + IBUS_SERVICE_CLASS (class)->service_method_call = + bus_input_context_service_method_call; ++ IBUS_SERVICE_CLASS (class)->service_get_property = ++ bus_input_context_service_get_property; + IBUS_SERVICE_CLASS (class)->service_set_property = + bus_input_context_service_set_property; + /* register the xml so that bus_ibus_impl_service_method_call will be +@@ -782,6 +816,11 @@ bus_input_context_property_changed (BusInputContext *context, + } + + ++typedef struct _PanelProcessKeyEventData { ++ GDBusMethodInvocation *invocation; ++ BusInputContext *context; ++} PanelProcessKeyEventData; ++ + /** + * _panel_process_key_event_cb: + * +@@ -789,14 +828,21 @@ bus_input_context_property_changed (BusInputContext *context, + * bus_panel_proxy_process_key_event() is finished. + */ + static void +-_panel_process_key_event_cb (GObject *source, +- GAsyncResult *res, +- GDBusMethodInvocation *invocation) ++_panel_process_key_event_cb (GObject *source, ++ GAsyncResult *res, ++ PanelProcessKeyEventData *data) + { + GError *error = NULL; + GVariant *value = g_dbus_proxy_call_finish ((GDBusProxy *)source, + res, + &error); ++ GDBusMethodInvocation *invocation; ++ BusInputContext *context; ++ ++ g_assert (data); ++ invocation = data->invocation; ++ context = data->context; ++ g_slice_free (PanelProcessKeyEventData, data); + if (value != NULL) { + g_dbus_method_invocation_return_value (invocation, value); + g_variant_unref (value); +@@ -805,6 +851,7 @@ _panel_process_key_event_cb (GObject *source, + g_dbus_method_invocation_return_gerror (invocation, error); + g_error_free (error); + } ++ context->processing_key_event = FALSE; + } + + typedef struct _ProcessKeyEventData ProcessKeyEventData; +@@ -841,21 +888,27 @@ _ic_process_key_event_reply_cb (GObject *source, + gboolean retval = FALSE; + g_variant_get (value, "(b)", &retval); + if (context->emoji_extension && !retval) { ++ PanelProcessKeyEventData *pdata = ++ g_slice_new (PanelProcessKeyEventData); ++ pdata->invocation = invocation; ++ pdata->context = context; + bus_panel_proxy_process_key_event (context->emoji_extension, + keyval, + keycode, + modifiers, + (GAsyncReadyCallback) + _panel_process_key_event_cb, +- invocation); ++ pdata); + } else { + g_dbus_method_invocation_return_value (invocation, value); ++ context->processing_key_event = FALSE; + } + g_variant_unref (value); + } + else { + g_dbus_method_invocation_return_gerror (invocation, error); + g_error_free (error); ++ context->processing_key_event = FALSE; + } + + g_object_unref (context); +@@ -877,6 +930,8 @@ _ic_process_key_event (BusInputContext *context, + guint keycode = 0; + guint modifiers = 0; + ++ if (context->use_post_process_key_event) ++ context->processing_key_event = TRUE; + g_variant_get (parameters, "(uuu)", &keyval, &keycode, &modifiers); + if (G_UNLIKELY (!context->has_focus)) { + /* workaround: set focus if context does not have focus */ +@@ -1372,17 +1427,109 @@ bus_input_context_service_method_call (IBusService *service, g_return_if_reached (); } @@ -2887,7 +3627,7 @@ index e76bbdfc..2110af87 100644 + * org.freedesktop.IBus.InputContext interface because currently the Gio + * D-Bus method calls don't support multiple nested tuples likes + * G_VARIANT_TYPE ("((ba(yv)))")) in "ProcessKeyEvent" D-Bus method -+ * So these post events are separated from the return value "b" of ++ * So these post events are separated from the return value "b" of + * the "ProcessKeyEvent" D-Bus method call. + */ +static GVariant * @@ -2989,7 +3729,7 @@ index e76bbdfc..2110af87 100644 context->purpose = purpose; context->hints = hints; -@@ -1358,24 +1543,30 @@ _ic_set_content_type (BusInputContext *context, +@@ -1400,24 +1547,30 @@ _ic_set_content_type (BusInputContext *context, context->hints); } @@ -3029,7 +3769,7 @@ index e76bbdfc..2110af87 100644 } static gboolean -@@ -1388,6 +1579,18 @@ bus_input_context_service_set_property (IBusService *service, +@@ -1430,6 +1583,18 @@ bus_input_context_service_set_property (IBusService *service, GVariant *value, GError **error) { @@ -3048,7 +3788,7 @@ index e76bbdfc..2110af87 100644 if (error) *error = NULL; if (g_strcmp0 (interface_name, IBUS_INTERFACE_INPUT_CONTEXT) != 0) { -@@ -1418,14 +1621,12 @@ bus_input_context_service_set_property (IBusService *service, +@@ -1460,14 +1625,12 @@ bus_input_context_service_set_property (IBusService *service, " "); return FALSE; } @@ -3069,349 +3809,13 @@ index e76bbdfc..2110af87 100644 } g_set_error (error, -@@ -1465,15 +1666,23 @@ bus_input_context_focus_in (BusInputContext *context) - ibus_service_get_object_path ((IBusService *)context); - bus_engine_proxy_focus_in (context->engine, path, context->client); - bus_engine_proxy_enable (context->engine); -- bus_engine_proxy_set_capabilities (context->engine, context->capabilities); -- bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h); -- bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints); -+ bus_engine_proxy_set_capabilities (context->engine, -+ context->capabilities); -+ bus_engine_proxy_set_cursor_location (context->engine, -+ context->x, -+ context->y, -+ context->w, -+ context->h); -+ bus_engine_proxy_set_content_type (context->engine, -+ context->purpose, -+ context->hints); - } - - if (context->capabilities & IBUS_CAP_FOCUS) { - g_signal_emit (context, context_signals[FOCUS_IN], 0); - if (context->engine) { -- /* if necessary, emit glib signals to the context object to update panel status. see the comment for PREEDIT_CONDITION -+ /* if necessary, emit glib signals to the context object to update -+ * panel status. see the comment for PREEDIT_CONDITION - * for details. */ - if (context->preedit_visible && !PREEDIT_CONDITION) { - g_signal_emit (context, -@@ -1483,14 +1692,16 @@ bus_input_context_focus_in (BusInputContext *context) - context->preedit_cursor_pos, - context->preedit_visible); - } -- if (context->auxiliary_visible && (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == 0) { -+ if (context->auxiliary_visible && -+ (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == 0) { - g_signal_emit (context, - context_signals[UPDATE_AUXILIARY_TEXT], - 0, - context->auxiliary_text, - context->auxiliary_visible); - } -- if (context->lookup_table_visible && (context->capabilities & IBUS_CAP_LOOKUP_TABLE) == 0) { -+ if (context->lookup_table_visible && -+ (context->capabilities & IBUS_CAP_LOOKUP_TABLE) == 0) { - g_signal_emit (context, - context_signals[UPDATE_LOOKUP_TABLE], - 0, -@@ -1630,14 +1841,17 @@ bus_input_context_property_activate (BusInputContext *context, +@@ -2204,7 +2367,23 @@ _engine_forward_key_event_cb (BusEngineProxy *engine, g_assert (BUS_IS_INPUT_CONTEXT (context)); - if (context->engine) { -- bus_engine_proxy_property_activate (context->engine, prop_name, prop_state); -+ bus_engine_proxy_property_activate (context->engine, -+ prop_name, -+ prop_state); - } - } - - /** - * bus_input_context_show_preedit_text: - * -- * Show a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Show a preedit text. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_show_preedit_text (BusInputContext *context, -@@ -1678,7 +1892,8 @@ bus_input_context_show_preedit_text (BusInputContext *context, - /** - * bus_input_context_hide_preedit_text: - * -- * Hide a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Hide a preedit text. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_hide_preedit_text (BusInputContext *context, -@@ -1717,7 +1932,8 @@ bus_input_context_hide_preedit_text (BusInputContext *context, - /** - * bus_input_context_update_auxiliary_text: - * -- * Update an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Update an aux text. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_update_auxiliary_text (BusInputContext *context, -@@ -1730,11 +1946,13 @@ bus_input_context_update_auxiliary_text (BusInputContext *context, - g_object_unref (context->auxiliary_text); - } - -- context->auxiliary_text = (IBusText *) g_object_ref_sink (text ? text : text_empty); -+ context->auxiliary_text = (IBusText *)g_object_ref_sink ( -+ text ? text : text_empty); - context->auxiliary_visible = visible; - - if (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) { -- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text); -+ GVariant *variant = -+ ibus_serializable_serialize ((IBusSerializable *)text); - bus_input_context_emit_signal (context, - "UpdateAuxiliaryText", - g_variant_new ("(vb)", variant, visible), -@@ -1752,7 +1970,8 @@ bus_input_context_update_auxiliary_text (BusInputContext *context, - /** - * bus_input_context_show_auxiliary_text: - * -- * Show an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Show an aux text. Send D-Bus signal to update status of client or send glib -+ * signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_show_auxiliary_text (BusInputContext *context) -@@ -1765,7 +1984,8 @@ bus_input_context_show_auxiliary_text (BusInputContext *context) - - context->auxiliary_visible = TRUE; - -- if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) { -+ if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) -+ == IBUS_CAP_AUXILIARY_TEXT) { - bus_input_context_emit_signal (context, - "ShowAuxiliaryText", - NULL, -@@ -1781,7 +2001,8 @@ bus_input_context_show_auxiliary_text (BusInputContext *context) - /** - * bus_input_context_hide_auxiliary_text: - * -- * Hide an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Hide an aux text. Send D-Bus signal to update status of client or send glib -+ * signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_hide_auxiliary_text (BusInputContext *context) -@@ -1794,7 +2015,8 @@ bus_input_context_hide_auxiliary_text (BusInputContext *context) - - context->auxiliary_visible = FALSE; - -- if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) { -+ if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) -+ == IBUS_CAP_AUXILIARY_TEXT) { - bus_input_context_emit_signal (context, - "HideAuxiliaryText", - NULL, -@@ -1829,11 +2051,13 @@ bus_input_context_update_lookup_table (BusInputContext *context, - g_object_unref (context->lookup_table); - } - -- context->lookup_table = (IBusLookupTable *) g_object_ref_sink (table ? table : lookup_table_empty); -+ context->lookup_table = (IBusLookupTable *)g_object_ref_sink ( -+ table ? table : lookup_table_empty); - context->lookup_table_visible = visible; - - if (context->capabilities & IBUS_CAP_LOOKUP_TABLE) { -- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)table); -+ GVariant *variant = -+ ibus_serializable_serialize ((IBusSerializable *)table); - bus_input_context_emit_signal (context, - "UpdateLookupTable", - g_variant_new ("(vb)", variant, visible), -@@ -1851,7 +2075,8 @@ bus_input_context_update_lookup_table (BusInputContext *context, - /** - * bus_input_context_show_lookup_table: - * -- * Show the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Show the lookup table. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_show_lookup_table (BusInputContext *context) -@@ -1864,7 +2089,8 @@ bus_input_context_show_lookup_table (BusInputContext *context) - - context->lookup_table_visible = TRUE; - -- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { -+ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) -+ == IBUS_CAP_LOOKUP_TABLE) { - bus_input_context_emit_signal (context, - "ShowLookupTable", - NULL, -@@ -1880,7 +2106,8 @@ bus_input_context_show_lookup_table (BusInputContext *context) - /** - * bus_input_context_hide_lookup_table: - * -- * Hide the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Hide the lookup table. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_hide_lookup_table (BusInputContext *context) -@@ -1893,7 +2120,8 @@ bus_input_context_hide_lookup_table (BusInputContext *context) - - context->lookup_table_visible = FALSE; - -- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { -+ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) -+ == IBUS_CAP_LOOKUP_TABLE) { - bus_input_context_emit_signal (context, - "HideLookupTable", - NULL, -@@ -1909,7 +2137,8 @@ bus_input_context_hide_lookup_table (BusInputContext *context) - /** - * bus_input_context_page_up_lookup_table: - * -- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Change cursor position. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_page_up_lookup_table (BusInputContext *context) -@@ -1920,7 +2149,8 @@ bus_input_context_page_up_lookup_table (BusInputContext *context) - return; - } - -- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { -+ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) -+ == IBUS_CAP_LOOKUP_TABLE) { - bus_input_context_emit_signal (context, - "PageUpLookupTable", - NULL, -@@ -1936,7 +2166,8 @@ bus_input_context_page_up_lookup_table (BusInputContext *context) - /** - * bus_input_context_page_down_lookup_table: - * -- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Change cursor position. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_page_down_lookup_table (BusInputContext *context) -@@ -1947,7 +2178,8 @@ bus_input_context_page_down_lookup_table (BusInputContext *context) - return; - } - -- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { -+ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) -+ == IBUS_CAP_LOOKUP_TABLE) { - bus_input_context_emit_signal (context, - "PageDownLookupTable", - NULL, -@@ -1963,7 +2195,8 @@ bus_input_context_page_down_lookup_table (BusInputContext *context) - /** - * bus_input_context_cursor_up_lookup_table: - * -- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Change cursor position. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_cursor_up_lookup_table (BusInputContext *context) -@@ -1974,7 +2207,8 @@ bus_input_context_cursor_up_lookup_table (BusInputContext *context) - return; - } - -- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { -+ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) -+ == IBUS_CAP_LOOKUP_TABLE) { - bus_input_context_emit_signal (context, - "CursorUpLookupTable", - NULL, -@@ -1990,7 +2224,8 @@ bus_input_context_cursor_up_lookup_table (BusInputContext *context) - /** - * bus_input_context_cursor_down_lookup_table: - * -- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Change cursor position. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_cursor_down_lookup_table (BusInputContext *context) -@@ -2001,7 +2236,8 @@ bus_input_context_cursor_down_lookup_table (BusInputContext *context) - return; - } - -- if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) { -+ if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) -+ == IBUS_CAP_LOOKUP_TABLE) { - bus_input_context_emit_signal (context, - "CursorDownLookupTable", - NULL, -@@ -2017,7 +2253,8 @@ bus_input_context_cursor_down_lookup_table (BusInputContext *context) - /** - * bus_input_context_register_properties: - * -- * Register properties. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Register properties. Send D-Bus signal to update status of client or send -+ * glib signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_register_properties (BusInputContext *context, -@@ -2027,7 +2264,8 @@ bus_input_context_register_properties (BusInputContext *context, - g_assert (IBUS_IS_PROP_LIST (props)); - - if (context->capabilities & IBUS_CAP_PROPERTY) { -- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)props); -+ GVariant *variant = -+ ibus_serializable_serialize ((IBusSerializable *)props); - bus_input_context_emit_signal (context, - "RegisterProperties", - g_variant_new ("(v)", variant), -@@ -2044,7 +2282,8 @@ bus_input_context_register_properties (BusInputContext *context, - /** - * bus_input_context_update_property: - * -- * Update property. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client. -+ * Update property. Send D-Bus signal to update status of client or send glib -+ * signal to the panel, depending on capabilities of the client. - */ - static void - bus_input_context_update_property (BusInputContext *context, -@@ -2054,7 +2293,8 @@ bus_input_context_update_property (BusInputContext *context, - g_assert (IBUS_IS_PROPERTY (prop)); - - if (context->capabilities & IBUS_CAP_PROPERTY) { -- GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)prop); -+ GVariant *variant = -+ ibus_serializable_serialize ((IBusSerializable *)prop); - bus_input_context_emit_signal (context, - "UpdateProperty", - g_variant_new ("(v)", variant), -@@ -2089,7 +2329,8 @@ _engine_destroy_cb (BusEngineProxy *engine, - /** - * _engine_commit_text_cb: - * -- * A function to be called when "commit-text" glib signal is sent to the engine object. -+ * A function to be called when "commit-text" glib signal is sent to the engine -+ * object. - */ - static void - _engine_commit_text_cb (BusEngineProxy *engine, -@@ -2108,7 +2349,8 @@ _engine_commit_text_cb (BusEngineProxy *engine, - /** - * _engine_forward_key_event_cb: - * -- * A function to be called when "forward-key-event" glib signal is sent to the engine object. -+ * A function to be called when "forward-key-event" glib signal is sent to the -+ * engine object. - */ - static void - _engine_forward_key_event_cb (BusEngineProxy *engine, -@@ -2122,16 +2364,33 @@ _engine_forward_key_event_cb (BusEngineProxy *engine, - g_assert (context->engine == 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) { + SyncForwardingData *data; @@ -3429,107 +3833,8 @@ index e76bbdfc..2110af87 100644 + } bus_input_context_emit_signal (context, "ForwardKeyEvent", -- g_variant_new ("(uuu)", keyval, keycode, state), -+ g_variant_new ("(uuu)", -+ keyval, keycode, state), - NULL); - } - - /** - * _engine_delete_surrounding_text_cb: - * -- * A function to be called when "delete-surrounding-text" glib signal is sent to the engine object. -+ * A function to be called when "delete-surrounding-text" glib signal is sent -+ * to the engine object. - */ - static void - _engine_delete_surrounding_text_cb (BusEngineProxy *engine, -@@ -2146,14 +2405,16 @@ _engine_delete_surrounding_text_cb (BusEngineProxy *engine, - - bus_input_context_emit_signal (context, - "DeleteSurroundingText", -- g_variant_new ("(iu)", offset_from_cursor, nchars), -+ g_variant_new ("(iu)", -+ offset_from_cursor, nchars), - NULL); - } - - /** - * _engine_require_surrounding_text_cb: - * -- * A function to be called when "require-surrounding-text" glib signal is sent to the engine object. -+ * A function to be called when "require-surrounding-text" glib signal is sent -+ * to the engine object. - */ - static void - _engine_require_surrounding_text_cb (BusEngineProxy *engine, -@@ -2173,7 +2434,8 @@ _engine_require_surrounding_text_cb (BusEngineProxy *engine, - /** - * _engine_update_preedit_text_cb: - * -- * A function to be called when "update-preedit-text" glib signal is sent to the engine object. -+ * A function to be called when "update-preedit-text" glib signal is sent to -+ * the engine object. - */ - static void - _engine_update_preedit_text_cb (BusEngineProxy *engine, -@@ -2197,7 +2459,8 @@ _engine_update_preedit_text_cb (BusEngineProxy *engine, - /** - * _engine_update_auxiliary_text_cb: - * -- * A function to be called when "update-auxiliary-text" glib signal is sent to the engine object. -+ * A function to be called when "update-auxiliary-text" glib signal is sent to -+ * the engine object. - */ - static void - _engine_update_auxiliary_text_cb (BusEngineProxy *engine, -@@ -2217,7 +2480,8 @@ _engine_update_auxiliary_text_cb (BusEngineProxy *engine, - /** - * _engine_update_lookup_table_cb: - * -- * A function to be called when "update-lookup-table" glib signal is sent to the engine object. -+ * A function to be called when "update-lookup-table" glib signal is sent to -+ * the engine object. - */ - static void - _engine_update_lookup_table_cb (BusEngineProxy *engine, -@@ -2237,7 +2501,8 @@ _engine_update_lookup_table_cb (BusEngineProxy *engine, - /** - * _engine_register_properties_cb: - * -- * A function to be called when "register-properties" glib signal is sent to the engine object. -+ * A function to be called when "register-properties" glib signal is sent to -+ * the engine object. - */ - static void - _engine_register_properties_cb (BusEngineProxy *engine, -@@ -2256,7 +2521,8 @@ _engine_register_properties_cb (BusEngineProxy *engine, - /** - * _engine_update_property_cb: - * -- * A function to be called when "update-property" glib signal is sent to the engine object. -+ * A function to be called when "update-property" glib signal is sent to the -+ * engine object. - */ - static void - _engine_update_property_cb (BusEngineProxy *engine, -@@ -2346,10 +2612,11 @@ bus_input_context_new (BusConnection *connection, - - BusInputContext *context = NULL; - if (connection) { -- context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT, -- "object-path", path, -- "connection", bus_connection_get_dbus_connection (connection), -- NULL); -+ context = (BusInputContext *) g_object_new ( -+ BUS_TYPE_INPUT_CONTEXT, -+ "object-path", path, -+ "connection", bus_connection_get_dbus_connection (connection), -+ NULL); - } - else { - context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT, -@@ -2362,6 +2629,7 @@ bus_input_context_new (BusConnection *connection, + g_variant_new ("(uuu)", +@@ -2455,6 +2634,7 @@ bus_input_context_new (BusConnection *connection, /* it is a fake input context, just need process hotkey */ context->fake = (strncmp (client, "fake", 4) == 0); @@ -3537,83 +3842,7 @@ index e76bbdfc..2110af87 100644 if (connection) { g_object_ref_sink (connection); -@@ -2439,28 +2707,37 @@ bus_input_context_disable (BusInputContext *context) - } - } - --/* A list of signals (and their handler functions) that could be emit by the engine proxy object. */ -+/* A list of signals (and their handler functions) that could be emit by the -+ * engine proxy object. -+ */ - const static struct { - const gchar *name; - GCallback callback; - } engine_signals [] = { - { "commit-text", G_CALLBACK (_engine_commit_text_cb) }, - { "forward-key-event", G_CALLBACK (_engine_forward_key_event_cb) }, -- { "delete-surrounding-text", G_CALLBACK (_engine_delete_surrounding_text_cb) }, -- { "require-surrounding-text", G_CALLBACK (_engine_require_surrounding_text_cb) }, -+ { "delete-surrounding-text", -+ G_CALLBACK (_engine_delete_surrounding_text_cb) }, -+ { "require-surrounding-text", -+ G_CALLBACK (_engine_require_surrounding_text_cb) }, - { "update-preedit-text", G_CALLBACK (_engine_update_preedit_text_cb) }, - { "show-preedit-text", G_CALLBACK (_engine_show_preedit_text_cb) }, - { "hide-preedit-text", G_CALLBACK (_engine_hide_preedit_text_cb) }, -- { "update-auxiliary-text", G_CALLBACK (_engine_update_auxiliary_text_cb) }, -+ { "update-auxiliary-text", -+ G_CALLBACK (_engine_update_auxiliary_text_cb) }, - { "show-auxiliary-text", G_CALLBACK (_engine_show_auxiliary_text_cb) }, - { "hide-auxiliary-text", G_CALLBACK (_engine_hide_auxiliary_text_cb) }, - { "update-lookup-table", G_CALLBACK (_engine_update_lookup_table_cb) }, - { "show-lookup-table", G_CALLBACK (_engine_show_lookup_table_cb) }, - { "hide-lookup-table", G_CALLBACK (_engine_hide_lookup_table_cb) }, -- { "page-up-lookup-table", G_CALLBACK (_engine_page_up_lookup_table_cb) }, -- { "page-down-lookup-table", G_CALLBACK (_engine_page_down_lookup_table_cb) }, -- { "cursor-up-lookup-table", G_CALLBACK (_engine_cursor_up_lookup_table_cb) }, -- { "cursor-down-lookup-table", G_CALLBACK (_engine_cursor_down_lookup_table_cb) }, -+ { "page-up-lookup-table", -+ G_CALLBACK (_engine_page_up_lookup_table_cb) }, -+ { "page-down-lookup-table", -+ G_CALLBACK (_engine_page_down_lookup_table_cb) }, -+ { "cursor-up-lookup-table", -+ G_CALLBACK (_engine_cursor_up_lookup_table_cb) }, -+ { "cursor-down-lookup-table", -+ G_CALLBACK (_engine_cursor_down_lookup_table_cb) }, - { "register-properties", G_CALLBACK (_engine_register_properties_cb) }, - { "update-property", G_CALLBACK (_engine_update_property_cb) }, - { "panel-extension", G_CALLBACK (_engine_panel_extension_cb) }, -@@ -2531,9 +2808,16 @@ bus_input_context_set_engine (BusInputContext *context, - ibus_service_get_object_path ((IBusService *)context); - bus_engine_proxy_focus_in (context->engine, path, context->client); - bus_engine_proxy_enable (context->engine); -- bus_engine_proxy_set_capabilities (context->engine, context->capabilities); -- bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h); -- bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints); -+ bus_engine_proxy_set_capabilities (context->engine, -+ context->capabilities); -+ bus_engine_proxy_set_cursor_location (context->engine, -+ context->x, -+ context->y, -+ context->w, -+ context->h); -+ bus_engine_proxy_set_content_type (context->engine, -+ context->purpose, -+ context->hints); - } - } - g_signal_emit (context, -@@ -2779,7 +3063,8 @@ bus_input_context_set_capabilities (BusInputContext *context, - { - g_assert (BUS_IS_INPUT_CONTEXT (context)); - -- /* If the context does not support IBUS_CAP_FOCUS, then the client application have to handle all information such as -+ /* If the context does not support IBUS_CAP_FOCUS, then the client -+ * application have to handle all information such as - * preedit and auxiliary text. */ - if ((capabilities & IBUS_CAP_FOCUS) == 0) { - capabilities |= (IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_AUXILIARY_TEXT | IBUS_CAP_LOOKUP_TABLE | IBUS_CAP_PROPERTY); -@@ -2828,11 +3113,17 @@ bus_input_context_set_content_type (BusInputContext *context, +@@ -2938,11 +3118,17 @@ bus_input_context_set_content_type (BusInputContext *context, guint hints) { GVariant *value; @@ -3632,7 +3861,7 @@ index e76bbdfc..2110af87 100644 g_variant_unref (value); } -@@ -2842,12 +3133,24 @@ bus_input_context_commit_text_use_extension (BusInputContext *context, +@@ -2952,12 +3138,24 @@ bus_input_context_commit_text_use_extension (BusInputContext *context, gboolean use_extension) { g_assert (BUS_IS_INPUT_CONTEXT (context)); @@ -3658,7 +3887,7 @@ index e76bbdfc..2110af87 100644 GVariant *variant = ibus_serializable_serialize ( (IBusSerializable *)text); diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c -index ea8270bb..d57575ce 100644 +index ea8270bb..7ccc129d 100644 --- a/client/gtk2/ibusimcontext.c +++ b/client/gtk2/ibusimcontext.c @@ -111,7 +111,7 @@ static guint _signal_delete_surrounding_id = 0; @@ -3884,7 +4113,7 @@ index ea8270bb..d57575ce 100644 + * IBus clients. + * Each GTK application, each QT application, Xorg server, Wayland + * comppsitor are called as IBus event owners here. -+ * ++ * + * The IBus client processes the key events between the IBus event owner + * and the IBus daemon and the procedure step is to: + * @@ -3919,7 +4148,7 @@ index ea8270bb..d57575ce 100644 + * *asynchronously* with a GSource loop and forward the return value + * to the IBus event owner synchronously. So IBus clients perform + * virtually synchronously to cover problems of IBus synchronous APIs. -+ * ++ * + * The purpose of the asynchronous process is that each IBus input + * method can process the key events without D-Bus timeout and also + * the IBus synchronous process has a problem that the IBus @@ -4184,7 +4413,7 @@ index 28ae04ad..def23b25 100644 void \ ibus_input_context_##name (IBusInputContext *context) \ diff --git a/src/ibusinputcontext.h b/src/ibusinputcontext.h -index 09992148..1cb5126a 100644 +index 09992148..ca604670 100644 --- a/src/ibusinputcontext.h +++ b/src/ibusinputcontext.h @@ -2,7 +2,7 @@ @@ -4204,7 +4433,7 @@ index 09992148..1cb5126a 100644 /** * ibus_input_context_set_cursor_location: * @context: An IBusInputContext. -@@ -519,9 +518,32 @@ void ibus_input_context_set_content_type +@@ -519,9 +518,38 @@ void ibus_input_context_set_content_type * * See also ibus_engine_update_preedit_text_with_mode(). */ @@ -4220,6 +4449,9 @@ index 09992148..1cb5126a 100644 + * @enable: Can use ibus_input_context_post_process_key_event() to retrieve + * commit-text and forwar-key-event signals during + * calling ibus_input_context_process_key_event() if it's %TRUE. ++ * ++ * Since: 1.5.00 ++ * Stability: Unstable + */ +void ibus_input_context_set_post_process_key_event + (IBusInputContext *context, @@ -4233,6 +4465,9 @@ index 09992148..1cb5126a 100644 + * calling ibus_input_context_process_key_event(). + * + * See also ibus_input_context_set_post_process_key_event(). ++ * ++ * Since: 1.5.00 ++ * Stability: Unstable + */ +void ibus_input_context_post_process_key_event + (IBusInputContext *context); @@ -4242,15 +4477,15 @@ index 09992148..1cb5126a 100644 -- 2.41.0 -From dd7e85890ced5e53d982f02f5b11ef5a36e2eab8 Mon Sep 17 00:00:00 2001 +From e495f8068380856c01fd22ceebb9398072fd65d8 Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Sun, 9 Jul 2023 18:48:21 +0900 -Subject: [PATCH 2/2] client/x11: Fix sync +Date: Wed, 12 Jul 2023 07:52:21 +0900 +Subject: [PATCH 3/3] client/x11: Fix sync ibus_input_context_process_key_event() Fix the synchronous "ProcessKeyEvent" D-Bus method in ibus-x11 too. -Fixes: https://github.com/ibus/ibus/commit/a73ea2c +Fixes: https://github.com/ibus/ibus/commit/3670faf BUG=https://github.com/ibus/ibus/issues/2486 --- diff --git a/ibus.spec b/ibus.spec index 8b73f26..b2d61e8 100644 --- a/ibus.spec +++ b/ibus.spec @@ -50,7 +50,7 @@ Name: ibus Version: 1.5.28 -Release: 12%{?dist} +Release: 13%{?dist} Summary: Intelligent Input Bus for Linux OS License: LGPL-2.0-or-later URL: https://github.com/ibus/%name/wiki @@ -557,6 +557,9 @@ dconf update || : %{_datadir}/installed-tests/ibus %changelog +* Wed Jul 12 2023 Takao Fujiwara - 1.5.28-13 +- Fix sync ibus_input_context_process_key_event() #3 + * Sun Jul 09 2023 Takao Fujiwara - 1.5.28-12 - Fix sync ibus_input_context_process_key_event() #2