b8129cf8ad
This is an automated DistroBaker update from upstream sources. If you do not know what this is about or would like to opt out, contact the OSCI team. Source: https://src.fedoraproject.org/rpms/ibus.git#823ed8c386d7d06fc9f38a7bfac78ce1a377c04a
1889 lines
66 KiB
Diff
1889 lines
66 KiB
Diff
From dd4cc5b028c35f9bb8fa9d3bdc8f26bcdfc43d40 Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
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
|
|
---
|
|
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 <shawn.p.huang@gmail.com>
|
|
- * Copyright(c) 2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+ * Copyright(c) 2017-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
*
|
|
* 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 {
|
|
}
|
|
|
|
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 <shawn.p.huang@gmail.com>
|
|
- * Copyright(c) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+ * Copyright(c) 2018-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
*
|
|
* 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 <takao.fujiwara1@gmail.com>
|
|
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 <shawn.p.huang@gmail.com>
|
|
-# Copyright (c) 2007-2015 Red Hat, Inc.
|
|
-# Copyright (c) 2015 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+# Copyright (c) 2007-2020 Red Hat, Inc.
|
|
+# Copyright (c) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
#
|
|
# 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 <takao.fujiwara1@gmail.com>
|
|
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 <shawn.p.huang@gmail.com>
|
|
-# Copyright (c) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+# Copyright (c) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
# 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 \
|
|
$(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 <takao.fujiwara1@gmail.com>
|
|
+ * Copyright (C) 2016-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
* 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;
|
|
}
|
|
--
|
|
2.24.1
|
|
|
|
From b72efea42d5f72e08e2774ae03027c246d41cab7 Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
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 @@
|
|
/* vim:set et sts=4: */
|
|
/* ibus - The Input Bus
|
|
* Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
|
|
- * Copyright (C) 2008-2015 Red Hat, Inc.
|
|
+ * Copyright (C) 2008-2020 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;
|
|
|
|
/**
|
|
@@ -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.
|
|
+ *
|
|
+ * Some common sense is expected when using these flags - mixing
|
|
+ * @IBUS_INPUT_HINT_LOWERCASE with any of the uppercase hints makes no sense.
|
|
+ *
|
|
+ * This enumeration may be extended in the future; engines should
|
|
+ * ignore unknown values.
|
|
+ *
|
|
+ * 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;
|
|
|
|
#endif
|
|
--
|
|
2.24.1
|
|
|
|
From 5322c447c74a10ee54b482d6eff6da6d16a7c9ce Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
Date: Sat, 21 Nov 2020 07:41:23 +0900
|
|
Subject: [PATCH] ui/gtk3: Warn deprecated IBus XKB engines /w dialog
|
|
|
|
simple.xml is updated by IBus release and some XKB engines
|
|
could be deprecated with xkeyboard-config updates.
|
|
Now a warning dialog is launched when the deprecated engines are
|
|
changed to xkb:us::eng engine.
|
|
|
|
BUG=https://github.com/ibus/ibus/issues/2274
|
|
---
|
|
ui/gtk3/panel.vala | 15 +++++++++++++++
|
|
1 files changed, 33 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
|
|
index 627e26ae..01f87e33 100644
|
|
--- a/ui/gtk3/panel.vala
|
|
+++ b/ui/gtk3/panel.vala
|
|
@@ -970,6 +970,21 @@ class Panel : IBus.PanelService {
|
|
names = {"xkb:us::eng"};
|
|
m_settings_general.set_strv("preload-engines", names);
|
|
engines = m_bus.get_engines_by_names(names);
|
|
+ var message = _("Your input method %s does not exist in IBus " +
|
|
+ "input methods so \"US\" layout was configured instead " +
|
|
+ "of your input method. Please run `ibus-setup` command, " +
|
|
+ "open \"Input Method\" tab, and configure your input " +
|
|
+ "methods again.").printf(names[0]);
|
|
+ var dialog = new Gtk.MessageDialog(
|
|
+ null,
|
|
+ Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
|
+ Gtk.MessageType.WARNING,
|
|
+ Gtk.ButtonsType.CLOSE,
|
|
+ message);
|
|
+ dialog.response.connect((id) => {
|
|
+ dialog.destroy();
|
|
+ });
|
|
+ dialog.show();
|
|
}
|
|
|
|
if (m_engines.length == 0) {
|
|
--
|
|
2.28.0
|
|
|
|
From aec2ac75ea673d3701904735378765476cad0f21 Mon Sep 17 00:00:00 2001
|
|
From: Gunnar Hjalmarsson <gunnarhj@ubuntu.com>
|
|
Date: Fri, 11 Dec 2020 16:27:36 +0900
|
|
Subject: [PATCH] ui/gtk3: Warning dialog for any deprecated IBus XKB
|
|
engine
|
|
|
|
This is a follow-up of commit 5322c447. That commit introduced
|
|
a warning dialog in case of an empty engines list.
|
|
|
|
This commit makes a differently worded warning dialog be shown
|
|
in cases where the engines list is not empty but preload-engines
|
|
includes at least one deprecated engine. It also fixes a variable
|
|
confusion so a deprecated engine is mentioned in the first kind
|
|
of warning dialog and not the US engine.
|
|
|
|
BUG=https://github.com/ibus/ibus/issues/2274
|
|
---
|
|
ui/gtk3/panel.vala | 30 +++++++++++++++++++-----------
|
|
1 files changed, 43 insertions(+), 24 deletions(-)
|
|
|
|
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
|
|
index 01f87e33..ab2005d7 100644
|
|
--- a/ui/gtk3/panel.vala
|
|
+++ b/ui/gtk3/panel.vala
|
|
@@ -966,25 +966,33 @@ class Panel : IBus.PanelService {
|
|
/* Fedora internal patch could save engines not in simple.xml
|
|
* likes 'xkb:cn::chi'.
|
|
*/
|
|
- if (engines.length == 0) {
|
|
- names = {"xkb:us::eng"};
|
|
- m_settings_general.set_strv("preload-engines", names);
|
|
- engines = m_bus.get_engines_by_names(names);
|
|
- var message = _("Your input method %s does not exist in IBus " +
|
|
- "input methods so \"US\" layout was configured instead " +
|
|
- "of your input method. Please run `ibus-setup` command, " +
|
|
- "open \"Input Method\" tab, and configure your input " +
|
|
- "methods again.").printf(names[0]);
|
|
+ if (engines.length < names.length) {
|
|
+ string message1;
|
|
+ if (engines.length == 0) {
|
|
+ string[] fallback_names = {"xkb:us::eng"};
|
|
+ m_settings_general.set_strv("preload-engines", fallback_names);
|
|
+ engines = m_bus.get_engines_by_names(fallback_names);
|
|
+ message1 = _("Your configured input method %s does not exist " +
|
|
+ "in IBus input methods so \"US\" layout was " +
|
|
+ "configured instead of your input method."
|
|
+ ).printf(names[0]);
|
|
+ } else {
|
|
+ message1 = _("At least one of your configured input methods " +
|
|
+ "does not exist in IBus input methods.");
|
|
+ }
|
|
+ var message2 = _("Please run `ibus-setup` command, open \"Input " +
|
|
+ "Method\" tab, and configure your input methods " +
|
|
+ "again.");
|
|
var dialog = new Gtk.MessageDialog(
|
|
null,
|
|
Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
|
Gtk.MessageType.WARNING,
|
|
Gtk.ButtonsType.CLOSE,
|
|
- message);
|
|
+ "%s %s", message1, message2);
|
|
dialog.response.connect((id) => {
|
|
dialog.destroy();
|
|
});
|
|
- dialog.show();
|
|
+ dialog.show_all();
|
|
}
|
|
|
|
if (m_engines.length == 0) {
|
|
--
|
|
2.28.0
|
|
|
|
From 5d68b00e0464d43ba2f77697f9dcfbff78d7b438 Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
Date: Thu, 31 Dec 2020 17:28:45 +0900
|
|
Subject: [PATCH] engine: Fix iso-path in gensimple.py
|
|
|
|
Replace datarootdir with ISOCODES_PREFIX.
|
|
---
|
|
engine/Makefile.am | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/engine/Makefile.am b/engine/Makefile.am
|
|
index d810704b..1944c02b 100644
|
|
--- a/engine/Makefile.am
|
|
+++ b/engine/Makefile.am
|
|
@@ -104,7 +104,7 @@ simple.xml.in:
|
|
--output=$@ \
|
|
--version=$(VERSION).`date '+%Y%m%d'` \
|
|
--exec-path=@libexecdir\@/ibus-engine-simple \
|
|
- --iso-path=$(datarootdir)/xml/iso-codes/iso_639.xml \
|
|
+ --iso-path=$(ISOCODES_PREFIX)/share/xml/iso-codes/iso_639.xml \
|
|
--first-language \
|
|
$(NULL)
|
|
|
|
--
|
|
2.28.0
|
|
|
|
From 29959e1d2521781c544879b284e03812a2a11b2e Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
Date: Thu, 31 Dec 2020 20:00:02 +0900
|
|
Subject: [PATCH] engine: Fix input in gensimple.py
|
|
|
|
Replace datarootdir with XKBCONFIG_BASE.
|
|
---
|
|
configure.ac | 7 +++++++
|
|
engine/Makefile.am | 2 +-
|
|
2 files changed, 8 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 5753057b..9ed5cb66 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -720,6 +720,13 @@ PKG_CHECK_MODULES(ISOCODES, [
|
|
ISOCODES_PREFIX=`$PKG_CONFIG iso-codes --variable=prefix`
|
|
AC_SUBST(ISOCODES_PREFIX)
|
|
|
|
+PKG_CHECK_MODULES(XKBCONFIG,
|
|
+ [xkeyboard-config],
|
|
+ [XKBCONFIG_BASE=`$PKG_CONFIG xkeyboard-config --variable=xkb_base`],
|
|
+ [XKBCONFIG_BASE='$(datarootdir)/X11/xkb']
|
|
+)
|
|
+AC_SUBST(XKBCONFIG_BASE)
|
|
+
|
|
AC_SUBST([GDBUS_CODEGEN], [`$PKG_CONFIG --variable gdbus_codegen gio-2.0`])
|
|
|
|
# OUTPUT files
|
|
diff --git a/engine/Makefile.am b/engine/Makefile.am
|
|
index 1944c02b..84bc7f6c 100644
|
|
--- a/engine/Makefile.am
|
|
+++ b/engine/Makefile.am
|
|
@@ -100,7 +100,7 @@ simple.xml: simple.xml.in
|
|
|
|
simple.xml.in:
|
|
$(srcdir)/gensimple.py \
|
|
- --input=$(datarootdir)/X11/xkb/rules/evdev.xml \
|
|
+ --input=$(XKBCONFIG_BASE)/rules/evdev.xml \
|
|
--output=$@ \
|
|
--version=$(VERSION).`date '+%Y%m%d'` \
|
|
--exec-path=@libexecdir\@/ibus-engine-simple \
|
|
--
|
|
2.28.0
|
|
|
|
From c7928b158741282e17a042f767bc5ae32c302c96 Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
Date: Fri, 8 Jan 2021 18:45:55 +0900
|
|
Subject: [PATCH] Add GTK4 IM module
|
|
|
|
BUG=https://github.com/ibus/ibus/issues/2291
|
|
---
|
|
client/Makefile.am | 7 +-
|
|
client/gtk2/ibusimcontext.c | 352 +++++++++++++++++++++++++++++++-----
|
|
client/gtk4/Makefile.am | 66 +++++++
|
|
client/gtk4/ibusim.c | 52 ++++++
|
|
client/gtk4/ibusimcontext.c | 1 +
|
|
client/gtk4/ibusimcontext.h | 1 +
|
|
configure.ac | 32 ++++
|
|
7 files changed, 465 insertions(+), 46 deletions(-)
|
|
create mode 100644 client/gtk4/Makefile.am
|
|
create mode 100644 client/gtk4/ibusim.c
|
|
create mode 120000 client/gtk4/ibusimcontext.c
|
|
create mode 120000 client/gtk4/ibusimcontext.h
|
|
|
|
diff --git a/client/Makefile.am b/client/Makefile.am
|
|
index 546ca132..1744518c 100644
|
|
--- a/client/Makefile.am
|
|
+++ b/client/Makefile.am
|
|
@@ -3,7 +3,7 @@
|
|
# ibus - The Input Bus
|
|
#
|
|
# Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
|
|
-# Copyright (c) 2007-2010 Red Hat, Inc.
|
|
+# Copyright (c) 2007-2020 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
|
|
@@ -28,6 +28,10 @@ if ENABLE_GTK3
|
|
GTK3 = gtk3
|
|
endif
|
|
|
|
+if ENABLE_GTK4
|
|
+GTK4 = gtk4
|
|
+endif
|
|
+
|
|
if ENABLE_XIM
|
|
X11 = x11
|
|
endif
|
|
@@ -39,6 +43,7 @@ endif
|
|
SUBDIRS = \
|
|
$(GTK2) \
|
|
$(GTK3) \
|
|
+ $(GTK4) \
|
|
$(X11) \
|
|
$(WAYLAND) \
|
|
$(NULL)
|
|
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
|
|
index 50290c55..a23fc2e3 100644
|
|
--- a/client/gtk2/ibusimcontext.c
|
|
+++ b/client/gtk2/ibusimcontext.c
|
|
@@ -2,8 +2,8 @@
|
|
/* vim:set et sts=4: */
|
|
/* ibus - The Input Bus
|
|
* Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
|
|
- * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
- * Copyright (C) 2008-2019 Red Hat, Inc.
|
|
+ * Copyright (C) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+ * Copyright (C) 2008-2020 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
|
|
@@ -32,8 +32,12 @@
|
|
#include "ibusimcontext.h"
|
|
|
|
#ifdef GDK_WINDOWING_WAYLAND
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+#include <gdk/wayland/gdkwayland.h>
|
|
+#else
|
|
#include <gdk/gdkwayland.h>
|
|
#endif
|
|
+#endif
|
|
|
|
#if !GTK_CHECK_VERSION (2, 91, 0)
|
|
# define DEPRECATED_GDK_KEYSYMS 1
|
|
@@ -52,7 +56,11 @@ struct _IBusIMContext {
|
|
|
|
/* instance members */
|
|
GtkIMContext *slave;
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GtkWidget *client_window;
|
|
+#else
|
|
GdkWindow *client_window;
|
|
+#endif
|
|
|
|
IBusInputContext *ibuscontext;
|
|
|
|
@@ -73,7 +81,12 @@ struct _IBusIMContext {
|
|
GCancellable *cancellable;
|
|
GQueue *events_queue;
|
|
|
|
-#if !GTK_CHECK_VERSION (3, 93, 0)
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GdkSurface *surface;
|
|
+ GdkDevice *device;
|
|
+ double x;
|
|
+ double y;
|
|
+#else
|
|
gboolean use_button_press_event;
|
|
#endif
|
|
};
|
|
@@ -90,9 +103,11 @@ static guint _signal_preedit_end_id = 0;
|
|
static guint _signal_delete_surrounding_id = 0;
|
|
static guint _signal_retrieve_surrounding_id = 0;
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
static const gchar *_no_snooper_apps = NO_SNOOPER_APPS;
|
|
static gboolean _use_key_snooper = ENABLE_SNOOPER;
|
|
static guint _key_snooper_id = 0;
|
|
+#endif
|
|
|
|
static gboolean _use_sync_mode = FALSE;
|
|
|
|
@@ -101,8 +116,10 @@ static gboolean _use_discard_password = FALSE;
|
|
|
|
static GtkIMContext *_focus_im_context = NULL;
|
|
static IBusInputContext *_fake_context = NULL;
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
static GdkWindow *_input_window = NULL;
|
|
static GtkWidget *_input_widget = NULL;
|
|
+#endif
|
|
|
|
/* functions prototype */
|
|
static void ibus_im_context_class_init (IBusIMContextClass *class);
|
|
@@ -114,7 +131,11 @@ static void ibus_im_context_finalize (GObject *obj);
|
|
static void ibus_im_context_reset (GtkIMContext *context);
|
|
static gboolean ibus_im_context_filter_keypress
|
|
(GtkIMContext *context,
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GdkEvent *key);
|
|
+#else
|
|
GdkEventKey *key);
|
|
+#endif
|
|
static void ibus_im_context_focus_in (GtkIMContext *context);
|
|
static void ibus_im_context_focus_out (GtkIMContext *context);
|
|
static void ibus_im_context_get_preedit_string
|
|
@@ -122,9 +143,15 @@ static void ibus_im_context_get_preedit_string
|
|
gchar **str,
|
|
PangoAttrList **attrs,
|
|
gint *cursor_pos);
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+static void ibus_im_context_set_client_widget
|
|
+ (GtkIMContext *context,
|
|
+ GtkWidget *client);
|
|
+#else
|
|
static void ibus_im_context_set_client_window
|
|
(GtkIMContext *context,
|
|
GdkWindow *client);
|
|
+#endif
|
|
static void ibus_im_context_set_cursor_location
|
|
(GtkIMContext *context,
|
|
GdkRectangle *area);
|
|
@@ -239,6 +266,7 @@ ibus_im_context_new (void)
|
|
return IBUS_IM_CONTEXT (obj);
|
|
}
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
static gboolean
|
|
_focus_in_cb (GtkWidget *widget,
|
|
GdkEventFocus *event,
|
|
@@ -260,22 +288,41 @@ _focus_out_cb (GtkWidget *widget,
|
|
}
|
|
return FALSE;
|
|
}
|
|
+#endif /* end of GTK_CHECK_VERSION (3, 98, 4) */
|
|
|
|
static gboolean
|
|
ibus_im_context_commit_event (IBusIMContext *ibusimcontext,
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GdkEvent *event)
|
|
+#else
|
|
GdkEventKey *event)
|
|
+#endif
|
|
{
|
|
+ guint keyval = 0;
|
|
+ GdkModifierType state = 0;
|
|
int i;
|
|
GdkModifierType no_text_input_mask;
|
|
gunichar ch;
|
|
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ if (gdk_event_get_event_type (event) == GDK_KEY_RELEASE)
|
|
+ return FALSE;
|
|
+ keyval = gdk_key_event_get_keyval (event);
|
|
+ state = gdk_event_get_modifier_state (event);
|
|
+#else
|
|
if (event->type == GDK_KEY_RELEASE)
|
|
return FALSE;
|
|
+ keyval = event->keyval;
|
|
+ state = event->state;
|
|
+#endif
|
|
+
|
|
/* Ignore modifier key presses */
|
|
for (i = 0; i < G_N_ELEMENTS (IBUS_COMPOSE_IGNORE_KEYLIST); i++)
|
|
- if (event->keyval == IBUS_COMPOSE_IGNORE_KEYLIST[i])
|
|
+ if (keyval == IBUS_COMPOSE_IGNORE_KEYLIST[i])
|
|
return FALSE;
|
|
-#if GTK_CHECK_VERSION (3, 4, 0)
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ no_text_input_mask = GDK_MODIFIER_MASK;
|
|
+#elif GTK_CHECK_VERSION (3, 4, 0)
|
|
no_text_input_mask = gdk_keymap_get_modifier_mask (
|
|
gdk_keymap_get_for_display (gdk_display_get_default ()),
|
|
GDK_MODIFIER_INTENT_NO_TEXT_INPUT);
|
|
@@ -290,13 +337,13 @@ ibus_im_context_commit_event (IBusIMContext *ibusimcontext,
|
|
|
|
# undef _IBUS_NO_TEXT_INPUT_MOD_MASK
|
|
#endif
|
|
- if (event->state & no_text_input_mask ||
|
|
- event->keyval == GDK_KEY_Return ||
|
|
- event->keyval == GDK_KEY_ISO_Enter ||
|
|
- event->keyval == GDK_KEY_KP_Enter) {
|
|
+ if (state & no_text_input_mask ||
|
|
+ keyval == GDK_KEY_Return ||
|
|
+ keyval == GDK_KEY_ISO_Enter ||
|
|
+ keyval == GDK_KEY_KP_Enter) {
|
|
return FALSE;
|
|
}
|
|
- ch = ibus_keyval_to_unicode (event->keyval);
|
|
+ ch = ibus_keyval_to_unicode (keyval);
|
|
if (ch != 0 && !g_unichar_iscntrl (ch)) {
|
|
IBusText *text = ibus_text_new_from_unichar (ch);
|
|
g_signal_emit (ibusimcontext, _signal_commit_id, 0, text->text);
|
|
@@ -307,14 +354,26 @@ ibus_im_context_commit_event (IBusIMContext *ibusimcontext,
|
|
return FALSE;
|
|
}
|
|
|
|
+struct _ProcessKeyEventData {
|
|
+ GdkEvent *event;
|
|
+ IBusIMContext *ibusimcontext;
|
|
+};
|
|
+
|
|
+typedef struct _ProcessKeyEventData ProcessKeyEventData;
|
|
+
|
|
static void
|
|
_process_key_event_done (GObject *object,
|
|
GAsyncResult *res,
|
|
gpointer user_data)
|
|
{
|
|
IBusInputContext *context = (IBusInputContext *)object;
|
|
- GdkEventKey *event = (GdkEventKey *) user_data;
|
|
+
|
|
+ ProcessKeyEventData *data = (ProcessKeyEventData *)user_data;
|
|
+ GdkEvent *event = data->event;
|
|
+ IBusIMContext *ibusimcontext = data->ibusimcontext;
|
|
GError *error = NULL;
|
|
+
|
|
+ g_slice_free (ProcessKeyEventData, data);
|
|
gboolean retval = ibus_input_context_process_key_event_async_finish (
|
|
context,
|
|
res,
|
|
@@ -326,46 +385,96 @@ _process_key_event_done (GObject *object,
|
|
}
|
|
|
|
if (retval == FALSE) {
|
|
- event->state |= IBUS_IGNORED_MASK;
|
|
- gdk_event_put ((GdkEvent *)event);
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ g_return_if_fail (GTK_IS_IM_CONTEXT (ibusimcontext));
|
|
+ gtk_im_context_filter_key (
|
|
+ GTK_IM_CONTEXT (ibusimcontext),
|
|
+ gdk_event_get_event_type (event) == GDK_KEY_PRESS,
|
|
+ gdk_event_get_surface (event),
|
|
+ gdk_event_get_device (event),
|
|
+ gdk_event_get_time (event),
|
|
+ gdk_key_event_get_keycode (event),
|
|
+ gdk_event_get_modifier_state (event) | IBUS_IGNORED_MASK,
|
|
+ 0);
|
|
+#else
|
|
+ ((GdkEventKey *)event)->state |= IBUS_IGNORED_MASK;
|
|
+ gdk_event_put (event);
|
|
+#endif
|
|
}
|
|
- gdk_event_free ((GdkEvent *)event);
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ gdk_event_unref (event);
|
|
+#else
|
|
+ gdk_event_free (event);
|
|
+#endif
|
|
}
|
|
|
|
static gboolean
|
|
_process_key_event (IBusInputContext *context,
|
|
- GdkEventKey *event)
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GdkEvent *event,
|
|
+#else
|
|
+ GdkEventKey *event,
|
|
+#endif
|
|
+ IBusIMContext *ibusimcontext)
|
|
{
|
|
- guint state = event->state;
|
|
+ guint state;
|
|
+ guint keyval = 0;
|
|
+ guint16 hardware_keycode = 0;
|
|
+ guint keycode = 0;
|
|
gboolean retval = FALSE;
|
|
|
|
- if (event->type == GDK_KEY_RELEASE) {
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GdkModifierType gdkstate = gdk_event_get_modifier_state (event);
|
|
+ state = (uint)gdkstate;
|
|
+ if (gdk_event_get_event_type (event) == GDK_KEY_RELEASE)
|
|
state |= IBUS_RELEASE_MASK;
|
|
- }
|
|
+ keyval = gdk_key_event_get_keyval (event);
|
|
+ hardware_keycode = gdk_key_event_get_keycode (event);
|
|
+#else
|
|
+ state = event->state;
|
|
+ if (event->type == GDK_KEY_RELEASE)
|
|
+ state |= IBUS_RELEASE_MASK;
|
|
+ keyval = event->keyval;
|
|
+ hardware_keycode = event->hardware_keycode;
|
|
+#endif
|
|
+ keycode = hardware_keycode;
|
|
|
|
if (_use_sync_mode) {
|
|
retval = ibus_input_context_process_key_event (context,
|
|
- event->keyval,
|
|
- event->hardware_keycode - 8,
|
|
+ keyval,
|
|
+ keycode - 8,
|
|
state);
|
|
}
|
|
else {
|
|
+ ProcessKeyEventData *data = g_slice_new0 (ProcessKeyEventData);
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ data->event = gdk_event_ref (event);
|
|
+#else
|
|
+ data->event = gdk_event_copy ((GdkEvent *)event);
|
|
+#endif
|
|
+ data->ibusimcontext = ibusimcontext;
|
|
ibus_input_context_process_key_event_async (context,
|
|
- event->keyval,
|
|
- event->hardware_keycode - 8,
|
|
+ keyval,
|
|
+ keycode - 8,
|
|
state,
|
|
-1,
|
|
NULL,
|
|
_process_key_event_done,
|
|
- gdk_event_copy ((GdkEvent *) event));
|
|
+ data);
|
|
|
|
retval = TRUE;
|
|
}
|
|
|
|
+ /* GTK4 does not provide gtk_key_snooper_install() and also
|
|
+ * GtkIMContextClass->filter_keypress() cannot send the updated
|
|
+ * GdkEventKey so event->state is not updated here in GTK4.
|
|
+ */
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
if (retval)
|
|
event->state |= IBUS_HANDLED_MASK;
|
|
else
|
|
event->state |= IBUS_IGNORED_MASK;
|
|
+#endif
|
|
|
|
return retval;
|
|
}
|
|
@@ -425,6 +534,7 @@ _set_content_type (IBusIMContext *context)
|
|
}
|
|
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
static gint
|
|
_key_snooper_cb (GtkWidget *widget,
|
|
GdkEventKey *event,
|
|
@@ -526,7 +636,7 @@ _key_snooper_cb (GtkWidget *widget,
|
|
ibusimcontext->time = event->time;
|
|
}
|
|
|
|
- retval = _process_key_event (ibuscontext, event);
|
|
+ retval = _process_key_event (ibuscontext, event, ibusimcontext);
|
|
|
|
if (ibusimcontext != NULL) {
|
|
/* unref ibusimcontext could call ibus_im_context_finalize here
|
|
@@ -537,6 +647,7 @@ _key_snooper_cb (GtkWidget *widget,
|
|
|
|
return retval;
|
|
}
|
|
+#endif
|
|
|
|
static gboolean
|
|
_get_boolean_env(const gchar *name,
|
|
@@ -599,7 +710,11 @@ ibus_im_context_class_init (IBusIMContextClass *class)
|
|
im_context_class->focus_out = ibus_im_context_focus_out;
|
|
im_context_class->filter_keypress = ibus_im_context_filter_keypress;
|
|
im_context_class->get_preedit_string = ibus_im_context_get_preedit_string;
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ im_context_class->set_client_widget = ibus_im_context_set_client_widget;
|
|
+#else
|
|
im_context_class->set_client_window = ibus_im_context_set_client_window;
|
|
+#endif
|
|
im_context_class->set_cursor_location = ibus_im_context_set_cursor_location;
|
|
im_context_class->set_use_preedit = ibus_im_context_set_use_preedit;
|
|
im_context_class->set_surrounding = ibus_im_context_set_surrounding;
|
|
@@ -630,8 +745,10 @@ ibus_im_context_class_init (IBusIMContextClass *class)
|
|
g_signal_lookup ("retrieve-surrounding", G_TYPE_FROM_CLASS (class));
|
|
g_assert (_signal_retrieve_surrounding_id != 0);
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
_use_key_snooper = !_get_boolean_env ("IBUS_DISABLE_SNOOPER",
|
|
!(ENABLE_SNOOPER));
|
|
+#endif
|
|
_use_sync_mode = _get_boolean_env ("IBUS_ENABLE_SYNC_MODE", FALSE);
|
|
_use_discard_password = _get_boolean_env ("IBUS_DISCARD_PASSWORD", FALSE);
|
|
|
|
@@ -656,6 +773,7 @@ ibus_im_context_class_init (IBusIMContextClass *class)
|
|
g_strfreev (apps); \
|
|
}
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
/* env IBUS_DISABLE_SNOOPER does not exist */
|
|
if (_use_key_snooper) {
|
|
/* disable snooper if app is in _no_snooper_apps */
|
|
@@ -664,6 +782,7 @@ ibus_im_context_class_init (IBusIMContextClass *class)
|
|
_no_snooper_apps,
|
|
FALSE);
|
|
}
|
|
+#endif
|
|
if (!_use_discard_password) {
|
|
CHECK_APP_IN_CSV_ENV_VARIABLES (_use_discard_password,
|
|
IBUS_DISCARD_PASSWORD_APPS,
|
|
@@ -686,6 +805,7 @@ ibus_im_context_class_init (IBusIMContextClass *class)
|
|
}
|
|
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
/* always install snooper */
|
|
if (_key_snooper_id == 0) {
|
|
#pragma GCC diagnostic push
|
|
@@ -693,6 +813,7 @@ ibus_im_context_class_init (IBusIMContextClass *class)
|
|
_key_snooper_id = gtk_key_snooper_install (_key_snooper_cb, NULL);
|
|
#pragma GCC diagnostic pop
|
|
}
|
|
+#endif
|
|
|
|
_daemon_name_watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
|
ibus_bus_get_service_name (_bus),
|
|
@@ -706,6 +827,7 @@ ibus_im_context_class_init (IBusIMContextClass *class)
|
|
static void
|
|
ibus_im_context_class_fini (IBusIMContextClass *class)
|
|
{
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
if (_key_snooper_id != 0) {
|
|
IDEBUG ("snooper is terminated.");
|
|
#pragma GCC diagnostic push
|
|
@@ -714,6 +836,7 @@ ibus_im_context_class_fini (IBusIMContextClass *class)
|
|
#pragma GCC diagnostic pop
|
|
_key_snooper_id = 0;
|
|
}
|
|
+#endif
|
|
|
|
g_bus_unwatch_name (_daemon_name_watch_id);
|
|
}
|
|
@@ -849,7 +972,11 @@ ibus_im_context_finalize (GObject *obj)
|
|
ibus_proxy_destroy ((IBusProxy *)ibusimcontext->ibuscontext);
|
|
}
|
|
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ ibus_im_context_set_client_widget ((GtkIMContext *)ibusimcontext, NULL);
|
|
+#else
|
|
ibus_im_context_set_client_window ((GtkIMContext *)ibusimcontext, NULL);
|
|
+#endif
|
|
|
|
if (ibusimcontext->slave) {
|
|
g_object_unref (ibusimcontext->slave);
|
|
@@ -864,8 +991,13 @@ ibus_im_context_finalize (GObject *obj)
|
|
pango_attr_list_unref (ibusimcontext->preedit_attrs);
|
|
}
|
|
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ g_queue_free_full (ibusimcontext->events_queue,
|
|
+ (GDestroyNotify)gdk_event_unref);
|
|
+#else
|
|
g_queue_free_full (ibusimcontext->events_queue,
|
|
(GDestroyNotify)gdk_event_free);
|
|
+#endif
|
|
|
|
G_OBJECT_CLASS(parent_class)->finalize (obj);
|
|
}
|
|
@@ -902,7 +1034,11 @@ ibus_im_context_clear_preedit_text (IBusIMContext *ibusimcontext)
|
|
|
|
static gboolean
|
|
ibus_im_context_filter_keypress (GtkIMContext *context,
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GdkEvent *event)
|
|
+#else
|
|
GdkEventKey *event)
|
|
+#endif
|
|
{
|
|
IDEBUG ("%s", __FUNCTION__);
|
|
|
|
@@ -917,6 +1053,15 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
|
|
if (!ibusimcontext->has_focus)
|
|
return gtk_im_context_filter_keypress (ibusimcontext->slave, event);
|
|
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ {
|
|
+ GdkModifierType state = gdk_event_get_modifier_state (event);
|
|
+ if (state & IBUS_HANDLED_MASK)
|
|
+ return TRUE;
|
|
+ if (state & IBUS_IGNORED_MASK)
|
|
+ return ibus_im_context_commit_event (ibusimcontext, event);
|
|
+ }
|
|
+#else
|
|
if (event->state & IBUS_HANDLED_MASK)
|
|
return TRUE;
|
|
|
|
@@ -931,17 +1076,28 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
|
|
if (ibusimcontext->client_window == NULL && event->window != NULL)
|
|
gtk_im_context_set_client_window ((GtkIMContext *)ibusimcontext,
|
|
event->window);
|
|
+#endif
|
|
|
|
_request_surrounding_text (ibusimcontext);
|
|
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ ibusimcontext->time = gdk_event_get_time (event);
|
|
+ ibusimcontext->surface= gdk_event_get_surface (event);
|
|
+ ibusimcontext->device = gdk_event_get_device (event);
|
|
+ gdk_event_get_position (event, &ibusimcontext->x, &ibusimcontext->y);
|
|
+#else
|
|
ibusimcontext->time = event->time;
|
|
+#endif
|
|
|
|
if (ibusimcontext->ibuscontext) {
|
|
- if (_process_key_event (ibusimcontext->ibuscontext, event))
|
|
+ if (_process_key_event (ibusimcontext->ibuscontext,
|
|
+ event,
|
|
+ ibusimcontext)) {
|
|
return TRUE;
|
|
- else
|
|
+ } else {
|
|
return gtk_im_context_filter_keypress (ibusimcontext->slave,
|
|
event);
|
|
+ }
|
|
}
|
|
|
|
/* At this point we _should_ be waiting for the IBus context to be
|
|
@@ -952,12 +1108,21 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
|
|
ibus_bus_is_connected (_bus) == FALSE,
|
|
FALSE);
|
|
g_queue_push_tail (ibusimcontext->events_queue,
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ gdk_event_ref (event));
|
|
+#else
|
|
gdk_event_copy ((GdkEvent *)event));
|
|
+#endif
|
|
|
|
if (g_queue_get_length (ibusimcontext->events_queue) > MAX_QUEUED_EVENTS) {
|
|
g_warning ("Events queue growing too big, will start to drop.");
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ gdk_event_unref ((GdkEvent *)
|
|
+ g_queue_pop_head (ibusimcontext->events_queue));
|
|
+#else
|
|
gdk_event_free ((GdkEvent *)
|
|
g_queue_pop_head (ibusimcontext->events_queue));
|
|
+#endif
|
|
}
|
|
|
|
return TRUE;
|
|
@@ -966,26 +1131,29 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
|
|
static void
|
|
ibus_im_context_focus_in (GtkIMContext *context)
|
|
{
|
|
- IDEBUG ("%s", __FUNCTION__);
|
|
-
|
|
IBusIMContext *ibusimcontext = (IBusIMContext *) context;
|
|
+ GtkWidget *widget = NULL;
|
|
+
|
|
+ IDEBUG ("%s", __FUNCTION__);
|
|
|
|
if (ibusimcontext->has_focus)
|
|
return;
|
|
|
|
/* don't set focus on password entry */
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ widget = ibusimcontext->client_window;
|
|
+#else
|
|
if (ibusimcontext->client_window != NULL) {
|
|
- GtkWidget *widget;
|
|
-
|
|
gdk_window_get_user_data (ibusimcontext->client_window,
|
|
(gpointer *)&widget);
|
|
|
|
- if (GTK_IS_ENTRY (widget) &&
|
|
- !gtk_entry_get_visibility (GTK_ENTRY (widget))) {
|
|
- return;
|
|
- }
|
|
}
|
|
+#endif
|
|
|
|
+ if (widget && GTK_IS_ENTRY (widget) &&
|
|
+ !gtk_entry_get_visibility (GTK_ENTRY (widget))) {
|
|
+ return;
|
|
+ }
|
|
/* Do not call gtk_im_context_focus_out() here.
|
|
* google-chrome's notification popup window (Pushbullet)
|
|
* takes the focus and the popup window disappears.
|
|
@@ -1014,10 +1182,10 @@ ibus_im_context_focus_in (GtkIMContext *context)
|
|
|
|
/* set_cursor_location_internal() will get origin from X server,
|
|
* it blocks UI. So delay it to idle callback. */
|
|
- gdk_threads_add_idle_full (G_PRIORITY_DEFAULT_IDLE,
|
|
- (GSourceFunc) _set_cursor_location_internal,
|
|
- g_object_ref (ibusimcontext),
|
|
- (GDestroyNotify) g_object_unref);
|
|
+ g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
|
|
+ (GSourceFunc) _set_cursor_location_internal,
|
|
+ g_object_ref (ibusimcontext),
|
|
+ (GDestroyNotify) g_object_unref);
|
|
|
|
/* retrieve the initial surrounding-text (regardless of whether
|
|
* the current IBus engine needs surrounding-text) */
|
|
@@ -1122,7 +1290,7 @@ ibus_im_context_get_preedit_string (GtkIMContext *context,
|
|
}
|
|
|
|
|
|
-#if !GTK_CHECK_VERSION (3, 93, 0)
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
/* Use the button-press-event signal until GtkIMContext always emits the reset
|
|
* signal.
|
|
* https://gitlab.gnome.org/GNOME/gtk/merge_requests/460
|
|
@@ -1171,8 +1339,15 @@ _connect_button_press_event (IBusIMContext *ibusimcontext,
|
|
}
|
|
#endif
|
|
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
static void
|
|
-ibus_im_context_set_client_window (GtkIMContext *context, GdkWindow *client)
|
|
+ibus_im_context_set_client_widget (GtkIMContext *context,
|
|
+ GtkWidget *client)
|
|
+#else
|
|
+static void
|
|
+ibus_im_context_set_client_window (GtkIMContext *context,
|
|
+ GdkWindow *client)
|
|
+#endif
|
|
{
|
|
IBusIMContext *ibusimcontext;
|
|
|
|
@@ -1181,7 +1356,7 @@ ibus_im_context_set_client_window (GtkIMContext *context, GdkWindow *client)
|
|
ibusimcontext = IBUS_IM_CONTEXT (context);
|
|
|
|
if (ibusimcontext->client_window) {
|
|
-#if !GTK_CHECK_VERSION (3, 93, 0)
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
if (ibusimcontext->use_button_press_event)
|
|
_connect_button_press_event (ibusimcontext, FALSE);
|
|
#endif
|
|
@@ -1191,26 +1366,41 @@ ibus_im_context_set_client_window (GtkIMContext *context, GdkWindow *client)
|
|
|
|
if (client != NULL) {
|
|
ibusimcontext->client_window = g_object_ref (client);
|
|
-#if !GTK_CHECK_VERSION (3, 93, 0)
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
if (!ibusimcontext->use_button_press_event)
|
|
_connect_button_press_event (ibusimcontext, TRUE);
|
|
#endif
|
|
}
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ if (ibusimcontext->slave)
|
|
+ gtk_im_context_set_client_widget (ibusimcontext->slave, client);
|
|
+#else
|
|
if (ibusimcontext->slave)
|
|
gtk_im_context_set_client_window (ibusimcontext->slave, client);
|
|
+#endif
|
|
}
|
|
|
|
static void
|
|
_set_rect_scale_factor_with_window (GdkRectangle *area,
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GtkWidget *window)
|
|
+#else
|
|
GdkWindow *window)
|
|
+#endif
|
|
{
|
|
#if GTK_CHECK_VERSION (3, 10, 0)
|
|
int scale_factor;
|
|
|
|
g_assert (area);
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ g_assert (GTK_IS_WIDGET (window));
|
|
+
|
|
+ scale_factor = gtk_widget_get_scale_factor (window);
|
|
+#else
|
|
g_assert (GDK_IS_WINDOW (window));
|
|
|
|
scale_factor = gdk_window_get_scale_factor (window);
|
|
+#endif
|
|
area->x *= scale_factor;
|
|
area->y *= scale_factor;
|
|
area->width *= scale_factor;
|
|
@@ -1230,6 +1420,7 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
|
|
|
|
area = ibusimcontext->cursor_area;
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
#ifdef GDK_WINDOWING_WAYLAND
|
|
if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ())) {
|
|
gdouble px, py;
|
|
@@ -1253,10 +1444,14 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
|
|
area.height);
|
|
return FALSE;
|
|
}
|
|
+#endif
|
|
#endif
|
|
|
|
if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) {
|
|
-#if GTK_CHECK_VERSION (2, 91, 0)
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ area.x = 0;
|
|
+ area.y += gtk_widget_get_height (ibusimcontext->client_window);
|
|
+#elif GTK_CHECK_VERSION (2, 91, 0)
|
|
area.x = 0;
|
|
area.y += gdk_window_get_height (ibusimcontext->client_window);
|
|
#else
|
|
@@ -1267,9 +1462,39 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
|
|
#endif
|
|
}
|
|
|
|
+#if GTK_CHECK_VERSION (3, 93, 0)
|
|
+ {
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GtkNative *native = gtk_widget_get_native (
|
|
+ ibusimcontext->client_window);
|
|
+ GtkRoot *root = gtk_widget_get_root (ibusimcontext->client_window);
|
|
+ double nx, ny;
|
|
+ double px, py;
|
|
+ gtk_native_get_surface_transform (native, &nx, &ny);
|
|
+ px = (double)area.x + ibusimcontext->x - nx;
|
|
+ py = (double)area.y + ibusimcontext->y - ny;
|
|
+ gtk_widget_translate_coordinates (ibusimcontext->client_window,
|
|
+ (GtkWidget *)root,
|
|
+ px, py,
|
|
+ &px, &py);
|
|
+ area.x = (int)px;
|
|
+ area.y = (int)py;
|
|
+#else
|
|
+ GtkNative *native = gtk_widget_get_native (
|
|
+ ibusimcontext->client_window);
|
|
+ GdkSurface *surface = gtk_native_get_surface (native);
|
|
+ int root_x = 0;
|
|
+ int root_y = 0;
|
|
+ gdk_surface_get_position (surface, &root_x, &root_y);
|
|
+ area.x += root_x;
|
|
+ area.y += root_y;
|
|
+#endif
|
|
+ }
|
|
+#else
|
|
gdk_window_get_root_coords (ibusimcontext->client_window,
|
|
area.x, area.y,
|
|
&area.x, &area.y);
|
|
+#endif
|
|
_set_rect_scale_factor_with_window (&area, ibusimcontext->client_window);
|
|
ibus_input_context_set_cursor_location (ibusimcontext->ibuscontext,
|
|
area.x,
|
|
@@ -1326,7 +1551,11 @@ get_selection_anchor_point (IBusIMContext *ibusimcontext,
|
|
if (ibusimcontext->client_window == NULL) {
|
|
return cursor_pos;
|
|
}
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ widget = ibusimcontext->client_window;
|
|
+#else
|
|
gdk_window_get_user_data (ibusimcontext->client_window, (gpointer *)&widget);
|
|
+#endif
|
|
|
|
if (!GTK_IS_TEXT_VIEW (widget)){
|
|
return cursor_pos;
|
|
@@ -1440,6 +1669,7 @@ _ibus_context_commit_text_cb (IBusInputContext *ibuscontext,
|
|
_request_surrounding_text (ibusimcontext);
|
|
}
|
|
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
static gboolean
|
|
_key_is_modifier (guint keyval)
|
|
{
|
|
@@ -1615,6 +1845,7 @@ _create_gdk_event (IBusIMContext *ibusimcontext,
|
|
out:
|
|
return event;
|
|
}
|
|
+#endif
|
|
|
|
static void
|
|
_ibus_context_forward_key_event_cb (IBusInputContext *ibuscontext,
|
|
@@ -1624,9 +1855,32 @@ _ibus_context_forward_key_event_cb (IBusInputContext *ibuscontext,
|
|
IBusIMContext *ibusimcontext)
|
|
{
|
|
IDEBUG ("%s", __FUNCTION__);
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ int group = 0;
|
|
+ g_return_if_fail (GTK_IS_IM_CONTEXT (ibusimcontext));
|
|
+ if (keycode == 0 && ibusimcontext->client_window) {
|
|
+ GdkDisplay *display = gtk_widget_get_display (ibusimcontext->client_window);
|
|
+ GdkKeymapKey *keys = NULL;
|
|
+ gint n_keys = 0;
|
|
+ if (!gdk_display_map_keyval (display, keyval, &keys, &n_keys))
|
|
+ g_warning ("Failed to parse keycode from keyval %x", keyval);
|
|
+ keycode = keys->keycode;
|
|
+ group = keys->group;
|
|
+ }
|
|
+ gtk_im_context_filter_key (
|
|
+ GTK_IM_CONTEXT (ibusimcontext),
|
|
+ (state & IBUS_RELEASE_MASK) ? FALSE : TRUE,
|
|
+ ibusimcontext->surface,
|
|
+ ibusimcontext->device,
|
|
+ ibusimcontext->time,
|
|
+ keycode,
|
|
+ (GdkModifierType)state,
|
|
+ group);
|
|
+#else
|
|
GdkEventKey *event = _create_gdk_event (ibusimcontext, keyval, keycode, state);
|
|
gdk_event_put ((GdkEvent *)event);
|
|
gdk_event_free ((GdkEvent *)event);
|
|
+#endif
|
|
}
|
|
|
|
static void
|
|
@@ -1660,7 +1914,7 @@ _ibus_context_update_preedit_text_cb (IBusInputContext *ibuscontext,
|
|
ibusimcontext->preedit_attrs = NULL;
|
|
}
|
|
|
|
-#if !GTK_CHECK_VERSION (3, 93, 0)
|
|
+#if !GTK_CHECK_VERSION (3, 98, 4)
|
|
if (!ibusimcontext->use_button_press_event &&
|
|
mode == IBUS_ENGINE_PREEDIT_COMMIT) {
|
|
if (ibusimcontext->client_window) {
|
|
@@ -1847,10 +2101,18 @@ _create_input_context_done (IBusBus *bus,
|
|
}
|
|
|
|
if (!g_queue_is_empty (ibusimcontext->events_queue)) {
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ GdkEvent *event;
|
|
+#else
|
|
GdkEventKey *event;
|
|
+#endif
|
|
while ((event = g_queue_pop_head (ibusimcontext->events_queue))) {
|
|
- _process_key_event (context, event);
|
|
+ _process_key_event (context, event, ibusimcontext);
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+ gdk_event_unref (event);
|
|
+#else
|
|
gdk_event_free ((GdkEvent *)event);
|
|
+#endif
|
|
}
|
|
}
|
|
}
|
|
diff --git a/client/gtk4/Makefile.am b/client/gtk4/Makefile.am
|
|
new file mode 100644
|
|
index 00000000..8d8b31db
|
|
--- /dev/null
|
|
+++ b/client/gtk4/Makefile.am
|
|
@@ -0,0 +1,66 @@
|
|
+# vim:set noet ts=4:
|
|
+#
|
|
+# ibus - The Input Bus
|
|
+#
|
|
+# Copyright (c) 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+# Copyright (c) 2020 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
|
|
+# License as published by the Free Software Foundation; either
|
|
+# version 2.1 of the License, or (at your option) any later version.
|
|
+#
|
|
+# This library is distributed in the hope that it will be useful,
|
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+# Lesser General Public License for more details.
|
|
+#
|
|
+# You should have received a copy of the GNU Lesser General Public
|
|
+# License along with this library; if not, write to the Free Software
|
|
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
+# USA
|
|
+
|
|
+libibus = $(top_builddir)/src/libibus-@IBUS_API_VERSION@.la
|
|
+
|
|
+AM_CPPFLAGS = \
|
|
+ -I$(top_srcdir)/src \
|
|
+ -I$(top_builddir)/src \
|
|
+ $(NULL)
|
|
+
|
|
+immoduledir = @GTK4_IM_MODULEDIR@
|
|
+immodule_LTLIBRARIES = libim-ibus.la
|
|
+
|
|
+libim_ibus_la_SOURCES = \
|
|
+ ibusim.c \
|
|
+ ibusimcontext.c \
|
|
+ ibusimcontext.h \
|
|
+ $(NULL)
|
|
+
|
|
+libim_ibus_la_DEPENDENCIES = $(libibus)
|
|
+
|
|
+libim_ibus_la_CFLAGS = \
|
|
+ @GTK4_CFLAGS@ \
|
|
+ @DBUS_CFLAGS@ \
|
|
+ -DG_LOG_DOMAIN=\"IBUS\" \
|
|
+ $(NULL)
|
|
+
|
|
+libim_ibus_la_LIBADD = \
|
|
+ @GTK4_LIBS@ \
|
|
+ @DBUS_LIBS@ \
|
|
+ $(libibus) \
|
|
+ $(NULL)
|
|
+libim_ibus_la_LDFLAGS = \
|
|
+ -avoid-version \
|
|
+ -module \
|
|
+ $(NULL)
|
|
+
|
|
+$(libibus):
|
|
+ (cd $(top_builddir)/src; make )
|
|
+
|
|
+EXTRA_DIST = \
|
|
+ $(NULL)
|
|
+
|
|
+test: all
|
|
+ GTK_IM_MODULE=ibus gedit
|
|
+
|
|
+-include $(top_srcdir)/git.mk
|
|
diff --git a/client/gtk4/ibusim.c b/client/gtk4/ibusim.c
|
|
new file mode 100644
|
|
index 00000000..5ecf9778
|
|
--- /dev/null
|
|
+++ b/client/gtk4/ibusim.c
|
|
@@ -0,0 +1,52 @@
|
|
+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
|
|
+/* vim:set et ts=4: */
|
|
+/* ibus - The Input Bus
|
|
+ * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
|
|
+ * Copyright (C) 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+ * Copyright (C) 2008-2020 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
|
|
+ * License as published by the Free Software Foundation; either
|
|
+ * version 2.1 of the License, or (at your option) any later version.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ * Lesser General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public
|
|
+ * License along with this library; if not, write to the Free Software
|
|
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
+ * USA
|
|
+ */
|
|
+
|
|
+#include <gtk/gtk.h>
|
|
+#include <gtk/gtkimmodule.h>
|
|
+#include <ibus.h>
|
|
+#include "ibusimcontext.h"
|
|
+
|
|
+G_MODULE_EXPORT void
|
|
+g_io_im_ibus_load (GTypeModule *type_module)
|
|
+{
|
|
+ static gboolean inited = FALSE;
|
|
+
|
|
+ if (!inited) {
|
|
+ ibus_init ();
|
|
+ ibus_im_context_register_type (type_module);
|
|
+ g_io_extension_point_implement ("gtk-im-module",
|
|
+ IBUS_TYPE_IM_CONTEXT,
|
|
+ "ibus",
|
|
+ 50);
|
|
+ inited = TRUE;
|
|
+ }
|
|
+ /* make module resident */
|
|
+ g_type_module_use (type_module);
|
|
+}
|
|
+
|
|
+G_MODULE_EXPORT void
|
|
+g_io_im_ibus_unload (GTypeModule *type_module)
|
|
+{
|
|
+ g_type_module_unuse (type_module);
|
|
+}
|
|
+
|
|
diff --git a/client/gtk4/ibusimcontext.c b/client/gtk4/ibusimcontext.c
|
|
new file mode 120000
|
|
index 00000000..41896f05
|
|
--- /dev/null
|
|
+++ b/client/gtk4/ibusimcontext.c
|
|
@@ -0,0 +1 @@
|
|
+../gtk2/ibusimcontext.c
|
|
\ No newline at end of file
|
|
diff --git a/client/gtk4/ibusimcontext.h b/client/gtk4/ibusimcontext.h
|
|
new file mode 120000
|
|
index 00000000..29759883
|
|
--- /dev/null
|
|
+++ b/client/gtk4/ibusimcontext.h
|
|
@@ -0,0 +1 @@
|
|
+../gtk2/ibusimcontext.h
|
|
\ No newline at end of file
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 9ed5cb66..ffea3317 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -193,6 +193,15 @@ AC_ARG_ENABLE(gtk3,
|
|
)
|
|
AM_CONDITIONAL([ENABLE_GTK3], [test x"$enable_gtk3" = x"yes"])
|
|
|
|
+# --enable-gtk4 option.
|
|
+AC_ARG_ENABLE(gtk4,
|
|
+ AS_HELP_STRING([--enable-gtk4],
|
|
+ [Build gtk4 im module]),
|
|
+ [enable_gtk4=$enableval],
|
|
+ [enable_gtk4=no]
|
|
+)
|
|
+AM_CONDITIONAL([ENABLE_GTK4], [test x"$enable_gtk4" = x"yes"])
|
|
+
|
|
# --disable-xim option.
|
|
AC_ARG_ENABLE(xim,
|
|
AS_HELP_STRING([--disable-xim],
|
|
@@ -257,6 +266,18 @@ if test x"$enable_gdk3_wayland" != x"yes"; then
|
|
fi
|
|
AM_CONDITIONAL([ENABLE_GDK3_WAYLAND], [test x"$enable_gdk3_wayland" = x"yes"])
|
|
|
|
+if test x"$enable_gtk4" = x"yes"; then
|
|
+ # check for gtk4
|
|
+ PKG_CHECK_MODULES(GTK4, [
|
|
+ gtk4
|
|
+ ])
|
|
+
|
|
+ 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)"
|
|
+fi
|
|
+
|
|
if test x"$enable_xim" = x"yes"; then
|
|
# Check for x11
|
|
PKG_CHECK_MODULES(X11, [
|
|
@@ -478,6 +499,14 @@ AC_ARG_WITH(gtk3-im-module-dir,
|
|
)
|
|
AC_SUBST(GTK3_IM_MODULEDIR)
|
|
|
|
+# Define gtk4 immodule dir.
|
|
+AC_ARG_WITH(gtk4-im-module-dir,
|
|
+ AS_HELP_STRING([--with-gtk4-im-module-dir[=DIR]],
|
|
+ [Select gtk4 immodule dir]),
|
|
+ GTK4_IM_MODULEDIR=$with_gtk4_im_module_dir
|
|
+)
|
|
+AC_SUBST(GTK4_IM_MODULEDIR)
|
|
+
|
|
if test x"$enable_python" = x"yes"; then
|
|
# Check for dbus-python.
|
|
AC_ARG_ENABLE(dbus-python-check,
|
|
@@ -737,6 +766,7 @@ ibus.spec
|
|
client/Makefile
|
|
client/gtk2/Makefile
|
|
client/gtk3/Makefile
|
|
+client/gtk4/Makefile
|
|
client/x11/Makefile
|
|
client/wayland/Makefile
|
|
src/Makefile
|
|
@@ -786,8 +816,10 @@ Build options:
|
|
Enable python2 $enable_python2
|
|
Gtk2 immodule dir $GTK2_IM_MODULEDIR
|
|
Gtk3 immodule dir $GTK3_IM_MODULEDIR
|
|
+ Gtk4 immodule dir $GTK4_IM_MODULEDIR
|
|
Build gtk2 immodule $enable_gtk2
|
|
Build gtk3 immodule $enable_gtk3
|
|
+ Build gtk4 immodule $enable_gtk4
|
|
Build XIM agent server $enable_xim
|
|
Build wayland support $enable_wayland
|
|
Build gdk3 wayland support $enable_gdk3_wayland
|
|
--
|
|
2.28.0
|
|
|
|
From d0a47c3c82b1a0c263ff8b95f9cf5c0a5d1f228d Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
Date: Fri, 8 Jan 2021 18:48:13 +0900
|
|
Subject: [PATCH] client/gtk2: Add XTranslateCoordinates for GTK4 X11
|
|
coordinate
|
|
|
|
GdkWindow had the absolute coordiante in the private class in GTK3
|
|
but the absolute coordiane no longer exists in GTK4 for Wayland.
|
|
Now get the toplevel window coordiante for the warkaround in GTK4
|
|
but the coordiante of the inner widgets is no longer available too.
|
|
|
|
BUG=https://gitlab.gnome.org/GNOME/gtk/-/issues/3024#note_987835
|
|
---
|
|
client/gtk2/ibusimcontext.c | 47 ++++++++++++++++++++++++-------------
|
|
1 file changed, 31 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
|
|
index a23fc2e3..e153081d 100644
|
|
--- a/client/gtk2/ibusimcontext.c
|
|
+++ b/client/gtk2/ibusimcontext.c
|
|
@@ -39,6 +39,13 @@
|
|
#endif
|
|
#endif
|
|
|
|
+#ifdef GDK_WINDOWING_X11
|
|
+#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+#include <gdk/x11/gdkx.h>
|
|
+#include <X11/Xlib.h>
|
|
+#endif
|
|
+#endif
|
|
+
|
|
#if !GTK_CHECK_VERSION (2, 91, 0)
|
|
# define DEPRECATED_GDK_KEYSYMS 1
|
|
#endif
|
|
@@ -1462,24 +1469,33 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
|
|
#endif
|
|
}
|
|
|
|
-#if GTK_CHECK_VERSION (3, 93, 0)
|
|
- {
|
|
#if GTK_CHECK_VERSION (3, 98, 4)
|
|
+#ifdef GDK_WINDOWING_X11
|
|
+ GdkDisplay *display = gtk_widget_get_display (ibusimcontext->client_window);
|
|
+ if (GDK_IS_X11_DISPLAY (display)) {
|
|
+ Display *xdisplay = gdk_x11_display_get_xdisplay (display);
|
|
+ Window root_window = gdk_x11_display_get_xrootwindow (display);
|
|
GtkNative *native = gtk_widget_get_native (
|
|
ibusimcontext->client_window);
|
|
- GtkRoot *root = gtk_widget_get_root (ibusimcontext->client_window);
|
|
- double nx, ny;
|
|
- double px, py;
|
|
- gtk_native_get_surface_transform (native, &nx, &ny);
|
|
- px = (double)area.x + ibusimcontext->x - nx;
|
|
- py = (double)area.y + ibusimcontext->y - ny;
|
|
- gtk_widget_translate_coordinates (ibusimcontext->client_window,
|
|
- (GtkWidget *)root,
|
|
- px, py,
|
|
- &px, &py);
|
|
- area.x = (int)px;
|
|
- area.y = (int)py;
|
|
-#else
|
|
+ GdkSurface *surface = gtk_native_get_surface (native);
|
|
+ /* The window is the toplevel window but not the inner text widget.
|
|
+ * Unfortunatelly GTK4 cannot get the coordinate of the text widget.
|
|
+ */
|
|
+ Window window = gdk_x11_surface_get_xid (surface);
|
|
+ Window child;
|
|
+ int x, y;
|
|
+ XTranslateCoordinates (xdisplay, window, root_window,
|
|
+ 0, 0, &x, &y, &child);
|
|
+ XWindowAttributes xwa;
|
|
+ XGetWindowAttributes (xdisplay, window, &xwa);
|
|
+ area.x = x - xwa.x + area.x;
|
|
+ area.y = y - xwa.y + area.y;
|
|
+ area.width = xwa.width;
|
|
+ area.height = xwa.height;
|
|
+ }
|
|
+#endif
|
|
+#elif GTK_CHECK_VERSION (3, 93, 0)
|
|
+ {
|
|
GtkNative *native = gtk_widget_get_native (
|
|
ibusimcontext->client_window);
|
|
GdkSurface *surface = gtk_native_get_surface (native);
|
|
@@ -1488,7 +1504,6 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
|
|
gdk_surface_get_position (surface, &root_x, &root_y);
|
|
area.x += root_x;
|
|
area.y += root_y;
|
|
-#endif
|
|
}
|
|
#else
|
|
gdk_window_get_root_coords (ibusimcontext->client_window,
|
|
--
|
|
2.28.0
|
|
|
|
From ef4c5c7ef790ce1f80e94a5463e110ed4bae254e Mon Sep 17 00:00:00 2001
|
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
|
Date: Wed, 20 Jan 2021 17:26:47 +0900
|
|
Subject: [PATCH] setup: Search engine name directly
|
|
|
|
Currently users can search language names only in the language list
|
|
in ibus-setup. After a language is selected and open, engine names can
|
|
be searched.
|
|
Now engine names also can be searched in the language list.
|
|
---
|
|
setup/enginedialog.py | 40 +++++++++++++++++++++-------------------
|
|
1 file changed, 21 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/setup/enginedialog.py b/setup/enginedialog.py
|
|
index 72deada8..e1c322bf 100644
|
|
--- a/setup/enginedialog.py
|
|
+++ b/setup/enginedialog.py
|
|
@@ -4,7 +4,7 @@
|
|
# ibus - The Input Bus
|
|
#
|
|
# Copyright (c) 2015 Peng Huang <shawn.p.huang@gmail.com>
|
|
-# Copyright (c) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
+# Copyright (c) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
|
# Copyright (c) 2013-2015 Red Hat, Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
@@ -112,15 +112,20 @@ class EngineDialog(Gtk.Dialog):
|
|
return False
|
|
if self.__filter_word == None:
|
|
return True
|
|
+ if row.back:
|
|
+ return True
|
|
|
|
- name = row.name.lower()
|
|
- untrans = row.untrans.lower()
|
|
- if self.__filter_word != None:
|
|
- word = self.__filter_word.lower()
|
|
- if name.startswith(word):
|
|
- return True
|
|
- if untrans.startswith(word):
|
|
- return True
|
|
+ word = self.__filter_word.lower()
|
|
+ if word in row.name.lower():
|
|
+ return True
|
|
+ if word in row.untrans.lower():
|
|
+ return True
|
|
+ if row.lang_info and row.name in self.__engines_for_lang:
|
|
+ for row_e in self.__engines_for_lang[row.name]:
|
|
+ if word in row_e.name.lower():
|
|
+ return True
|
|
+ if word in row_e.untrans.lower():
|
|
+ return True
|
|
return False
|
|
|
|
|
|
@@ -129,11 +134,9 @@ class EngineDialog(Gtk.Dialog):
|
|
self.__show_more()
|
|
return
|
|
if row.back:
|
|
- self.__filter_entry.set_text('')
|
|
self.__show_lang_rows()
|
|
return
|
|
if row.lang_info:
|
|
- self.__filter_entry.set_text('')
|
|
self.__show_engines_for_lang(row)
|
|
return
|
|
|
|
@@ -232,6 +235,7 @@ class EngineDialog(Gtk.Dialog):
|
|
description = i18n.gettext_engine_description(engine)
|
|
row = self.__list_box_row_new(longname)
|
|
row.untrans = engine.get_longname()
|
|
+ row.rank = engine.get_rank()
|
|
row.set_tooltip_text(description)
|
|
row.engine = engine
|
|
widget = self.__padded_label_new(longname,
|
|
@@ -260,16 +264,13 @@ class EngineDialog(Gtk.Dialog):
|
|
lang = row.name
|
|
|
|
def cmp_engine(a, b):
|
|
- if a.get_rank() == b.get_rank():
|
|
- a_longname = i18n.gettext_engine_longname(a)
|
|
- b_longname = i18n.gettext_engine_longname(b)
|
|
- return locale.strcoll(a_longname, b_longname)
|
|
- return int(b.get_rank() - a.get_rank())
|
|
+ if a.rank == b.rank:
|
|
+ return locale.strcoll(a.name, b.name)
|
|
+ return int(b.rank - a.rank)
|
|
|
|
self.__engines_for_lang[lang].sort(
|
|
key = functools.cmp_to_key(cmp_engine))
|
|
- for e in self.__engines_for_lang[lang]:
|
|
- row = self.__engine_row_new(e)
|
|
+ for row in self.__engines_for_lang[lang]:
|
|
self.__list.add(row)
|
|
|
|
|
|
@@ -329,7 +330,8 @@ class EngineDialog(Gtk.Dialog):
|
|
if l not in self.__engines_for_lang:
|
|
self.__engines_for_lang[l] = []
|
|
i18n.init_textdomain(e.get_textdomain())
|
|
- self.__engines_for_lang[l].append(e)
|
|
+ row = self.__engine_row_new(e)
|
|
+ self.__engines_for_lang[l].append(row)
|
|
|
|
# Retrieve Untranslated language names.
|
|
untrans = IBus.get_untranslated_language_name(e.get_language())
|
|
--
|
|
2.28.0
|
|
|