Skip to content

Commit

Permalink
client/gtk2: Update surrounding text properties by focus in
Browse files Browse the repository at this point in the history
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=#2423
  • Loading branch information
fujiwarat committed Sep 21, 2022
1 parent 781119b commit ddead51
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
25 changes: 25 additions & 0 deletions client/gtk2/ibusimcontext.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ struct _IBusIMContext {
#endif

IBusInputContext *ibuscontext;
IBusInputContext *ibuscontext_needs_surrounding;

/* preedit status */
gchar *preedit_string;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -2183,6 +2185,18 @@ _ibus_context_hide_preedit_text_cb (IBusInputContext *ibuscontext,
g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0);
}

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)
Expand Down Expand Up @@ -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);
Expand All @@ -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)) {
Expand Down
29 changes: 28 additions & 1 deletion src/ibusinputcontext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -55,6 +55,7 @@ enum {
CURSOR_DOWN_LOOKUP_TABLE,
REGISTER_PROPERTIES,
UPDATE_PROPERTY,
REQUIRE_SURROUNDING_TEXT,
LAST_SIGNAL,
};

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit ddead51

Please sign in to comment.