514 lines
16 KiB
Diff
514 lines
16 KiB
Diff
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
|
|
|