diff options
author | fujiwarat <takao.fujiwara1@gmail.com> | 2022-09-21 21:08:33 +0900 |
---|---|---|
committer | fujiwarat <takao.fujiwara1@gmail.com> | 2022-09-21 21:08:33 +0900 |
commit | ddead515d9d53fc692af252f610b009660494e21 (patch) | |
tree | 6b73c24c867241aecee22276855846b63e144643 | |
parent | 781119be4f646f06197badb73398a41d5acca787 (diff) | |
download | ibus-ddead515d9d53fc692af252f610b009660494e21.tar.gz |
client/gtk2: Update surrounding text properties by focus in
ibus_input_context_set_surrounding_text() should be succeeded
if input contexts are different so that ibus engines can
update surrounding text properties with focus in event.
When an input context is created newly, RequireSurroundingText D-Bus
signal could not be received yet and set_surrounding_text() is failed.
Now "require-surrounding-text" signal is added to IBusInputContext
and clients can call set_surrounding_text() later.
BUG=https://github.com/ibus/ibus/issues/2423
-rw-r--r-- | client/gtk2/ibusimcontext.c | 25 | ||||
-rw-r--r-- | src/ibusinputcontext.c | 29 |
2 files changed, 53 insertions, 1 deletions
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c index eaf7eb90..6e338157 100644 --- a/client/gtk2/ibusimcontext.c +++ b/client/gtk2/ibusimcontext.c @@ -70,6 +70,7 @@ struct _IBusIMContext { #endif IBusInputContext *ibuscontext; + IBusInputContext *ibuscontext_needs_surrounding; /* preedit status */ gchar *preedit_string; @@ -985,6 +986,7 @@ ibus_im_context_init (GObject *obj) ibusimcontext->cursor_area.height = 0; ibusimcontext->ibuscontext = NULL; + ibusimcontext->ibuscontext_needs_surrounding = NULL; ibusimcontext->has_focus = FALSE; ibusimcontext->time = GDK_CURRENT_TIME; #ifdef ENABLE_SURROUNDING @@ -2184,6 +2186,18 @@ _ibus_context_hide_preedit_text_cb (IBusInputContext *ibuscontext, } static void +_ibus_context_require_surrounding_text_cb (IBusInputContext *ibuscontext, + IBusIMContext *ibusimcontext) +{ + IDEBUG ("%s", __FUNCTION__); + g_assert (ibusimcontext->ibuscontext == ibuscontext); + if (ibusimcontext->ibuscontext_needs_surrounding == ibuscontext) { + _request_surrounding_text (ibusimcontext); + ibusimcontext->ibuscontext_needs_surrounding = NULL; + } +} + +static void _ibus_context_destroy_cb (IBusInputContext *ibuscontext, IBusIMContext *ibusimcontext) { @@ -2249,6 +2263,11 @@ _create_input_context_done (IBusBus *bus, "hide-preedit-text", G_CALLBACK (_ibus_context_hide_preedit_text_cb), ibusimcontext); + g_signal_connect ( + ibusimcontext->ibuscontext, + "require-surrounding-text", + G_CALLBACK (_ibus_context_require_surrounding_text_cb), + ibusimcontext); g_signal_connect (ibusimcontext->ibuscontext, "destroy", G_CALLBACK (_ibus_context_destroy_cb), ibusimcontext); @@ -2265,6 +2284,12 @@ _create_input_context_done (IBusBus *bus, ibus_input_context_focus_in (ibusimcontext->ibuscontext); _set_cursor_location_internal (ibusimcontext); + if (ibus_input_context_needs_surrounding_text ( + ibusimcontext->ibuscontext)) { + _request_surrounding_text (ibusimcontext); + } else { + ibusimcontext->ibuscontext_needs_surrounding = ibusimcontext->ibuscontext; + } } if (!g_queue_is_empty (ibusimcontext->events_queue)) { diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c index 7981de38..28ae04ad 100644 --- a/src/ibusinputcontext.c +++ b/src/ibusinputcontext.c @@ -2,7 +2,7 @@ /* vim:set et sts=4: */ /* ibus - The Input Bus * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com> - * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com> + * Copyright (C) 2018-2022 Takao Fujiwara <takao.fujiwara1@gmail.com> * Copyright (C) 2008-2019 Red Hat, Inc. * * This library is free software; you can redistribute it and/or @@ -55,6 +55,7 @@ enum { CURSOR_DOWN_LOOKUP_TABLE, REGISTER_PROPERTIES, UPDATE_PROPERTY, + REQUIRE_SURROUNDING_TEXT, LAST_SIGNAL, }; @@ -488,6 +489,21 @@ ibus_input_context_class_init (IBusInputContextClass *class) 1, IBUS_TYPE_PROPERTY); + /** + * IBusInputContext::require-surrounding-text: + * @context: An IBusInputContext. + * + * Emitted to receive the RequireSurroundingText signal from the daemon. + */ + context_signals[REQUIRE_SURROUNDING_TEXT] = + g_signal_new (I_("require-surrounding-text"), + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + _ibus_marshal_VOID__VOID, + G_TYPE_NONE, 0); + text_empty = ibus_text_new_from_static_string (""); g_object_ref_sink (text_empty); } @@ -735,6 +751,7 @@ ibus_input_context_g_signal (GDBusProxy *proxy, if (g_strcmp0 (signal_name, "RequireSurroundingText") == 0) { priv->needs_surrounding_text = TRUE; + g_signal_emit (context, context_signals[REQUIRE_SURROUNDING_TEXT], 0); return; } @@ -1116,9 +1133,19 @@ ibus_input_context_set_surrounding_text (IBusInputContext *context, priv = IBUS_INPUT_CONTEXT_GET_PRIVATE (context); + /* This API should send "SetSurroundingText" D-Bus method when + * input contexts are switched between tabs in a text application + * so that engines can receive the updated surrounding texts after + * focus-in events happen. + * + * GNOME shell uses a single input context and the address of the input + * contexts are always same. So check the address of texts if the input + * contexts on applications are switched. + */ if (cursor_pos != priv->surrounding_cursor_pos || anchor_pos != priv->selection_anchor_pos || priv->surrounding_text == NULL || + text != priv->surrounding_text || g_strcmp0 (text->text, priv->surrounding_text->text) != 0) { if (priv->surrounding_text) g_object_unref (priv->surrounding_text); |