ibus/ibus-HEAD.patch
2019-12-26 17:29:11 +09:00

3124 lines
117 KiB
Diff

From fcb2187dd46d71031867f3bd43196c2448693469 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Fri, 6 Sep 2019 20:59:49 +0900
Subject: [PATCH] src/tests: Replace push with cd for Posix SH
BUG=https://github.com/ibus/ibus/issues/2124
BUG=https://github.com/ibus/ibus/issues/2126
---
src/tests/ibus-config.c | 2 +-
src/tests/runtest | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/tests/ibus-config.c b/src/tests/ibus-config.c
index 9b925ad9..5e845f10 100644
--- a/src/tests/ibus-config.c
+++ b/src/tests/ibus-config.c
@@ -114,7 +114,7 @@ test_config_set_get (void)
value_bits |= (1 << 1);
}
else {
- g_warning ("unknow value name=%s", name);
+ g_warning ("Unknown value name=%s", name);
}
ibus_config_unset (config, "test", name);
g_variant_unref (value);
diff --git a/src/tests/runtest b/src/tests/runtest
index 1fcc9283..ed38992f 100755
--- a/src/tests/runtest
+++ b/src/tests/runtest
@@ -111,7 +111,8 @@ fi
run_test_case()
{
test -d $tstdir || mkdir $tstdir
- pushd $tstdir
+ backup_dir=$PWD
+ cd $tstdir
need_bus=no
for t in $BUS_REQUIRED_TESTS; do
@@ -190,7 +191,7 @@ run_test_case()
retval=`expr $retval \| $?`
- popd
+ cd $backup_dir
func_cleanup $tstdir
}
--
2.21.0
From 48a8d7ed58bdfb02c24c8039bae1cb15d4fc1bce Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Fri, 6 Sep 2019 21:24:24 +0900
Subject: [PATCH] Delete deprecated g_type_class_add_private since glib 2.58
G_DEFINE_TYPE_WITH_PRIVATE() and G_ADD_PRIVATE() have been available
since 2.38.
IBusService has custom GBaseInitFunc and GBaseFinalizeFunc in
ibus_service_get_type() and implements ibus_service_private_offset
and ibus_service_get_instance_private() directly without
G_DEFINE_TYPE_WITH_PRIVATE().
---
bus/ibusimpl.c | 7 +++---
src/ibusbus.c | 8 +++---
src/ibuscomponent.c | 10 ++++----
src/ibusconfig.c | 9 +++----
src/ibusemoji.c | 14 +++++------
src/ibusengine.c | 10 +++-----
src/ibusenginedesc.c | 10 ++++----
src/ibusenginesimple.c | 8 +++---
src/ibusfactory.c | 8 +++---
src/ibushotkey.c | 55 ++++++++++++------------------------------
src/ibusinputcontext.c | 12 ++++-----
src/ibusobject.c | 8 +++---
src/ibusobservedpath.c | 6 ++---
src/ibusproperty.c | 8 +++---
src/ibusregistry.c | 10 +++-----
src/ibusserializable.c | 24 ++++++++++++++----
src/ibusservice.c | 34 +++++++++++++++++++-------
src/ibusunicode.c | 24 ++++++++----------
src/ibusxevent.c | 22 ++++++++---------
19 files changed, 135 insertions(+), 152 deletions(-)
diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
index bbbb5770..39b16139 100644
--- a/bus/ibusimpl.c
+++ b/bus/ibusimpl.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) 2011-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2008-2018 Red Hat, Inc.
+ * Copyright (C) 2011-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -2180,7 +2180,8 @@ bus_ibus_impl_registry_destroy (BusIBusImpl *ibus)
g_clear_pointer (&ibus->engine_table, g_hash_table_destroy);
- g_clear_pointer (&ibus->registry, ibus_object_destroy);
+ ibus_object_destroy (IBUS_OBJECT (ibus->registry));
+ ibus->registry = NULL;
if (ibus->extension_register_keys)
g_clear_pointer (&ibus->extension_register_keys, g_variant_unref);
diff --git a/src/ibusbus.c b/src/ibusbus.c
index 09054851..0783e7bb 100644
--- a/src/ibusbus.c
+++ b/src/ibusbus.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* ibus - The Input Bus
* Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
* Copyright (C) 2008-2016 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
@@ -36,7 +36,7 @@
#include "ibusconfig.h"
#define IBUS_BUS_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_BUS, IBusBusPrivate))
+ ((IBusBusPrivate *)ibus_bus_get_instance_private (o))
enum {
CONNECTED,
@@ -115,7 +115,7 @@ static void ibus_bus_get_property (IBusBus *bus,
static void ibus_bus_close_connection (IBusBus *bus);
-G_DEFINE_TYPE (IBusBus, ibus_bus, IBUS_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusBus, ibus_bus, IBUS_TYPE_OBJECT)
static void
ibus_bus_class_init (IBusBusClass *class)
@@ -234,8 +234,6 @@ ibus_bus_class_init (IBusBusClass *class)
G_TYPE_NONE,
3,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-
- g_type_class_add_private (class, sizeof (IBusBusPrivate));
}
static void
diff --git a/src/ibuscomponent.c b/src/ibuscomponent.c
index a933e79b..9837f47c 100644
--- a/src/ibuscomponent.c
+++ b/src/ibuscomponent.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* bus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2010 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -58,7 +58,7 @@ struct _IBusComponentPrivate {
};
#define IBUS_COMPONENT_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_COMPONENT, IBusComponentPrivate))
+ ((IBusComponentPrivate *)ibus_component_get_instance_private (o))
// static guint _signals[LAST_SIGNAL] = { 0 };
@@ -90,7 +90,9 @@ static void ibus_component_parse_observed_paths
XMLNode *node,
gboolean access_fs);
-G_DEFINE_TYPE (IBusComponent, ibus_component, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusComponent,
+ ibus_component,
+ IBUS_TYPE_SERIALIZABLE)
static void
ibus_component_class_init (IBusComponentClass *class)
@@ -99,8 +101,6 @@ ibus_component_class_init (IBusComponentClass *class)
IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (class);
- g_type_class_add_private (class, sizeof (IBusComponentPrivate));
-
gobject_class->set_property = (GObjectSetPropertyFunc) ibus_component_set_property;
gobject_class->get_property = (GObjectGetPropertyFunc) ibus_component_get_property;
object_class->destroy = (IBusObjectDestroyFunc) ibus_component_destroy;
diff --git a/src/ibusconfig.c b/src/ibusconfig.c
index 621a4e53..713fe251 100644
--- a/src/ibusconfig.c
+++ b/src/ibusconfig.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* ibus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2010 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include "ibuserror.h"
#define IBUS_CONFIG_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_CONFIG, IBusConfigPrivate))
+ ((IBusConfigPrivate *)ibus_config_get_instance_private (o))
enum {
VALUE_CHANGED,
@@ -65,6 +65,7 @@ static void _signal_unsubscribe (GDBusProxy *proxy,
static void _remove_all_match_rules (IBusConfig *config);
G_DEFINE_TYPE_WITH_CODE (IBusConfig, ibus_config, IBUS_TYPE_PROXY,
+ G_ADD_PRIVATE (IBusConfig)
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init)
G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init)
);
@@ -75,8 +76,6 @@ ibus_config_class_init (IBusConfigClass *class)
GDBusProxyClass *dbus_proxy_class = G_DBUS_PROXY_CLASS (class);
IBusProxyClass *proxy_class = IBUS_PROXY_CLASS (class);
- g_type_class_add_private (class, sizeof (IBusConfigPrivate));
-
dbus_proxy_class->g_signal = ibus_config_g_signal;
proxy_class->destroy = ibus_config_real_destroy;
@@ -116,7 +115,7 @@ ibus_config_init (IBusConfig *config)
static void
ibus_config_real_destroy (IBusProxy *proxy)
{
- IBusConfigPrivate *priv = IBUS_CONFIG_GET_PRIVATE (proxy);
+ IBusConfigPrivate *priv = IBUS_CONFIG_GET_PRIVATE (IBUS_CONFIG (proxy));
_signal_unsubscribe (G_DBUS_PROXY (proxy), priv->watch_config_signal_id);
_remove_all_match_rules (IBUS_CONFIG (proxy));
diff --git a/src/ibusemoji.c b/src/ibusemoji.c
index d56c48aa..ae8907a2 100644
--- a/src/ibusemoji.c
+++ b/src/ibusemoji.c
@@ -1,8 +1,8 @@
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
/* vim:set et sts=4: */
/* bus - The Input Bus
- * Copyright (C) 2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2017 Red Hat, Inc.
+ * Copyright (C) 2017-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2017-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -47,9 +47,7 @@ struct _IBusEmojiDataPrivate {
};
#define IBUS_EMOJI_DATA_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
- IBUS_TYPE_EMOJI_DATA, \
- IBusEmojiDataPrivate))
+ ((IBusEmojiDataPrivate *)ibus_emoji_data_get_instance_private (o))
/* functions prototype */
static void ibus_emoji_data_set_property (IBusEmojiData *emoji,
@@ -68,7 +66,9 @@ static gint ibus_emoji_data_deserialize (IBusEmojiData *emoji,
static gboolean ibus_emoji_data_copy (IBusEmojiData *emoji,
const IBusEmojiData *src);
-G_DEFINE_TYPE (IBusEmojiData, ibus_emoji_data, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusEmojiData,
+ ibus_emoji_data,
+ IBUS_TYPE_SERIALIZABLE)
static void
ibus_emoji_data_class_init (IBusEmojiDataClass *class)
@@ -89,8 +89,6 @@ ibus_emoji_data_class_init (IBusEmojiDataClass *class)
serializable_class->copy =
(IBusSerializableCopyFunc) ibus_emoji_data_copy;
- g_type_class_add_private (class, sizeof (IBusEmojiDataPrivate));
-
/* install properties */
/**
* IBusEmojiData:emoji:
diff --git a/src/ibusengine.c b/src/ibusengine.c
index 7fb4e856..9aeafbf9 100644
--- a/src/ibusengine.c
+++ b/src/ibusengine.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) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2008-2018 Red Hat, Inc.
+ * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,7 @@
#include "ibusxevent.h"
#define IBUS_ENGINE_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_ENGINE, IBusEnginePrivate))
+ ((IBusEnginePrivate *)ibus_engine_get_instance_private (o))
enum {
PROCESS_KEY_EVENT,
@@ -187,7 +187,7 @@ static void ibus_engine_dbus_property_changed
GVariant *value);
-G_DEFINE_TYPE (IBusEngine, ibus_engine, IBUS_TYPE_SERVICE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusEngine, ibus_engine, IBUS_TYPE_SERVICE)
static const gchar introspection_xml[] =
"<node>"
@@ -830,8 +830,6 @@ ibus_engine_class_init (IBusEngineClass *class)
G_TYPE_UINT,
G_TYPE_UINT);
- g_type_class_add_private (class, sizeof (IBusEnginePrivate));
-
text_empty = ibus_text_new_from_static_string ("");
g_object_ref_sink (text_empty);
}
diff --git a/src/ibusenginedesc.c b/src/ibusenginedesc.c
index 22622865..064588bd 100644
--- a/src/ibusenginedesc.c
+++ b/src/ibusenginedesc.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* bus - The Input Bus
* Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2015 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -72,7 +72,7 @@ struct _IBusEngineDescPrivate {
};
#define IBUS_ENGINE_DESC_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_ENGINE_DESC, IBusEngineDescPrivate))
+ ((IBusEngineDescPrivate *)ibus_engine_desc_get_instance_private (o))
// static guint _signals[LAST_SIGNAL] = { 0 };
@@ -95,7 +95,9 @@ static gboolean ibus_engine_desc_copy (IBusEngineDesc *des
static gboolean ibus_engine_desc_parse_xml_node (IBusEngineDesc *desc,
XMLNode *node);
-G_DEFINE_TYPE (IBusEngineDesc, ibus_engine_desc, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusEngineDesc,
+ ibus_engine_desc,
+ IBUS_TYPE_SERIALIZABLE)
static void
@@ -113,8 +115,6 @@ ibus_engine_desc_class_init (IBusEngineDescClass *class)
serializable_class->deserialize = (IBusSerializableDeserializeFunc) ibus_engine_desc_deserialize;
serializable_class->copy = (IBusSerializableCopyFunc) ibus_engine_desc_copy;
- g_type_class_add_private (class, sizeof (IBusEngineDescPrivate));
-
/* install properties */
/**
* IBusEngineDesc:name:
diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
index b623e149..43bd5283 100644
--- a/src/ibusenginesimple.c
+++ b/src/ibusenginesimple.c
@@ -45,7 +45,7 @@
#define X11_DATADIR X11_DATA_PREFIX "/share/X11/locale"
#define IBUS_ENGINE_SIMPLE_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_ENGINE_SIMPLE, IBusEngineSimplePrivate))
+ ((IBusEngineSimplePrivate *)ibus_engine_simple_get_instance_private (o))
#define SET_COMPOSE_BUFFER_ELEMENT_NEXT(buffer, index, value) { \
if ((index) >= COMPOSE_BUFFER_SIZE && \
@@ -150,7 +150,9 @@ static void ibus_engine_simple_commit_str (IBusEngineSimple *simple,
static void ibus_engine_simple_update_preedit_text
(IBusEngineSimple *simple);
-G_DEFINE_TYPE (IBusEngineSimple, ibus_engine_simple, IBUS_TYPE_ENGINE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusEngineSimple,
+ ibus_engine_simple,
+ IBUS_TYPE_ENGINE)
static void
ibus_engine_simple_class_init (IBusEngineSimpleClass *class)
@@ -170,8 +172,6 @@ ibus_engine_simple_class_init (IBusEngineSimpleClass *class)
engine_class->page_up = ibus_engine_simple_page_up;
engine_class->candidate_clicked
= ibus_engine_simple_candidate_clicked;
-
- g_type_class_add_private (class, sizeof (IBusEngineSimplePrivate));
}
static void
diff --git a/src/ibusfactory.c b/src/ibusfactory.c
index e915c931..cb9b53cc 100644
--- a/src/ibusfactory.c
+++ b/src/ibusfactory.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* ibus - The Input Bus
* Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2015 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
#include "ibusinternal.h"
#define IBUS_FACTORY_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_FACTORY, IBusFactoryPrivate))
+ ((IBusFactoryPrivate *)ibus_factory_get_instance_private (o))
enum {
CREATE_ENGINE,
@@ -87,7 +87,7 @@ static void ibus_factory_engine_destroy_cb
(IBusEngine *engine,
IBusFactory *factory);
-G_DEFINE_TYPE (IBusFactory, ibus_factory, IBUS_TYPE_SERVICE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusFactory, ibus_factory, IBUS_TYPE_SERVICE)
static const gchar introspection_xml[] =
"<node>"
@@ -158,8 +158,6 @@ ibus_factory_class_init (IBusFactoryClass *class)
ibus_service_class_add_interfaces (IBUS_SERVICE_CLASS (class), introspection_xml);
- g_type_class_add_private (class, sizeof (IBusFactoryPrivate));
-
/**
* IBusFactory::create-engine:
* @factory: the factory which received the signal
diff --git a/src/ibushotkey.c b/src/ibushotkey.c
index 249ed5d2..d4ab7c23 100644
--- a/src/ibushotkey.c
+++ b/src/ibushotkey.c
@@ -2,8 +2,8 @@
/* vim:set et sts=4: */
/* IBus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2008-2018 Red Hat, Inc.
+ * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@
#include "ibusshare.h"
#define IBUS_HOTKEY_PROFILE_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_HOTKEY_PROFILE, IBusHotkeyProfilePrivate))
+ ((IBusHotkeyProfilePrivate *)ibus_hotkey_profile_get_instance_private (o))
enum {
TRIGGER,
@@ -79,7 +79,10 @@ static guint normalize_modifiers (guint key
guint modifiers);
static gboolean is_modifier (guint keyval);
-static IBusSerializableClass *parent_class = NULL;
+G_DEFINE_TYPE_WITH_PRIVATE (IBusHotkeyProfile,
+ ibus_hotkey_profile,
+ IBUS_TYPE_SERIALIZABLE)
+
static guint profile_signals[LAST_SIGNAL] = { 0 };
@@ -141,43 +144,12 @@ ibus_hotkey_cmp_with_data (IBusHotkey *hotkey1,
-GType
-ibus_hotkey_profile_get_type (void)
-{
- static GType type = 0;
-
- static const GTypeInfo type_info = {
- sizeof (IBusHotkeyProfileClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) ibus_hotkey_profile_class_init,
- NULL, /* class finalize */
- NULL, /* class data */
- sizeof (IBusHotkeyProfile),
- 0,
- (GInstanceInitFunc) ibus_hotkey_profile_init,
- };
-
- if (type == 0) {
- type = g_type_register_static (IBUS_TYPE_SERIALIZABLE,
- "IBusHotkeyProfile",
- &type_info,
- 0);
- }
-
- return type;
-}
-
static void
ibus_hotkey_profile_class_init (IBusHotkeyProfileClass *class)
{
IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (class);
- parent_class = (IBusSerializableClass *) g_type_class_peek_parent (class);
-
- g_type_class_add_private (class, sizeof (IBusHotkeyProfilePrivate));
-
object_class->destroy = (IBusObjectDestroyFunc) ibus_hotkey_profile_destroy;
serializable_class->serialize = (IBusSerializableSerializeFunc) ibus_hotkey_profile_serialize;
@@ -255,7 +227,8 @@ ibus_hotkey_profile_destroy (IBusHotkeyProfile *profile)
priv->hotkeys = NULL;
}
- IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *)profile);
+ IBUS_OBJECT_CLASS (ibus_hotkey_profile_parent_class)->
+ destroy ((IBusObject *)profile);
}
static gboolean
@@ -264,7 +237,8 @@ ibus_hotkey_profile_serialize (IBusHotkeyProfile *profile,
{
gboolean retval;
- retval = parent_class->serialize ((IBusSerializable *) profile, builder);
+ retval = IBUS_SERIALIZABLE_CLASS (ibus_hotkey_profile_parent_class)->
+ serialize ((IBusSerializable *) profile, builder);
g_return_val_if_fail (retval, FALSE);
return TRUE;
@@ -276,7 +250,8 @@ ibus_hotkey_profile_deserialize (IBusHotkeyProfile *profile,
{
gint retval;
- retval = parent_class->deserialize ((IBusSerializable *) profile, variant);
+ retval = IBUS_SERIALIZABLE_CLASS (ibus_hotkey_profile_parent_class)->
+ deserialize ((IBusSerializable *) profile, variant);
g_return_val_if_fail (retval, 0);
return retval;
@@ -288,8 +263,8 @@ ibus_hotkey_profile_copy (IBusHotkeyProfile *dest,
{
gboolean retval;
- retval = parent_class->copy ((IBusSerializable *)dest,
- (IBusSerializable *)src);
+ retval = IBUS_SERIALIZABLE_CLASS (ibus_hotkey_profile_parent_class)->
+ copy ((IBusSerializable *)dest, (IBusSerializable *)src);
g_return_val_if_fail (retval, FALSE);
g_return_val_if_fail (IBUS_IS_HOTKEY_PROFILE (dest), FALSE);
diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
index a809ef08..2b1438fc 100644
--- a/src/ibusinputcontext.c
+++ b/src/ibusinputcontext.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) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2008-2018 Red Hat, Inc.
+ * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -31,7 +31,7 @@
#include "ibuserror.h"
#define IBUS_INPUT_CONTEXT_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_INPUT_CONTEXT, IBusInputContextPrivate))
+ ((IBusInputContextPrivate *)ibus_input_context_get_instance_private (o))
enum {
ENABLED,
@@ -83,7 +83,9 @@ static void ibus_input_context_g_signal (GDBusProxy *proxy,
const gchar *signal_name,
GVariant *parameters);
-G_DEFINE_TYPE (IBusInputContext, ibus_input_context, IBUS_TYPE_PROXY)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusInputContext,
+ ibus_input_context,
+ IBUS_TYPE_PROXY)
static void
ibus_input_context_class_init (IBusInputContextClass *class)
@@ -91,8 +93,6 @@ ibus_input_context_class_init (IBusInputContextClass *class)
IBusProxyClass *ibus_proxy_class = IBUS_PROXY_CLASS (class);
GDBusProxyClass *g_dbus_proxy_class = G_DBUS_PROXY_CLASS (class);
- g_type_class_add_private (class, sizeof (IBusInputContextPrivate));
-
ibus_proxy_class->destroy = ibus_input_context_real_destroy;
g_dbus_proxy_class->g_signal = ibus_input_context_g_signal;
diff --git a/src/ibusobject.c b/src/ibusobject.c
index 258048c0..15d9aa3a 100644
--- a/src/ibusobject.c
+++ b/src/ibusobject.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) 2008-2013 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,7 @@
#include "ibusinternal.h"
#define IBUS_OBJECT_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_OBJECT, IBusObjectPrivate))
+ ((IBusObjectPrivate *)ibus_object_get_instance_private (o))
enum {
DESTROY,
@@ -53,7 +53,7 @@ static void ibus_object_dispose (IBusObject *obj);
static void ibus_object_finalize (IBusObject *obj);
static void ibus_object_real_destroy (IBusObject *obj);
-G_DEFINE_TYPE (IBusObject, ibus_object, G_TYPE_INITIALLY_UNOWNED)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusObject, ibus_object, G_TYPE_INITIALLY_UNOWNED)
static void
ibus_object_class_init (IBusObjectClass *class)
@@ -86,8 +86,6 @@ ibus_object_class_init (IBusObjectClass *class)
_ibus_marshal_VOID__VOID,
G_TYPE_NONE, 0);
- g_type_class_add_private (class, sizeof (IBusObjectPrivate));
-
#ifdef DEBUG_MEMORY
_count_table = g_hash_table_new (g_direct_hash, g_direct_equal);
#endif
diff --git a/src/ibusobservedpath.c b/src/ibusobservedpath.c
index cbb846df..5b79f1fe 100644
--- a/src/ibusobservedpath.c
+++ b/src/ibusobservedpath.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* ibus - The Input IBus
* Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2015 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -37,7 +37,7 @@ struct _IBusObservedPathPrivate {
typedef struct _IBusObservedPathPrivate IBusObservedPathPrivate;
#define IBUS_OBSERVED_PATH_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_OBSERVED_PATH, IBusObservedPathPrivate))
+ ((IBusObservedPathPrivate *)ibus_observed_path_get_instance_private (o))
// static guint _signals[LAST_SIGNAL] = { 0 };
@@ -60,8 +60,6 @@ ibus_observed_path_class_init (IBusObservedPathClass *class)
IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (class);
- // g_type_class_add_private (class, sizeof (IBusObservedPathPrivate));
-
object_class->destroy = (IBusObjectDestroyFunc) ibus_observed_path_destroy;
serializable_class->serialize = (IBusSerializableSerializeFunc) ibus_observed_path_serialize;
diff --git a/src/ibusproperty.c b/src/ibusproperty.c
index c6a37534..e87d26b6 100644
--- a/src/ibusproperty.c
+++ b/src/ibusproperty.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* IBus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2010 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -59,7 +59,7 @@ struct _IBusPropertyPrivate {
};
#define IBUS_PROPERTY_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_PROPERTY, IBusPropertyPrivate))
+ ((IBusPropertyPrivate *)ibus_property_get_instance_private (o))
/* functions prototype */
static void ibus_property_set_property (IBusProperty *prop,
@@ -78,7 +78,7 @@ static gint ibus_property_deserialize (IBusProperty *prop,
static gboolean ibus_property_copy (IBusProperty *dest,
const IBusProperty *src);
-G_DEFINE_TYPE (IBusProperty, ibus_property, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusProperty, ibus_property, IBUS_TYPE_SERIALIZABLE)
static void
ibus_property_class_init (IBusPropertyClass *class)
@@ -87,8 +87,6 @@ ibus_property_class_init (IBusPropertyClass *class)
IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (class);
- g_type_class_add_private (class, sizeof (IBusPropertyPrivate));
-
gobject_class->set_property = (GObjectSetPropertyFunc) ibus_property_set_property;
gobject_class->get_property = (GObjectGetPropertyFunc) ibus_property_get_property;
diff --git a/src/ibusregistry.c b/src/ibusregistry.c
index b0483998..43990d5f 100644
--- a/src/ibusregistry.c
+++ b/src/ibusregistry.c
@@ -2,8 +2,8 @@
/* vim:set et sts=4: */
/* bus - The Input Bus
* Copyright (C) 2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2015 Red Hat, Inc.
+ * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2015-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -55,7 +55,7 @@ struct _IBusRegistryPrivate {
};
#define IBUS_REGISTRY_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_REGISTRY, IBusRegistryPrivate))
+ ((IBusRegistryPrivate *)ibus_registry_get_instance_private (o))
/* functions prototype */
static void ibus_registry_destroy (IBusRegistry *registry);
@@ -67,7 +67,7 @@ static gint ibus_registry_deserialize (IBusRegistry *registry,
static gboolean ibus_registry_copy (IBusRegistry *dest,
const IBusRegistry *src);
-G_DEFINE_TYPE (IBusRegistry, ibus_registry, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusRegistry, ibus_registry, IBUS_TYPE_SERIALIZABLE)
static void
ibus_registry_class_init (IBusRegistryClass *class)
@@ -84,8 +84,6 @@ ibus_registry_class_init (IBusRegistryClass *class)
(IBusSerializableDeserializeFunc) ibus_registry_deserialize;
serializable_class->copy = (IBusSerializableCopyFunc) ibus_registry_copy;
- g_type_class_add_private (class, sizeof (IBusRegistryPrivate));
-
/* install signals */
/**
* IBusRegistry::changed:
diff --git a/src/ibusserializable.c b/src/ibusserializable.c
index a8d4dd65..231020b7 100644
--- a/src/ibusserializable.c
+++ b/src/ibusserializable.c
@@ -2,8 +2,8 @@
/* vim:set et sts=4: */
/* ibus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2008-2018 Red Hat, Inc.
+ * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#include "ibusserializable.h"
#define IBUS_SERIALIZABLE_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_SERIALIZABLE, IBusSerializablePrivate))
+ ((IBusSerializablePrivate *)ibus_serializable_get_instance_private (o))
enum {
LAST_SIGNAL,
@@ -50,7 +50,15 @@ static gboolean ibus_serializable_real_copy (IBusSerializable *des
const IBusSerializable *src);
static IBusObjectClass *parent_class = NULL;
+static gint ibus_serializable_private_offset;
+G_GNUC_UNUSED
+static inline gpointer
+ibus_serializable_get_instance_private (IBusSerializable *self)
+{
+ return (G_STRUCT_MEMBER_P (self, ibus_serializable_private_offset));
+}
+
GType
ibus_serializable_get_type (void)
{
@@ -73,6 +81,9 @@ ibus_serializable_get_type (void)
"IBusSerializable",
&type_info,
0);
+ ibus_serializable_private_offset =
+ g_type_add_instance_private (type,
+ sizeof (IBusSerializablePrivate));
}
return type;
@@ -101,7 +112,10 @@ ibus_serializable_class_init (IBusSerializableClass *class)
parent_class = (IBusObjectClass *) g_type_class_peek_parent (class);
- g_type_class_add_private (class, sizeof (IBusSerializablePrivate));
+ if (ibus_serializable_private_offset) {
+ g_type_class_adjust_private_offset (class,
+ &ibus_serializable_private_offset);
+ }
object_class->destroy = (IBusObjectDestroyFunc) ibus_serializable_destroy;
@@ -184,7 +198,7 @@ ibus_serializable_real_copy (IBusSerializable *dest,
{
IBusSerializablePrivate *src_priv;
IBusSerializablePrivate *dest_priv;
- src_priv = IBUS_SERIALIZABLE_GET_PRIVATE (src);
+ src_priv = IBUS_SERIALIZABLE_GET_PRIVATE (IBUS_SERIALIZABLE (src));
dest_priv = IBUS_SERIALIZABLE_GET_PRIVATE (dest);
g_datalist_foreach (&src_priv->attachments,
diff --git a/src/ibusservice.c b/src/ibusservice.c
index eb370e8b..60255bd5 100644
--- a/src/ibusservice.c
+++ b/src/ibusservice.c
@@ -2,8 +2,8 @@
/* vim:set et sts=4: */
/* ibus - The Input Bus
* Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2008-2018 Red Hat, Inc.
+ * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,7 @@
#include "ibusinternal.h"
#define IBUS_SERVICE_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_SERVICE, IBusServicePrivate))
+ ((IBusServicePrivate *)ibus_service_get_instance_private (o))
enum {
LAST_SIGNAL
@@ -133,6 +133,13 @@ static const GDBusInterfaceVTable ibus_service_interface_vtable = {
};
static IBusObjectClass *ibus_service_parent_class = NULL;
+static gint ibus_service_private_offset;
+
+static inline gpointer
+ibus_service_get_instance_private (IBusService *self)
+{
+ return (G_STRUCT_MEMBER_P (self, ibus_service_private_offset));
+}
GType
ibus_service_get_type (void)
@@ -156,6 +163,9 @@ ibus_service_get_type (void)
"IBusService",
&type_info,
0);
+ ibus_service_private_offset =
+ g_type_add_instance_private (type,
+ sizeof (IBusServicePrivate));
}
return type;
@@ -198,12 +208,20 @@ ibus_service_class_init (IBusServiceClass *class)
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (class);
- ibus_service_parent_class = IBUS_OBJECT_CLASS (g_type_class_peek_parent (class));
+ ibus_service_parent_class =
+ IBUS_OBJECT_CLASS (g_type_class_peek_parent (class));
+ if (ibus_service_private_offset) {
+ g_type_class_adjust_private_offset (class,
+ &ibus_service_private_offset);
+ }
gobject_class->constructed = ibus_service_constructed;
- gobject_class->set_property = (GObjectSetPropertyFunc) ibus_service_set_property;
- gobject_class->get_property = (GObjectGetPropertyFunc) ibus_service_get_property;
- ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_service_destroy;
+ gobject_class->set_property =
+ (GObjectSetPropertyFunc) ibus_service_set_property;
+ gobject_class->get_property =
+ (GObjectGetPropertyFunc) ibus_service_get_property;
+ ibus_object_class->destroy =
+ (IBusObjectDestroyFunc) ibus_service_destroy;
/* virtual functions */
class->service_method_call = ibus_service_service_method_call;
@@ -252,8 +270,6 @@ ibus_service_class_init (IBusServiceClass *class)
G_PARAM_STATIC_NICK |
G_PARAM_STATIC_BLURB)
);
-
- g_type_class_add_private (class, sizeof (IBusServicePrivate));
}
static void
diff --git a/src/ibusunicode.c b/src/ibusunicode.c
index aac9c135..9e6f6b2b 100644
--- a/src/ibusunicode.c
+++ b/src/ibusunicode.c
@@ -1,8 +1,8 @@
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
/* vim:set et sts=4: */
/* bus - The Input Bus
- * Copyright (C) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2018 Red Hat, Inc.
+ * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2018-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -64,13 +64,9 @@ typedef struct {
} IBusUnicodeDataLoadData;
#define IBUS_UNICODE_DATA_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
- IBUS_TYPE_UNICODE_DATA, \
- IBusUnicodeDataPrivate))
+ ((IBusUnicodeDataPrivate *)ibus_unicode_data_get_instance_private (o))
#define IBUS_UNICODE_BLOCK_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
- IBUS_TYPE_UNICODE_BLOCK, \
- IBusUnicodeBlockPrivate))
+ ((IBusUnicodeBlockPrivate *)ibus_unicode_block_get_instance_private (o))
/* functions prototype */
static void ibus_unicode_data_set_property (IBusUnicodeData *unicode,
@@ -106,8 +102,12 @@ static gint ibus_unicode_block_deserialize (IBusUnicodeBlock *block,
static gboolean ibus_unicode_block_copy (IBusUnicodeBlock *dest,
const IBusUnicodeBlock *src);
-G_DEFINE_TYPE (IBusUnicodeData, ibus_unicode_data, IBUS_TYPE_SERIALIZABLE)
-G_DEFINE_TYPE (IBusUnicodeBlock, ibus_unicode_block, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusUnicodeData,
+ ibus_unicode_data,
+ IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusUnicodeBlock,
+ ibus_unicode_block,
+ IBUS_TYPE_SERIALIZABLE)
static void
ibus_unicode_data_class_init (IBusUnicodeDataClass *class)
@@ -128,8 +128,6 @@ ibus_unicode_data_class_init (IBusUnicodeDataClass *class)
serializable_class->copy =
(IBusSerializableCopyFunc) ibus_unicode_data_copy;
- g_type_class_add_private (class, sizeof (IBusUnicodeDataPrivate));
-
/* install properties */
/**
* IBusUnicodeData:code:
@@ -690,8 +688,6 @@ ibus_unicode_block_class_init (IBusUnicodeBlockClass *class)
serializable_class->copy =
(IBusSerializableCopyFunc) ibus_unicode_block_copy;
- g_type_class_add_private (class, sizeof (IBusUnicodeBlockPrivate));
-
/* install properties */
/**
* IBusUnicodeBlock:start:
diff --git a/src/ibusxevent.c b/src/ibusxevent.c
index 287bb99b..a2ea7b57 100644
--- a/src/ibusxevent.c
+++ b/src/ibusxevent.c
@@ -1,8 +1,8 @@
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
/* vim:set et sts=4: */
/* ibus - The Input Bus
- * Copyright (C) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2018 Red Hat, Inc.
+ * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2018-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -24,13 +24,11 @@
#define IBUS_EXTENSION_EVENT_VERSION 1
#define IBUS_EXTENSION_EVENT_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
- IBUS_TYPE_EXTENSION_EVENT, \
- IBusExtensionEventPrivate))
+ ((IBusExtensionEventPrivate *)ibus_extension_event_get_instance_private (o))
#define IBUS_X_EVENT_VERSION 1
#define IBUS_X_EVENT_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_X_EVENT, IBusXEventPrivate))
+ ((IBusXEventPrivate *)ibus_x_event_get_instance_private (o))
enum {
PROP_0,
@@ -128,8 +126,12 @@ static gint ibus_x_event_deserialize (IBusXEvent *event,
static gboolean ibus_x_event_copy (IBusXEvent *dest,
const IBusXEvent *src);
-G_DEFINE_TYPE (IBusExtensionEvent, ibus_extension_event, IBUS_TYPE_SERIALIZABLE)
-G_DEFINE_TYPE (IBusXEvent, ibus_x_event, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusExtensionEvent,
+ ibus_extension_event,
+ IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusXEvent,
+ ibus_x_event,
+ IBUS_TYPE_SERIALIZABLE)
static void
ibus_extension_event_class_init (IBusExtensionEventClass *class)
@@ -228,8 +230,6 @@ ibus_extension_event_class_init (IBusExtensionEventClass *class)
"",
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
-
- g_type_class_add_private (class, sizeof (IBusExtensionEventPrivate));
}
static void
@@ -779,8 +779,6 @@ ibus_x_event_class_init (IBusXEventClass *class)
"",
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
-
- g_type_class_add_private (class, sizeof (IBusXEventPrivate));
}
static void
--
2.21.0
From 3d442dbf936d197aa11ca0a71663c2bc61696151 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Fri, 13 Sep 2019 15:59:03 +0900
Subject: [PATCH] bus: Implement GDBusAuthObserver callback
ibus uses a GDBusServer with G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS,
and doesn't set a GDBusAuthObserver, which allows anyone who can connect
to its AF_UNIX socket to authenticate and be authorized to send method calls.
It also seems to use an abstract AF_UNIX socket, which does not have
filesystem permissions, so the practical effect might be that a local
attacker can connect to another user's ibus service and make arbitrary
method calls.
BUGS=rhbz#1717958
---
bus/server.c | 89 ++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 73 insertions(+), 16 deletions(-)
diff --git a/bus/server.c b/bus/server.c
index 3a626230..2439de14 100644
--- a/bus/server.c
+++ b/bus/server.c
@@ -2,7 +2,8 @@
/* vim:set et sts=4: */
/* bus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2010 Red Hat, Inc.
+ * Copyright (C) 2011-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -69,17 +70,64 @@ _restart_server (void)
exit (-1);
}
+/**
+ * bus_allow_mechanism_cb:
+ * @observer: A #GDBusAuthObserver.
+ * @mechanism: The name of the mechanism.
+ * @user_data: always %NULL.
+ *
+ * Check if @mechanism can be used to authenticate the other peer.
+ * Returns: %TRUE if the peer's mechanism is allowed.
+ */
+static gboolean
+bus_allow_mechanism_cb (GDBusAuthObserver *observer,
+ const gchar *mechanism,
+ G_GNUC_UNUSED gpointer user_data)
+{
+ if (g_strcmp0 (mechanism, "EXTERNAL") == 0)
+ return TRUE;
+ return FALSE;
+}
+
+/**
+ * bus_authorize_authenticated_peer_cb:
+ * @observer: A #GDBusAuthObserver.
+ * @stream: A #GIOStream.
+ * @credentials: A #GCredentials.
+ * @user_data: always %NULL.
+ *
+ * Check if a peer who has already authenticated should be authorized.
+ * Returns: %TRUE if the peer's credential is authorized.
+ */
+static gboolean
+bus_authorize_authenticated_peer_cb (GDBusAuthObserver *observer,
+ GIOStream *stream,
+ GCredentials *credentials,
+ G_GNUC_UNUSED gpointer user_data)
+{
+ gboolean authorized = FALSE;
+ if (credentials) {
+ GCredentials *own_credentials = g_credentials_new ();
+ if (g_credentials_is_same_user (credentials, own_credentials, NULL))
+ authorized = TRUE;
+ g_object_unref (own_credentials);
+ }
+ return authorized;
+}
+
/**
* bus_new_connection_cb:
- * @user_data: always NULL.
- * @returns: TRUE when the function can handle the connection.
+ * @observer: A #GDBusAuthObserver.
+ * @dbus_connection: A #GDBusconnection.
+ * @user_data: always %NULL.
*
* Handle incoming connections.
+ * Returns: %TRUE when the function can handle the connection.
*/
static gboolean
-bus_new_connection_cb (GDBusServer *server,
- GDBusConnection *dbus_connection,
- gpointer user_data)
+bus_new_connection_cb (GDBusServer *server,
+ GDBusConnection *dbus_connection,
+ G_GNUC_UNUSED gpointer user_data)
{
BusConnection *connection = bus_connection_new (dbus_connection);
bus_dbus_impl_new_connection (dbus, connection);
@@ -94,9 +142,9 @@ bus_new_connection_cb (GDBusServer *server,
}
static void
-_server_connect_start_portal_cb (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
+_server_connect_start_portal_cb (GObject *source_object,
+ GAsyncResult *res,
+ G_GNUC_UNUSED gpointer user_data)
{
GVariant *result;
GError *error = NULL;
@@ -113,9 +161,9 @@ _server_connect_start_portal_cb (GObject *source_object,
}
static void
-bus_acquired_handler (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
+bus_acquired_handler (GDBusConnection *connection,
+ const gchar *name,
+ G_GNUC_UNUSED gpointer user_data)
{
g_dbus_connection_call (connection,
IBUS_SERVICE_PORTAL,
@@ -136,14 +184,17 @@ void
bus_server_init (void)
{
GError *error = NULL;
+ GDBusServerFlags flags = G_DBUS_SERVER_FLAGS_NONE;
+ gchar *guid;
+ GDBusAuthObserver *observer;
dbus = bus_dbus_impl_get_default ();
ibus = bus_ibus_impl_get_default ();
bus_dbus_impl_register_object (dbus, (IBusService *)ibus);
/* init server */
- GDBusServerFlags flags = G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS;
- gchar *guid = g_dbus_generate_guid ();
+ guid = g_dbus_generate_guid ();
+ observer = g_dbus_auth_observer_new ();
if (!g_str_has_prefix (g_address, "unix:tmpdir=") &&
!g_str_has_prefix (g_address, "unix:path=")) {
g_error ("Your socket address does not have the format unix:tmpdir=$DIR "
@@ -152,7 +203,7 @@ bus_server_init (void)
server = g_dbus_server_new_sync (
g_address, /* the place where the socket file lives, e.g. /tmp, abstract namespace, etc. */
flags, guid,
- NULL /* observer */,
+ observer,
NULL /* cancellable */,
&error);
if (server == NULL) {
@@ -162,7 +213,13 @@ bus_server_init (void)
}
g_free (guid);
- g_signal_connect (server, "new-connection", G_CALLBACK (bus_new_connection_cb), NULL);
+ g_signal_connect (observer, "allow-mechanism",
+ G_CALLBACK (bus_allow_mechanism_cb), NULL);
+ g_signal_connect (observer, "authorize-authenticated-peer",
+ G_CALLBACK (bus_authorize_authenticated_peer_cb), NULL);
+ g_object_unref (observer);
+ g_signal_connect (server, "new-connection",
+ G_CALLBACK (bus_new_connection_cb), NULL);
g_dbus_server_start (server);
--
2.21.0
From a141a14102da038e3f35557ec42e14e322cfdff1 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Fri, 13 Sep 2019 20:19:36 +0900
Subject: [PATCH] bus: Use XDG_RUNTIME_DIR for Unix socket directory
g_dbus_server_new_sync() is failed with address "unix:tmpdir=/tmp/ibus"
in BSD systems because BSD systems do not support abstract socket files
and use the real files but no directory "/tmp/ibus". Now the default
directory will be an unique "unix:tmpdir=$XDG_RUNTIME_DIR/ibus" by user
in Linux and "unix:tmpdir=/tmp" in BSD and mkdir() runs with the directory
mode 0700 not to modify by malicious users.
BUG=https://github.com/ibus/ibus/issues/2116
---
bus/global.c | 6 ++--
bus/server.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++-----
configure.ac | 25 +++++++++++++
3 files changed, 120 insertions(+), 10 deletions(-)
diff --git a/bus/global.c b/bus/global.c
index 2ba8b2a7..8758d923 100644
--- a/bus/global.c
+++ b/bus/global.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* ibus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2008-2010 Red Hat, Inc.
+ * Copyright (C) 2008-2019 Red Hat, Inc.
* Copyright (c) 2012 Google, Inc.
*
* This library is free software; you can redistribute it and/or
@@ -21,10 +21,12 @@
* USA
*/
+#include <config.h>
+
#include "global.h"
gchar **g_argv = NULL;
-gchar *g_address = "unix:tmpdir=/tmp/ibus";
+gchar *g_address = IBUS_SOCKET_DIR;
gchar *g_cache = "auto";
gboolean g_mempro = FALSE;
gboolean g_verbose = FALSE;
diff --git a/bus/server.c b/bus/server.c
index 2439de14..d9c30e44 100644
--- a/bus/server.c
+++ b/bus/server.c
@@ -22,6 +22,8 @@
*/
#include "server.h"
+#include <errno.h>
+#include <glib/gstdio.h>
#include <gio/gio.h>
#include <stdlib.h>
#include <string.h>
@@ -180,28 +182,102 @@ bus_acquired_handler (GDBusConnection *connection,
NULL);
}
+static gchar *
+_bus_extract_address (void)
+{
+ gchar *socket_address = g_strdup (g_address);
+ gchar *p;
+
+#define IF_REPLACE_VARIABLE_WITH_FUNC(variable, func, format) \
+ if ((p = g_strstr_len (socket_address, -1, (variable)))) { \
+ gchar *sub1 = g_strndup (socket_address, p - socket_address); \
+ gchar *sub2 = g_strdup (p + strlen (variable)); \
+ gchar *tmp = g_strdup_printf ("%s" format "%s", \
+ sub1, (func) (), sub2); \
+ g_free (sub1); \
+ g_free (sub2); \
+ g_free (socket_address); \
+ socket_address = tmp; \
+ }
+
+ IF_REPLACE_VARIABLE_WITH_FUNC ("$XDG_RUNTIME_DIR",
+ g_get_user_runtime_dir,
+ "%s")
+ else
+ IF_REPLACE_VARIABLE_WITH_FUNC ("$XDG_CACHE_HOME",
+ g_get_user_cache_dir,
+ "%s")
+ else
+ IF_REPLACE_VARIABLE_WITH_FUNC ("$UID", getuid, "%d")
+
+#undef IF_REPLACE_VARIABLE_WITH_FUNC
+
+ return socket_address;
+}
+
void
bus_server_init (void)
{
- GError *error = NULL;
+#define IBUS_UNIX_TMPDIR "unix:tmpdir="
+#define IBUS_UNIX_PATH "unix:path="
+#define IBUS_UNIX_ABSTRACT "unix:abstract="
+#define IBUS_UNIX_DIR "unix:dir="
+
+ gchar *socket_address;
GDBusServerFlags flags = G_DBUS_SERVER_FLAGS_NONE;
gchar *guid;
GDBusAuthObserver *observer;
+ GError *error = NULL;
+ gchar *unix_dir = NULL;
dbus = bus_dbus_impl_get_default ();
ibus = bus_ibus_impl_get_default ();
bus_dbus_impl_register_object (dbus, (IBusService *)ibus);
/* init server */
+ socket_address = _bus_extract_address ();
+
+#define IF_GET_UNIX_DIR(prefix) \
+ if (g_str_has_prefix (socket_address, (prefix))) { \
+ unix_dir = g_strdup (socket_address + strlen (prefix)); \
+ }
+
+ IF_GET_UNIX_DIR (IBUS_UNIX_TMPDIR)
+ else
+ IF_GET_UNIX_DIR (IBUS_UNIX_PATH)
+ else
+ IF_GET_UNIX_DIR (IBUS_UNIX_ABSTRACT)
+ else
+ IF_GET_UNIX_DIR (IBUS_UNIX_DIR)
+ else {
+ g_error ("Your socket address \"%s\" does not correspond with "
+ "one of the following formats; "
+ IBUS_UNIX_TMPDIR "DIR, " IBUS_UNIX_PATH "FILE, "
+ IBUS_UNIX_ABSTRACT "FILE, " IBUS_UNIX_DIR "DIR.",
+ socket_address);
+ }
+ if (!g_file_test (unix_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
+ /* Require mkdir for BSD system. */
+ if (g_mkdir_with_parents (unix_dir, 0) != 0) {
+ g_error ("mkdir is failed in: %s: %s",
+ unix_dir, g_strerror (errno));
+ }
+ /* The mode 0700 can eliminate malicious users change the mode.
+ * `chmod` runs for the last directory only not to change the modes
+ * of the parent directories. E.g. "/tmp/ibus".
+ */
+ if (g_chmod (unix_dir, 0700) != 0) {
+ g_error ("chmod(700) is failed in: %s: %s",
+ unix_dir, g_strerror (errno));
+ }
+ }
+ g_free (unix_dir);
guid = g_dbus_generate_guid ();
observer = g_dbus_auth_observer_new ();
- if (!g_str_has_prefix (g_address, "unix:tmpdir=") &&
- !g_str_has_prefix (g_address, "unix:path=")) {
- g_error ("Your socket address does not have the format unix:tmpdir=$DIR "
- "or unix:path=$FILE; %s", g_address);
- }
server = g_dbus_server_new_sync (
- g_address, /* the place where the socket file lives, e.g. /tmp, abstract namespace, etc. */
+ /* the place where the socket file lives, e.g. /tmp,
+ * abstract namespace, etc. */
+ socket_address,
flags, guid,
observer,
NULL /* cancellable */,
@@ -209,8 +285,9 @@ bus_server_init (void)
if (server == NULL) {
g_error ("g_dbus_server_new_sync() is failed with address %s "
"and guid %s: %s",
- g_address, guid, error->message);
+ socket_address, guid, error->message);
}
+ g_free (socket_address);
g_free (guid);
g_signal_connect (observer, "allow-mechanism",
@@ -235,6 +312,12 @@ bus_server_init (void)
G_BUS_NAME_OWNER_FLAGS_NONE,
bus_acquired_handler,
NULL, NULL, NULL, NULL);
+
+#undef IF_GET_UNIX_DIR
+#undef IBUS_UNIX_TMPDIR
+#undef IBUS_UNIX_PATH
+#undef IBUS_UNIX_ABSTRACT
+#undef IBUS_UNIX_DIR
}
const gchar *
diff --git a/configure.ac b/configure.ac
index c47e23dc..0c1ee40e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -702,6 +702,30 @@ the UCD files from https://www.unicode.org/Public/UNIDATA/)
enable_unicode_dict="yes (enabled, use --disable-unicode-dict to disable)"
fi
+AC_ARG_WITH(socket-dir,
+ AS_HELP_STRING([--with-socket-dir[=DIR]],
+ [Set the default socket directory to connect ibus-daemon with D-Bus
+ connections (default: "$XDG_RUNTIME_DIR/ibus").
+ The best practice of the socket directory would be unique per user
+ not to modify by malicious users but XDG_RUNTIME_DIR is not integrated
+ in BSD systems and the BSD's default is "/tmp".
+ "$XDG_RUMTIME_DIR", "$XDG_CACHE_HOME", "$UID" are extracted by
+ ibus-daemon.
+ ibus-daemon also runs mkdir for the socket directory since BSD
+ systems do not support abstract socket paths.
+ The socket path on a NFS mount would not be a good idea likes
+ "/home/$USER" because the directory is not sometimes accessible
+ with the network condition.]),
+ [IBUS_SOCKET_DIR=$with_socket_dir],
+ [case $host in
+ *linux*) IBUS_SOCKET_DIR='unix:tmpdir=$XDG_RUNTIME_DIR/ibus';;
+ *) IBUS_SOCKET_DIR='unix:tmpdir=/tmp';;
+ esac]
+
+)
+AC_DEFINE_UNQUOTED(IBUS_SOCKET_DIR, "$IBUS_SOCKET_DIR",
+ [The default socket directory to connect ibus-daemon.])
+
# Check iso-codes.
PKG_CHECK_MODULES(ISOCODES, [
iso-codes
@@ -793,6 +817,7 @@ Build options:
CLDR annotation directory $EMOJI_ANNOTATION_DIR
Enable Unicode dict $enable_unicode_dict
UCD directory $UCD_DIR
+ Socket directory "$IBUS_SOCKET_DIR"
Run test cases $enable_tests
Install tests $enable_install_tests
])
--
2.21.0
From 773420fad23078ceef83e8ae84bba4e139d0bea3 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Thu, 19 Sep 2019 17:09:46 +0900
Subject: [PATCH] src: Fix to allocate compose output buffer with more than two
chars
If the compose output chars are more than two, IBusCompose calls
g_renew() but the size is not enough to insert '\0'.
BUG=https://github.com/ibus/ibus/issues/2123
---
src/ibuscomposetable.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
index 5fd37f10..dd9d31d4 100644
--- a/src/ibuscomposetable.c
+++ b/src/ibuscomposetable.c
@@ -148,7 +148,7 @@ parse_compose_value (IBusComposeData *compose_data,
} else {
compose_data->values = g_renew (gunichar,
compose_data->values,
- n_uchars + 1);
+ n_uchars + 2);
}
compose_data->values[n_uchars++] = *up;
}
--
2.21.0
From 5742e1b399e5d50f34f35b1cda74e548b95554da Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 2 Oct 2019 16:41:27 +0900
Subject: [PATCH] Revert XDG_RUNTIME_DIR to XDG_CONFIG_HOME
Some users failed to run ibus-daemon with XDG_RUNTIME_DIR because
the directory is not created by `su` command.
Now the IBus socket files will be generated in XDG_CACHE_HOME.
BUG=https://github.com/ibus/ibus/issues/2135
---
configure.ac | 6 ++++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index 0c1ee40e..84589be0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -705,10 +705,12 @@ fi
AC_ARG_WITH(socket-dir,
AS_HELP_STRING([--with-socket-dir[=DIR]],
[Set the default socket directory to connect ibus-daemon with D-Bus
- connections (default: "$XDG_RUNTIME_DIR/ibus").
+ connections (default: "$XDG_CACHE_HOME/ibus").
The best practice of the socket directory would be unique per user
not to modify by malicious users but XDG_RUNTIME_DIR is not integrated
in BSD systems and the BSD's default is "/tmp".
+ XDG_RUMTIME_DIR is not useful now because XDG_RUMTIME_DIR is available
+ by login but not `su` command but ibus-daemon can be run with su.
"$XDG_RUMTIME_DIR", "$XDG_CACHE_HOME", "$UID" are extracted by
ibus-daemon.
ibus-daemon also runs mkdir for the socket directory since BSD
@@ -718,7 +720,7 @@ AC_ARG_WITH(socket-dir,
with the network condition.]),
[IBUS_SOCKET_DIR=$with_socket_dir],
[case $host in
- *linux*) IBUS_SOCKET_DIR='unix:tmpdir=$XDG_RUNTIME_DIR/ibus';;
+ *linux*) IBUS_SOCKET_DIR='unix:tmpdir=$XDG_CACHE_HOME/ibus';;
*) IBUS_SOCKET_DIR='unix:tmpdir=/tmp';;
esac]
--
2.21.0
From 35863d81d15e3d3463cd5dafd0473afb193c57e3 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 30 Oct 2019 17:29:25 +0900
Subject: [PATCH] Fix deprecated APIs
- Fix deprecated gtk_misc_set_padding(), gtk_widget_set_margin_left(),
gtk_widget_set_margin_right() in emojilang.py, enginedialog.py,
setup.ui, candidatearea.vala, candidatepanel.vala, switcher.vala
since GTK 3.12
- Fix g_new0() argument 1 range [18446744071562067968, 18446744073709551615]
exceeds maximum object size 9223372036854775807
[-Walloc-size-larger-than=] by adding g_assert() in ibuscomposetable.c
- Fix gdk_keymap_get_default() with gdk_keymap_get_for_display() in
bindingcommon.vala
- Fix string.utf8_offset() with string.next_char() in emojier.vala
- Fix Posix.SIGUSR1 with Posix.Signal.USR1 in panel.vala
---
bus/ibusimpl.c | 1 +
configure.ac | 3 ++-
setup/emojilang.py | 14 +++++++-------
setup/enginedialog.py | 18 +++++++++---------
setup/setup.ui | 34 +++++++++++++++++-----------------
src/ibuscomposetable.c | 1 +
ui/gtk3/bindingcommon.vala | 6 +++---
ui/gtk3/candidatearea.vala | 9 +++++----
ui/gtk3/candidatepanel.vala | 10 +++++-----
ui/gtk3/emojier.vala | 4 +++-
ui/gtk3/panel.vala | 4 ++--
ui/gtk3/switcher.vala | 9 +++++----
12 files changed, 60 insertions(+), 53 deletions(-)
diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
index 39b16139..85761d30 100644
--- a/bus/ibusimpl.c
+++ b/bus/ibusimpl.c
@@ -2180,6 +2180,7 @@ bus_ibus_impl_registry_destroy (BusIBusImpl *ibus)
g_clear_pointer (&ibus->engine_table, g_hash_table_destroy);
+ /* g_clear_pointer() does not set the cast. */
ibus_object_destroy (IBUS_OBJECT (ibus->registry));
ibus->registry = NULL;
diff --git a/configure.ac b/configure.ac
index 84589be0..ab74a380 100644
--- a/configure.ac
+++ b/configure.ac
@@ -53,6 +53,7 @@ m4_define([ibus_binary_version],
# Required versions of other packages.
m4_define([glib_required_version], [2.46.0])
+m4_define([gtk3_required_version], [3.12.0])
# VALA_TARGET_GLIB_VERSION is used by valac --ccode --target-glib .
# VALA_TARGET_GLIB_VERSION and glib_required_version will be different
@@ -238,7 +239,7 @@ fi
if test x"$enable_gtk3" = x"yes"; then
# check for gtk3
PKG_CHECK_MODULES(GTK3, [
- gtk+-3.0
+ gtk+-3.0 >= gtk3_required_version
])
PKG_CHECK_EXISTS([gdk-wayland-3.0],
[enable_gdk3_wayland=yes],
diff --git a/setup/emojilang.py b/setup/emojilang.py
index 8250589d..58757d86 100644
--- a/setup/emojilang.py
+++ b/setup/emojilang.py
@@ -3,7 +3,7 @@
#
# ibus - The Input Bus
#
-# Copyright (c) 2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2017-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
# Copyright (c) 2017 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or
@@ -83,8 +83,8 @@ class EmojiLangChooser(Gtk.Dialog):
hscrollbar_policy = Gtk.PolicyType.NEVER,
vscrollbar_policy = Gtk.PolicyType.NEVER,
shadow_type = Gtk.ShadowType.IN,
- margin_left = 6,
- margin_right = 6,
+ margin_start = 6,
+ margin_end = 6,
margin_top = 6,
margin_bottom = 6)
self.vbox.add(self.__scrolled)
@@ -192,8 +192,8 @@ class EmojiLangChooser(Gtk.Dialog):
label = Gtk.Label(label = text)
label.set_halign(alignment)
label.set_valign(Gtk.Align.CENTER)
- label.set_margin_left(20)
- label.set_margin_right(20)
+ label.set_margin_start(20)
+ label.set_margin_end(20)
label.set_margin_top(6)
label.set_margin_bottom(6)
hbox.pack_start(label, True, True, 0)
@@ -235,8 +235,8 @@ class EmojiLangChooser(Gtk.Dialog):
row.set_tooltip_text(_("More…"))
arrow = Gtk.Image.new_from_icon_name('view-more-symbolic',
Gtk.IconSize.MENU)
- arrow.set_margin_left(20)
- arrow.set_margin_right(20)
+ arrow.set_margin_start(20)
+ arrow.set_margin_end(20)
arrow.set_margin_top(6)
arrow.set_margin_bottom(6)
arrow.set_halign(Gtk.Align.CENTER)
diff --git a/setup/enginedialog.py b/setup/enginedialog.py
index 2c472deb..72deada8 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 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
# Copyright (c) 2013-2015 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or
@@ -70,8 +70,8 @@ class EngineDialog(Gtk.Dialog):
hscrollbar_policy = Gtk.PolicyType.NEVER,
vscrollbar_policy = Gtk.PolicyType.NEVER,
shadow_type = Gtk.ShadowType.IN,
- margin_left = 6,
- margin_right = 6,
+ margin_start = 6,
+ margin_end = 6,
margin_top = 6,
margin_bottom = 6)
self.vbox.add(self.__scrolled)
@@ -94,8 +94,8 @@ class EngineDialog(Gtk.Dialog):
self.__filter_timeout_id = 0
self.__filter_word = None
self.__filter_entry = Gtk.SearchEntry(hexpand = True,
- margin_left = 6,
- margin_right = 6,
+ margin_start = 6,
+ margin_end = 6,
margin_top = 6,
margin_bottom = 6)
self.__filter_entry.set_no_show_all(True)
@@ -164,8 +164,8 @@ class EngineDialog(Gtk.Dialog):
label = Gtk.Label(label = text)
label.set_halign(alignment)
label.set_valign(Gtk.Align.CENTER)
- label.set_margin_left(20)
- label.set_margin_right(20)
+ label.set_margin_start(20)
+ label.set_margin_end(20)
label.set_margin_top(6)
label.set_margin_bottom(6)
hbox.pack_start(label, True, True, 0)
@@ -205,8 +205,8 @@ class EngineDialog(Gtk.Dialog):
row.set_tooltip_text(_("More…"))
arrow = Gtk.Image.new_from_icon_name('view-more-symbolic',
Gtk.IconSize.MENU)
- arrow.set_margin_left(20)
- arrow.set_margin_right(20)
+ arrow.set_margin_start(20)
+ arrow.set_margin_end(20)
arrow.set_margin_top(6)
arrow.set_margin_bottom(6)
arrow.set_halign(Gtk.Align.CENTER)
diff --git a/setup/setup.ui b/setup/setup.ui
index 9d9d7ee9..56453054 100644
--- a/setup/setup.ui
+++ b/setup/setup.ui
@@ -90,8 +90,8 @@
<property name="spacing">18</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
- <property name="margin_left">12</property>
- <property name="margin_right">12</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
<child>
<object class="GtkFrame" id="frame3">
<property name="visible">True</property>
@@ -105,7 +105,7 @@
<property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<property name="margin_top">6</property>
- <property name="margin_left">12</property>
+ <property name="margin_start">12</property>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
@@ -366,7 +366,7 @@
<property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<property name="margin_top">6</property>
- <property name="margin_left">12</property>
+ <property name="margin_start">12</property>
<child>
<object class="GtkLabel" id="label6">
<property name="visible">True</property>
@@ -589,8 +589,8 @@
<property name="can_focus">False</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
- <property name="margin_left">12</property>
- <property name="margin_right">12</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
<child>
<object class="GtkBox" id="hbox1">
<property name="orientation">horizontal</property>
@@ -658,7 +658,7 @@
<property name="can_focus">False</property>
<property name="spacing">5</property>
<property name="layout_style">start</property>
- <property name="margin_left">12</property>
+ <property name="margin_start">12</property>
<child>
<object class="GtkButton" id="button_engine_add">
<property name="label" translatable="yes">_Add</property>
@@ -811,7 +811,7 @@
<property name="max_width_chars">74</property>
<property name="label" translatable="yes">&lt;small&gt;&lt;i&gt;The active input method can be switched around from the selected ones in the above list by pressing the keyboard shortcut keys or clicking the panel icon.&lt;/i&gt;&lt;/small&gt;</property>
<property name="use_markup">True</property>
- <!-- property name="margin_left">0</property -->
+ <!-- property name="margin_start">0</property -->
</object>
<packing>
<property name="expand">True</property>
@@ -850,8 +850,8 @@
<property name="spacing">18</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
- <property name="margin_left">12</property>
- <property name="margin_right">12</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
<child>
<object class="GtkFrame" id="frame_emoji1">
<property name="visible">True</property>
@@ -865,7 +865,7 @@
<property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<property name="margin_top">6</property>
- <property name="margin_left">12</property>
+ <property name="margin_start">12</property>
<child>
<object class="GtkLabel" id="label_emoji1">
<property name="visible">True</property>
@@ -1004,7 +1004,7 @@
<property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<property name="margin_top">6</property>
- <property name="margin_left">12</property>
+ <property name="margin_start">12</property>
<property name="row_homogeneous">false</property>
<child>
<object class="GtkLabel" id="label_emoji_font">
@@ -1187,8 +1187,8 @@
<property name="can_focus">False</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
- <property name="margin_left">12</property>
- <property name="margin_right">12</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
<child>
<object class="GtkFrame" id="frame2">
<property name="visible">True</property>
@@ -1202,7 +1202,7 @@
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="margin_top">6</property>
- <property name="margin_left">24</property>
+ <property name="margin_start">24</property>
<child>
<object class="GtkCheckButton" id="checkbutton_use_sys_layout">
<property name="label" translatable="yes">Use system keyboard layout</property>
@@ -1251,7 +1251,7 @@
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="margin_top">6</property>
- <property name="margin_left">24</property>
+ <property name="margin_start">24</property>
<child>
<object class="GtkCheckButton" id="checkbutton_use_global_engine">
<property name="label" translatable="yes">Share the same input method among all applications</property>
@@ -1348,7 +1348,7 @@ Homepage: https://github.com/ibus/ibus/wiki
<property name="halign">start</property>
<property name="draw_indicator">True</property>
<property name="margin_top">6</property>
- <property name="margin_left">12</property>
+ <property name="margin_start">12</property>
</object>
</child>
<child type="label">
diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
index dd9d31d4..e4e3a7cd 100644
--- a/src/ibuscomposetable.c
+++ b/src/ibuscomposetable.c
@@ -1058,6 +1058,7 @@ ibus_compose_table_list_add_array (GSList *compose_tables,
int i;
guint16 *ibus_compose_seqs = NULL;
+ g_assert (length >= 0);
g_return_val_if_fail (data != NULL, compose_tables);
g_return_val_if_fail (max_seq_len <= IBUS_MAX_COMPOSE_LEN, compose_tables);
diff --git a/ui/gtk3/bindingcommon.vala b/ui/gtk3/bindingcommon.vala
index 4171f29d..150d4c39 100644
--- a/ui/gtk3/bindingcommon.vala
+++ b/ui/gtk3/bindingcommon.vala
@@ -3,7 +3,7 @@
* ibus - The Input Bus
*
* Copyright(c) 2018 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright(c) 2018 Takao Fujwiara <takao.fujiwara1@gmail.com>
+ * Copyright(c) 2018-2019 Takao Fujwiara <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
@@ -75,8 +75,8 @@ class BindingCommon {
// workaround a bug in gdk vapi vala > 0.18
// https://bugzilla.gnome.org/show_bug.cgi?id=677559
#if VALA_0_18
- Gdk.Keymap.get_default().map_virtual_modifiers(
- ref switch_modifiers);
+ Gdk.Keymap.get_for_display(Gdk.Display.get_default()
+ ).map_virtual_modifiers(ref switch_modifiers);
#else
if ((switch_modifiers & Gdk.ModifierType.SUPER_MASK) != 0)
switch_modifiers |= Gdk.ModifierType.MOD4_MASK;
diff --git a/ui/gtk3/candidatearea.vala b/ui/gtk3/candidatearea.vala
index 781ecd1e..b22ab5da 100644
--- a/ui/gtk3/candidatearea.vala
+++ b/ui/gtk3/candidatearea.vala
@@ -3,7 +3,7 @@
* ibus - The Input Bus
*
* Copyright(c) 2011-2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright(c) 2015-2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright(c) 2015-2019 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
@@ -215,9 +215,10 @@ class CandidateArea : Gtk.Box {
candidate.show();
m_candidates += candidate;
- /* Use Gtk.Widget.set_margin_start() since gtk 3.12 */
- label.set_padding(8, 0);
- candidate.set_padding(8, 0);
+ label.set_margin_start (8);
+ label.set_margin_end (8);
+ candidate.set_margin_start (8);
+ candidate.set_margin_end (8);
// Make a copy of i to workaround a bug in vala.
// https://bugzilla.gnome.org/show_bug.cgi?id=628336
diff --git a/ui/gtk3/candidatepanel.vala b/ui/gtk3/candidatepanel.vala
index d404c659..8994cdb9 100644
--- a/ui/gtk3/candidatepanel.vala
+++ b/ui/gtk3/candidatepanel.vala
@@ -3,7 +3,7 @@
* ibus - The Input Bus
*
* Copyright(c) 2011-2015 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright(c) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright(c) 2015-2019 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
@@ -242,16 +242,16 @@ public class CandidatePanel : Gtk.Box{
m_preedit_label.set_size_request(20, -1);
m_preedit_label.set_halign(Gtk.Align.START);
m_preedit_label.set_valign(Gtk.Align.CENTER);
- /* Use Gtk.Widget.set_margin_start() since gtk 3.12 */
- m_preedit_label.set_padding(8, 0);
+ m_preedit_label.set_margin_start(8);
+ m_preedit_label.set_margin_end(8);
m_preedit_label.set_no_show_all(true);
m_aux_label = new Gtk.Label(null);
m_aux_label.set_size_request(20, -1);
m_aux_label.set_halign(Gtk.Align.START);
m_aux_label.set_valign(Gtk.Align.CENTER);
- /* Use Gtk.Widget.set_margin_start() since gtk 3.12 */
- m_aux_label.set_padding(8, 0);
+ m_aux_label.set_margin_start(8);
+ m_aux_label.set_margin_end(8);
m_aux_label.set_no_show_all(true);
m_candidate_area = new CandidateArea(m_vertical_panel_system);
diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala
index fc15cffe..4e52769c 100644
--- a/ui/gtk3/emojier.vala
+++ b/ui/gtk3/emojier.vala
@@ -2147,11 +2147,13 @@ public class IBusEmojier : Gtk.ApplicationWindow {
ncandidates));
int char_count = text.text.char_count();
int start_index = -1;
+ unowned string title = text.text;
for (int i = 0; i < char_count; i++) {
- if (text.text.utf8_offset(i).has_prefix(language)) {
+ if (title.has_prefix(language)) {
start_index = i;
break;
}
+ title = title.next_char();
}
if (start_index >= 0) {
var attr = new IBus.Attribute(
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
index 2054658e..680c86ed 100644
--- a/ui/gtk3/panel.vala
+++ b/ui/gtk3/panel.vala
@@ -1053,7 +1053,7 @@ class Panel : IBus.PanelService {
private void show_setup_dialog() {
if (m_setup_pid != 0) {
- if (Posix.kill(m_setup_pid, Posix.SIGUSR1) == 0)
+ if (Posix.kill(m_setup_pid, Posix.Signal.USR1) == 0)
return;
m_setup_pid = 0;
}
@@ -1087,7 +1087,7 @@ class Panel : IBus.PanelService {
string copyright =
"Copyright © 2007-2015 Peng Huang\n" +
- "Copyright © 2015 Takao Fujiwara\n" +
+ "Copyright © 2015-2019 Takao Fujiwara\n" +
"Copyright © 2007-2015 Red Hat, Inc.\n";
m_about_dialog.set_copyright(copyright);
diff --git a/ui/gtk3/switcher.vala b/ui/gtk3/switcher.vala
index 0de44e98..a4529c88 100644
--- a/ui/gtk3/switcher.vala
+++ b/ui/gtk3/switcher.vala
@@ -3,7 +3,7 @@
* ibus - The Input Bus
*
* Copyright(c) 2011-2016 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright(c) 2015-2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright(c) 2015-2019 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
@@ -125,9 +125,10 @@ class Switcher : Gtk.Window {
Atk.Object obj = m_label.get_accessible();
obj.set_role (Atk.Role.STATUSBAR);
- /* Use Gtk.Widget.set_margin_start() and
- * Gtk.Widget.set_margin_top() since gtk 3.12 */
- m_label.set_padding(3, 3);
+ m_label.set_margin_start(3);
+ m_label.set_margin_end(3);
+ m_label.set_margin_top(3);
+ m_label.set_margin_bottom(3);
vbox.pack_end(m_label, false, false, 0);
grab_focus();
--
2.21.0
From efeb7b9689126e4f05bd1e10441cdc4a3720ff1c Mon Sep 17 00:00:00 2001
From: Robert Hoffmann <externer.dl.hoffmann@muenchen.de>
Date: Fri, 1 Nov 2019 21:55:13 +0900
Subject: [PATCH] bus: Fix restart crash with inotify read()
Do not close inotify desciptors when restarting the server. This
may lead to crashes in glib.
Fixes crash in libglib/libgio with
GLib-GIO-ERROR : inotify read(): Bad file descriptor
See also src/tests/ibus-bus.c: start_exit_async():
/* When `./runtest ibus-bus` runs, ibus-daemon sometimes failed to
* restart because closing a file descriptor was failed in
* bus/server.c:_restart_server() with a following error:
* "inotify read(): Bad file descriptor"
Test plan:
Run
$ ibus restart
several times. Without the patch ibus-daemon will crash occasionally.
BUG=https://github.com/ibus/ibus/pull/2148
---
bus/server.c | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/bus/server.c b/bus/server.c
index d9c30e44..a7554a88 100644
--- a/bus/server.c
+++ b/bus/server.c
@@ -26,6 +26,8 @@
#include <glib/gstdio.h>
#include <gio/gio.h>
#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
#include <string.h>
#include "dbusimpl.h"
@@ -45,16 +47,33 @@ _restart_server (void)
{
gchar *exe;
gint fd;
+ ssize_t r;
+ int MAXSIZE = 0xFFF;
+ char proclnk[MAXSIZE];
+ char filename[MAXSIZE];
- exe = g_strdup_printf ("/proc/%d/exe", getpid ());
- exe = g_file_read_link (exe, NULL);
+ exe = g_file_read_link ("/proc/self/exe", NULL);
if (exe == NULL)
- exe = BINDIR "/ibus-daemon";
+ exe = g_strdup (BINDIR "/ibus-daemon");
/* close all fds except stdin, stdout, stderr */
for (fd = 3; fd <= sysconf (_SC_OPEN_MAX); fd ++) {
- close (fd);
+ errno = 0;
+ /* only close valid fds */
+ if (fcntl (fd, F_GETFD) != -1 || errno != EBADF) {
+ g_sprintf (proclnk, "/proc/self/fd/%d", fd);
+ r = readlink (proclnk, filename, MAXSIZE);
+ if (r < 0) {
+ continue;
+ }
+ filename[r] = '\0';
+
+ /* Do not close 'anon_inode:inotify' fds, that may crash in glib */
+ if (g_strcmp0 (filename, "anon_inode:inotify") != 0) {
+ close (fd);
+ }
+ }
}
_restart = FALSE;
@@ -69,6 +88,7 @@ _restart_server (void)
execv (exe, g_argv);
}
g_warning ("execv %s failed!", g_argv[0]);
+ g_free (exe);
exit (-1);
}
--
2.21.0
From 26a8105b7003953e56bf04426ee89a93482a45c5 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Sun, 10 Nov 2019 09:53:27 +0900
Subject: [PATCH] ui/gtk3: Fix to exit `ibus emoji` with Escape key
When Escape key is pressed, the current ibus-ui-emojier should exit
although another daemon one is alive.
`ibus emoji` was used in Wayland desktop as a workaround but now
IBus emoji functions are moved to the engine's pre-edit and the same
function is available with Ctrl-Sfhit-e and space key so this problem
would not be so visible.
BUG=rhbz#1658187
---
ui/gtk3/emojier.vala | 5 ++--
ui/gtk3/emojierapp.vala | 63 +++++++++++++++++++++++++++++------------
2 files changed, 48 insertions(+), 20 deletions(-)
diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala
index 4e52769c..13bacebd 100644
--- a/ui/gtk3/emojier.vala
+++ b/ui/gtk3/emojier.vala
@@ -320,6 +320,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
public signal void candidate_clicked(uint index, uint button, uint state);
public signal void commit_text(string text);
+ public signal void cancel();
public IBusEmojier() {
GLib.Object(
@@ -1789,8 +1790,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
show_emoji_variants(emojis);
return true;
}
- if (m_input_context_path != "")
- m_result = text;
+ m_result = text;
if (need_commit_signal)
commit_text(text);
return false;
@@ -1897,6 +1897,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
// PageUp/PageDown.
remove_all_children();
}
+ cancel();
return false;
}
diff --git a/ui/gtk3/emojierapp.vala b/ui/gtk3/emojierapp.vala
index e8331989..783c611c 100644
--- a/ui/gtk3/emojierapp.vala
+++ b/ui/gtk3/emojierapp.vala
@@ -3,6 +3,7 @@
* ibus - The Input Bus
*
* Copyright (c) 2017 Peng Wu <alexepico@gmail.com>
+ * Copyright (c) 2017-2019 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
@@ -40,6 +41,33 @@ public class EmojiApplication : Gtk.Application {
}
+ private void save_selected_string(string? selected_string,
+ bool cancelled) {
+ if (cancelled) {
+ m_command_line.print("%s\n", _("Canceled to choose an emoji."));
+ return;
+ }
+ GLib.return_if_fail(selected_string != null);
+ Gtk.Clipboard clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD);
+ clipboard.set_text(selected_string, -1);
+ clipboard.store();
+
+ var emojier_favorites = m_settings_emoji.get_strv("favorites");
+ bool has_favorite = false;
+ foreach (unowned string favorite in emojier_favorites) {
+ if (favorite == selected_string) {
+ has_favorite = true;
+ break;
+ }
+ }
+ if (!has_favorite) {
+ emojier_favorites += selected_string;
+ m_settings_emoji.set_strv("favorites", emojier_favorites);
+ }
+ m_command_line.print("%s\n", _("Copied an emoji to your clipboard."));
+ }
+
+
private void show_dialog(ApplicationCommandLine command_line) {
m_command_line = command_line;
m_emojier.reset();
@@ -55,7 +83,7 @@ public class EmojiApplication : Gtk.Application {
return;
if (button == IBusEmojier.BUTTON_CLOSE_BUTTON) {
m_emojier.hide();
- m_command_line.print("%s\n", _("Canceled to choose an emoji."));
+ save_selected_string(null, true);
m_command_line = null;
return;
}
@@ -74,23 +102,7 @@ public class EmojiApplication : Gtk.Application {
}
string emoji = m_emojier.get_current_candidate();
m_emojier.hide();
- Gtk.Clipboard clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD);
- clipboard.set_text(emoji, -1);
- clipboard.store();
-
- var emojier_favorites = m_settings_emoji.get_strv("favorites");
- bool has_favorite = false;
- foreach (unowned string favorite in emojier_favorites) {
- if (favorite == emoji) {
- has_favorite = true;
- break;
- }
- }
- if (!has_favorite) {
- emojier_favorites += emoji;
- m_settings_emoji.set_strv("favorites", emojier_favorites);
- }
- m_command_line.print("%s\n", _("Copied an emoji to your clipboard."));
+ save_selected_string(emoji, false);
m_command_line = null;
}
@@ -202,6 +214,21 @@ public class EmojiApplication : Gtk.Application {
m_emojier.candidate_clicked.connect((i, b, s) => {
candidate_clicked_lookup_table(i, b, s);
});
+ m_emojier.cancel.connect(() => {
+ if (m_command_line == null)
+ return;
+ m_emojier.hide();
+ save_selected_string(null, true);
+ m_command_line = null;
+ });
+ m_emojier.commit_text.connect(() => {
+ if (m_command_line == null)
+ return;
+ m_emojier.hide();
+ string selected_string = m_emojier.get_selected_string();
+ save_selected_string(selected_string, false);
+ m_command_line = null;
+ });
}
activate_dialog(command_line);
--
2.21.0
From 76b1773c6ef529888bcd62c4f8207c89ba23503f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Mangano-Tarumi?= <fmang@mg0.fr>
Date: Mon, 18 Nov 2019 12:05:35 +0900
Subject: [PATCH] engine-simple: Add the French bepo_afnor layout
BUG=https://github.com/ibus/ibus/pull/2155
---
engine/simple.xml.in | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/engine/simple.xml.in b/engine/simple.xml.in
index 4445c254..fc1541ec 100644
--- a/engine/simple.xml.in
+++ b/engine/simple.xml.in
@@ -283,6 +283,18 @@
<icon>ibus-keyboard</icon>
<rank>1</rank>
</engine>
+ <engine>
+ <name>xkb:fr:bepo_afnor:fra</name>
+ <language>fr</language>
+ <license>GPL</license>
+ <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+ <layout>fr</layout>
+ <layout_variant>bepo_afnor</layout_variant>
+ <longname>French (Bepo, ergonomic, Dvorak way, AFNOR)</longname>
+ <description>French (Bepo, ergonomic, Dvorak way, AFNOR)</description>
+ <icon>ibus-keyboard</icon>
+ <rank>1</rank>
+ </engine>
<engine>
<name>xkb:fr:dvorak:fra</name>
<language>fr</language>
--
2.21.0
From 7f335dcc3dcfe51f74f1dc4e13315e1031d4561e Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 18 Nov 2019 11:33:04 +0900
Subject: [PATCH] src: Add file list in registry file
Under Fedora Silverblue, st_mtime in /usr/share/ibus/component is
1 Jan 1970 even if ibus engines are installed and ibus-daemon
cannot detect new engines.
Now IBusObservedPath saves hashed file list besides st_mtime of
the compnent directory to detect the installed engines newly.
BUG=https://github.com/ibus/ibus/issues/2132
---
src/ibuscomponent.c | 7 +-
src/ibusobservedpath.c | 275 ++++++++++++++++++++++++++++++++++++-----
src/ibusregistry.c | 2 +-
3 files changed, 250 insertions(+), 34 deletions(-)
diff --git a/src/ibuscomponent.c b/src/ibuscomponent.c
index 9837f47c..bbff10fd 100644
--- a/src/ibuscomponent.c
+++ b/src/ibuscomponent.c
@@ -2,6 +2,7 @@
/* vim:set et sts=4: */
/* bus - The Input Bus
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
+ * Copyright (C) 2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
* Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
@@ -499,11 +500,7 @@ ibus_component_output (IBusComponent *component,
for (p = component->priv->observed_paths; p != NULL; p = p->next ) {
IBusObservedPath *path = (IBusObservedPath *) p->data;
-
- g_string_append_indent (output, indent + 2);
- g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
- path->mtime,
- path->path);
+ ibus_observed_path_output (path, output, indent + 2);
}
g_string_append_indent (output, indent + 1);
diff --git a/src/ibusobservedpath.c b/src/ibusobservedpath.c
index 5b79f1fe..bf7229b7 100644
--- a/src/ibusobservedpath.c
+++ b/src/ibusobservedpath.c
@@ -2,6 +2,7 @@
/* vim:set et sts=4: */
/* ibus - The Input IBus
* Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
+ * Copyright (C) 2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
* Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
@@ -30,9 +31,9 @@ enum {
};
-/* IBusObservedPathPriv */
+/* IBusObservedPathPrivate */
struct _IBusObservedPathPrivate {
- gpointer pad;
+ guint *file_hash_list;
};
typedef struct _IBusObservedPathPrivate IBusObservedPathPrivate;
@@ -52,7 +53,9 @@ static gboolean ibus_observed_path_copy (IBusObservedPath *des
static gboolean ibus_observed_path_parse_xml_node (IBusObservedPath *path,
XMLNode *node);
-G_DEFINE_TYPE (IBusObservedPath, ibus_observed_path, IBUS_TYPE_SERIALIZABLE)
+G_DEFINE_TYPE_WITH_PRIVATE (IBusObservedPath,
+ ibus_observed_path,
+ IBUS_TYPE_SERIALIZABLE)
static void
ibus_observed_path_class_init (IBusObservedPathClass *class)
@@ -84,7 +87,9 @@ static gboolean
ibus_observed_path_serialize (IBusObservedPath *path,
GVariantBuilder *builder)
{
+ IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
gboolean retval;
+ guint i;
retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
serialize ((IBusSerializable *)path, builder);
@@ -93,6 +98,15 @@ ibus_observed_path_serialize (IBusObservedPath *path,
g_variant_builder_add (builder, "s", path->path);
g_variant_builder_add (builder, "x", path->mtime);
+ if (!priv->file_hash_list) {
+ g_variant_builder_add (builder, "u", 0);
+ return TRUE;
+ }
+ for (i = 0; priv->file_hash_list[i]; i++);
+ g_variant_builder_add (builder, "u", i);
+ for (i = 0; priv->file_hash_list[i]; i++)
+ g_variant_builder_add (builder, "u", priv->file_hash_list[i]);
+
return TRUE;
}
@@ -100,7 +114,9 @@ static gint
ibus_observed_path_deserialize (IBusObservedPath *path,
GVariant *variant)
{
+ IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
gint retval;
+ guint i, length = 0;
retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
deserialize ((IBusSerializable *)path, variant);
@@ -109,6 +125,15 @@ ibus_observed_path_deserialize (IBusObservedPath *path,
ibus_g_variant_get_child_string (variant, retval++, &path->path);
g_variant_get_child (variant, retval++, "x", &path->mtime);
+ if (g_variant_n_children (variant) < retval + 2)
+ return retval;
+ g_variant_get_child (variant, retval++, "u", &length);
+ if (!length)
+ return retval;
+ priv->file_hash_list = g_new0 (guint, length + 1);
+ for (i = 0; i < length; i++)
+ g_variant_get_child (variant, retval++, "u", &priv->file_hash_list[i]);
+
return retval;
}
@@ -116,14 +141,27 @@ static gboolean
ibus_observed_path_copy (IBusObservedPath *dest,
const IBusObservedPath *src)
{
+ IBusObservedPathPrivate *dest_priv = IBUS_OBSERVED_PATH_GET_PRIVATE (dest);
+ IBusObservedPathPrivate *src_priv =
+ IBUS_OBSERVED_PATH_GET_PRIVATE ((IBusObservedPath *)src);
gboolean retval;
+ guint i;
- retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->copy ((IBusSerializable *)dest, (IBusSerializable *)src);
+ retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
+ copy ((IBusSerializable *)dest, (IBusSerializable *)src);
g_return_val_if_fail (retval, FALSE);
dest->path = g_strdup (src->path);
dest->mtime = src->mtime;
+ g_clear_pointer (&dest_priv->file_hash_list, g_free);
+ if (!src_priv->file_hash_list)
+ return TRUE;
+ for (i = 0; src_priv->file_hash_list[i]; i++);
+ dest_priv->file_hash_list = g_new0 (guint, i + 1);
+ for (i = 0; src_priv->file_hash_list[i]; i++)
+ dest_priv->file_hash_list[i] = src_priv->file_hash_list[i];
+
return TRUE;
}
@@ -137,23 +175,48 @@ ibus_observed_path_copy (IBusObservedPath *dest,
void
ibus_observed_path_output (IBusObservedPath *path,
- GString *output,
- gint indent)
+ GString *output,
+ gint indent)
{
+ IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
+ guint i;
+
g_assert (IBUS_IS_OBSERVED_PATH (path));
g_assert (output);
- g_string_append_indent (output, indent);
- g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
- path->mtime,
- path->path);
+ if (!priv->file_hash_list) {
+ g_string_append_indent (output, indent);
+ g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
+ path->mtime,
+ path->path);
+ } else {
+ g_string_append_indent (output, indent);
+ g_string_append_printf (
+ output,
+ "<path mtime=\"%ld\" type=\"dir\" path=\"%s\">\n",
+ path->mtime,
+ path->path);
+ for (i = 0; priv->file_hash_list[i]; i++) {
+ g_string_append_indent (output, indent + 1);
+ g_string_append_printf (output, "<file hash=\"%u\" />\n",
+ priv->file_hash_list[i]);
+ }
+ g_string_append_indent (output, indent);
+ g_string_append_printf (output, "</path>\n");
+ }
}
gboolean
ibus_observed_path_check_modification (IBusObservedPath *path)
{
+ IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
gchar *real_path = NULL;
struct stat buf;
+ gboolean retval = FALSE;
+ GDir *dir = NULL;
+ const gchar *name;
+ guint i = 0;
+ guint file_num = 0;
g_assert (IBUS_IS_OBSERVED_PATH (path));
@@ -169,11 +232,71 @@ ibus_observed_path_check_modification (IBusObservedPath *path)
buf.st_mtime = 0;
}
- g_free (real_path);
- if (path->mtime == buf.st_mtime)
- return FALSE;
- return TRUE;
+ if (path->mtime != buf.st_mtime) {
+ retval = TRUE;
+ goto end_check_modification;
+ }
+
+ /* If an ibus engine is installed, normal file system updates
+ * the directory mtime of "/usr/share/ibus/component" and
+ * path->mtime of the cache file and buf.st_mtime of the current directory
+ * could have the different values.
+ *
+ * But under a special file system, the buf.st_mtime is not updated
+ * even if an ibus engine is installed, likes Fedora Silverblue
+ * and ibus_observed_path_check_modification() could not detect
+ * the installed ibus engines.
+ * Now path->priv->file_hash_list reserves the hash list of the files
+ * in the observed directory and if a new ibus engine is installed,
+ * the hash of the compose file does not exists in the cache's
+ * file_hash_list and ibus-daemon regenerate the cache successfully.
+ */
+ if (!priv->file_hash_list) {
+ /* If the cache version is old, ibus_registry_load_cache() returns
+ * FALSE and ibus_registry_check_modification() and this are not
+ * called.
+ * If the cache version is the latest, the cache file includes the
+ * filled file_hash_list for directories with ibus_observed_path_new()
+ * when the cache was generated.
+ * Then if file_hash_list is null, it's a simple file in ibus
+ * components and return here simply.
+ */
+ goto end_check_modification;
+ }
+ dir = g_dir_open (real_path, 0, NULL);
+ g_return_val_if_fail (dir, FALSE);
+
+ while ((name = g_dir_read_name (dir)) != NULL) {
+ guint current_hash;
+ gboolean has_file = FALSE;
+
+ if (!g_str_has_suffix (name, ".xml"))
+ continue;
+ current_hash = g_str_hash (name);
+ for (i = 0; priv->file_hash_list[i]; i++) {
+ if (current_hash == priv->file_hash_list[i]) {
+ has_file = TRUE;
+ break;
+ }
+ }
+ if (!has_file) {
+ retval = TRUE;
+ goto end_check_modification;
+ }
+ file_num++;
+ }
+ if (!retval) {
+ for (i = 0; priv->file_hash_list[i]; i++);
+ if (file_num != i)
+ retval = TRUE;
+ }
+
+end_check_modification:
+ if (dir)
+ g_dir_close (dir);
+ g_free (real_path);
+ return retval;
}
static void
@@ -224,7 +347,7 @@ ibus_observed_path_traverse (IBusObservedPath *path,
paths = g_list_append (paths, sub);
paths = g_list_concat (paths,
ibus_observed_path_traverse (sub, dir_only));
- } else if (!dir_only) {
+ } else if (sub->is_exist && !dir_only) {
paths = g_list_append (paths, sub);
}
}
@@ -233,36 +356,102 @@ ibus_observed_path_traverse (IBusObservedPath *path,
return paths;
}
+
+static gboolean
+ibus_observed_path_parse_file (IBusObservedPath *path,
+ XMLNode *node,
+ int *nth)
+{
+ IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
+ gchar **attr;
+
+ for (attr = node->attributes; attr[0]; attr += 2) {
+ guint hash = 0;
+
+ if (g_strcmp0 (*attr, "hash") == 0)
+ hash = atol (attr[1]);
+ else if (g_strcmp0 (*attr, "name") == 0)
+ hash = g_str_hash (attr[1]);
+ if (hash) {
+ if (!priv->file_hash_list) {
+ *nth = 0;
+ priv->file_hash_list = g_new0 (guint, *nth + 2);
+ } else {
+ priv->file_hash_list = g_renew (guint, priv->file_hash_list,
+ *nth + 2);
+ }
+ priv->file_hash_list[*nth] = hash;
+ priv->file_hash_list[*nth + 1] = 0;
+ *nth += 1;
+ continue;
+ }
+ g_warning ("Unkonwn attribute %s", attr[0]);
+ }
+
+ return TRUE;
+}
+
+
static gboolean
ibus_observed_path_parse_xml_node (IBusObservedPath *path,
XMLNode *node)
{
+ gchar **attr;
+ const gchar *full_path = node->text;
+ GList *p;
+ int i = 0;
+
g_assert (IBUS_IS_OBSERVED_PATH (path));
g_assert (node);
- if (G_UNLIKELY (g_strcmp0 (node->name, "path") != 0)) {
+ if (G_UNLIKELY (g_strcmp0 (node->name, "path") != 0))
return FALSE;
+
+ for (attr = node->attributes; attr[0]; attr += 2) {
+ if (g_strcmp0 (*attr, "mtime") == 0) {
+ path->mtime = atol (attr[1]);
+ continue;
+ }
+ if (g_strcmp0 (*attr, "path") == 0) {
+ full_path = attr[1];
+ continue;
+ }
+ if (g_strcmp0 (*attr, "type") == 0) {
+ if (!g_strcmp0 (attr[1], "dir"))
+ path->is_dir = TRUE;
+ else if (!g_strcmp0 (attr[1], "file"))
+ path->is_dir = FALSE;
+ else
+ g_warning ("The type attribute can be \"dir\" or \"file\".");
+ continue;
+ }
+ g_warning ("Unkonwn attribute %s", attr[0]);
}
- if (node->text[0] == '~' && node->text[1] != G_DIR_SEPARATOR) {
- g_warning ("Invalid path \"%s\"", node->text);
+ if (full_path[0] == '~' && full_path[1] != G_DIR_SEPARATOR) {
+ g_warning ("Invalid path \"%s\"", full_path);
return FALSE;
}
- path->path = g_strdup (node->text);
+ path->path = g_strdup (full_path);
- gchar **attr;
- for (attr = node->attributes; attr[0]; attr += 2) {
- if (g_strcmp0 (*attr, "mtime") == 0) {
- path->mtime = atol (attr[1]);
+ if (!path->is_dir)
+ return TRUE;
+
+ for (i = 0, p = node->sub_nodes; p != NULL; p = p->next) {
+ XMLNode *sub_node = (XMLNode *)p->data;
+
+ if (G_UNLIKELY (g_strcmp0 (sub_node->name, "file") != 0)) {
+ g_warning ("Unkonwn tag %s", sub_node->name);
continue;
}
- g_warning ("Unkonwn attribute %s", attr[0]);
+ ibus_observed_path_parse_file (path, sub_node, &i);
}
return TRUE;
}
+
IBusObservedPath *
ibus_observed_path_new_from_xml_node (XMLNode *node,
gboolean fill_stat)
@@ -288,16 +477,46 @@ IBusObservedPath *
ibus_observed_path_new (const gchar *path,
gboolean fill_stat)
{
- g_assert (path);
-
IBusObservedPath *op;
+ IBusObservedPathPrivate *priv;
+ GList *file_list, *l;
+ guint i = 0;
+ g_assert (path);
op = (IBusObservedPath *) g_object_new (IBUS_TYPE_OBSERVED_PATH, NULL);
op->path = g_strdup (path);
- if (fill_stat) {
- ibus_observed_path_fill_stat (op);
+ priv = IBUS_OBSERVED_PATH_GET_PRIVATE (op);
+ l = file_list = ibus_observed_path_traverse (op, FALSE);
+ for (; l; l = l->next) {
+ IBusObservedPath *sub = l->data;
+ const gchar *file = NULL;
+
+ g_return_val_if_fail (sub && sub->path, op);
+
+ file = sub->path;
+ if (!g_str_has_suffix (file, ".xml"))
+ continue;
+ if (g_str_has_prefix (file, path)) {
+ file += strlen (path);
+ if (*file == '/')
+ file++;
+ /* Ignore sub directories */
+ if (strchr (file, '/'))
+ continue;
+ }
+ if (!i)
+ priv->file_hash_list = g_new0 (guint, i + 2);
+ else
+ priv->file_hash_list = g_renew (guint, priv->file_hash_list, i + 2);
+ priv->file_hash_list[i] = g_str_hash (file);
+ priv->file_hash_list[i + 1] = 0;
+ ++i;
}
+ g_list_free_full (file_list, (GDestroyNotify)ibus_observed_path_destroy);
+
+ if (fill_stat)
+ ibus_observed_path_fill_stat (op);
return op;
}
diff --git a/src/ibusregistry.c b/src/ibusregistry.c
index 43990d5f..378388d9 100644
--- a/src/ibusregistry.c
+++ b/src/ibusregistry.c
@@ -29,7 +29,7 @@
#include "ibusregistry.h"
#define IBUS_CACHE_MAGIC 0x49425553 /* "IBUS" */
-#define IBUS_CACHE_VERSION 0x00010512
+#define IBUS_CACHE_VERSION 0x00010522
enum {
CHANGED,
--
2.21.0
From bccf94d5ec1c5fc80d5aeac622f2ab8007d5a28a Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Fri, 29 Nov 2019 20:28:49 +0900
Subject: [PATCH] src/tests: RHEL codereview for ibus-desktop-testing-runner
---
src/tests/ibus-desktop-testing-runner.in | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
index 141e9b5b..72537cd4 100755
--- a/src/tests/ibus-desktop-testing-runner.in
+++ b/src/tests/ibus-desktop-testing-runner.in
@@ -28,6 +28,10 @@
# # /root/ibus/tests/test-console.sh --tests ibus-compose \
# --builddir /root/ibus/src/tests --srcdir /root/ibus/src/tests
+# POSIX sh has no 'echo -e'
+: ${ECHO:='/usr/bin/echo'}
+
+
PROGNAME=`basename $0`
VERSION=0.1
DISPLAY=:99.0
@@ -54,15 +58,15 @@ print_log()
shift
fi
NO_ESCAPE=`echo $@ | sed -e 's/\\\033\\[0;3.m//g' -e 's/\\\033\\[0m//g'`
- echo $NO_ESCAPE >> $RESULT_LOG
+ $ECHO $NO_ESCAPE >> $RESULT_LOG
else
- echo $@
+ $ECHO $@
fi
}
usage()
{
- echo -e \
+ $ECHO -e \
"This test runs /usr/bin/ibus-daemon after install ibus\n" \
"$PROGNAME [OPTIONS…]\n" \
"\n" \
@@ -92,7 +96,7 @@ parse_args()
while [ 1 ] ; do
case "$1" in
-h | --help ) usage; exit 0;;
- -v | --version ) echo -e "$VERSION"; exit 0;;
+ -v | --version ) $ECHO -e "$VERSION"; exit 0;;
-b | --builddir ) BUILDDIR="$2"; shift 2;;
-s | --srcdir ) SRCDIR="$2"; shift 2;;
-c | --no-graphics ) HAVE_GRAPHICS=0; shift;;
@@ -121,7 +125,7 @@ init_desktop()
fi
if [ "$TEST_LOG" = "" ] ; then
print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: a log file is required to get return value with 'read' command"
- exit -1
+ exit 255
elif [ -f $TEST_LOG ] ; then
rm $TEST_LOG
fi
@@ -291,7 +295,7 @@ EOF
done
child_pass=`grep '^PASS:' $TEST_LOG | wc -l`
child_fail=`grep '^FAIL:' $TEST_LOG | wc -l`
- if [ $child_pass -ne 0 -o $child_fail -ne 0 ] ; then
+ if [ $child_pass -ne 0 ] || [ $child_fail -ne 0 ] ; then
pass=$child_pass
if [ $child_fail -ne 0 ] ; then
fail=`expr $child_fail / 2`
--
2.21.0
From d50627f0b7a000ee13ea6dcc02a4162be1fa853d Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Tue, 3 Dec 2019 21:42:49 +0900
Subject: [PATCH] src/tests: RHEL codereview #2 for ibus-desktop-testing-runner
---
src/tests/ibus-compose-locales.in | 21 +++++++--------
src/tests/ibus-desktop-testing-runner.in | 33 ++++++++++++------------
2 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/src/tests/ibus-compose-locales.in b/src/tests/ibus-compose-locales.in
index f650b584..b36165fe 100755
--- a/src/tests/ibus-compose-locales.in
+++ b/src/tests/ibus-compose-locales.in
@@ -7,27 +7,26 @@ BUILDDIR=`dirname $0`
export IBUS_COMPOSE_CACHE_DIR=$PWD
retval=0
-# Let for-loop notice '\n' as a delimiter
-IFS=$'\n'
-for var in `cat $SRCDIR/ibus-compose.env`
+# Deleted for var in `cat *.env` because IFS=$'\n' is not supported in POSIX sh
+while read var
do
- # Revert IFS to recognize env a=foo b=foo
- IFS=' '
IS_COMMENT=`echo "$var" | grep "^#"`
if [ "x$IS_COMMENT" != x ] ; then
continue
fi
- echo "# Starting $var $BUILDDIR/ibus-compose $SRCDIR $@"
- env $var $BUILDDIR/ibus-compose $SRCDIR $@
+ # Use $* instead of $@ not to mix strings and integers
+ echo "# Starting $var $BUILDDIR/ibus-compose $SRCDIR $*"
+ # Need to enclose $@ with double quotes not to split the array.
+ env $var $BUILDDIR/ibus-compose $SRCDIR "$@"
retval=`expr $retval + $?`
- echo "# Finished $var $BUILDDIR/ibus-compose $SRCDIR $@ with $retval"
+ echo "# Finished $var $BUILDDIR/ibus-compose $SRCDIR $* with $retval"
CACHE_FILES=`ls *.cache`
if [ x"$CACHE_FILES" != x ] ; then
echo "Clean $CACHE_FILES"
rm $CACHE_FILES
fi
- IFS=$'\n'
-done
-IFS=' '
+done << EOF_ENVS
+`cat $SRCDIR/ibus-compose.env`
+EOF_ENVS
exit $retval
diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
index 72537cd4..981941d5 100755
--- a/src/tests/ibus-desktop-testing-runner.in
+++ b/src/tests/ibus-desktop-testing-runner.in
@@ -30,6 +30,8 @@
# POSIX sh has no 'echo -e'
: ${ECHO:='/usr/bin/echo'}
+# POSIX sh has $UID
+: ${UID:='`id -u`'}
PROGNAME=`basename $0`
@@ -57,10 +59,10 @@ print_log()
if [ x"$1" = x'-e' ] ; then
shift
fi
- NO_ESCAPE=`echo $@ | sed -e 's/\\\033\\[0;3.m//g' -e 's/\\\033\\[0m//g'`
+ NO_ESCAPE=`echo "$@" | sed -e 's/\\\033\\[0;3.m//g' -e 's/\\\033\\[0m//g'`
$ECHO $NO_ESCAPE >> $RESULT_LOG
else
- $ECHO $@
+ $ECHO "$@"
fi
}
@@ -231,9 +233,9 @@ run_direct_test_cases()
if test x"$ENVS" = x ; then
$BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
retval=$?
- read pass fail << EOF
+ read pass fail << EOF_COUNT
`count_case_result $retval $pass $fail`
-EOF
+EOF_COUNT
echo_case_result $retval $tst
CACHE_FILES=`ls *.cache`
if [ x"$CACHE_FILES" != x ] ; then
@@ -242,11 +244,9 @@ EOF
fi
else
i=1
- # Let for-loop notice '\n' as a delimiter
- IFS=$'\n'
- for e in $ENVS; do
- # Revert IFS to recognize env a=foo b=foo
- IFS=' '
+ # Deleted for var in "$ENVS" because IFS=$'\n' is not supported
+ # in POSIX sh
+ while read e ; do
first=`echo "$e" | grep '^#'`
if test x"$first" = x"#" ; then
continue
@@ -255,9 +255,9 @@ EOF
env $e $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
retval=$?
echo "# Finished $e $BUILDDIR/$tst $SRCDIR with $retval" >>$TEST_LOG
- read pass fail << EOF
+ read pass fail << EOF_COUNT
`count_case_result $retval $pass $fail`
-EOF
+EOF_COUNT
echo_case_result $retval $tst $e
CACHE_FILES=`ls *.cache`
if [ x"$CACHE_FILES" != x ] ; then
@@ -265,9 +265,9 @@ EOF
rm $CACHE_FILES
fi
i=`expr $i + 1`
- IFS=$'\n'
- done
- IFS=' '
+ done << EOF_ENVS
+ `echo "$ENVS"`
+EOF_ENVS
fi
done
echo $pass $fail
@@ -357,7 +357,7 @@ finit()
main()
{
- parse_args $@
+ parse_args "$@"
init_desktop
run_dbus_daemon 2>>$TEST_LOG 1>>$TEST_LOG
run_desktop 2>>$TEST_LOG 1>>$TEST_LOG
@@ -365,4 +365,5 @@ main()
finit
}
-main $@
+# Need to enclose $@ with double quotes not to split the array.
+main "$@"
--
2.21.0
From 25d11f5cfd4c39e53be11a1348da29a61593cc4c Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 11 Dec 2019 16:28:22 +0900
Subject: [PATCH] client/gtk2: Fix to set use_button_press_event after signals
are connected
_ibus_context_update_preedit_text_cb() can be called with reset signals
before ibus_im_context_set_client_window() is called. Then
use_button_press_event needs to be set only when the signals are connected.
BUG=https://github.com/ibus/ibus/issues/1980
---
client/gtk2/ibusimcontext.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index 5e3457ba..ac5de809 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -1074,8 +1074,9 @@ ibus_im_context_reset (GtkIMContext *context)
/* Commented out ibus_im_context_clear_preedit_text().
* Hangul needs to receive the reset callback with button press
* but other IMEs should avoid to receive the reset callback
- * so the signal would need to be customized with GtkSetting.
- * IBus uses button-press-event instead.
+ * by themselves.
+ * IBus uses button-press-event instead until GTK is fixed.
+ * https://gitlab.gnome.org/GNOME/gtk/issues/1534
*/
ibus_input_context_reset (ibusimcontext->ibuscontext);
}
@@ -1657,10 +1658,13 @@ _ibus_context_update_preedit_text_cb (IBusInputContext *ibuscontext,
if (!ibusimcontext->use_button_press_event &&
mode == IBUS_ENGINE_PREEDIT_COMMIT) {
#if !GTK_CHECK_VERSION (3, 93, 0)
- if (ibusimcontext->client_window)
+ if (ibusimcontext->client_window) {
_connect_button_press_event (ibusimcontext, TRUE);
-#endif
+ ibusimcontext->use_button_press_event = TRUE;
+ }
+#else
ibusimcontext->use_button_press_event = TRUE;
+#endif
}
str = text->text;
--
2.21.0
From c662a02bf3b50914c697af12fc152ee97e2df961 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 25 Dec 2019 17:30:56 +0900
Subject: [PATCH] client/gtk2: Fix to connect button-press-event signal
IBus clients do not connect button-press-event in some conditions
and it will be fixed.
BUG=https://github.com/ibus/ibus/issues/1980
---
client/gtk2/ibusimcontext.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index ac5de809..30585403 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-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
- * Copyright (C) 2008-2018 Red Hat, Inc.
+ * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2008-2019 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -73,7 +73,7 @@ struct _IBusIMContext {
GCancellable *cancellable;
GQueue *events_queue;
- gboolean use_button_press_event;
+ gboolean use_button_press_event;
};
struct _IBusIMContextClass {
@@ -1125,6 +1125,10 @@ ibus_im_context_get_preedit_string (GtkIMContext *context,
#if !GTK_CHECK_VERSION (3, 93, 0)
+/* Use the button-press-event signal until GtkIMContext always emits the reset
+ * signal.
+ * https://gitlab.gnome.org/GNOME/gtk/merge_requests/460
+ */
static gboolean
ibus_im_context_button_press_event_cb (GtkWidget *widget,
GdkEventButton *event,
@@ -1157,11 +1161,13 @@ _connect_button_press_event (IBusIMContext *ibusimcontext,
"button-press-event",
G_CALLBACK (ibus_im_context_button_press_event_cb),
ibusimcontext);
+ ibusimcontext->use_button_press_event = TRUE;
} else {
g_signal_handlers_disconnect_by_func (
widget,
G_CALLBACK (ibus_im_context_button_press_event_cb),
ibusimcontext);
+ ibusimcontext->use_button_press_event = FALSE;
}
}
}
@@ -1188,7 +1194,7 @@ 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 (ibusimcontext->use_button_press_event)
+ if (!ibusimcontext->use_button_press_event)
_connect_button_press_event (ibusimcontext, TRUE);
#endif
}
@@ -1655,17 +1661,14 @@ _ibus_context_update_preedit_text_cb (IBusInputContext *ibuscontext,
ibusimcontext->preedit_attrs = NULL;
}
+#if !GTK_CHECK_VERSION (3, 93, 0)
if (!ibusimcontext->use_button_press_event &&
mode == IBUS_ENGINE_PREEDIT_COMMIT) {
-#if !GTK_CHECK_VERSION (3, 93, 0)
if (ibusimcontext->client_window) {
_connect_button_press_event (ibusimcontext, TRUE);
- ibusimcontext->use_button_press_event = TRUE;
}
-#else
- ibusimcontext->use_button_press_event = TRUE;
-#endif
}
+#endif
str = text->text;
ibusimcontext->preedit_string = g_strdup (str);
--
2.21.0