diff --git a/0001-Fix-ibus-setup-startup-failure.patch b/0001-Fix-ibus-setup-startup-failure.patch deleted file mode 100644 index 07ae476..0000000 --- a/0001-Fix-ibus-setup-startup-failure.patch +++ /dev/null @@ -1,39 +0,0 @@ -From ff13b86247701950d525a3949c31dc94885f63eb Mon Sep 17 00:00:00 2001 -From: yangxianzhao -Date: Fri, 15 Sep 2023 10:45:17 +0800 -Subject: [PATCH] Fix ibus setup startup failure - ---- - setup/i18n.py | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/setup/i18n.py b/setup/i18n.py -index 976d1ae..182022b 100644 ---- a/setup/i18n.py -+++ b/setup/i18n.py -@@ -23,9 +23,11 @@ - import locale - import gettext - import os -+import sys - - DOMAINNAME = "ibus10" - -+PY3K = sys.version_info >= (3, 0) - _ = lambda a: gettext.dgettext(DOMAINNAME, a) - N_ = lambda a: a - -@@ -42,7 +44,9 @@ def init_textdomain(domainname): - except AttributeError: - pass - gettext.bindtextdomain(domainname, LOCALEDIR) -- gettext.bind_textdomain_codeset(domainname, 'UTF-8') -+ # https://docs.python.org/3/library/gettext.html#gettext.lgettext -+ if not PY3K: -+ gettext.bind_textdomain_codeset(domainname, 'UTF-8') - - def gettext_engine_longname(engine): - name = engine.get_name() --- -2.41.0 - diff --git a/ibus-1.5.23.tar.gz b/ibus-1.5.23.tar.gz deleted file mode 100644 index 1425490..0000000 Binary files a/ibus-1.5.23.tar.gz and /dev/null differ diff --git a/ibus-1.5.29-rc2.tar.gz b/ibus-1.5.29-rc2.tar.gz new file mode 100644 index 0000000..20e8620 Binary files /dev/null and b/ibus-1.5.29-rc2.tar.gz differ diff --git a/ibus-1385349-segv-bus-proxy.patch b/ibus-1385349-segv-bus-proxy.patch index 91ca4a7..a82d795 100644 --- a/ibus-1385349-segv-bus-proxy.patch +++ b/ibus-1385349-segv-bus-proxy.patch @@ -1,36 +1,50 @@ -From 41c325dfb32269c9aadfeedb4df44656aac4d883 Mon Sep 17 00:00:00 2001 +From 68996e1430e3478bda1201d8e31a82679b2659a4 Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Fri, 20 Nov 2020 09:53:54 +0900 +Date: Sat, 30 Sep 2023 11:50:14 +0900 Subject: [PATCH] Fix SEGV in bus_panel_proxy_focus_in() - + rhbz#1350291 SEGV in BUS_IS_CONNECTION(skip_connection) in bus_dbus_impl_dispatch_message_by_rule() check if dbus_connection is closed in bus_dbus_impl_connection_filter_cb(). - + rhbz#1767976 SEGV in assert(connection != NULL) in bus_dbus_impl_connection_filter_cb() call bus_connection_set_filter() in bus_dbus_impl_destroy(). - + +rhbz#2213445 SEGV in bus_panel_proxy_new() +WIP: Add a GError. + rhbz#1601577 rhbz#1797726 SEGV in ibus_engine_desc_get_layout() in bus_engine_proxy_new_internal() -WIP: Added a GError to get the error message to check why the SEGV happened. - +WIP: Add a GError to get the error message to check why the SEGV happened. + rhbz#1663528 SEGV in g_mutex_clear() in bus_dbus_impl_destroy() If the mutex is not unlocked, g_mutex_clear() causes assert. - + rhbz#1767691 SEGV in client/x11/main.c:_sighandler(). Do not call atexit functions in _sighandler(). - -rhbz#1795499 SEGV in ibus_bus_get_bus_address() because of no _bus->priv. + +rhbz#2195895 SEGV in client/x11/main.c:_xim_set_cursor_location() +check if IBusInputContext was disconnected. + +rhbz#1795499 rhbz#1936777 SEGV in ibus_bus_get_bus_address() because of +no _bus->priv. _changed_cb() should not be called after ibus_bus_destroy() is called. - + rhbz#1771238 SEGV in assert(m_loop == null) in switcher.vala. Grabbing keyboard could be failed and switcher received the keyboard events and m_loop was not released. - + rhbz#1797120 SEGV in assert(bus.is_connected()) in panel_binding_construct() Check m_ibus in extension.vala:bus_name_acquired_cb() - + +rhbz#2151344 SEGV with portal_context->owner in name_owner_changed() +Maybe g_object_unref() is called but not finalized yet. + +rhbz#2239633 SEGV with g_object_unref() in +ibus_portal_context_handle_destroy() +Connect "handle-destroy" signal after g_list_prepend(). + BUG=rhbz#1350291 BUG=rhbz#1601577 BUG=rhbz#1663528 @@ -39,15 +53,20 @@ BUG=rhbz#1795499 BUG=rhbz#1771238 BUG=rhbz#1767976 BUG=rhbz#1797120 +BUG=rhbz#2151344 +BUG=rhbz#2195895 +BUG=rhbz#2239633 --- bus/dbusimpl.c | 47 ++++++++++++++++++++++++--- - bus/engineproxy.c | 51 ++++++++++++++++++++++------- - client/x11/main.c | 8 ++++- - src/ibusbus.c | 5 +++ + bus/engineproxy.c | 44 +++++++++++++++++++------ + bus/panelproxy.c | 9 +++++- + client/x11/main.c | 56 ++++++++++++++++++++++++++++---- + portal/portal.c | 25 ++++++++++++--- + src/ibusbus.c | 6 ++++ ui/gtk3/extension.vala | 4 +++ ui/gtk3/switcher.vala | 73 +++++++++++++++++++++++++----------------- - 6 files changed, 141 insertions(+), 47 deletions(-) - + 8 files changed, 208 insertions(+), 56 deletions(-) + diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c index 59787a80..af2fbde2 100644 --- a/bus/dbusimpl.c @@ -137,10 +156,10 @@ index 59787a80..af2fbde2 100644 if (incoming) { /* is incoming message */ diff --git a/bus/engineproxy.c b/bus/engineproxy.c -index 2d98995c..bbbe5532 100644 +index b3e16066..ba479b59 100644 --- a/bus/engineproxy.c +++ b/bus/engineproxy.c -@@ -660,20 +660,33 @@ bus_engine_proxy_g_signal (GDBusProxy *proxy, +@@ -693,10 +693,12 @@ bus_engine_proxy_g_signal (GDBusProxy *proxy, g_return_if_reached (); } @@ -152,16 +171,14 @@ index 2d98995c..bbbe5532 100644 + GDBusConnection *connection, + GError **error) { -+ GDBusProxyFlags flags; -+ BusEngineProxy *engine; -+ + GDBusProxyFlags flags; + BusEngineProxy *engine; +@@ -706,12 +708,20 @@ bus_engine_proxy_new_internal (const gchar *path, g_assert (path); g_assert (IBUS_IS_ENGINE_DESC (desc)); g_assert (G_IS_DBUS_CONNECTION (connection)); + g_assert (error && *error == NULL); -- GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; -- BusEngineProxy *engine = + /* rhbz#1601577 engine == NULL if connection is closed. */ + if (g_dbus_connection_is_closed (connection)) { + *error = g_error_new (G_DBUS_ERROR, @@ -169,19 +186,19 @@ index 2d98995c..bbbe5532 100644 + "Connection is closed."); + return NULL; + } -+ flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; -+ engine = - (BusEngineProxy *) g_initable_new (BUS_TYPE_ENGINE_PROXY, - NULL, -- NULL, -+ error, - "desc", desc, - "g-connection", connection, - "g-interface-name", IBUS_INTERFACE_ENGINE, -@@ -681,12 +694,19 @@ bus_engine_proxy_new_internal (const gchar *path, - "g-default-timeout", g_gdbus_timeout, - "g-flags", flags, - NULL); + flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; + engine = (BusEngineProxy *) g_initable_new ( + BUS_TYPE_ENGINE_PROXY, + NULL, +- NULL, ++ error, + "desc", desc, + "g-connection", connection, + "g-interface-name", IBUS_INTERFACE_ENGINE, +@@ -719,6 +729,12 @@ bus_engine_proxy_new_internal (const gchar *path, + "g-default-timeout", g_gdbus_timeout, + "g-flags", flags, + NULL); + /* FIXME: rhbz#1601577 */ + if (!engine) { + /* show abrt local variable */ @@ -191,14 +208,15 @@ index 2d98995c..bbbe5532 100644 const gchar *layout = ibus_engine_desc_get_layout (desc); if (layout != NULL && layout[0] != '\0') { engine->keymap = ibus_keymap_get (layout); - } +@@ -756,6 +772,7 @@ bus_engine_proxy_new_internal (const gchar *path, + return engine; } +#pragma GCC reset_options typedef struct { GTask *task; -@@ -748,23 +768,30 @@ create_engine_ready_cb (BusFactoryProxy *factory, +@@ -818,23 +835,30 @@ create_engine_ready_cb (BusFactoryProxy *factory, GAsyncResult *res, EngineProxyNewData *data) { @@ -237,11 +255,45 @@ index 2d98995c..bbbe5532 100644 /* FIXME: set destroy callback ? */ g_task_return_pointer (data->task, engine, NULL); +diff --git a/bus/panelproxy.c b/bus/panelproxy.c +index e6001ebf..00828fbc 100644 +--- a/bus/panelproxy.c ++++ b/bus/panelproxy.c +@@ -122,6 +122,8 @@ bus_panel_proxy_new (BusConnection *connection, + const gchar *path = NULL; + GObject *obj; + BusPanelProxy *panel; ++ GError *error = NULL; ++ const gchar *message; + + g_assert (BUS_IS_CONNECTION (connection)); + +@@ -138,7 +140,7 @@ bus_panel_proxy_new (BusConnection *connection, + + obj = g_initable_new (BUS_TYPE_PANEL_PROXY, + NULL, +- NULL, ++ &error, + "g-object-path", path, + "g-interface-name", IBUS_INTERFACE_PANEL, + "g-connection", bus_connection_get_dbus_connection (connection), +@@ -146,6 +148,11 @@ bus_panel_proxy_new (BusConnection *connection, + "g-flags", G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL); + ++ if (error) { ++ /* TODO: rhbz#2213445 Why does this issue happen? */ ++ message = error->message; ++ g_critical ("Failed to generate BusPanelProxy: %s", message); ++ } + panel = BUS_PANEL_PROXY (obj); + panel->panel_type = panel_type; + return panel; diff --git a/client/x11/main.c b/client/x11/main.c -index c9ee174d..768b91f0 100644 +index b7eb5961..3075d5d0 100644 --- a/client/x11/main.c +++ b/client/x11/main.c -@@ -40,6 +40,7 @@ +@@ -45,6 +45,7 @@ #include #include #include @@ -249,7 +301,142 @@ index c9ee174d..768b91f0 100644 #include -@@ -1104,7 +1105,12 @@ _atexit_cb () +@@ -69,6 +70,7 @@ typedef struct _X11ICONN X11ICONN; + typedef struct _X11IC X11IC; + struct _X11IC { + IBusInputContext *context; ++ gboolean ibus_connected; + Window client_window; + Window focus_window; + gint32 input_style; +@@ -327,6 +329,18 @@ _xim_store_ic_values (X11IC *x11ic, IMChangeICStruct *call_data) + return 1; + } + ++static void ++ibus_ic_connection_closed_cb (GDBusConnection *connection, ++ gboolean remote_peer_vanished, ++ GError *error, ++ X11IC *x11ic) ++{ ++ /* rhbz#2195895 The moment of the IBusBus disconnection would be ++ * different from the moment of XIM_DISCONNECT. ++ */ ++ x11ic->ibus_connected = FALSE; ++} ++ + + static int + xim_create_ic (XIMS xims, IMChangeICStruct *call_data) +@@ -334,6 +348,7 @@ xim_create_ic (XIMS xims, IMChangeICStruct *call_data) + static int base_icid = 1; + X11IC *x11ic; + guint32 capabilities = IBUS_CAP_FOCUS; ++ GDBusConnection *connection; + + call_data->icid = base_icid ++; + +@@ -345,8 +360,9 @@ xim_create_ic (XIMS xims, IMChangeICStruct *call_data) + + x11ic->icid = call_data->icid; + x11ic->connect_id = call_data->connect_id; +- x11ic->conn = (X11ICONN *)g_hash_table_lookup (_connections, +- GINT_TO_POINTER ((gint) call_data->connect_id)); ++ x11ic->conn = (X11ICONN *)g_hash_table_lookup ( ++ _connections, ++ GINT_TO_POINTER ((gint) call_data->connect_id)); + if (x11ic->conn == NULL) { + g_slice_free (X11IC, x11ic); + g_return_val_if_reached (0); +@@ -376,6 +392,10 @@ xim_create_ic (XIMS xims, IMChangeICStruct *call_data) + G_CALLBACK (_context_enabled_cb), x11ic); + g_signal_connect (x11ic->context, "disabled", + G_CALLBACK (_context_disabled_cb), x11ic); ++ connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (x11ic->context)); ++ x11ic->ibus_connected = !g_dbus_connection_is_closed (connection); ++ g_signal_connect (connection, "closed", ++ G_CALLBACK (ibus_ic_connection_closed_cb), x11ic); + + + if (x11ic->input_style & XIMPreeditCallbacks) +@@ -400,11 +420,19 @@ xim_destroy_ic (XIMS xims, IMChangeICStruct *call_data) + LOG (1, "XIM_DESTROY_IC ic=%d connect_id=%d", + call_data->icid, call_data->connect_id); + +- x11ic = (X11IC *)g_hash_table_lookup (_x11_ic_table, +- GINT_TO_POINTER ((gint) call_data->icid)); ++ x11ic = (X11IC *)g_hash_table_lookup ( ++ _x11_ic_table, ++ GINT_TO_POINTER ((gint) call_data->icid)); + g_return_val_if_fail (x11ic != NULL, 0); + + if (x11ic->context) { ++ GDBusConnection *connection = ++ g_dbus_proxy_get_connection (G_DBUS_PROXY (x11ic->context)); ++ x11ic->ibus_connected = FALSE; ++ g_signal_handlers_disconnect_by_func ( ++ connection, ++ (GCallback)ibus_ic_connection_closed_cb, ++ x11ic); + ibus_proxy_destroy ((IBusProxy *)x11ic->context); + g_object_unref (x11ic->context); + x11ic->context = NULL; +@@ -412,7 +440,8 @@ xim_destroy_ic (XIMS xims, IMChangeICStruct *call_data) + + g_hash_table_remove (_x11_ic_table, + GINT_TO_POINTER ((gint) call_data->icid)); +- x11ic->conn->clients = g_list_remove (x11ic->conn->clients, (gconstpointer)x11ic); ++ x11ic->conn->clients = g_list_remove (x11ic->conn->clients, ++ (gconstpointer)x11ic); + + g_free (x11ic->preedit_string); + x11ic->preedit_string = NULL; +@@ -439,6 +468,8 @@ xim_set_ic_focus (XIMS xims, IMChangeFocusStruct *call_data) + x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table, + GINT_TO_POINTER ((gint) call_data->icid)); + g_return_val_if_fail (x11ic != NULL, 0); ++ if (!x11ic->ibus_connected) ++ return 1; + + ibus_input_context_focus_in (x11ic->context); + _xim_set_cursor_location (x11ic); +@@ -458,6 +489,8 @@ xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data) + x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table, + GINT_TO_POINTER ((gint) call_data->icid)); + g_return_val_if_fail (x11ic != NULL, 0); ++ if (!x11ic->ibus_connected) ++ return 1; + + ibus_input_context_focus_out (x11ic->context); + +@@ -712,6 +745,8 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data) + _x11_ic_table, + GINT_TO_POINTER ((gint) call_data->icid)); + g_return_val_if_fail (x11ic != NULL, 0); ++ if (!x11ic->ibus_connected) ++ return 0; + + xevent = (XKeyEvent*) &(call_data->event); + +@@ -870,6 +905,8 @@ _xim_set_cursor_location (X11IC *x11ic) + } + } + ++ if (!x11ic->ibus_connected) ++ return; + ibus_input_context_set_cursor_location (x11ic->context, + preedit_area.x, + preedit_area.y, +@@ -950,6 +987,8 @@ xim_reset_ic (XIMS xims, IMResetICStruct *call_data) + x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table, + GINT_TO_POINTER ((gint) call_data->icid)); + g_return_val_if_fail (x11ic != NULL, 0); ++ if (!x11ic->ibus_connected) ++ return 1; + + ibus_input_context_reset (x11ic->context); + +@@ -1309,7 +1348,12 @@ _atexit_cb () static void _sighandler (int sig) { @@ -263,11 +450,70 @@ index c9ee174d..768b91f0 100644 } static void +diff --git a/portal/portal.c b/portal/portal.c +index c2e4fc7f..76ef4f0a 100644 +--- a/portal/portal.c ++++ b/portal/portal.c +@@ -90,6 +90,11 @@ static void portal_context_g_signal (GDBusProxy *proxy, + GVariant *parameters, + IBusPortalContext *portal_context); + ++#define IBUS_TYPE_PORTAL_CONTEXT \ ++ (ibus_portal_context_get_type ()) ++#define IBUS_IS_PORTAL_CONTEXT(obj) \ ++ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_PORTAL_CONTEXT)) ++ + G_DEFINE_TYPE_WITH_CODE (IBusPortalContext, + ibus_portal_context, + IBUS_DBUS_TYPE_INPUT_CONTEXT_SKELETON, +@@ -449,11 +454,6 @@ ibus_portal_context_new (IBusInputContext *context, + g_strdup_printf (IBUS_PATH_INPUT_CONTEXT, portal_context->id); + portal_context->service = ibus_dbus_service_skeleton_new (); + +- g_signal_connect (portal_context->service, +- "handle-destroy", +- G_CALLBACK (ibus_portal_context_handle_destroy), +- portal_context); +- + if (!g_dbus_interface_skeleton_export ( + G_DBUS_INTERFACE_SKELETON (portal_context->service), + connection, portal_context->object_path, +@@ -466,8 +466,17 @@ ibus_portal_context_new (IBusInputContext *context, + return NULL; + } + ++ /* rhbz#2239633 g_list_prepend() needs to be callsed before ++ * ibus_portal_context_handle_destroy() is connected ++ * for g_list_remove() in ibus_portal_context_finalize(). ++ */ + all_contexts = g_list_prepend (all_contexts, portal_context); + ++ g_signal_connect (portal_context->service, ++ "handle-destroy", ++ G_CALLBACK (ibus_portal_context_handle_destroy), ++ portal_context); ++ + return portal_context; + } + +@@ -624,6 +633,12 @@ name_owner_changed (GDBusConnection *connection, + IBusPortalContext *portal_context = l->data; + next = l->next; + ++ /* rhbz#2151344 portal_context might not be finalized? */ ++ if (!G_LIKELY (IBUS_IS_PORTAL_CONTEXT (portal_context))) { ++ g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, ++ "portal_context is not IBusPortalContext"); ++ continue; ++ } + if (g_strcmp0 (portal_context->owner, name) == 0) { + g_object_unref (portal_context); + } diff --git a/src/ibusbus.c b/src/ibusbus.c -index b7ffbb47..668c8a26 100644 +index 0e6d67f1..fcc742b6 100644 --- a/src/ibusbus.c +++ b/src/ibusbus.c -@@ -689,6 +689,11 @@ ibus_bus_destroy (IBusObject *object) +@@ -742,6 +742,12 @@ ibus_bus_destroy (IBusObject *object) _bus = NULL; if (bus->priv->monitor) { @@ -276,6 +522,7 @@ index b7ffbb47..668c8a26 100644 + */ + g_signal_handlers_disconnect_by_func (bus->priv->monitor, + (GCallback) _changed_cb, bus); ++ g_file_monitor_cancel (bus->priv->monitor); g_object_unref (bus->priv->monitor); bus->priv->monitor = NULL; } @@ -295,10 +542,10 @@ index a6f2e8e6..b7a04081 100644 m_panel.load_settings(); } diff --git a/ui/gtk3/switcher.vala b/ui/gtk3/switcher.vala -index a4529c88..29a70dd5 100644 +index e3fab8d9..a827094f 100644 --- a/ui/gtk3/switcher.vala +++ b/ui/gtk3/switcher.vala -@@ -140,8 +140,8 @@ class Switcher : Gtk.Window { +@@ -176,8 +176,8 @@ class Switcher : Gtk.Window { IBus.EngineDesc[] engines, int index, string input_context_path) { @@ -307,9 +554,9 @@ index a4529c88..29a70dd5 100644 + assert(m_loop == null); + assert(index < engines.length); - m_is_running = true; - m_keyval = keyval; -@@ -198,16 +198,18 @@ class Switcher : Gtk.Window { + if (m_is_running) + return index; +@@ -236,16 +236,18 @@ class Switcher : Gtk.Window { null, event, null); @@ -337,7 +584,7 @@ index a4529c88..29a70dd5 100644 #else Gdk.Device device = event.get_device(); if (device == null) { -@@ -243,30 +245,41 @@ class Switcher : Gtk.Window { +@@ -281,30 +283,41 @@ class Switcher : Gtk.Window { Gdk.EventMask.KEY_RELEASE_MASK, null, Gdk.CURRENT_TIME); @@ -399,5 +646,5 @@ index a4529c88..29a70dd5 100644 #if VALA_0_34 seat.ungrab(); -- -2.24.1 - +2.41.0 + \ No newline at end of file diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch index 0b66c2d..215b51c 100644 --- a/ibus-HEAD.patch +++ b/ibus-HEAD.patch @@ -1,423 +1,1694 @@ -From dd4cc5b028c35f9bb8fa9d3bdc8f26bcdfc43d40 Mon Sep 17 00:00:00 2001 +From 59944ddbfe915f195e757c509246b597048116cf Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Wed, 30 Sep 2020 20:35:23 +0900 -Subject: [PATCH] ui/gtk3: Fix arguments in GLib.DBusSignalCallback for Vala - 0.50 - -BUG=https://github.com/ibus/ibus/issues/2265 +Date: Sat, 25 Nov 2023 13:42:31 +0900 +Subject: [PATCH] client/wayland: Implement preedit color in Plasma Wayland + +Wayland input-method protocol version 1 supports the preedit style +with text-input protocol version 1 in Plasma Wayland. +GNOME Wayland uses text-input version 3 which deletes the preedit style. + +Now IBus supports the preedit color for anthy, hangul, table, +typing-booster. + +This change now also supports +ibus_engine_update_preedit_text_with_mode() + +Rf. https://github.com/ibus/ibus/wiki/Wayland-Colors + +BUG=rhbz#2237486 --- - ui/gtk3/application.vala | 22 +++++++++++----------- - ui/gtk3/extension.vala | 22 +++++++++++----------- - 2 files changed, 22 insertions(+), 22 deletions(-) - -diff --git a/ui/gtk3/application.vala b/ui/gtk3/application.vala -index cc9ee54c..da65301b 100644 ---- a/ui/gtk3/application.vala -+++ b/ui/gtk3/application.vala -@@ -3,7 +3,7 @@ - * ibus - The Input Bus - * - * Copyright(c) 2011 Peng Huang -- * Copyright(c) 2017 Takao Fujiwara -+ * Copyright(c) 2017-2020 Takao Fujiwara - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public -@@ -69,22 +69,22 @@ class Application { - } + client/wayland/Makefile.am | 1 + + client/wayland/ibuswaylandim.c | 204 ++++- + .../text-input-unstable-v1-client-protocol.h | 847 ++++++++++++++++++ + src/ibusattribute.h | 52 +- + 4 files changed, 1101 insertions(+), 3 deletions(-) + create mode 100644 client/wayland/text-input-unstable-v1-client-protocol.h - private void bus_name_acquired_cb(DBusConnection connection, -- string sender_name, -- string object_path, -- string interface_name, -- string signal_name, -- Variant parameters) { -+ string? sender_name, -+ string object_path, -+ string interface_name, -+ string signal_name, -+ Variant parameters) { - debug("signal_name = %s", signal_name); - m_panel = new Panel(m_bus); - m_panel.load_settings(); - } - - private void bus_name_lost_cb(DBusConnection connection, -- string sender_name, -- string object_path, -- string interface_name, -- string signal_name, -- Variant parameters) { -+ string? sender_name, -+ string object_path, -+ string interface_name, -+ string signal_name, -+ Variant parameters) { - // "Destroy" dbus method was called before this callback is called. - // "Destroy" dbus method -> ibus_service_destroy() - // -> g_dbus_connection_unregister_object() -diff --git a/ui/gtk3/extension.vala b/ui/gtk3/extension.vala -index ea3cd464..a6f2e8e6 100644 ---- a/ui/gtk3/extension.vala -+++ b/ui/gtk3/extension.vala -@@ -3,7 +3,7 @@ - * ibus - The Input Bus - * - * Copyright(c) 2018 Peng Huang -- * Copyright(c) 2018 Takao Fujiwara -+ * Copyright(c) 2018-2020 Takao Fujiwara - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public -@@ -67,22 +67,22 @@ class ExtensionGtk : Gtk.Application { - - - private void bus_name_acquired_cb(DBusConnection connection, -- string sender_name, -- string object_path, -- string interface_name, -- string signal_name, -- Variant parameters) { -+ string? sender_name, -+ string object_path, -+ string interface_name, -+ string signal_name, -+ Variant parameters) { - debug("signal_name = %s", signal_name); - m_panel = new PanelBinding(m_bus, this); - m_panel.load_settings(); - } - - private void bus_name_lost_cb(DBusConnection connection, -- string sender_name, -- string object_path, -- string interface_name, -- string signal_name, -- Variant parameters) { -+ string? sender_name, -+ string object_path, -+ string interface_name, -+ string signal_name, -+ Variant parameters) { - // "Destroy" dbus method was called before this callback is called. - // "Destroy" dbus method -> ibus_service_destroy() - // -> g_dbus_connection_unregister_object() --- -2.24.1 - -From 02338ce751a1ed5b9b892fba530ec2fe211d314e Mon Sep 17 00:00:00 2001 -From: fujiwarat -Date: Fri, 20 Nov 2020 08:58:52 +0900 -Subject: [PATCH] docs: Fix make dist - ---- - docs/reference/ibus/Makefile.am | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/docs/reference/ibus/Makefile.am b/docs/reference/ibus/Makefile.am -index 1ece234c..0f307bbd 100644 ---- a/docs/reference/ibus/Makefile.am -+++ b/docs/reference/ibus/Makefile.am -@@ -3,8 +3,8 @@ - # ibus - The Input Bus - # - # Copyright (c) 2007-2015 Peng Huang --# Copyright (c) 2007-2015 Red Hat, Inc. --# Copyright (c) 2015 Takao Fujiwara -+# Copyright (c) 2007-2020 Red Hat, Inc. -+# Copyright (c) 2015-2020 Takao Fujiwara - # - # This library is free software; you can redistribute it and/or - # modify it under the terms of the GNU Lesser General Public -@@ -147,6 +147,6 @@ tmpl-build.stamp: trim-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DO - # clean-local: - # rm -rf tmpl ${DOC_MODULE) - --CLEANFILES+= *.stamp -+CLEANFILES+= *actions *.stamp - - -include $(top_srcdir)/git.mk --- -2.24.1 - -From aa558de80c224921753990806cf553428fbe7057 Mon Sep 17 00:00:00 2001 -From: fujiwarat -Date: Fri, 20 Nov 2020 09:03:32 +0900 -Subject: [PATCH] src: Fix to build emoji-*.dict in CLDR 38 - -root.xml and sr_Cyrl.xml have included no contents since -cldr-emoji-annotation-38 and make install failed because of no -emoji-root.dict and emoji-sr.Cyrl.dict. -Now the build creates the no content files but remove those files -in the install hook. - -BUG=rhbz#1898065 ---- - src/Makefile.am | 61 ++++++++++++++++++++++------------------------ - src/emoji-parser.c | 4 ++- - 2 files changed, 32 insertions(+), 33 deletions(-) - -diff --git a/src/Makefile.am b/src/Makefile.am -index 99de1ab7..742ee7d7 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -3,7 +3,7 @@ - # ibus - The Input Bus - # - # Copyright (c) 2007-2015 Peng Huang --# Copyright (c) 2015-2019 Takao Fujiwara -+# Copyright (c) 2015-2020 Takao Fujiwara - # Copyright (c) 2007-2017 Red Hat, Inc. - # - # This library is free software; you can redistribute it and/or -@@ -248,6 +248,7 @@ AM_CPPFLAGS += -DENABLE_EMOJI_DICT - dictdir = $(pkgdatadir)/dicts - LANG_FILES = $(basename $(notdir $(wildcard $(EMOJI_ANNOTATION_DIR)/*.xml))) - EMOJI_DICT_FILES = $(patsubst %,dicts/emoji-%.dict,$(LANG_FILES)) -+# emoji-root.dict, emoji-sr_Cyrl.dict have no contents. - dict_DATA = $(EMOJI_DICT_FILES) - - noinst_PROGRAMS += emoji-parser -@@ -265,6 +266,7 @@ dicts/emoji-%.dict: emoji-parser - xml_derived_option="--xml-derived $(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$*.xml"; \ - plus_comment="derived"; \ - fi; \ -+ is_skip=0; \ - if test x"$*" = xen ; then \ - $(builddir)/emoji-parser \ - --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \ -@@ -279,48 +281,43 @@ dicts/emoji-%.dict: emoji-parser - --xml $(EMOJI_ANNOTATION_DIR)/$*.xml \ - $$xml_derived_option \ - --out $@; \ -+ retval=$$?; \ -+ if test $$retval -eq 99 ; then \ -+ is_skip=1; \ -+ touch $@; \ -+ elif test $$retval -ne 0 ; then \ -+ echo "Fail to generate $@"; \ -+ abrt; \ -+ fi; \ - fi; \ -- echo "Generated $$plus_comment $@" -+ if test $$is_skip -eq 0 ; then \ -+ echo "Generated $$plus_comment $@"; \ -+ else \ -+ echo "Skip $$plus_comment $@"; \ -+ fi; - - ibusemojigen.h: dicts/emoji-en.dict - $(NULL) - --install-data-hook: $(dict_DATA) -- @$(NORMAL_INSTALL) -+# We put dicts/emoji-%.dict as the make target for the parallel build -+# and the make target has to be genarated even if the file size is zero. -+# But we don't want to install the zero size files and delete them -+# in install-data-hook. -+install-data-hook: - $(AM_V_at)list='$(wildcard dicts/*.dict)'; \ - test -n "$(dictdir)" || list=; \ -- if test -n "$$list"; then \ -- echo " $(MKDIR_P) '$(DESTDIR)$(dictdir)'"; \ -- $(MKDIR_P) "$(DESTDIR)$(dictdir)" || exit 1; \ -- fi; \ - for p in $$list; do \ -- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ -- echo "$$d$$p"; \ -+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ -+ if test -s "$$d$$p"; then continue; fi; \ -+ basename "$$p"; \ - done | \ -- while read files; do \ -- if [ x$(AM_DEFAULT_VERBOSITY) = x1 ] ; then \ -- echo "$(INSTALL_DATA) $$files '$(DESTDIR)$(dictdir)'"; \ -- else \ -- echo "Installing $$files"; \ -- fi; \ -- $(INSTALL_DATA) $$files "$(DESTDIR)$(dictdir)" || exit $$?; \ -+ while read file; do \ -+ if test -f "$(DESTDIR)$(dictdir)/$$file"; then \ -+ echo "Delete $(DESTDIR)$(dictdir)/$$file"; \ -+ rm "$(DESTDIR)$(dictdir)/$$file" || exit $$?; \ -+ fi; \ - done - --dict__uninstall_files_from_dir = { \ -- test -z "$$files" \ -- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ -- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ -- cd "$$dir" && rm -f $$files; }; \ -- } -- --# for make dist --uninstall-hook: -- @$(NORMAL_UNINSTALL) -- $(AM_V_at)list='$(wildcard dicts/*.dict)'; \ -- test -n "$(dictdir)" || list=; \ -- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ -- dir='$(DESTDIR)$(dictdir)'; $(dict__uninstall_files_from_dir) -- - emoji_parser_SOURCES = \ - emoji-parser.c \ +diff --git a/client/wayland/Makefile.am b/client/wayland/Makefile.am +index 7e8d18af..94e357b4 100644 +--- a/client/wayland/Makefile.am ++++ b/client/wayland/Makefile.am +@@ -31,6 +31,7 @@ DISTCLEANFILES = + protocol_sources = \ + input-method-unstable-v1-client-protocol.h \ + input-method-unstable-v1-protocol.c \ ++ text-input-unstable-v1-client-protocol.h \ $(NULL) -diff --git a/src/emoji-parser.c b/src/emoji-parser.c -index 96a779c6..b117b1b4 100644 ---- a/src/emoji-parser.c -+++ b/src/emoji-parser.c -@@ -1,7 +1,7 @@ - /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */ - /* vim:set et sts=4: */ - /* ibus - The Input Bus -- * Copyright (C) 2016-2018 Takao Fujiwara -+ * Copyright (C) 2016-2020 Takao Fujiwara - * Copyright (C) 2016 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or -@@ -1294,6 +1294,8 @@ main (int argc, char *argv[]) - category_file_save (output_category, list); - if (list) - g_slist_free (list); -+ else -+ return 99; - return 0; + ibus_wayland_SOURCES = \ +diff --git a/client/wayland/ibuswaylandim.c b/client/wayland/ibuswaylandim.c +index 8f938288..9e8f651e 100644 +--- a/client/wayland/ibuswaylandim.c ++++ b/client/wayland/ibuswaylandim.c +@@ -32,6 +32,7 @@ + #include + + #include "input-method-unstable-v1-client-protocol.h" ++#include "text-input-unstable-v1-client-protocol.h" + #include "ibuswaylandim.h" + + enum { +@@ -58,6 +59,7 @@ struct _IBusWaylandIMPrivate + IBusInputContext *ibuscontext; + IBusText *preedit_text; + guint preedit_cursor_pos; ++ guint preedit_mode; + IBusModifierType modifiers; + + struct xkb_context *xkb_context; +@@ -266,12 +268,204 @@ _context_forward_key_event_cb (IBusInputContext *context, } --- -2.24.1 - -From b72efea42d5f72e08e2774ae03027c246d41cab7 Mon Sep 17 00:00:00 2001 -From: fujiwarat -Date: Fri, 20 Nov 2020 10:56:11 +0900 -Subject: [PATCH] src: Update IBusInputPurpose and IBusInputHints in - ibustypes.h - -Copy IBUS_INPUT_PURPOSE_TERMINAL, IBUS_INPUT_PURPOSE_PIN, -IBUS_INPUT_PURPOSE_TERMINAL from GTK 3.24.14 ---- - src/ibustypes.h | 77 ++++++++++++++++++++++++++++++++++--------------- - 1 file changed, 53 insertions(+), 24 deletions(-) - -diff --git a/src/ibustypes.h b/src/ibustypes.h -index 06370a27..798ad04d 100644 ---- a/src/ibustypes.h -+++ b/src/ibustypes.h -@@ -2,7 +2,7 @@ + + ++/** ++ * ibus_wayland_im_update_preedit_style: ++ * @wlim: An #IBusWaylandIM ++ * ++ * Convert RGB values to IBusAttrPreedit at first. ++ * Convert IBusAttrPreedit to zwp_text_input_v1_preedit_style at second. ++ * ++ * RF. https://github.com/ibus/ibus/wiki/Wayland-Colors ++ */ ++static void ++ibus_wayland_im_update_preedit_style (IBusWaylandIM *wlim) ++{ ++ IBusWaylandIMPrivate *priv; ++ IBusAttrList *attrs; ++ guint i; ++ const char *str; ++ uint32_t whole_wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT; ++ uint32_t prev_start = 0; ++ uint32_t prev_end = 0; ++ ++ g_return_if_fail (IBUS_IS_WAYLAND_IM (wlim)); ++ priv = ibus_wayland_im_get_instance_private (wlim); ++ if (!priv->preedit_text) ++ return; ++ attrs = priv->preedit_text->attrs; ++ if (!attrs) ++ return; ++ for (i = 0; ; i++) { ++ IBusAttribute *attr = ibus_attr_list_get (attrs, i); ++ IBusAttrPreedit istyle = IBUS_ATTR_PREEDIT_DEFAULT; ++ uint32_t wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT; ++ uint32_t start, end; ++ if (attr == NULL) ++ break; ++ switch (attr->type) { ++ case IBUS_ATTR_TYPE_UNDERLINE: ++ istyle = IBUS_ATTR_PREEDIT_WHOLE; ++ break; ++ case IBUS_ATTR_TYPE_FOREGROUND: ++ switch (attr->value) { ++ case 0x7F7F7F: /* typing-booster */ ++ istyle = IBUS_ATTR_PREEDIT_PREDICTION; ++ break; ++ case 0xF90F0F: /* table */ ++ istyle = IBUS_ATTR_PREEDIT_PREFIX; ++ break; ++ case 0x1EDC1A: /* table */ ++ istyle = IBUS_ATTR_PREEDIT_SUFFIX; ++ break; ++ case 0xA40000: /* typing-booster, table */ ++ istyle = IBUS_ATTR_PREEDIT_ERROR_SPELLING; ++ break; ++ case 0xFF00FF: /* typing-booster */ ++ istyle = IBUS_ATTR_PREEDIT_ERROR_COMPOSE; ++ break; ++ case 0x0: /* Japanese */ ++ case 0xFF000000: ++ break; ++ case 0xFFFFFF: /* hangul */ ++ case 0xFFFFFFFF: ++ istyle = IBUS_ATTR_PREEDIT_SELECTION; ++ break; ++ default: /* Custom */ ++ istyle = IBUS_ATTR_PREEDIT_NONE; ++ } ++ break; ++ case IBUS_ATTR_TYPE_BACKGROUND: ++ switch (attr->value) { ++ case 0xC8C8F0: /* Japanese */ ++ case 0xFFC8C8F0: ++ istyle = IBUS_ATTR_PREEDIT_SELECTION; ++ break; ++ default:; /* Custom */ ++ } ++ break; ++ default: ++ istyle = IBUS_ATTR_PREEDIT_NONE; ++ } ++ switch (istyle) { ++ case IBUS_ATTR_PREEDIT_NONE: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_NONE; ++ break; ++ case IBUS_ATTR_PREEDIT_WHOLE: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_UNDERLINE; ++ break; ++ case IBUS_ATTR_PREEDIT_SELECTION: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_SELECTION; ++ break; ++ case IBUS_ATTR_PREEDIT_PREDICTION: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INACTIVE; ++ break; ++ case IBUS_ATTR_PREEDIT_PREFIX: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_HIGHLIGHT; ++ break; ++ case IBUS_ATTR_PREEDIT_SUFFIX: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INACTIVE; ++ break; ++ case IBUS_ATTR_PREEDIT_ERROR_SPELLING: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INCORRECT; ++ break; ++ case IBUS_ATTR_PREEDIT_ERROR_COMPOSE: ++ wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INCORRECT; ++ break; ++ default:; ++ } ++ if (wstyle == ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT) ++ continue; ++ str = priv->preedit_text->text; ++ start = g_utf8_offset_to_pointer (str, attr->start_index) - str; ++ end = g_utf8_offset_to_pointer (str, attr->end_index) - str; ++ /* Double styles cannot be applied likes the underline and ++ * preedit color. */ ++ if (start == 0 && strlen (str) == end && ++ (i > 0 || ibus_attr_list_get (attrs, i + 1))) { ++ whole_wstyle = wstyle; ++ continue; ++ } ++ if (end < prev_start) { ++ if (priv->log) { ++ fprintf (priv->log, ++ "Reverse order is not supported in end %d for %s " ++ "against start %d.\n", end, str, prev_start); ++ fflush (priv->log); ++ } ++ continue; ++ } ++ if (prev_end > end) { ++ if (priv->log) { ++ fprintf (priv->log, ++ "Nested styles are not supported in end %d for %s " ++ "against end %d.\n", end, str, prev_end); ++ fflush (priv->log); ++ } ++ continue; ++ } ++ if (prev_end > start && prev_start >= start) ++ start = prev_end; ++ if (start >= end) { ++ if (priv->log) { ++ fprintf (priv->log, "Wrong start %d and end %d for %s.\n", ++ start, end, str); ++ fflush (priv->log); ++ } ++ return; ++ } ++ zwp_input_method_context_v1_preedit_styling (priv->context, ++ start, ++ end - start, ++ wstyle); ++ prev_start = start; ++ prev_end = end; ++ } ++ if (whole_wstyle != ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT) { ++ uint32_t whole_start = 0; ++ uint32_t whole_end = strlen (str); ++ uint32_t start, end; ++ for (i = 0; ; i++) { ++ IBusAttribute *attr = ibus_attr_list_get (attrs, i); ++ if (!attr) ++ break; ++ start = g_utf8_offset_to_pointer (str, attr->start_index) - str; ++ end = g_utf8_offset_to_pointer (str, attr->end_index) - str; ++ if (start == 0 && strlen (str) == end) ++ continue; ++ if (start == 0) { ++ whole_start = end; ++ } else if (strlen (str) == end) { ++ whole_end = start; ++ } else { ++ whole_end = start; ++ if (whole_start < whole_end) { ++ zwp_input_method_context_v1_preedit_styling ( ++ priv->context, ++ whole_start, ++ whole_end - whole_start, ++ whole_wstyle); ++ } ++ whole_start = end; ++ whole_end = strlen (str); ++ } ++ } ++ if (whole_start < whole_end) { ++ zwp_input_method_context_v1_preedit_styling ( ++ priv->context, ++ whole_start, ++ whole_end - whole_start, ++ whole_wstyle); ++ } ++ } ++} ++ + static void + _context_show_preedit_text_cb (IBusInputContext *context, + IBusWaylandIM *wlim) + { + IBusWaylandIMPrivate *priv; + uint32_t cursor; ++ const char *commit = ""; + g_return_if_fail (IBUS_IS_WAYLAND_IM (wlim)); + priv = ibus_wayland_im_get_instance_private (wlim); + /* CURSOR is byte offset. */ +@@ -282,10 +476,13 @@ _context_show_preedit_text_cb (IBusInputContext *context, + + zwp_input_method_context_v1_preedit_cursor (priv->context, + cursor); ++ ibus_wayland_im_update_preedit_style (wlim); ++ if (priv->preedit_mode == IBUS_ENGINE_PREEDIT_COMMIT) ++ commit = priv->preedit_text->text; + zwp_input_method_context_v1_preedit_string (priv->context, + priv->serial, + priv->preedit_text->text, +- priv->preedit_text->text); ++ commit); + } + + +@@ -308,6 +505,7 @@ _context_update_preedit_text_cb (IBusInputContext *context, + IBusText *text, + gint cursor_pos, + gboolean visible, ++ guint mode, + IBusWaylandIM *wlim) + { + IBusWaylandIMPrivate *priv; +@@ -317,6 +515,7 @@ _context_update_preedit_text_cb (IBusInputContext *context, + g_object_unref (priv->preedit_text); + priv->preedit_text = g_object_ref_sink (text); + priv->preedit_cursor_pos = cursor_pos; ++ priv->preedit_mode = mode; + + if (visible) + _context_show_preedit_text_cb (context, wlim); +@@ -971,7 +1170,7 @@ _create_input_context_done (GObject *object, + G_CALLBACK (_context_forward_key_event_cb), + wlim); + +- g_signal_connect (priv->ibuscontext, "update-preedit-text", ++ g_signal_connect (priv->ibuscontext, "update-preedit-text-with-mode", + G_CALLBACK (_context_update_preedit_text_cb), + wlim); + g_signal_connect (priv->ibuscontext, "show-preedit-text", +@@ -988,6 +1187,7 @@ _create_input_context_done (GObject *object, + capabilities |= IBUS_CAP_SYNC_PROCESS_KEY_V2; + ibus_input_context_set_capabilities (priv->ibuscontext, + capabilities); ++ ibus_input_context_set_client_commit_preedit (priv->ibuscontext, TRUE); + if (_use_sync_mode == 1) { + ibus_input_context_set_post_process_key_event (priv->ibuscontext, + TRUE); +diff --git a/client/wayland/text-input-unstable-v1-client-protocol.h b/client/wayland/text-input-unstable-v1-client-protocol.h +new file mode 100644 +index 00000000..71069ec7 +--- /dev/null ++++ b/client/wayland/text-input-unstable-v1-client-protocol.h +@@ -0,0 +1,847 @@ ++/* Generated by wayland-scanner 1.22.0 */ ++ ++#ifndef TEXT_INPUT_UNSTABLE_V1_CLIENT_PROTOCOL_H ++#define TEXT_INPUT_UNSTABLE_V1_CLIENT_PROTOCOL_H ++ ++#include ++#include ++#include "wayland-client.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * @page page_text_input_unstable_v1 The text_input_unstable_v1 protocol ++ * @section page_ifaces_text_input_unstable_v1 Interfaces ++ * - @subpage page_iface_zwp_text_input_v1 - text input ++ * - @subpage page_iface_zwp_text_input_manager_v1 - text input manager ++ * @section page_copyright_text_input_unstable_v1 Copyright ++ *
++ *
++ * Copyright © 2012, 2013 Intel Corporation
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ * 
++ */ ++struct wl_seat; ++struct wl_surface; ++struct zwp_text_input_manager_v1; ++struct zwp_text_input_v1; ++ ++#ifndef ZWP_TEXT_INPUT_V1_INTERFACE ++#define ZWP_TEXT_INPUT_V1_INTERFACE ++/** ++ * @page page_iface_zwp_text_input_v1 zwp_text_input_v1 ++ * @section page_iface_zwp_text_input_v1_desc Description ++ * ++ * An object used for text input. Adds support for text input and input ++ * methods to applications. A text_input object is created from a ++ * wl_text_input_manager and corresponds typically to a text entry in an ++ * application. ++ * ++ * Requests are used to activate/deactivate the text_input object and set ++ * state information like surrounding and selected text or the content type. ++ * The information about entered text is sent to the text_input object via ++ * the pre-edit and commit events. Using this interface removes the need ++ * for applications to directly process hardware key events and compose text ++ * out of them. ++ * ++ * Text is generally UTF-8 encoded, indices and lengths are in bytes. ++ * ++ * Serials are used to synchronize the state between the text input and ++ * an input method. New serials are sent by the text input in the ++ * commit_state request and are used by the input method to indicate ++ * the known text input state in events like preedit_string, commit_string, ++ * and keysym. The text input can then ignore events from the input method ++ * which are based on an outdated state (for example after a reset). ++ * ++ * Warning! The protocol described in this file is experimental and ++ * backward incompatible changes may be made. Backward compatible changes ++ * may be added together with the corresponding interface version bump. ++ * Backward incompatible changes are done by bumping the version number in ++ * the protocol and interface names and resetting the interface version. ++ * Once the protocol is to be declared stable, the 'z' prefix and the ++ * version number in the protocol and interface names are removed and the ++ * interface version number is reset. ++ * @section page_iface_zwp_text_input_v1_api API ++ * See @ref iface_zwp_text_input_v1. ++ */ ++/** ++ * @defgroup iface_zwp_text_input_v1 The zwp_text_input_v1 interface ++ * ++ * An object used for text input. Adds support for text input and input ++ * methods to applications. A text_input object is created from a ++ * wl_text_input_manager and corresponds typically to a text entry in an ++ * application. ++ * ++ * Requests are used to activate/deactivate the text_input object and set ++ * state information like surrounding and selected text or the content type. ++ * The information about entered text is sent to the text_input object via ++ * the pre-edit and commit events. Using this interface removes the need ++ * for applications to directly process hardware key events and compose text ++ * out of them. ++ * ++ * Text is generally UTF-8 encoded, indices and lengths are in bytes. ++ * ++ * Serials are used to synchronize the state between the text input and ++ * an input method. New serials are sent by the text input in the ++ * commit_state request and are used by the input method to indicate ++ * the known text input state in events like preedit_string, commit_string, ++ * and keysym. The text input can then ignore events from the input method ++ * which are based on an outdated state (for example after a reset). ++ * ++ * Warning! The protocol described in this file is experimental and ++ * backward incompatible changes may be made. Backward compatible changes ++ * may be added together with the corresponding interface version bump. ++ * Backward incompatible changes are done by bumping the version number in ++ * the protocol and interface names and resetting the interface version. ++ * Once the protocol is to be declared stable, the 'z' prefix and the ++ * version number in the protocol and interface names are removed and the ++ * interface version number is reset. ++ */ ++extern const struct wl_interface zwp_text_input_v1_interface; ++#endif ++#ifndef ZWP_TEXT_INPUT_MANAGER_V1_INTERFACE ++#define ZWP_TEXT_INPUT_MANAGER_V1_INTERFACE ++/** ++ * @page page_iface_zwp_text_input_manager_v1 zwp_text_input_manager_v1 ++ * @section page_iface_zwp_text_input_manager_v1_desc Description ++ * ++ * A factory for text_input objects. This object is a global singleton. ++ * @section page_iface_zwp_text_input_manager_v1_api API ++ * See @ref iface_zwp_text_input_manager_v1. ++ */ ++/** ++ * @defgroup iface_zwp_text_input_manager_v1 The zwp_text_input_manager_v1 interface ++ * ++ * A factory for text_input objects. This object is a global singleton. ++ */ ++extern const struct wl_interface zwp_text_input_manager_v1_interface; ++#endif ++ ++#ifndef ZWP_TEXT_INPUT_V1_CONTENT_HINT_ENUM ++#define ZWP_TEXT_INPUT_V1_CONTENT_HINT_ENUM ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * content hint ++ * ++ * Content hint is a bitmask to allow to modify the behavior of the text ++ * input. ++ */ ++enum zwp_text_input_v1_content_hint { ++ /** ++ * no special behaviour ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_NONE = 0x0, ++ /** ++ * auto completion, correction and capitalization ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_DEFAULT = 0x7, ++ /** ++ * hidden and sensitive text ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_PASSWORD = 0xc0, ++ /** ++ * suggest word completions ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_AUTO_COMPLETION = 0x1, ++ /** ++ * suggest word corrections ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_AUTO_CORRECTION = 0x2, ++ /** ++ * switch to uppercase letters at the start of a sentence ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_AUTO_CAPITALIZATION = 0x4, ++ /** ++ * prefer lowercase letters ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_LOWERCASE = 0x8, ++ /** ++ * prefer uppercase letters ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_UPPERCASE = 0x10, ++ /** ++ * prefer casing for titles and headings (can be language dependent) ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_TITLECASE = 0x20, ++ /** ++ * characters should be hidden ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_HIDDEN_TEXT = 0x40, ++ /** ++ * typed text should not be stored ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_SENSITIVE_DATA = 0x80, ++ /** ++ * just latin characters should be entered ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_LATIN = 0x100, ++ /** ++ * the text input is multiline ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_HINT_MULTILINE = 0x200, ++}; ++#endif /* ZWP_TEXT_INPUT_V1_CONTENT_HINT_ENUM */ ++ ++#ifndef ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ENUM ++#define ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ENUM ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * content purpose ++ * ++ * The content purpose allows to specify the primary purpose of a text ++ * input. ++ * ++ * This allows an input method to show special purpose input panels with ++ * extra characters or to disallow some characters. ++ */ ++enum zwp_text_input_v1_content_purpose { ++ /** ++ * default input, allowing all characters ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_NORMAL = 0, ++ /** ++ * allow only alphabetic characters ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ALPHA = 1, ++ /** ++ * allow only digits ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_DIGITS = 2, ++ /** ++ * input a number (including decimal separator and sign) ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_NUMBER = 3, ++ /** ++ * input a phone number ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_PHONE = 4, ++ /** ++ * input an URL ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_URL = 5, ++ /** ++ * input an email address ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_EMAIL = 6, ++ /** ++ * input a name of a person ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_NAME = 7, ++ /** ++ * input a password (combine with password or sensitive_data hint) ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_PASSWORD = 8, ++ /** ++ * input a date ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_DATE = 9, ++ /** ++ * input a time ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_TIME = 10, ++ /** ++ * input a date and time ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_DATETIME = 11, ++ /** ++ * input for a terminal ++ */ ++ ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_TERMINAL = 12, ++}; ++#endif /* ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ENUM */ ++ ++#ifndef ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ENUM ++#define ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ENUM ++enum zwp_text_input_v1_preedit_style { ++ /** ++ * default style for composing text ++ */ ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT = 0, ++ /** ++ * style should be the same as in non-composing text ++ */ ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_NONE = 1, ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ACTIVE = 2, ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INACTIVE = 3, ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_HIGHLIGHT = 4, ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_UNDERLINE = 5, ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_SELECTION = 6, ++ ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INCORRECT = 7, ++}; ++#endif /* ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ENUM */ ++ ++#ifndef ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_ENUM ++#define ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_ENUM ++enum zwp_text_input_v1_text_direction { ++ /** ++ * automatic text direction based on text and language ++ */ ++ ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_AUTO = 0, ++ /** ++ * left-to-right ++ */ ++ ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_LTR = 1, ++ /** ++ * right-to-left ++ */ ++ ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_RTL = 2, ++}; ++#endif /* ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_ENUM */ ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * @struct zwp_text_input_v1_listener ++ */ ++struct zwp_text_input_v1_listener { ++ /** ++ * enter event ++ * ++ * Notify the text_input object when it received focus. Typically ++ * in response to an activate request. ++ */ ++ void (*enter)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ struct wl_surface *surface); ++ /** ++ * leave event ++ * ++ * Notify the text_input object when it lost focus. Either in ++ * response to a deactivate request or when the assigned surface ++ * lost focus or was destroyed. ++ */ ++ void (*leave)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1); ++ /** ++ * modifiers map ++ * ++ * Transfer an array of 0-terminated modifier names. The position ++ * in the array is the index of the modifier as used in the ++ * modifiers bitmask in the keysym event. ++ */ ++ void (*modifiers_map)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ struct wl_array *map); ++ /** ++ * state of the input panel ++ * ++ * Notify when the visibility state of the input panel changed. ++ */ ++ void (*input_panel_state)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ uint32_t state); ++ /** ++ * pre-edit ++ * ++ * Notify when a new composing text (pre-edit) should be set ++ * around the current cursor position. Any previously set composing ++ * text should be removed. ++ * ++ * The commit text can be used to replace the preedit text on reset ++ * (for example on unfocus). ++ * ++ * The text input should also handle all preedit_style and ++ * preedit_cursor events occurring directly before preedit_string. ++ * @param serial serial of the latest known text input state ++ */ ++ void (*preedit_string)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ uint32_t serial, ++ const char *text, ++ const char *commit); ++ /** ++ * pre-edit styling ++ * ++ * Sets styling information on composing text. The style is ++ * applied for length bytes from index relative to the beginning of ++ * the composing text (as byte offset). Multiple styles can be ++ * applied to a composing text by sending multiple preedit_styling ++ * events. ++ * ++ * This event is handled as part of a following preedit_string ++ * event. ++ */ ++ void (*preedit_styling)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ uint32_t index, ++ uint32_t length, ++ uint32_t style); ++ /** ++ * pre-edit cursor ++ * ++ * Sets the cursor position inside the composing text (as byte ++ * offset) relative to the start of the composing text. When index ++ * is a negative number no cursor is shown. ++ * ++ * This event is handled as part of a following preedit_string ++ * event. ++ */ ++ void (*preedit_cursor)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ int32_t index); ++ /** ++ * commit ++ * ++ * Notify when text should be inserted into the editor widget. ++ * The text to commit could be either just a single character after ++ * a key press or the result of some composing (pre-edit). It could ++ * also be an empty text when some text should be removed (see ++ * delete_surrounding_text) or when the input cursor should be ++ * moved (see cursor_position). ++ * ++ * Any previously set composing text should be removed. ++ * @param serial serial of the latest known text input state ++ */ ++ void (*commit_string)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ uint32_t serial, ++ const char *text); ++ /** ++ * set cursor to new position ++ * ++ * Notify when the cursor or anchor position should be modified. ++ * ++ * This event should be handled as part of a following ++ * commit_string event. ++ */ ++ void (*cursor_position)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ int32_t index, ++ int32_t anchor); ++ /** ++ * delete surrounding text ++ * ++ * Notify when the text around the current cursor position should ++ * be deleted. ++ * ++ * Index is relative to the current cursor (in bytes). Length is ++ * the length of deleted text (in bytes). ++ * ++ * This event should be handled as part of a following ++ * commit_string event. ++ */ ++ void (*delete_surrounding_text)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ int32_t index, ++ uint32_t length); ++ /** ++ * keysym ++ * ++ * Notify when a key event was sent. Key events should not be ++ * used for normal text input operations, which should be done with ++ * commit_string, delete_surrounding_text, etc. The key event ++ * follows the wl_keyboard key event convention. Sym is an XKB ++ * keysym, state a wl_keyboard key_state. Modifiers are a mask for ++ * effective modifiers (where the modifier indices are set by the ++ * modifiers_map event) ++ * @param serial serial of the latest known text input state ++ */ ++ void (*keysym)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ uint32_t serial, ++ uint32_t time, ++ uint32_t sym, ++ uint32_t state, ++ uint32_t modifiers); ++ /** ++ * language ++ * ++ * Sets the language of the input text. The "language" argument ++ * is an RFC-3066 format language tag. ++ * @param serial serial of the latest known text input state ++ */ ++ void (*language)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ uint32_t serial, ++ const char *language); ++ /** ++ * text direction ++ * ++ * Sets the text direction of input text. ++ * ++ * It is mainly needed for showing an input cursor on the correct ++ * side of the editor when there is no input done yet and making ++ * sure neutral direction text is laid out properly. ++ * @param serial serial of the latest known text input state ++ */ ++ void (*text_direction)(void *data, ++ struct zwp_text_input_v1 *zwp_text_input_v1, ++ uint32_t serial, ++ uint32_t direction); ++}; ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++static inline int ++zwp_text_input_v1_add_listener(struct zwp_text_input_v1 *zwp_text_input_v1, ++ const struct zwp_text_input_v1_listener *listener, void *data) ++{ ++ return wl_proxy_add_listener((struct wl_proxy *) zwp_text_input_v1, ++ (void (**)(void)) listener, data); ++} ++ ++#define ZWP_TEXT_INPUT_V1_ACTIVATE 0 ++#define ZWP_TEXT_INPUT_V1_DEACTIVATE 1 ++#define ZWP_TEXT_INPUT_V1_SHOW_INPUT_PANEL 2 ++#define ZWP_TEXT_INPUT_V1_HIDE_INPUT_PANEL 3 ++#define ZWP_TEXT_INPUT_V1_RESET 4 ++#define ZWP_TEXT_INPUT_V1_SET_SURROUNDING_TEXT 5 ++#define ZWP_TEXT_INPUT_V1_SET_CONTENT_TYPE 6 ++#define ZWP_TEXT_INPUT_V1_SET_CURSOR_RECTANGLE 7 ++#define ZWP_TEXT_INPUT_V1_SET_PREFERRED_LANGUAGE 8 ++#define ZWP_TEXT_INPUT_V1_COMMIT_STATE 9 ++#define ZWP_TEXT_INPUT_V1_INVOKE_ACTION 10 ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_ENTER_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_LEAVE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_MODIFIERS_MAP_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_INPUT_PANEL_STATE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_PREEDIT_STRING_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_PREEDIT_STYLING_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_PREEDIT_CURSOR_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_COMMIT_STRING_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_CURSOR_POSITION_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_DELETE_SURROUNDING_TEXT_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_KEYSYM_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_LANGUAGE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_SINCE_VERSION 1 ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_ACTIVATE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_DEACTIVATE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_SHOW_INPUT_PANEL_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_HIDE_INPUT_PANEL_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_RESET_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_SET_SURROUNDING_TEXT_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_SET_CONTENT_TYPE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_SET_CURSOR_RECTANGLE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_SET_PREFERRED_LANGUAGE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_COMMIT_STATE_SINCE_VERSION 1 ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++#define ZWP_TEXT_INPUT_V1_INVOKE_ACTION_SINCE_VERSION 1 ++ ++/** @ingroup iface_zwp_text_input_v1 */ ++static inline void ++zwp_text_input_v1_set_user_data(struct zwp_text_input_v1 *zwp_text_input_v1, void *user_data) ++{ ++ wl_proxy_set_user_data((struct wl_proxy *) zwp_text_input_v1, user_data); ++} ++ ++/** @ingroup iface_zwp_text_input_v1 */ ++static inline void * ++zwp_text_input_v1_get_user_data(struct zwp_text_input_v1 *zwp_text_input_v1) ++{ ++ return wl_proxy_get_user_data((struct wl_proxy *) zwp_text_input_v1); ++} ++ ++static inline uint32_t ++zwp_text_input_v1_get_version(struct zwp_text_input_v1 *zwp_text_input_v1) ++{ ++ return wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1); ++} ++ ++/** @ingroup iface_zwp_text_input_v1 */ ++static inline void ++zwp_text_input_v1_destroy(struct zwp_text_input_v1 *zwp_text_input_v1) ++{ ++ wl_proxy_destroy((struct wl_proxy *) zwp_text_input_v1); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Requests the text_input object to be activated (typically when the ++ * text entry gets focus). ++ * ++ * The seat argument is a wl_seat which maintains the focus for this ++ * activation. The surface argument is a wl_surface assigned to the ++ * text_input object and tracked for focus lost. The enter event ++ * is emitted on successful activation. ++ */ ++static inline void ++zwp_text_input_v1_activate(struct zwp_text_input_v1 *zwp_text_input_v1, struct wl_seat *seat, struct wl_surface *surface) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_ACTIVATE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, seat, surface); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Requests the text_input object to be deactivated (typically when the ++ * text entry lost focus). The seat argument is a wl_seat which was used ++ * for activation. ++ */ ++static inline void ++zwp_text_input_v1_deactivate(struct zwp_text_input_v1 *zwp_text_input_v1, struct wl_seat *seat) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_DEACTIVATE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, seat); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Requests input panels (virtual keyboard) to show. ++ */ ++static inline void ++zwp_text_input_v1_show_input_panel(struct zwp_text_input_v1 *zwp_text_input_v1) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_SHOW_INPUT_PANEL, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Requests input panels (virtual keyboard) to hide. ++ */ ++static inline void ++zwp_text_input_v1_hide_input_panel(struct zwp_text_input_v1 *zwp_text_input_v1) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_HIDE_INPUT_PANEL, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Should be called by an editor widget when the input state should be ++ * reset, for example after the text was changed outside of the normal ++ * input method flow. ++ */ ++static inline void ++zwp_text_input_v1_reset(struct zwp_text_input_v1 *zwp_text_input_v1) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_RESET, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Sets the plain surrounding text around the input position. Text is ++ * UTF-8 encoded. Cursor is the byte offset within the ++ * surrounding text. Anchor is the byte offset of the ++ * selection anchor within the surrounding text. If there is no selected ++ * text anchor, then it is the same as cursor. ++ */ ++static inline void ++zwp_text_input_v1_set_surrounding_text(struct zwp_text_input_v1 *zwp_text_input_v1, const char *text, uint32_t cursor, uint32_t anchor) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_SET_SURROUNDING_TEXT, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, text, cursor, anchor); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Sets the content purpose and content hint. While the purpose is the ++ * basic purpose of an input field, the hint flags allow to modify some ++ * of the behavior. ++ * ++ * When no content type is explicitly set, a normal content purpose with ++ * default hints (auto completion, auto correction, auto capitalization) ++ * should be assumed. ++ */ ++static inline void ++zwp_text_input_v1_set_content_type(struct zwp_text_input_v1 *zwp_text_input_v1, uint32_t hint, uint32_t purpose) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_SET_CONTENT_TYPE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, hint, purpose); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++static inline void ++zwp_text_input_v1_set_cursor_rectangle(struct zwp_text_input_v1 *zwp_text_input_v1, int32_t x, int32_t y, int32_t width, int32_t height) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_SET_CURSOR_RECTANGLE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, x, y, width, height); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ * ++ * Sets a specific language. This allows for example a virtual keyboard to ++ * show a language specific layout. The "language" argument is an RFC-3066 ++ * format language tag. ++ * ++ * It could be used for example in a word processor to indicate the ++ * language of the currently edited document or in an instant message ++ * application which tracks languages of contacts. ++ */ ++static inline void ++zwp_text_input_v1_set_preferred_language(struct zwp_text_input_v1 *zwp_text_input_v1, const char *language) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_SET_PREFERRED_LANGUAGE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, language); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++static inline void ++zwp_text_input_v1_commit_state(struct zwp_text_input_v1 *zwp_text_input_v1, uint32_t serial) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_COMMIT_STATE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, serial); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_v1 ++ */ ++static inline void ++zwp_text_input_v1_invoke_action(struct zwp_text_input_v1 *zwp_text_input_v1, uint32_t button, uint32_t index) ++{ ++ wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1, ++ ZWP_TEXT_INPUT_V1_INVOKE_ACTION, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, button, index); ++} ++ ++#define ZWP_TEXT_INPUT_MANAGER_V1_CREATE_TEXT_INPUT 0 ++ ++ ++/** ++ * @ingroup iface_zwp_text_input_manager_v1 ++ */ ++#define ZWP_TEXT_INPUT_MANAGER_V1_CREATE_TEXT_INPUT_SINCE_VERSION 1 ++ ++/** @ingroup iface_zwp_text_input_manager_v1 */ ++static inline void ++zwp_text_input_manager_v1_set_user_data(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1, void *user_data) ++{ ++ wl_proxy_set_user_data((struct wl_proxy *) zwp_text_input_manager_v1, user_data); ++} ++ ++/** @ingroup iface_zwp_text_input_manager_v1 */ ++static inline void * ++zwp_text_input_manager_v1_get_user_data(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1) ++{ ++ return wl_proxy_get_user_data((struct wl_proxy *) zwp_text_input_manager_v1); ++} ++ ++static inline uint32_t ++zwp_text_input_manager_v1_get_version(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1) ++{ ++ return wl_proxy_get_version((struct wl_proxy *) zwp_text_input_manager_v1); ++} ++ ++/** @ingroup iface_zwp_text_input_manager_v1 */ ++static inline void ++zwp_text_input_manager_v1_destroy(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1) ++{ ++ wl_proxy_destroy((struct wl_proxy *) zwp_text_input_manager_v1); ++} ++ ++/** ++ * @ingroup iface_zwp_text_input_manager_v1 ++ * ++ * Creates a new text_input object. ++ */ ++static inline struct zwp_text_input_v1 * ++zwp_text_input_manager_v1_create_text_input(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1) ++{ ++ struct wl_proxy *id; ++ ++ id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_manager_v1, ++ ZWP_TEXT_INPUT_MANAGER_V1_CREATE_TEXT_INPUT, &zwp_text_input_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_manager_v1), 0, NULL); ++ ++ return (struct zwp_text_input_v1 *) id; ++} ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/src/ibusattribute.h b/src/ibusattribute.h +index fe4cab45..10190921 100644 +--- a/src/ibusattribute.h ++++ b/src/ibusattribute.h +@@ -2,7 +2,8 @@ /* vim:set et sts=4: */ - /* ibus - The Input Bus + /* IBus - The Input Bus * Copyright (C) 2008-2013 Peng Huang -- * Copyright (C) 2008-2015 Red Hat, Inc. -+ * Copyright (C) 2008-2020 Red Hat, Inc. +- * Copyright (C) 2008-2013 Red Hat, Inc. ++ * Copyright (C) 2011-2023 Takao Fujiwara ++ * Copyright (C) 2008-2023 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 -@@ -241,29 +241,46 @@ typedef void (* IBusFreeFunc) (gpointer object); - * @IBUS_INPUT_PURPOSE_EMAIL: Edited field expects email address - * @IBUS_INPUT_PURPOSE_NAME: Edited field expects the name of a person - * @IBUS_INPUT_PURPOSE_PASSWORD: Like @IBUS_INPUT_PURPOSE_FREE_FORM, -- * but characters are hidden -+ * but characters are hidden - * @IBUS_INPUT_PURPOSE_PIN: Like @IBUS_INPUT_PURPOSE_DIGITS, but -- * characters are hidden -+ * characters are hidden -+ * @IBUS_INPUT_PURPOSE_TERMINAL: Allow any character, in addition to control -+ * codes. Since 1.5.24 - * - * Describes primary purpose of the input context. This information - * is particularly useful to implement intelligent behavior in - * engines, such as automatic input-mode switch and text prediction. - * -+ * Note that the purpose is not meant to impose a totally strict rule -+ * about allowed characters, and does not replace input validation. -+ * It is fine for an on-screen keyboard to let the user override the -+ * character set restriction that is expressed by the purpose. The -+ * application is expected to validate the entry contents, even if -+ * it specified a purpose. -+ * -+ * The difference between @IBUS_INPUT_PURPOSE_DIGITS and -+ * @IBUS_INPUT_PURPOSE_NUMBER is that the former accepts only digits -+ * while the latter also some punctuation (like commas or points, plus, -+ * minus) and “e” or “E” as in 3.14E+000. -+ * - * This enumeration may be extended in the future; engines should - * interpret unknown values as 'free form'. -+ * -+ * Since: 1.5.4 - */ - typedef enum - { -- IBUS_INPUT_PURPOSE_FREE_FORM, -- IBUS_INPUT_PURPOSE_ALPHA, -- IBUS_INPUT_PURPOSE_DIGITS, -- IBUS_INPUT_PURPOSE_NUMBER, -- IBUS_INPUT_PURPOSE_PHONE, -- IBUS_INPUT_PURPOSE_URL, -- IBUS_INPUT_PURPOSE_EMAIL, -- IBUS_INPUT_PURPOSE_NAME, -- IBUS_INPUT_PURPOSE_PASSWORD, -- IBUS_INPUT_PURPOSE_PIN -+ IBUS_INPUT_PURPOSE_FREE_FORM, -+ IBUS_INPUT_PURPOSE_ALPHA, -+ IBUS_INPUT_PURPOSE_DIGITS, -+ IBUS_INPUT_PURPOSE_NUMBER, -+ IBUS_INPUT_PURPOSE_PHONE, -+ IBUS_INPUT_PURPOSE_URL, -+ IBUS_INPUT_PURPOSE_EMAIL, -+ IBUS_INPUT_PURPOSE_NAME, -+ IBUS_INPUT_PURPOSE_PASSWORD, -+ IBUS_INPUT_PURPOSE_PIN, -+ IBUS_INPUT_PURPOSE_TERMINAL - } IBusInputPurpose; +@@ -91,6 +92,55 @@ typedef enum { + IBUS_ATTR_UNDERLINE_ERROR = 4, + } IBusAttrUnderline; - /** -@@ -280,24 +297,36 @@ typedef enum - * first word of each sentence - * @IBUS_INPUT_HINT_INHIBIT_OSK: Suggest to not show an onscreen keyboard - * (e.g for a calculator that already has all the keys). -- * @IBUS_INPUT_HINT_VERTICAL_WRITING: The text is vertical. -+ * @IBUS_INPUT_HINT_VERTICAL_WRITING: The text is vertical. Since 1.5.11 -+ * @IBUS_INPUT_HINT_EMOJI: Suggest offering Emoji support. Since 1.5.24 -+ * @IBUS_INPUT_HINT_NO_EMOJI: Suggest not offering Emoji support. Since 1.5.24 - * - * Describes hints that might be taken into account by engines. Note - * that engines may already tailor their behaviour according to the - * #IBusInputPurpose of the entry. ++ ++/** ++ * IBusAttrPreedit: ++ * @IBUS_ATTR_PREEDIT_DEFAULT: Default style for composing text. ++ * @IBUS_ATTR_PREEDIT_NONE: Style should be the same as in non-composing text. ++ * @IBUS_ATTR_PREEDIT_WHOLE: Most language engines wish to draw underline in ++ * the typed whole preedit string except for the ++ * prediction string. (Chinese, Japanese, ++ * Typing-booster) ++ * @IBUS_ATTR_PREEDIT_SELECTION: Modifying an active segment is distinguished ++ * against whole the preedit text. (Hangul, ++ * Japanese) ++ * @IBUS_ATTR_PREEDIT_PREDICTION: A prediction string can be appended after the ++ * typed string. (Typing-booster) ++ * @IBUS_ATTR_PREEDIT_PREFIX: A prefix string can be an informative color. ++ * (Table) ++ * @IBUS_ATTR_PREEDIT_SUFFIX: A suffix string can be an informative color. ++ * (Table) ++ * @IBUS_ATTR_PREEDIT_ERROR_SPELLING: An detected typo could be an error color ++ * with a spelling check or the word could ++ * not be found in a dictionary. The ++ * underline color also might be more ++ * visible. (Typing-booster, Table) ++ * @IBUS_ATTR_PREEDIT_ERROR_COMPOSE: A wrong compose key could be an error ++ * color. (Typing-booster) + * -+ * Some common sense is expected when using these flags - mixing -+ * @IBUS_INPUT_HINT_LOWERCASE with any of the uppercase hints makes no sense. ++ * Type of Pre-edit style as the semantic name. ++ * The Wayland specs prefers to express the semantic values rather than RGB ++ * values and text-input protocol version 1 defines some values: ++ * https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/unstable/text-input/text-input-unstable-v1.xml?ref_type=heads#L251 + * -+ * This enumeration may be extended in the future; engines should -+ * ignore unknown values. ++ * IBus compiled the values for major input method engines: ++ * https://github.com/ibus/ibus/wiki/Wayland-Colors + * -+ * Since: 1.5.4 - */ - typedef enum - { -- IBUS_INPUT_HINT_NONE = 0, -- IBUS_INPUT_HINT_SPELLCHECK = 1 << 0, -- IBUS_INPUT_HINT_NO_SPELLCHECK = 1 << 1, -- IBUS_INPUT_HINT_WORD_COMPLETION = 1 << 2, -- IBUS_INPUT_HINT_LOWERCASE = 1 << 3, -- IBUS_INPUT_HINT_UPPERCASE_CHARS = 1 << 4, -- IBUS_INPUT_HINT_UPPERCASE_WORDS = 1 << 5, -- IBUS_INPUT_HINT_UPPERCASE_SENTENCES = 1 << 6, -- IBUS_INPUT_HINT_INHIBIT_OSK = 1 << 7, -- IBUS_INPUT_HINT_VERTICAL_WRITING = 1 << 8 -+ IBUS_INPUT_HINT_NONE = 0, -+ IBUS_INPUT_HINT_SPELLCHECK = 1 << 0, -+ IBUS_INPUT_HINT_NO_SPELLCHECK = 1 << 1, -+ IBUS_INPUT_HINT_WORD_COMPLETION = 1 << 2, -+ IBUS_INPUT_HINT_LOWERCASE = 1 << 3, -+ IBUS_INPUT_HINT_UPPERCASE_CHARS = 1 << 4, -+ IBUS_INPUT_HINT_UPPERCASE_WORDS = 1 << 5, -+ IBUS_INPUT_HINT_UPPERCASE_SENTENCES = 1 << 6, -+ IBUS_INPUT_HINT_INHIBIT_OSK = 1 << 7, -+ IBUS_INPUT_HINT_VERTICAL_WRITING = 1 << 8, -+ IBUS_INPUT_HINT_EMOJI = 1 << 9, -+ IBUS_INPUT_HINT_NO_EMOJI = 1 << 10 - } IBusInputHints; ++ * Since: 1.5.29 ++ * Stability: Unstable ++ */ ++typedef enum { ++ IBUS_ATTR_PREEDIT_DEFAULT = 0, ++ IBUS_ATTR_PREEDIT_NONE, ++ IBUS_ATTR_PREEDIT_WHOLE, ++ IBUS_ATTR_PREEDIT_SELECTION, ++ IBUS_ATTR_PREEDIT_PREDICTION, ++ IBUS_ATTR_PREEDIT_PREFIX, ++ IBUS_ATTR_PREEDIT_SUFFIX, ++ IBUS_ATTR_PREEDIT_ERROR_SPELLING, ++ IBUS_ATTR_PREEDIT_ERROR_COMPOSE, ++} IBusAttrPreedit; ++ + typedef struct _IBusAttribute IBusAttribute; + typedef struct _IBusAttributeClass IBusAttributeClass; - #endif -- -2.24.1 - +2.41.0 + +From 1be3e2f79b384a374b2a69a31c88a4f36e1dd868 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Wed, 15 Nov 2023 17:19:02 +0900 +Subject: [PATCH] client/gtk2: Call strdup() after g_return_if_fail() + +--- + client/gtk2/ibusimcontext.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c +index b5a44da0..cfc08c20 100644 +--- a/client/gtk2/ibusimcontext.c ++++ b/client/gtk2/ibusimcontext.c +@@ -2417,7 +2417,7 @@ _create_input_context_done (IBusBus *bus, + static void + _create_input_context (IBusIMContext *ibusimcontext) + { +- gchar *prgname = g_strdup (g_get_prgname()); ++ gchar *prgname; + gchar *client_name; + IDEBUG ("%s", __FUNCTION__); + +@@ -2425,6 +2425,7 @@ _create_input_context (IBusIMContext *ibusimcontext) + + g_return_if_fail (ibusimcontext->cancellable == NULL); + ++ prgname = g_strdup (g_get_prgname()); + ibusimcontext->cancellable = g_cancellable_new (); + + if (!prgname) +-- +2.41.0 + +From 0a7a4d1dfa580dfcc65d76a697f40094085e55a2 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Sat, 25 Nov 2023 13:42:07 +0900 +Subject: [PATCH] ui/gtk3: Error handling with display == null + +BUG=rhbz#2188800 +--- + ui/gtk3/bindingcommon.vala | 6 +++++- + ui/gtk3/panel.vala | 14 ++++++++++---- + 2 files changed, 15 insertions(+), 5 deletions(-) + +diff --git a/ui/gtk3/bindingcommon.vala b/ui/gtk3/bindingcommon.vala +index da324f70..588be17a 100644 +--- a/ui/gtk3/bindingcommon.vala ++++ b/ui/gtk3/bindingcommon.vala +@@ -263,10 +263,14 @@ class BindingCommon { + return m_default_is_xdisplay; + } + +- public static Gdk.X11.Display get_xdisplay() { ++ public static Gdk.X11.Display? get_xdisplay() { + if (m_xdisplay != null) + return m_xdisplay; + var display = Gdk.Display.get_default(); ++ if (display == null) { ++ error("You should open a display for IBus panel."); ++ return null; ++ } + Type instance_type = display.get_type(); + Type x11_type = typeof(Gdk.X11.Display); + if (instance_type.is_a(x11_type)) { +diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala +index f1bbd720..783ec842 100644 +--- a/ui/gtk3/panel.vala ++++ b/ui/gtk3/panel.vala +@@ -1422,9 +1422,12 @@ class Panel : IBus.PanelService { + + Gdk.Display display_backup = null; + if (use_x11 && !BindingCommon.default_is_xdisplay()) { ++ var display = BindingCommon.get_xdisplay(); + display_backup = Gdk.Display.get_default(); +- Gdk.DisplayManager.get().set_default_display( +- (Gdk.Display)BindingCommon.get_xdisplay()); ++ if (display != null) { ++ Gdk.DisplayManager.get().set_default_display( ++ (Gdk.Display)display); ++ } + } + + // Show system menu +@@ -1476,9 +1479,12 @@ class Panel : IBus.PanelService { + private Gtk.Menu create_activate_menu(bool use_x11 = false) { + Gdk.Display display_backup = null; + if (use_x11 && !BindingCommon.default_is_xdisplay()) { ++ var display = BindingCommon.get_xdisplay(); + display_backup = Gdk.Display.get_default(); +- Gdk.DisplayManager.get().set_default_display( +- (Gdk.Display)BindingCommon.get_xdisplay()); ++ if (display != null) { ++ Gdk.DisplayManager.get().set_default_display( ++ (Gdk.Display)display); ++ } + } + m_ime_menu = new Gtk.Menu(); + +-- +2.41.0 + +From 719792d300579c1bfdf43251a83c6ed4e5594c07 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Tue, 5 Dec 2023 23:13:25 +0900 +Subject: [PATCH] src: Complete preedit signals for PostProcessKeyEvent + +I forgot to implement show-preedit-text and hide-preedit-text signals +with PostProcessKeyEvent D-Bus signal in the client side. + +Fixes: https://github.com/ibus/ibus/commit/e059536 + +BUG=https://github.com/ibus/ibus/issues/2585 +--- + src/ibusinputcontext.c | 33 ++++++++++++++++++++++++++------- + 1 file changed, 26 insertions(+), 7 deletions(-) + +diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c +index 1b62f656..600526e5 100644 +--- a/src/ibusinputcontext.c ++++ b/src/ibusinputcontext.c +@@ -1463,6 +1463,22 @@ ibus_input_context_fwd_text_to_delete_surrounding (IBusInputContext *context, + } + + ++static void ++ibus_input_context_fwd_text_to_hide_preedit (IBusInputContext *context, ++ IBusText *text) ++{ ++ g_signal_emit (context, context_signals[HIDE_PREEDIT_TEXT], 0, text); ++} ++ ++ ++static void ++ibus_input_context_fwd_text_to_show_preedit (IBusInputContext *context, ++ IBusText *text) ++{ ++ g_signal_emit (context, context_signals[SHOW_PREEDIT_TEXT], 0, text); ++} ++ ++ + static void + ibus_input_context_fwd_text_to_update_preedit (IBusInputContext *context, + IBusText *text, +@@ -1558,18 +1574,21 @@ ibus_input_context_post_process_key_event (IBusInputContext *context) + case 'c': + ibus_input_context_fwd_text_to_commit (context, text); + break; +- case 'f': { ++ case 'd': ++ ibus_input_context_fwd_text_to_delete_surrounding (context, text); ++ break; ++ case 'f': + ibus_input_context_fwd_text_to_forward_key_event (context, text); + break; +- } +- case 'r': { ++ case 'h': ++ ibus_input_context_fwd_text_to_hide_preedit (context, text); ++ break; ++ case 'r': + ibus_input_context_fwd_text_to_require_surrounding (context, text); + break; +- } +- case 'd': { +- ibus_input_context_fwd_text_to_delete_surrounding (context, text); ++ case 's': ++ ibus_input_context_fwd_text_to_show_preedit (context, text); + break; +- } + case 'u': + case 'm': { + IBusText *position; +-- +2.41.0 + +From ac46d154e72fdc914e6d34ff1b251c8fcb70ce20 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Thu, 7 Dec 2023 20:34:49 +0900 +Subject: [PATCH] Refactor object initialization + +- client/wayland: Make sure IBusWaylandIM->ibuscontext is NULL + when IBusWaylandIM->context is NULL. + +- configure: Set some default help messages. + +- ui/gtk3: Make sure to call an error message if display is NULL. +--- + client/wayland/ibuswaylandim.c | 10 ++++++---- + configure.ac | 18 +++++++++--------- + ui/gtk3/panel.vala | 5 +---- + 3 files changed, 16 insertions(+), 17 deletions(-) + +diff --git a/client/wayland/ibuswaylandim.c b/client/wayland/ibuswaylandim.c +index 9e8f651e..0430538f 100644 +--- a/client/wayland/ibuswaylandim.c ++++ b/client/wayland/ibuswaylandim.c +@@ -115,6 +115,10 @@ struct wl_registry *_registry = NULL; + + static gboolean _use_sync_mode = 1; + ++static void input_method_deactivate ++ (void *data, ++ struct zwp_input_method_v1 *input_method, ++ struct zwp_input_method_context_v1 *context); + static GObject *ibus_wayland_im_constructor (GType type, + guint n_params, + GObjectConstructParam +@@ -1207,10 +1211,8 @@ input_method_activate (void *data, + + g_return_if_fail (IBUS_IS_WAYLAND_IM (wlim)); + priv = ibus_wayland_im_get_instance_private (wlim); +- if (priv->context) { +- zwp_input_method_context_v1_destroy (priv->context); +- priv->context = NULL; +- } ++ if (priv->context) ++ input_method_deactivate (data, input_method, context); + + priv->serial = 0; + priv->context = context; +diff --git a/configure.ac b/configure.ac +index 50b4a820..dc1410cc 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -233,7 +233,7 @@ AC_ARG_ENABLE(gtk4, + AS_HELP_STRING([--enable-gtk4], + [Build gtk4 im module]), + [enable_gtk4=$enableval], +- [enable_gtk4=no] ++ [enable_gtk4=yes] + ) + AM_CONDITIONAL([ENABLE_GTK4], [test x"$enable_gtk4" = x"yes"]) + +@@ -276,8 +276,7 @@ if test x"$enable_gtk2" = x"yes"; then + + gtk2_binary_version=`$PKG_CONFIG --variable=gtk_binary_version gtk+-2.0` + GTK2_IM_MODULEDIR="$libdir"/gtk-2.0/$gtk2_binary_version/immodules +-else +- enable_gtk2="no (disabled, use --enable-gtk2 to enable)" ++ enable_gtk2="yes (enabled, use --disable-gtk2 to disable)" + fi + + if test x"$enable_gtk3" = x"yes"; then +@@ -297,7 +296,6 @@ if test x"$enable_gtk3" = x"yes"; then + gtk3_binary_version=`$PKG_CONFIG --variable=gtk_binary_version gtk+-3.0` + GTK3_IM_MODULEDIR="$libdir"/gtk-3.0/$gtk3_binary_version/immodules + else +- enable_gtk3="no (disabled, use --enable-gtk3 to enable)" + enable_gdk3_wayland=no + fi + if test x"$enable_gdk3_wayland" != x"yes"; then +@@ -313,8 +311,7 @@ if test x"$enable_gtk4" = x"yes"; then + + gtk4_binary_version=`$PKG_CONFIG --variable=gtk_binary_version gtk4` + GTK4_IM_MODULEDIR="$libdir"/gtk-4.0/$gtk4_binary_version/immodules +-else +- enable_gtk4="no (disabled, use --enable-gtk4 to enable)" ++ enable_gtk4="yes (enabled, use --disable-gtk4 to disable)" + fi + + if test x"$enable_xim" = x"yes"; then +@@ -331,8 +328,10 @@ if test x"$enable_xim" = x"yes"; then + gtk+-2.0 + ]) + fi +-else +- enable_xim="no (disabled, use --enable-xim to enable)" ++ enable_xim="yes (enabled, use --disable-xim to disable)" ++fi ++if test x"$enable_gtk3" = x"yes"; then ++ enable_gtk3="yes (enabled, use --disable-gtk3 to disable)" + fi + + if $PKG_CONFIG --exists x11; then +@@ -363,8 +362,9 @@ if test x"$enable_wayland" = x"yes"; then + AC_SUBST(WAYLAND_PRTCLS_SUBDIR) + WAYLAND_SCANNER_RULES(['$(datadir)/$(WAYLAND_PRTCLS_SUBDIR)'])], + [AC_SUBST(wayland_scanner_rules)]) ++ enable_wayland="yes (enabled, use --disable-wayland to disable)" + else +- enable_wayland="no (disabled, use --enable-wayland to enable)" ++ wayland_scanner_rules="./wayland-scanner.mk" + AC_SUBST(wayland_scanner_rules) + fi + +diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala +index 783ec842..233dd29c 100644 +--- a/ui/gtk3/panel.vala ++++ b/ui/gtk3/panel.vala +@@ -111,10 +111,7 @@ class Panel : IBus.PanelService { + m_is_wayland_im = is_wayland_im; + + #if USE_GDK_WAYLAND +- var display = Gdk.Display.get_default(); +- Type instance_type = display.get_type(); +- Type wayland_type = typeof(GdkWayland.Display); +- m_is_wayland = instance_type.is_a(wayland_type); ++ m_is_wayland = !BindingCommon.default_is_xdisplay(); + #else + m_is_wayland = false; + warning("Checking Wayland is disabled"); +-- +2.41.0 + +From 8470873979e3435c29d98704f1ac7e1e47e9dc2f Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Thu, 14 Dec 2023 23:55:42 +0900 +Subject: [PATCH] ui/gtk3: Fix some warnings + +- Try to disable Vala warnings with gtk_menu_shell_insert() workaround. +- Stop string_slice() warning with different language lengths. +--- + ui/gtk3/panel.vala | 17 ++++++++++------- + ui/gtk3/switcher.vala | 4 +++- + 2 files changed, 13 insertions(+), 8 deletions(-) + +diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala +index 233dd29c..aa9e8664 100644 +--- a/ui/gtk3/panel.vala ++++ b/ui/gtk3/panel.vala +@@ -1433,7 +1433,8 @@ class Panel : IBus.PanelService { + + item = new Gtk.MenuItem.with_label(_("Preferences")); + item.activate.connect((i) => show_setup_dialog()); +- m_sys_menu.append(item); ++ // https://gitlab.gnome.org/GNOME/gtk/-/issues/5870 ++ m_sys_menu.insert(item, -1); + + #if EMOJI_DICT + item = new Gtk.MenuItem.with_label(_("Emoji Choice")); +@@ -1448,22 +1449,23 @@ class Panel : IBus.PanelService { + */ + panel_extension(event); + }); +- m_sys_menu.append(item); ++ // https://gitlab.gnome.org/GNOME/gtk/-/issues/5870 ++ m_sys_menu.insert(item, -1); + #endif + + item = new Gtk.MenuItem.with_label(_("About")); + item.activate.connect((i) => show_about_dialog()); +- m_sys_menu.append(item); ++ m_sys_menu.insert(item, -1); + +- m_sys_menu.append(new Gtk.SeparatorMenuItem()); ++ m_sys_menu.insert(new Gtk.SeparatorMenuItem(), -1); + + item = new Gtk.MenuItem.with_label(_("Restart")); + item.activate.connect((i) => m_bus.exit(true)); +- m_sys_menu.append(item); ++ m_sys_menu.insert(item, -1); + + item = new Gtk.MenuItem.with_label(_("Quit")); + item.activate.connect((i) => m_bus.exit(false)); +- m_sys_menu.append(item); ++ m_sys_menu.insert(item, -1); + + m_sys_menu.show_all(); + +@@ -1488,7 +1490,8 @@ class Panel : IBus.PanelService { + // Show properties and IME switching menu + m_property_manager.create_menu_items(m_ime_menu); + +- m_ime_menu.append(new Gtk.SeparatorMenuItem()); ++ // https://gitlab.gnome.org/GNOME/gtk/-/issues/5870 ++ m_ime_menu.insert(new Gtk.SeparatorMenuItem(), -1); + + // Append IMEs + foreach (var engine in m_engines) { +diff --git a/ui/gtk3/switcher.vala b/ui/gtk3/switcher.vala +index e3fab8d9..26bded99 100644 +--- a/ui/gtk3/switcher.vala ++++ b/ui/gtk3/switcher.vala +@@ -592,7 +592,9 @@ class Switcher : Gtk.Window { + int index = 0; + + foreach (var saved_language in m_xkb_languages.get_values()) { +- if (language == saved_language[0:length]) ++ // Duplicated langauge is EN, EN_2 for E.G. ++ if (length <= saved_language.length && ++ language == saved_language[0:length]) + index++; + } + +-- +2.41.0 + +From 4872c1fcdc8bbe146e967d004edf63f5994b21f8 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Thu, 21 Dec 2023 08:26:48 +0900 +Subject: [PATCH] src/ibusenginesimple.c: Don't commit any characters + +Revert a part of the previous patch of #2495 because it explains +"Super-space and space key can launch IBus Emojier." but I cannot +remember what I tried to fix. + +IBus XKB engines should not commit any keysyms before the key event is +sent to the application with IBUS_IGNORED_MASK flag even if the key +is not an ASCII because any characters can be control characters +by application. +E.g. VIM cursor mode "hjkl" keys or game cursor keys with language +layouts. + +Fixes: https://github.com/ibus/ibus/commit/ad883dc + +BUG=https://github.com/ibus/ibus/issues/2588 +--- + client/gtk2/ibusimcontext.c | 6 ++++++ + src/ibusenginesimple.c | 15 ++++++++++----- + 2 files changed, 16 insertions(+), 5 deletions(-) + +diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c +index cfc08c20..ebc8d869 100644 +--- a/client/gtk2/ibusimcontext.c ++++ b/client/gtk2/ibusimcontext.c +@@ -361,6 +361,12 @@ ibus_im_context_commit_event (IBusIMContext *ibusimcontext, + keyval == GDK_KEY_KP_Enter) { + return FALSE; + } ++ /* #2588 If IBus tries to commit a character, it should be forwarded to ++ * the application at once with IBUS_IGNORED_MASK before the actual ++ * commit because any characters can be control characters even if ++ * they are not ASCII characters, e.g. game cursor keys with a ++ * language keyboard layout likes VIM cursor mode "hjkl" keys. ++ */ + ch = ibus_keyval_to_unicode (keyval); + if (ch != 0 && !g_unichar_iscntrl (ch)) { + IBusText *text = ibus_text_new_from_unichar (ch); +diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c +index 31cb416c..4bee8cb3 100644 +--- a/src/ibusenginesimple.c ++++ b/src/ibusenginesimple.c +@@ -647,12 +647,17 @@ no_sequence_matches (IBusEngineSimple *simple, + + ibus_engine_simple_update_preedit_text (simple); + ch = ibus_keyval_to_unicode (keyval); +- /* IBUS_CHANGE: RH#769133 +- * Since we use ibus xkb engines as the disable state, +- * Super-space and space key can launch IBus Emojier. ++ /* IBUS_CHANGE: RH#769133, #2588 ++ * Since we use ibus xkb engines as the disable IM mode, ++ * do not commit the characters locally without in_hex_sequence. ++ * If IBus tries to commit a character, it should be forwarded to ++ * the application at once with IBUS_IGNORED_MASK before the actual ++ * commit because any characters can be control characters even if ++ * they are not ASCII characters, e.g. game cursor keys with a ++ * language keyboard layout likes VIM cursor mode "hjkl" keys. + */ +- if (ch != 0 && !g_unichar_iscntrl (ch) && ch > 0x7F) { +- ibus_engine_simple_commit_char (simple, ch); ++ if (ch != 0 && !g_unichar_iscntrl (ch) && ++ priv->in_hex_sequence) { + return TRUE; + } else { + return FALSE; +-- +2.43.0 diff --git a/ibus.spec b/ibus.spec index b2be84c..600d025 100644 --- a/ibus.spec +++ b/ibus.spec @@ -5,24 +5,24 @@ %global dbus_python_version 0.83.0 Name: ibus -Version: 1.5.23 -Release: 3 +Version: 1.5.29 +Release: 1 Summary: Intelligent Input Bus for Linux OS License: LGPLv2+ URL: https://github.com/ibus/%name/wiki -Source0: https://github.com/ibus/ibus/releases/download/%{version}/%{name}-%{version}.tar.gz +Source0: https://github.com/ibus/ibus/releases/download/%{version}/%{name}-%{version}-rc2.tar.gz #Source1,2 come form fedora Source1: %{name}-xinput Source2: %{name}.conf.5 Patch0: %{name}-HEAD.patch Patch1: %{name}-1385349-segv-bus-proxy.patch Patch2: 30a3641e19c541924959a5770dd784b4424288d4.patch -Patch3: 0001-Fix-ibus-setup-startup-failure.patch BuildRequires: gettext-devel libtool glib2-doc gtk2-devel gtk3-devel dbus-glib-devel gtk-doc dconf-devel dbus-x11 python3-devel BuildRequires: dbus-python-devel >= %{dbus_python_version} desktop-file-utils python3-gobject vala vala-devel vala-tools BuildRequires: iso-codes-devel libnotify-devel libwayland-client-devel qt5-qtbase-devel cldr-emoji-annotation BuildRequires: unicode-emoji unicode-ucd libXtst-devel libxslt gobject-introspection-devel pygobject3-devel +BuildRequires: libdbusmenu-gtk3-devel Requires: iso-codes dbus-x11 dconf python3-gobject python3 Requires: xorg-x11-xinit xorg-x11-xkb-utils @@ -69,8 +69,8 @@ The ibus-devel package contains the header files and developer docs for ibus. %prep -%autosetup -p1 - +%autosetup -n %{name}-%{version}-rc2 -p1 +cp client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c || : diff client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c if test $? -ne 0 ; then @@ -150,12 +150,17 @@ dconf update || : %{_libexecdir}/* %{_sysconfdir}/dconf/db/ibus.d %{_sysconfdir}/dconf/profile/ibus +%dir %{_sysconfdir}/xdg/Xwayland-session.d +%{_sysconfdir}/xdg/Xwayland-session.d/10-ibus-x11 +%{_prefix}/lib/systemd/user/gnome-session.target.wants/*.service +%{_prefix}/lib/systemd/user/org.freedesktop.IBus.session.*.service %python3_sitearch/gi/overrides/__pycache__/*.py* %python3_sitearch/gi/overrides/IBus.py %dir %{_sysconfdir}/X11/xinit/xinput.d %config %{_xinputconf} %{_libdir}/gtk-2.0/* %{_libdir}/gtk-3.0/* +%{_libdir}/gtk-4.0/* %files libs %{_libdir}/libibus-*%{ibus_api_version}.so.* @@ -178,6 +183,9 @@ dconf update || : %{_datadir}/gtk-doc/html/* %changelog +* Thu Feb 01 2024 zhouwenpei - 1.5.29-1 +- update to 1.5.29 + * Fri Sep 15 2023 yangxianzhao - 1.5.23-3 - fix ibus setup failure