diff --git a/client/gtk3/ibusimcontext.c b/client/gtk3/ibusimcontext.c index e4de52d..50290c5 100644 --- a/client/gtk3/ibusimcontext.c +++ b/client/gtk3/ibusimcontext.c @@ -2,8 +2,8 @@ /* vim:set et sts=4: */ /* ibus - The Input Bus * Copyright (C) 2008-2013 Peng Huang - * Copyright (C) 2015-2017 Takao Fujiwara - * Copyright (C) 2008-2017 Red Hat, Inc. + * Copyright (C) 2015-2019 Takao Fujiwara + * Copyright (C) 2008-2019 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -61,6 +61,7 @@ struct _IBusIMContext { PangoAttrList *preedit_attrs; gint preedit_cursor_pos; gboolean preedit_visible; + guint preedit_mode; GdkRectangle cursor_area; gboolean has_focus; @@ -71,6 +72,10 @@ struct _IBusIMContext { /* cancellable */ GCancellable *cancellable; GQueue *events_queue; + +#if !GTK_CHECK_VERSION (3, 93, 0) + gboolean use_button_press_event; +#endif }; struct _IBusIMContextClass { @@ -132,8 +137,14 @@ static void ibus_im_context_set_surrounding gint len, gint cursor_index); - /* static methods*/ +static void _ibus_context_update_preedit_text_cb + (IBusInputContext *ibuscontext, + IBusText *text, + gint cursor_pos, + gboolean visible, + guint mode, + IBusIMContext *ibusimcontext); static void _create_input_context (IBusIMContext *context); static gboolean _set_cursor_location_internal (IBusIMContext *context); @@ -163,7 +174,6 @@ static void _create_fake_input_context (void); static gboolean _set_content_type (IBusIMContext *context); - static GType _ibus_type_im_context = 0; static GtkIMContextClass *parent_class = NULL; @@ -291,6 +301,7 @@ ibus_im_context_commit_event (IBusIMContext *ibusimcontext, IBusText *text = ibus_text_new_from_unichar (ch); g_signal_emit (ibusimcontext, _signal_commit_id, 0, text->text); g_object_unref (text); + _request_surrounding_text (ibusimcontext); return TRUE; } return FALSE; @@ -303,7 +314,6 @@ _process_key_event_done (GObject *object, { IBusInputContext *context = (IBusInputContext *)object; GdkEventKey *event = (GdkEventKey *) user_data; - GError *error = NULL; gboolean retval = ibus_input_context_process_key_event_async_finish ( context, @@ -352,12 +362,10 @@ _process_key_event (IBusInputContext *context, retval = TRUE; } - if (retval) { + if (retval) event->state |= IBUS_HANDLED_MASK; - } - else { + else event->state |= IBUS_IGNORED_MASK; - } return retval; } @@ -379,9 +387,12 @@ _request_surrounding_text (IBusIMContext *context) g_signal_emit (context, _signal_retrieve_surrounding_id, 0, &return_value); if (!return_value) { - context->caps &= ~IBUS_CAP_SURROUNDING_TEXT; - ibus_input_context_set_capabilities (context->ibuscontext, - context->caps); + /* #2054 firefox::IMContextWrapper::GetCurrentParagraph() could + * fail with the first typing on firefox but it succeeds with + * the second typing. + */ + g_warning ("%s has no capability of surrounding-text feature", + g_get_prgname ()); } } } @@ -552,6 +563,10 @@ daemon_name_appeared (GDBusConnection *connection, const gchar *owner, gpointer data) { + if (!g_strcmp0 (ibus_bus_get_service_name (_bus), IBUS_SERVICE_PORTAL)) { + _daemon_is_running = TRUE; + return; + } /* If ibus-daemon is running and run ssh -X localhost, * daemon_name_appeared() is called but ibus_get_address() == NULL * because the hostname and display number are different between @@ -744,6 +759,7 @@ ibus_im_context_init (GObject *obj) ibusimcontext->preedit_attrs = NULL; ibusimcontext->preedit_cursor_pos = 0; ibusimcontext->preedit_visible = FALSE; + ibusimcontext->preedit_mode = IBUS_ENGINE_PREEDIT_CLEAR; // Init cursor area ibusimcontext->cursor_area.x = -1; @@ -854,6 +870,36 @@ ibus_im_context_finalize (GObject *obj) G_OBJECT_CLASS(parent_class)->finalize (obj); } +static void +ibus_im_context_clear_preedit_text (IBusIMContext *ibusimcontext) +{ + gchar *preedit_string = NULL; + g_assert (ibusimcontext->ibuscontext); + if (ibusimcontext->preedit_visible && + ibusimcontext->preedit_mode == IBUS_ENGINE_PREEDIT_COMMIT) { + preedit_string = g_strdup (ibusimcontext->preedit_string); + } + + /* Clear the preedit_string but keep the preedit_cursor_pos and + * preedit_visible because a time lag could happen, firefox commit + * the preedit text before the preedit text is cleared and it cause + * a double commits of the Hangul preedit in firefox if the preedit + * would be located on the URL bar and click on anywhere of firefox + * out of the URL bar. + */ + _ibus_context_update_preedit_text_cb (ibusimcontext->ibuscontext, + ibus_text_new_from_string (""), + ibusimcontext->preedit_cursor_pos, + ibusimcontext->preedit_visible, + IBUS_ENGINE_PREEDIT_CLEAR, + ibusimcontext); + if (preedit_string) { + g_signal_emit (ibusimcontext, _signal_commit_id, 0, preedit_string); + g_free (preedit_string); + _request_surrounding_text (ibusimcontext); + } +} + static gboolean ibus_im_context_filter_keypress (GtkIMContext *context, GdkEventKey *event) @@ -1003,6 +1049,7 @@ ibus_im_context_focus_out (GtkIMContext *context) ibusimcontext->has_focus = FALSE; if (ibusimcontext->ibuscontext) { + ibus_im_context_clear_preedit_text (ibusimcontext); ibus_input_context_focus_out (ibusimcontext->ibuscontext); } @@ -1022,6 +1069,13 @@ ibus_im_context_reset (GtkIMContext *context) IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context); if (ibusimcontext->ibuscontext) { + /* Commented out ibus_im_context_clear_preedit_text(). + * Hangul needs to receive the reset callback with button press + * but other IMEs should avoid to receive the reset callback + * by themselves. + * IBus uses button-press-event instead until GTK is fixed. + * https://gitlab.gnome.org/GNOME/gtk/issues/1534 + */ ibus_input_context_reset (ibusimcontext->ibuscontext); } gtk_im_context_reset (ibusimcontext->slave); @@ -1068,21 +1122,80 @@ ibus_im_context_get_preedit_string (GtkIMContext *context, } +#if !GTK_CHECK_VERSION (3, 93, 0) +/* Use the button-press-event signal until GtkIMContext always emits the reset + * signal. + * https://gitlab.gnome.org/GNOME/gtk/merge_requests/460 + */ +static gboolean +ibus_im_context_button_press_event_cb (GtkWidget *widget, + GdkEventButton *event, + IBusIMContext *ibusimcontext) +{ + if (event->button != 1) + return FALSE; + + if (ibusimcontext->ibuscontext) { + ibus_im_context_clear_preedit_text (ibusimcontext); + ibus_input_context_reset (ibusimcontext->ibuscontext); + } + return FALSE; +} + +static void +_connect_button_press_event (IBusIMContext *ibusimcontext, + gboolean do_connect) +{ + GtkWidget *widget = NULL; + + g_assert (ibusimcontext->client_window); + gdk_window_get_user_data (ibusimcontext->client_window, + (gpointer *)&widget); + /* firefox needs GtkWidget instead of GtkWindow */ + if (GTK_IS_WIDGET (widget)) { + if (do_connect) { + g_signal_connect ( + widget, + "button-press-event", + G_CALLBACK (ibus_im_context_button_press_event_cb), + ibusimcontext); + ibusimcontext->use_button_press_event = TRUE; + } else { + g_signal_handlers_disconnect_by_func ( + widget, + G_CALLBACK (ibus_im_context_button_press_event_cb), + ibusimcontext); + ibusimcontext->use_button_press_event = FALSE; + } + } +} +#endif + static void ibus_im_context_set_client_window (GtkIMContext *context, GdkWindow *client) { + IBusIMContext *ibusimcontext; + IDEBUG ("%s", __FUNCTION__); - IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context); + ibusimcontext = IBUS_IM_CONTEXT (context); if (ibusimcontext->client_window) { +#if !GTK_CHECK_VERSION (3, 93, 0) + if (ibusimcontext->use_button_press_event) + _connect_button_press_event (ibusimcontext, FALSE); +#endif g_object_unref (ibusimcontext->client_window); ibusimcontext->client_window = NULL; } - if (client != NULL) + if (client != NULL) { ibusimcontext->client_window = g_object_ref (client); - +#if !GTK_CHECK_VERSION (3, 93, 0) + if (!ibusimcontext->use_button_press_event) + _connect_button_press_event (ibusimcontext, TRUE); +#endif + } if (ibusimcontext->slave) gtk_im_context_set_client_window (ibusimcontext->slave, client); } @@ -1393,6 +1506,7 @@ _key_is_modifier (guint keyval) return FALSE; } } + /* Copy from gdk */ static GdkEventKey * _create_gdk_event (IBusIMContext *ibusimcontext, @@ -1530,6 +1644,7 @@ _ibus_context_update_preedit_text_cb (IBusInputContext *ibuscontext, IBusText *text, gint cursor_pos, gboolean visible, + guint mode, IBusIMContext *ibusimcontext) { IDEBUG ("%s", __FUNCTION__); @@ -1545,6 +1660,15 @@ _ibus_context_update_preedit_text_cb (IBusInputContext *ibuscontext, ibusimcontext->preedit_attrs = NULL; } +#if !GTK_CHECK_VERSION (3, 93, 0) + if (!ibusimcontext->use_button_press_event && + mode == IBUS_ENGINE_PREEDIT_COMMIT) { + if (ibusimcontext->client_window) { + _connect_button_press_event (ibusimcontext, TRUE); + } + } +#endif + str = text->text; ibusimcontext->preedit_string = g_strdup (str); if (text->attrs) { @@ -1586,6 +1710,7 @@ _ibus_context_update_preedit_text_cb (IBusInputContext *ibuscontext, flag = ibusimcontext->preedit_visible != visible; ibusimcontext->preedit_visible = visible; + ibusimcontext->preedit_mode = mode; if (ibusimcontext->preedit_visible) { if (flag) { @@ -1676,7 +1801,7 @@ _create_input_context_done (IBusBus *bus, g_error_free (error); } else { - + ibus_input_context_set_client_commit_preedit (context, TRUE); ibusimcontext->ibuscontext = context; g_signal_connect (ibusimcontext->ibuscontext, @@ -1692,7 +1817,7 @@ _create_input_context_done (IBusBus *bus, G_CALLBACK (_ibus_context_delete_surrounding_text_cb), ibusimcontext); g_signal_connect (ibusimcontext->ibuscontext, - "update-preedit-text", + "update-preedit-text-with-mode", G_CALLBACK (_ibus_context_update_preedit_text_cb), ibusimcontext); g_signal_connect (ibusimcontext->ibuscontext, diff --git a/po/sv.po b/po/sv.po index d7593be..3ec90e6 100644 --- a/po/sv.po +++ b/po/sv.po @@ -16,11 +16,11 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2018-05-10 10:16+0000\n" +"PO-Revision-Date: 2018-08-17 06:36+0000\n" "Last-Translator: Göran Uddeborg \n" "Language-Team: Swedish\n" "Language: sv\n" -"X-Generator: Zanata 4.4.5\n" +"X-Generator: Zanata 4.6.0\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../setup/setup.ui.h:1 @@ -234,27 +234,27 @@ msgstr "Inmatningsmetod" msgid "" "The shortcut keys to enable conversions of emoji annotations or Unicode " "names" -msgstr "" +msgstr "Kortkommandot för att aktivera emoji-annoteringar eller Unicode-namn" #: ../setup/setup.ui.h:50 msgid "Emoji annotation:" -msgstr "" +msgstr "Emoji-annoteringar:" #: ../setup/setup.ui.h:51 msgid "The shortcut keys to enable Unicode code point conversions" -msgstr "" +msgstr "Kortkommandon för att aktivera konverteringar av Unicode-kodpunkter" #: ../setup/setup.ui.h:52 msgid "Unicode code point:" -msgstr "" +msgstr "Unicode-kodpunkter:" #: ../setup/setup.ui.h:53 msgid "Set a font of Unicode candidates on the emoji dialog" -msgstr "" +msgstr "Ange ett typsnitt för Unicode-kandidater i emoji-dialogen" #: ../setup/setup.ui.h:54 msgid "Unicode font:" -msgstr "" +msgstr "Unicode-typsnitt:" #: ../setup/setup.ui.h:55 msgid "Set a language of emoji annotations on the emoji dialog" @@ -572,11 +572,11 @@ msgstr "Anpassat typsnittsnamn till språkpanelen" #: ../data/ibus.schemas.in.h:50 msgid "Unicode shortcut keys for gtk_accelerator_parse" -msgstr "" +msgstr "Unicode-kortkommandon för gtk_accelerator_parse" #: ../data/ibus.schemas.in.h:51 msgid "The shortcut keys for turning Unicode typing on or off" -msgstr "" +msgstr "Kortkommandot för att slå på och av Unicode-inmatning" #: ../data/ibus.schemas.in.h:52 msgid "Emoji shortcut keys for gtk_accelerator_parse" @@ -660,7 +660,7 @@ msgstr "" #: ../data/ibus.schemas.in.h:67 msgid "Load the emoji data at the time of startup" -msgstr "" +msgstr "Läs in emoji-data vid uppstartstillfället" #: ../data/ibus.schemas.in.h:68 msgid "" @@ -668,10 +668,13 @@ msgid "" "needed to load the data. Load the emoji data when open the emoji dialog at " "the beginning if false." msgstr "" +"Läs in emoji-data vid uppstartstillfället om sant. Ungefär 10 MB minne " +"behövs för att läsa in datan. Läs emoji-datan när emoji-dialogen öppnas i " +"början om falskt." #: ../data/ibus.schemas.in.h:69 msgid "Load the Unicode data at the time of startup" -msgstr "" +msgstr "Läs in Unicode-data vid uppstartstillfället" #: ../data/ibus.schemas.in.h:70 msgid "" @@ -680,6 +683,10 @@ msgid "" "the beginning if false. The Unicode data is always loaded after the emoji " "data is loaded even if true." msgstr "" +"Läs in Unicode-data vid uppstartstillfället om sant. Ungefär 15 MB minne " +"behövs för att läsa in datan. Läs Unicode-datan när emoji-dialogen öppnas i " +"början om falskt. Unicode-datan läses alltid in efter emoji-datan läses in " +"även om sant." #: ../data/ibus.schemas.in.h:71 msgid "Embed Preedit Text" @@ -2885,6 +2892,8 @@ msgid "" "Use engine schema paths instead of ibus core, which can be comma-separated " "values." msgstr "" +"Använd motorschemasökvägar istället för ibus-kärnan, vilket kan vara " +"kommaseparerade värden." #: ../tools/main.vala:381 msgid "Resetting…" @@ -2996,7 +3005,7 @@ msgstr "Visa emoji-varianter" #: ../ui/gtk3/emojier.vala:1082 msgid "Close" -msgstr "" +msgstr "Stäng" #: ../ui/gtk3/emojier.vala:1088 msgid "Menu" @@ -3004,7 +3013,7 @@ msgstr "Meny" #: ../ui/gtk3/emojier.vala:1099 msgid "Click to view a warning message" -msgstr "" +msgstr "Klicka för att visa ett varningsmeddelande" #: ../ui/gtk3/emojier.vala:1143 msgid "Loading a Unicode dictionary:" @@ -3059,6 +3068,10 @@ msgid "" " E.g. Press Esc key several times to release the emoji typing mode, click " "your desktop and click your text application again." msgstr "" +"Misslyckades att få det aktuella textprogrammet. Fokusera om ditt program. " +"T.ex. tryck Esc-tangenten flera gånger för att släppa emoji-" +"inskrivningsläget, klicka på ditt skrivbord och klicka på ditt textprogram " +"igen." #: ../ui/gtk3/emojierapp.vala:58 msgid "Canceled to choose an emoji." diff --git a/po/zh_TW.po b/po/zh_TW.po index 295b67e..9cc4364 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -22,12 +22,12 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2018-06-08 02:11+0000\n" +"PO-Revision-Date: 2018-08-14 10:13+0000\n" "Last-Translator: Peter Pan \n" "Language-Team: Chinese (Taiwan) \n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Zanata 4.4.5\n" +"X-Generator: Zanata 4.6.0\n" #: ../setup/setup.ui.h:1 msgid "Horizontal" @@ -232,27 +232,27 @@ msgstr "輸入法" msgid "" "The shortcut keys to enable conversions of emoji annotations or Unicode " "names" -msgstr "" +msgstr "啟用 Emoji 符號或 Unicode 名稱轉換的快捷鍵" #: ../setup/setup.ui.h:50 msgid "Emoji annotation:" -msgstr "" +msgstr "Emoji 符號:" #: ../setup/setup.ui.h:51 msgid "The shortcut keys to enable Unicode code point conversions" -msgstr "" +msgstr "啟用 Unicode 碼位轉換的快捷鍵" #: ../setup/setup.ui.h:52 msgid "Unicode code point:" -msgstr "" +msgstr "Unicode 碼位:" #: ../setup/setup.ui.h:53 msgid "Set a font of Unicode candidates on the emoji dialog" -msgstr "" +msgstr "設定 Emoji 對話框上的 Unicode 候選字型" #: ../setup/setup.ui.h:54 msgid "Unicode font:" -msgstr "" +msgstr "Unicode 字體:" #: ../setup/setup.ui.h:55 msgid "Set a language of emoji annotations on the emoji dialog" @@ -548,11 +548,11 @@ msgstr "為語言面板自訂字型" #: ../data/ibus.schemas.in.h:50 msgid "Unicode shortcut keys for gtk_accelerator_parse" -msgstr "" +msgstr "gtk_accelerator_parse 的 Unicode 快捷鍵" #: ../data/ibus.schemas.in.h:51 msgid "The shortcut keys for turning Unicode typing on or off" -msgstr "" +msgstr "開啟或關閉 Unicode 輸入的快捷鍵" #: ../data/ibus.schemas.in.h:52 msgid "Emoji shortcut keys for gtk_accelerator_parse" @@ -627,7 +627,7 @@ msgstr "選擇下列部分符合繪文字註解的條件之一:0 == 前綴符� #: ../data/ibus.schemas.in.h:67 msgid "Load the emoji data at the time of startup" -msgstr "" +msgstr "每次開啟時載入 Emoji 資料" #: ../data/ibus.schemas.in.h:68 msgid "" @@ -635,10 +635,12 @@ msgid "" "needed to load the data. Load the emoji data when open the emoji dialog at " "the beginning if false." msgstr "" +"如果為 True 則在每次開啟時載入 Emoji 資料,載入資料大約需要 10MB 的記憶體大小。當設定為 False 時則在第一次開啟 Emoji " +"對話框時載入 Emoji 資料。" #: ../data/ibus.schemas.in.h:69 msgid "Load the Unicode data at the time of startup" -msgstr "" +msgstr "每次開啟時載入 Unicode 資料" #: ../data/ibus.schemas.in.h:70 msgid "" @@ -647,6 +649,8 @@ msgid "" "the beginning if false. The Unicode data is always loaded after the emoji " "data is loaded even if true." msgstr "" +"如果為 True 則在每次開啟時載入 Unicode 資料。載入資料需要大約 15MB 大小的記憶體。如果設定為 False 則在第一次開啟 Emoji " +"對話框時載入 Unicode 資料,就算設定為 True,Unicode 資料永遠都會在 Emoji 資料載入後才載入。" #: ../data/ibus.schemas.in.h:71 msgid "Embed Preedit Text" @@ -2847,7 +2851,7 @@ msgstr "寫入註冊快取 FILE。" msgid "" "Use engine schema paths instead of ibus core, which can be comma-separated " "values." -msgstr "" +msgstr "使用引擎基模位置取代 ibus 核心,可以透過逗號分割字串。" #: ../tools/main.vala:381 msgid "Resetting…" @@ -2959,7 +2963,7 @@ msgstr "顯示繪文字變化" #: ../ui/gtk3/emojier.vala:1082 msgid "Close" -msgstr "" +msgstr "關閉" #: ../ui/gtk3/emojier.vala:1088 msgid "Menu" @@ -2967,7 +2971,7 @@ msgstr "選單" #: ../ui/gtk3/emojier.vala:1099 msgid "Click to view a warning message" -msgstr "" +msgstr "點擊顯示警告訊息" #: ../ui/gtk3/emojier.vala:1143 msgid "Loading a Unicode dictionary:" @@ -3022,6 +3026,7 @@ msgid "" " E.g. Press Esc key several times to release the emoji typing mode, click " "your desktop and click your text application again." msgstr "" +"無法取得目前的文字應用程式,請重新取回您應用程式的焦點。例如按幾次 Esc 退出 Emoji 輸入模式後,按一下桌面再重按您的文字應用程式一次。" #: ../ui/gtk3/emojierapp.vala:58 msgid "Canceled to choose an emoji."