summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfujiwarat <takao.fujiwara1@gmail.com>2022-09-21 21:08:33 +0900
committerfujiwarat <takao.fujiwara1@gmail.com>2022-09-21 21:08:33 +0900
commitddead515d9d53fc692af252f610b009660494e21 (patch)
tree6b73c24c867241aecee22276855846b63e144643
parent781119be4f646f06197badb73398a41d5acca787 (diff)
downloadibus-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.c25
-rw-r--r--src/ibusinputcontext.c29
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);