fujiwara / rpms / ibus

Forked from rpms/ibus 4 years ago
Clone
Blob Blame History Raw
From 17648f0522910480b6c5dd4f5356ca1f6c160bf5 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Tue, 29 Mar 2022 22:48:19 +0200
Subject: [PATCH] src: Fix refcounting issues

Commit 5a455b1ead attempted to fix both GLib warnings around
floating references and other presumed refcounting issues. However
it missed 2 kinds of bugs:

- The places that take an IBusText created from a static string
  were made to avoid freeing it afterwards, but the staticness refers
  to the string content, not the object itself.
- The places that are documented to emit signals on floating object
  references used to do the following after signal emission:

  if (g_object_is_floating (object))
    g_object_unref (object)

  And did possibly trigger GLib warnings were changed to:

  if (g_object_is_floating (object))
    g_object_sink_ref (object);
  g_object_unref (object);

  Which fixes the GLib warning for floating references, but do
  unintendedly steal one reference away for non floating references.

This commit is essentially a revert of commit 5a455b1ead, but
addressing both things differently:

- All label/tooltip/symbol IBusText properties in IBusProperty do
  now always sink the reference of the stored object.

- All places documented as maybe using objects with a floating reference
  on signals changed to doing:

  if (g_object_is_floating (object)) {
    g_object_ref_sink (object);
    g_object_unref (object);
  }

  So the floating reference is owned and unreferenced without warnings,
  but already owned references are left unchanged.

This addresses the possible GLib warnings, fixes the possible double
unrefs happening on IBusText used in signals, and fixes the missing
unrefs on IBusText objects created from static strings.

BUG=https://github.com/ibus/ibus/issues/2393
BUG=https://github.com/ibus/ibus/issues/2387
---
 src/ibusinputcontext.c | 35 +++++++++++++++++++++--------------
 src/ibusproperty.c     | 32 +++++++++++++++++---------------
 2 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
index 4b27551b..7981de38 100644
--- a/src/ibusinputcontext.c
+++ b/src/ibusinputcontext.c
@@ -549,9 +549,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
         g_variant_unref (variant);
         g_signal_emit (context, context_signals[COMMIT_TEXT], 0, text);
 
-        if (g_object_is_floating (text))
+        if (g_object_is_floating (text)) {
             g_object_ref_sink (text);
-        g_object_unref (text);
+            g_object_unref (text);
+        }
         return;
     }
     if (g_strcmp0 (signal_name, "UpdatePreeditText") == 0) {
@@ -569,9 +570,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
                        cursor_pos,
                        visible);
 
-        if (g_object_is_floating (text))
+        if (g_object_is_floating (text)) {
             g_object_ref_sink (text);
-        g_object_unref (text);
+            g_object_unref (text);
+        }
         return;
     }
     if (g_strcmp0 (signal_name, "UpdatePreeditTextWithMode") == 0) {
@@ -592,9 +594,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
                        visible,
                        mode);
 
-        if (g_object_is_floating (text))
+        if (g_object_is_floating (text)) {
             g_object_ref_sink (text);
-        g_object_unref (text);
+            g_object_unref (text);
+        }
         return;
     }
 
@@ -621,9 +624,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
                        0,
                        text,
                        visible);
-        if (g_object_is_floating (text))
+        if (g_object_is_floating (text)) {
             g_object_ref_sink (text);
-        g_object_unref (text);
+            g_object_unref (text);
+        }
         return;
     }
 
@@ -640,9 +644,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
                        0,
                        table,
                        visible);
-        if (g_object_is_floating (table))
+        if (g_object_is_floating (table)) {
             g_object_ref_sink (table);
-        g_object_unref (table);
+            g_object_unref (table);
+        }
         return;
 
     }
@@ -659,9 +664,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
                        0,
                        prop_list);
 
-        if (g_object_is_floating (prop_list))
+        if (g_object_is_floating (prop_list)) {
             g_object_ref_sink (prop_list);
-        g_object_unref (prop_list);
+            g_object_unref (prop_list);
+        }
         return;
     }
 
@@ -673,9 +679,10 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
 
         g_signal_emit (context, context_signals[UPDATE_PROPERTY], 0, prop);
 
-        if (g_object_is_floating (prop))
+        if (g_object_is_floating (prop)) {
             g_object_ref_sink (prop);
-        g_object_unref (prop);
+            g_object_unref (prop);
+        }
         return;
     }
 
diff --git a/src/ibusproperty.c b/src/ibusproperty.c
index 6d4ed088..cd8a0e2a 100644
--- a/src/ibusproperty.c
+++ b/src/ibusproperty.c
@@ -336,20 +336,17 @@ ibus_property_destroy (IBusProperty *prop)
     prop->priv->icon = NULL;
 
     if (prop->priv->label) {
-        if (!ibus_text_get_is_static (prop->priv->label))
-            g_object_unref (prop->priv->label);
+        g_object_unref (prop->priv->label);
         prop->priv->label = NULL;
     }
 
     if (prop->priv->symbol) {
-        if (!ibus_text_get_is_static (prop->priv->symbol))
-            g_object_unref (prop->priv->symbol);
+        g_object_unref (prop->priv->symbol);
         prop->priv->symbol = NULL;
     }
 
     if (prop->priv->tooltip) {
-        if (!ibus_text_get_is_static (prop->priv->tooltip))
-            g_object_unref (prop->priv->tooltip);
+        g_object_unref (prop->priv->tooltip);
         prop->priv->tooltip = NULL;
     }
 
@@ -404,7 +401,7 @@ ibus_property_deserialize (IBusProperty *prop,
     g_variant_get_child (variant, retval++, "u", &prop->priv->type);
 
     GVariant *subvar = g_variant_get_child_value (variant, retval++);
-    if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
+    if (prop->priv->label) {
         g_object_unref (prop->priv->label);
     }
     prop->priv->label = IBUS_TEXT (ibus_serializable_deserialize (subvar));
@@ -414,7 +411,7 @@ ibus_property_deserialize (IBusProperty *prop,
     ibus_g_variant_get_child_string (variant, retval++, &prop->priv->icon);
 
     subvar = g_variant_get_child_value (variant, retval++);
-    if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
+    if (prop->priv->tooltip) {
         g_object_unref (prop->priv->tooltip);
     }
     prop->priv->tooltip = IBUS_TEXT (ibus_serializable_deserialize (subvar));
@@ -435,7 +432,7 @@ ibus_property_deserialize (IBusProperty *prop,
 
     /* Keep the serialized order for the compatibility when add new members. */
     subvar = g_variant_get_child_value (variant, retval++);
-    if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
+    if (prop->priv->symbol) {
         g_object_unref (prop->priv->symbol);
     }
     prop->priv->symbol = IBUS_TEXT (ibus_serializable_deserialize (subvar));
@@ -567,7 +564,7 @@ ibus_property_set_label (IBusProperty *prop,
     g_assert (IBUS_IS_PROPERTY (prop));
     g_return_if_fail (label == NULL || IBUS_IS_TEXT (label));
 
-    if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
+    if (prop->priv->label) {
         g_object_unref (prop->priv->label);
     }
 
@@ -575,8 +572,10 @@ ibus_property_set_label (IBusProperty *prop,
         prop->priv->label = ibus_text_new_from_static_string ("");
     }
     else {
-        prop->priv->label = g_object_ref_sink (label);
+        prop->priv->label = label;
     }
+
+    g_object_ref_sink (prop->priv->label);
 }
 
 void
@@ -586,7 +585,7 @@ ibus_property_set_symbol (IBusProperty *prop,
     g_assert (IBUS_IS_PROPERTY (prop));
     g_return_if_fail (symbol == NULL || IBUS_IS_TEXT (symbol));
 
-    if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
+    if (prop->priv->symbol) {
         g_object_unref (prop->priv->symbol);
     }
 
@@ -594,8 +593,10 @@ ibus_property_set_symbol (IBusProperty *prop,
         prop->priv->symbol = ibus_text_new_from_static_string ("");
     }
     else {
-        prop->priv->symbol = g_object_ref_sink (symbol);
+        prop->priv->symbol = symbol;
     }
+
+    g_object_ref_sink (prop->priv->symbol);
 }
 
 void
@@ -615,7 +616,7 @@ ibus_property_set_tooltip (IBusProperty *prop,
     g_assert (IBUS_IS_PROPERTY (prop));
     g_assert (tooltip == NULL || IBUS_IS_TEXT (tooltip));
 
-    if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
+    if (prop->priv->tooltip) {
         g_object_unref (prop->priv->tooltip);
     }
 
@@ -624,8 +625,9 @@ ibus_property_set_tooltip (IBusProperty *prop,
     }
     else {
         prop->priv->tooltip = tooltip;
-        g_object_ref_sink (prop->priv->tooltip);
     }
+
+    g_object_ref_sink (prop->priv->tooltip);
 }
 
 void
-- 
2.34.1

From 1b5b9548ad418765717ce1fbdc70b3f3eaae67fc Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 14 Mar 2022 14:25:10 +0900
Subject: [PATCH] client/gtk2: Revert CCedilla change for pt-BR

gtk_im_context_simple_add_table() is deprecated in GTK4.
I decide to delete gtk_im_context_simple_add_table() here because
the change 03c9e591430c62354bbf26ef7bd4a2e6acfb7c8f is no longer needed
because IBusEngineSimple has implemented to load pt_br compose key
by locale

BUG=chromium-os:11421
BUG=http://codereview.appspot.com/3989060
---
 client/gtk2/ibusimcontext.c | 33 +--------------------------------
 1 file changed, 1 insertion(+), 32 deletions(-)

diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index a5e5e792..e314ae98 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -2,7 +2,7 @@
 /* vim:set et sts=4: */
 /* ibus - The Input Bus
  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
  * Copyright (C) 2008-2021 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
@@ -874,33 +874,6 @@ ibus_im_context_class_fini (IBusIMContextClass *class)
     g_bus_unwatch_name (_daemon_name_watch_id);
 }
 
-/* Copied from gtk+2.0-2.20.1/modules/input/imcedilla.c to fix crosbug.com/11421.
- * Overwrite the original Gtk+'s compose table in gtk+-2.x.y/gtk/gtkimcontextsimple.c. */
-
-/* The difference between this and the default input method is the handling
- * of C+acute - this method produces C WITH CEDILLA rather than C WITH ACUTE.
- * For languages that use CCedilla and not acute, this is the preferred mapping,
- * and is particularly important for pt_BR, where the us-intl keyboard is
- * used extensively.
- */
-static guint16 cedilla_compose_seqs[] = {
-#ifdef DEPRECATED_GDK_KEYSYMS
-  GDK_dead_acute,	GDK_C,	0,	0,	0,	0x00C7,	/* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-  GDK_dead_acute,	GDK_c,	0,	0,	0,	0x00E7,	/* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-  GDK_Multi_key,	GDK_apostrophe,	GDK_C,  0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-  GDK_Multi_key,	GDK_apostrophe,	GDK_c,  0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-  GDK_Multi_key,	GDK_C,  GDK_apostrophe,	0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-  GDK_Multi_key,	GDK_c,  GDK_apostrophe,	0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-#else
-  GDK_KEY_dead_acute,	GDK_KEY_C,	0,	0,	0,	0x00C7,	/* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-  GDK_KEY_dead_acute,	GDK_KEY_c,	0,	0,	0,	0x00E7,	/* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-  GDK_KEY_Multi_key,	GDK_KEY_apostrophe,	GDK_KEY_C,  0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-  GDK_KEY_Multi_key,	GDK_KEY_apostrophe,	GDK_KEY_c,  0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-  GDK_KEY_Multi_key,	GDK_KEY_C,  GDK_KEY_apostrophe,	0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-  GDK_KEY_Multi_key,	GDK_KEY_c,  GDK_KEY_apostrophe,	0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-#endif
-};
-
 static void
 ibus_im_context_init (GObject *obj)
 {
@@ -936,10 +909,6 @@ ibus_im_context_init (GObject *obj)
 
     // Create slave im context
     ibusimcontext->slave = gtk_im_context_simple_new ();
-    gtk_im_context_simple_add_table (GTK_IM_CONTEXT_SIMPLE (ibusimcontext->slave),
-                                     cedilla_compose_seqs,
-                                     4,
-                                     G_N_ELEMENTS (cedilla_compose_seqs) / (4 + 2));
 
     g_signal_connect (ibusimcontext->slave,
                       "commit",
-- 
2.34.1

From 37900574934bb01cc31860ae3ae2f668e4360838 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 28 Mar 2022 23:18:58 +0900
Subject: [PATCH] src/tests: Run ibus-daemon from CI even if GNOME desktop

gnome-shell no longer launch ibus-daemon with IBus systemd file.
This is a workaround to call ibus-daemon after GNOME fails to
launch ibus-daemon

BUG=https://gitlab.gnome.org/GNOME/gdm/-/issues/777
---
 src/tests/ibus-desktop-testing-runner.in | 38 +++++++++++++++++++++---
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
index 48528326..6b208345 100755
--- a/src/tests/ibus-desktop-testing-runner.in
+++ b/src/tests/ibus-desktop-testing-runner.in
@@ -55,6 +55,7 @@ GREEN='\033[0;32m'
 RED='\033[0;31m'
 NC='\033[0m'
 
+
 print_log()
 {
     if [ x"$RESULT_LOG" != x ] ; then
@@ -69,6 +70,7 @@ print_log()
     fi
 }
 
+
 usage()
 {
     $ECHO -e \
@@ -95,6 +97,7 @@ usage()
 ""
 }
 
+
 parse_args()
 {
     # This is GNU getopt. "sudo port getopt" in BSD?
@@ -129,6 +132,7 @@ parse_args()
     fi
 }
 
+
 init_desktop()
 {
     if [ "$RESULT_LOG" != "" ] ; then
@@ -207,6 +211,7 @@ _EOF
     #export XDG_SEAT=seat0
 }
 
+
 run_dbus_daemon()
 {
     # Use dbus-launch --exit-with-session later instead of --sh-syntax
@@ -216,6 +221,7 @@ run_dbus_daemon()
     export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
 }
 
+
 init_gnome()
 {
     # gsettings set command needs dconf-service with the same $DISPLAY
@@ -258,6 +264,7 @@ init_gnome()
     fi
 }
 
+
 run_desktop()
 {
     echo "$DESKTOP_COMMAND" | grep gnome-session > /dev/null
@@ -278,12 +285,28 @@ run_desktop()
     $DESKTOP_COMMAND &
     PID_GNOME_SESSION=$!
     sleep 30
-    if [  $HAS_GNOME -ne 0 ] ; then
-        ibus-daemon --daemonize --verbose
-        sleep 3
-    fi
+
+    # gnome-shell 42 checks if org.freedesktop.IBus.session.GNOME.service
+    # systemd file is available with org.freedesktop.systemd1.Manager.GetUnit
+    # D-Bus method, which is provided by IBus 1.5.26, and if the file
+    # is available, gnome-shell no longer launch ibus-daemon
+    # because gnome-shell assumes gnome-session would launch ibus-daemon
+    # with org.freedesktop.systemd1.Manager.StartUnit D-Bus method.
+    # But actually gnome-session failed to launch ibus-daemon
+    # because the IBus systemd file depends on gnome-session.target
+    # but this CI launches gnome-session directly.
+    #
+    # So ibus-dameon is now always called here after gnome-shell fails to
+    # launch ibus-daemon.
+    # It may be better this CI launches GDM autologin to run gnome-session
+    # with gnome-session.target systemd file.
+    # But `systemctl start gdm` terminates the parent script forcibly
+    # and the script cannot get the CI result.
+    ibus-daemon --daemonize --verbose
+    sleep 3
 }
 
+
 count_case_result()
 {
     retval=$1
@@ -298,6 +321,7 @@ count_case_result()
     echo $pass $fail
 }
 
+
 echo_case_result()
 {
     retval=$1
@@ -311,6 +335,7 @@ echo_case_result()
     fi
 }
 
+
 run_direct_test_cases()
 {
     pass=0
@@ -363,6 +388,7 @@ EOF_ENVS
     echo $pass $fail
 }
 
+
 run_gnome_desktop_testing_runner()
 {
     pass=0
@@ -397,6 +423,7 @@ EOF
     echo $pass $fail
 }
 
+
 run_test_suite()
 {
     pass=0
@@ -435,6 +462,7 @@ EOF_RUNNER
     fi
 }
 
+
 finit()
 {
     echo "# Killing left gnome-session and Xorg"
@@ -451,6 +479,7 @@ finit()
     echo "# Finished $PROGNAME testing"
 }
 
+
 main()
 {
     parse_args "$@"
@@ -470,5 +499,6 @@ main()
     finit
 }
 
+
 # Need to enclose $@ with double quotes not to split the array.
 main "$@"
-- 
2.34.1

From b024ea8fcee6fe1a20570a6f80cc4f9f8f420706 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 20 Apr 2022 19:36:10 +0900
Subject: [PATCH] ui/gtk3: Disable XKB engines in Plasma Wayland

Currently ibus-ui-gtk3 runs the setxkbmap command internally to set
the XKB keymaps from XKB engines but setxkbmap does not work in Wayland
session.
The IBus XKB engines are disabled at the moment in Plamsa Wayland
and ibus-ui-gtk3 asks users to use systemsettings5.

Will use libinput and libxkbcommon later but it would be better
to implement IBus in Plamsa Wayland compositor.

BUG=rhbz#2076596
---
 configure.ac        | 16 ++++++++++
 ui/gtk3/Makefile.am | 17 ++++++++++-
 ui/gtk3/panel.vala  | 74 +++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 100 insertions(+), 7 deletions(-)

diff --git a/configure.ac b/configure.ac
index a3cdb2da..79b9c11a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -636,6 +636,21 @@ if test x"$enable_engine" = x"yes"; then
     enable_engine="yes (enabled, use --disable-engine to disable)"
 fi
 
+# --disable-libnotify
+AC_ARG_ENABLE(libnotify,
+    AS_HELP_STRING([--disable-libnotify],
+                   [Disable to link libnotify]),
+    [enable_libnotify=$enableval],
+    [enable_libnotify=yes]
+)
+AM_CONDITIONAL([ENABLE_LIBNOTIFY], [test x"$enable_libnotify" = x"yes"])
+if test x"$enable_libnotify" = x"yes"; then
+    PKG_CHECK_MODULES(LIBNOTIFY, [
+        libnotify >= 0.7
+    ])
+    enable_libnotify="yes (enabled, use --disable-libnotify to disable)"
+fi
+
 PKG_CHECK_MODULES(XTEST,
     [x11 xtst],
     [enable_xtest=yes],
@@ -871,6 +886,7 @@ Build options:
   No snooper regexes            "$NO_SNOOPER_APPS"
   Panel icon                    "$IBUS_ICON_KEYBOARD"
   Enable surrounding-text       $enable_surrounding_text
+  Enable libnotify              $enable_libnotify
   Enable Emoji dict             $enable_emoji_dict
   Unicode Emoji directory       $UNICODE_EMOJI_DIR
   CLDR annotation directory     $EMOJI_ANNOTATION_DIR
diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
index ab379328..2a9cabde 100644
--- a/ui/gtk3/Makefile.am
+++ b/ui/gtk3/Makefile.am
@@ -3,7 +3,7 @@
 # ibus - The Input Bus
 #
 # Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
-# Copyright (c) 2015-2020 Takao Fujwiara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2015-2022 Takao Fujwiara <takao.fujiwara1@gmail.com>
 # Copyright (c) 2007-2020 Red Hat, Inc.
 #
 # This library is free software; you can redistribute it and/or
@@ -81,6 +81,21 @@ AM_VALAFLAGS = \
 	--target-glib="$(VALA_TARGET_GLIB_VERSION)" \
 	$(NULL)
 
+if ENABLE_LIBNOTIFY
+AM_CFLAGS += \
+       @LIBNOTIFY_CFLAGS@ \
+       $(NULL)
+
+AM_LDADD += \
+       @LIBNOTIFY_LIBS@ \
+       $(NULL)
+
+AM_VALAFLAGS += \
+       --pkg=libnotify \
+       -D ENABLE_LIBNOTIFY \
+       $(NULL)
+endif
+
 if ENABLE_APPINDICATOR
 AM_VALAFLAGS += --define=INDICATOR
 endif
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
index 07ce6524..bd70d7d2 100644
--- a/ui/gtk3/panel.vala
+++ b/ui/gtk3/panel.vala
@@ -73,6 +73,7 @@ class Panel : IBus.PanelService {
     private string m_icon_prop_key = "";
     private int m_property_icon_delay_time = 500;
     private uint m_property_icon_delay_time_id;
+    private bool m_is_wayland;
 #if INDICATOR
     private bool m_is_kde = is_kde();
 #else
@@ -93,6 +94,18 @@ class Panel : IBus.PanelService {
 
         m_bus = bus;
 
+#if USE_GDK_WAYLAND
+        Gdk.set_allowed_backends("*");
+        var display = Gdk.DisplayManager.get().open_display(null);
+        Type instance_type = display.get_type();
+        Type wayland_type = typeof(GdkWayland.Display);
+        m_is_wayland = instance_type.is_a(wayland_type);
+        Gdk.set_allowed_backends("x11");
+#else
+        m_is_wayland = false;
+        warning("Checking Wayland is disabled");
+#endif
+
         init_settings();
 
         // init ui
@@ -553,6 +566,11 @@ class Panel : IBus.PanelService {
         GLib.List<IBus.EngineDesc> im_engines =
                 get_engines_from_locale(engines);
 
+        if (m_is_wayland) {
+            if (xkb_engines.length() > 0)
+                xkb_engines = new GLib.List<IBus.EngineDesc>();
+        }
+
         string[] names = {};
         foreach (unowned IBus.EngineDesc engine in xkb_engines)
             names += engine.get_name();
@@ -728,6 +746,32 @@ class Panel : IBus.PanelService {
         inited_engines_order = false;
     }
 
+    private void update_version_1_5_26() {
+#if ENABLE_LIBNOTIFY
+        if (!Notify.is_initted()) {
+            Notify.init ("ibus");
+        }
+
+        var notification = new Notify.Notification(
+                _("IBus Attention"),
+                _("Layout changes do not work in Plasma Wayland. " +
+                  "Please use systemsettings5."),
+                "ibus");
+        notification.set_timeout(30 * 1000);
+        notification.set_category("hotkey");
+
+        try {
+            notification.show();
+        } catch (GLib.Error e){
+            warning (_("Layout changes do not work in Plasma Wayland. " +
+                        "Please use systemsettings5."));
+        }
+#else
+        warning (_("Layout changes do not work in Plasma Wayland. " +
+                   "Please use systemsettings5."));
+#endif
+    }
+
     private void set_version() {
         string prev_version = m_settings_general.get_string("version");
         string current_version = null;
@@ -735,6 +779,9 @@ class Panel : IBus.PanelService {
         if (compare_versions(prev_version, "1.5.8") < 0)
             update_version_1_5_8();
 
+        if (compare_versions(prev_version, "1.5.26") < 0)
+            update_version_1_5_26();
+
         current_version = "%d.%d.%d".printf(IBus.MAJOR_VERSION,
                                             IBus.MINOR_VERSION,
                                             IBus.MICRO_VERSION);
@@ -856,7 +903,7 @@ class Panel : IBus.PanelService {
         m_icon_prop_key = "";
 
         // set xkb layout
-        if (!m_use_system_keyboard_layout)
+        if (!m_use_system_keyboard_layout && !m_is_wayland)
             m_xkblayout.set_layout(engine);
 
         set_language_from_engine(engine);
@@ -960,17 +1007,25 @@ class Panel : IBus.PanelService {
                                 string[]? order_names) {
         string[]? engine_names = unowned_engine_names;
 
-        if (engine_names == null || engine_names.length == 0)
-            engine_names = {"xkb:us::eng"};
+        if (engine_names == null || engine_names.length == 0) {
+            if (m_is_wayland)
+                engine_names = {};
+            else
+                engine_names = {"xkb:us::eng"};
+        }
 
         string[] names = {};
 
         foreach (var name in order_names) {
+            if (m_is_wayland && name.has_prefix("xkb:"))
+                continue;
             if (name in engine_names)
                 names += name;
         }
 
         foreach (var name in engine_names) {
+            if (m_is_wayland && name.has_prefix("xkb:"))
+                continue;
             if (name in names)
                 continue;
             names += name;
@@ -1011,9 +1066,14 @@ class Panel : IBus.PanelService {
 	}
 
         if (m_engines.length == 0) {
-            m_engines = engines;
-            switch_engine(0, true);
-            run_preload_engines(engines, 1);
+            if (engines.length > 0) {
+                m_engines = engines;
+                switch_engine(0, true);
+                run_preload_engines(engines, 1);
+            } else {
+                m_candidate_panel.set_language(new Pango.AttrLanguage(
+                        Pango.Language.from_string(null)));
+            }
         } else {
             var current_engine = m_engines[0];
             m_engines = engines;
@@ -1478,6 +1538,8 @@ class Panel : IBus.PanelService {
         /* Do not change the order of m_engines during running switcher. */
         if (m_switcher.is_running())
             return;
+        if (m_engines.length == 0)
+            return;
 
         if (m_icon_type == IconType.INDICATOR) {
             // Wait for the callback of the session bus.
-- 
2.34.1