Blob Blame History Raw
From fbdd157b2ab1e6e873818132530dd9e55e4f94dd Mon Sep 17 00:00:00 2001
From: Peng Huang <shawn.p.huang@gmail.com>
Date: Mon, 7 Mar 2011 10:26:04 -0500
Subject: [PATCH] Move gtk_key_snooper_remove from function object_fini to class_fini.

BUG=http://crosbug.com/12803
TEST=Linux desktop

Review URL: http://codereview.appspot.com/4267044
---
 client/gtk2/ibusimcontext.c |   24 +++++++++++++++---------
 1 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index a634d0e..31a415d 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -88,6 +88,7 @@ static GtkWidget *_input_widget = NULL;
 
 /* functions prototype */
 static void     ibus_im_context_class_init  (IBusIMContextClass    *class);
+static void     ibus_im_context_class_fini  (IBusIMContextClass    *class);
 static void     ibus_im_context_init        (GObject               *obj);
 static void     ibus_im_context_finalize    (GObject               *obj);
 static void     ibus_im_context_reset       (GtkIMContext          *context);
@@ -152,10 +153,10 @@ ibus_im_context_register_type (GTypeModule *type_module)
 
     static const GTypeInfo ibus_im_context_info = {
         sizeof (IBusIMContextClass),
-        (GBaseInitFunc)        NULL,
-        (GBaseFinalizeFunc)     NULL,
+        (GBaseInitFunc)      NULL,
+        (GBaseFinalizeFunc)  NULL,
         (GClassInitFunc)     ibus_im_context_class_init,
-        NULL,            /* class finialize */
+        (GClassFinalizeFunc) ibus_im_context_class_fini,
         NULL,            /* class data */
         sizeof (IBusIMContext),
         0,
@@ -477,6 +478,16 @@ ibus_im_context_class_init (IBusIMContextClass *class)
         _key_snooper_id = gtk_key_snooper_install (_key_snooper_cb, NULL);
 }
 
+static void
+ibus_im_context_class_fini (IBusIMContextClass *class)
+{
+    if (_key_snooper_id != 0) {
+        IDEBUG ("snooper is terminated.");
+        gtk_key_snooper_remove (_key_snooper_id);
+        _key_snooper_id = 0;
+    }
+}
+
 /* Copied from gtk+2.0-2.20.1/modules/input/imcedilla.c to fix crosbug.com/11421.
  * Overwrite the original Gtk+'s compose table in gtk+-2.x.y/gtk/gtkimcontextsimple.c. */
 
@@ -601,12 +612,6 @@ ibus_im_context_finalize (GObject *obj)
         pango_attr_list_unref (ibusimcontext->preedit_attrs);
     }
 
-    if (_key_snooper_id != 0) {
-        IDEBUG ("snooper is terminated.");
-        gtk_key_snooper_remove (_key_snooper_id);
-        _key_snooper_id = 0;
-    }
-
     G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
-- 
1.7.4.1

From c0489ba017f298e51efe86bc7f5def1928389197 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Fri, 11 Mar 2011 15:53:53 +0900
Subject: [PATCH] Fix preedit_string = NULL in ibus-x11 _free_ic()

---
 client/x11/main.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/client/x11/main.c b/client/x11/main.c
index a2967cc..16104de 100644
--- a/client/x11/main.c
+++ b/client/x11/main.c
@@ -526,6 +526,7 @@ _free_ic (gpointer data, gpointer user_data)
     g_return_if_fail (x11ic != NULL);
 
     g_free (x11ic->preedit_string);
+    x11ic->preedit_string = NULL;
 
     if (x11ic->preedit_attrs) {
         g_object_unref (x11ic->preedit_attrs);
-- 
1.7.4.1

From b9b2c42596e1a7394e89c11025074aed2fcb099a Mon Sep 17 00:00:00 2001
From: Peng Huang <shawn.p.huang@gmail.com>
Date: Wed, 16 Mar 2011 10:02:47 -0400
Subject: [PATCH] Fix issue of InputContext.SetEngine.

InputContext.SetEngine returns error sometimes, because "request-engine"
signal handler calls an async function to set the engine of the context.
So checking context->engine != NULL just after emiting "request-engine"
signal is not correct.

BUG=none
TEST=Linux desktop

Review URL: http://codereview.appspot.com/4287049
---
 bus/ibusimpl.c      |   68 ++++++++++++++++++++++++-----------
 bus/inputcontext.c  |   97 +++++++++++++++++++++++++++++++++++++++++++--------
 bus/marshalers.list |   14 ++++----
 3 files changed, 136 insertions(+), 43 deletions(-)

diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
index 8d4ec36..5a8e134 100644
--- a/bus/ibusimpl.c
+++ b/bus/ibusimpl.c
@@ -186,6 +186,9 @@ static BusInputContext
                                                 (BusIBusImpl        *ibus,
                                                  BusConnection      *connection,
                                                  const gchar        *client);
+static IBusEngineDesc
+               *bus_ibus_impl_get_engine_desc   (BusIBusImpl        *ibus,
+                                                 const gchar        *engine_name);
 /* some callback functions */
 static void     _context_engine_changed_cb      (BusInputContext    *context,
                                                  BusIBusImpl        *ibus);
@@ -975,21 +978,30 @@ _find_engine_desc_by_name (BusIBusImpl *ibus,
  *
  * A callback function to be called when the "request-engine" signal is sent to the context.
  */
-static void
+static IBusEngineDesc *
 _context_request_engine_cb (BusInputContext *context,
                             const gchar     *engine_name,
                             BusIBusImpl     *ibus)
 {
-    IBusEngineDesc *desc = NULL;
+    return bus_ibus_impl_get_engine_desc (ibus, engine_name);
+}
 
-    /* context should has focus before request an engine */
-    g_return_if_fail (bus_input_context_has_focus (context) ||
-                      context == ibus->focused_context);
+/**
+ * bus_ibus_impl_get_engine_desc:
+ *
+ * Get the IBusEngineDesc by engine_name. If the engine_name is NULL, return
+ * a default engine desc.
+ */
+static IBusEngineDesc *
+bus_ibus_impl_get_engine_desc (BusIBusImpl *ibus,
+                               const gchar *engine_name)
+{
+    IBusEngineDesc *desc = NULL;
 
     if (engine_name != NULL && engine_name[0] != '\0') {
         /* request engine by name */
         desc = _find_engine_desc_by_name (ibus, engine_name);
-        g_return_if_fail (desc != NULL);
+        g_return_val_if_fail (desc != NULL, NULL);
     }
     else {
         /* Use global engine if possible. */
@@ -1018,11 +1030,11 @@ _context_request_engine_cb (BusInputContext *context,
              * not find any default engines. another possiblity is that the
              * user hasn't installed an engine yet? just give up. */
             g_warning ("No engine is available. Run ibus-setup first.");
-            return;
+            return NULL;
         }
     }
 
-    bus_ibus_impl_set_context_engine_from_desc (ibus, context, desc);
+    return desc;
 }
 
 /**
@@ -1041,7 +1053,11 @@ bus_ibus_impl_context_request_next_engine_in_menu (BusIBusImpl     *ibus,
 
     engine = bus_input_context_get_engine (context);
     if (engine == NULL) {
-        _context_request_engine_cb (context, NULL, ibus);
+        desc = bus_ibus_impl_get_engine_desc (ibus, NULL);
+        if (desc != NULL)
+            bus_ibus_impl_set_context_engine_from_desc (ibus,
+                                                        context,
+                                                        desc);
         return;
     }
 
@@ -1112,7 +1128,14 @@ bus_ibus_impl_context_request_previous_engine (BusIBusImpl     *ibus,
         bus_ibus_impl_context_request_next_engine_in_menu (ibus, context);
         return;
     }
-    _context_request_engine_cb (context, engine_name, ibus);
+
+    IBusEngineDesc *desc = NULL;
+    desc = bus_ibus_impl_get_engine_desc (ibus, engine_name);
+    if (desc != NULL) {
+        bus_ibus_impl_set_context_engine_from_desc (ibus,
+                                                    context,
+                                                    desc);
+    }
 }
 
 static void
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
index c226a20..6d65830 100644
--- a/bus/inputcontext.c
+++ b/bus/inputcontext.c
@@ -20,11 +20,13 @@
  * Boston, MA 02111-1307, USA.
  */
 #include "inputcontext.h"
-#include "types.h"
-#include "marshalers.h"
-#include "ibusimpl.h"
+
 #include "engineproxy.h"
 #include "factoryproxy.h"
+#include "ibusimpl.h"
+#include "marshalers.h"
+#include "option.h"
+#include "types.h"
 
 struct _SetEngineByDescData {
     /* context related to the data */
@@ -565,8 +567,8 @@ bus_input_context_class_init (BusInputContextClass *class)
             G_SIGNAL_RUN_LAST,
             0,
             NULL, NULL,
-            bus_marshal_VOID__STRING,
-            G_TYPE_NONE,
+            bus_marshal_OBJECT__STRING,
+            IBUS_TYPE_ENGINE_DESC,
             1,
             G_TYPE_STRING);
 
@@ -917,6 +919,26 @@ _ic_is_enabled (BusInputContext       *context,
     g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", context->enabled));
 }
 
+static void
+_ic_set_engine_done (BusInputContext       *context,
+                     GAsyncResult          *res,
+                     GDBusMethodInvocation *invocation)
+{
+    gboolean retval = FALSE;
+    GError *error = NULL;
+
+    retval = bus_input_context_set_engine_by_desc_finish (context,
+                    res, &error);
+
+    if (!retval) {
+        g_dbus_method_invocation_return_gerror (invocation, error);
+        g_error_free (error);
+    }
+    else {
+        g_dbus_method_invocation_return_value (invocation, NULL);
+    }
+}
+
 /**
  * _ic_set_engine:
  *
@@ -930,16 +952,34 @@ _ic_set_engine (BusInputContext       *context,
     gchar *engine_name = NULL;
     g_variant_get (parameters, "(&s)", &engine_name);
 
-    g_signal_emit (context, context_signals[REQUEST_ENGINE], 0, engine_name);
-
-    if (context->engine == NULL) {
-        g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
-                        "Can not find engine '%s'.", engine_name);
+    if (!bus_input_context_has_focus (context)) {
+        g_dbus_method_invocation_return_error (invocation,
+                G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+                "Context which does not has focus can not change engine to %s.",
+                engine_name);
+        return;
     }
-    else {
-        bus_input_context_enable (context);
-        g_dbus_method_invocation_return_value (invocation, NULL);
+
+    IBusEngineDesc *desc = NULL;
+    g_signal_emit (context,
+                   context_signals[REQUEST_ENGINE], 0,
+                   engine_name,
+                   &desc);
+    if (desc == NULL) {
+        g_dbus_method_invocation_return_error (invocation,
+                        G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+                        "Can not find engine %s.", engine_name);
+        return;
     }
+
+    bus_input_context_set_engine_by_desc (context,
+                            desc,
+                            g_gdbus_timeout,
+                            NULL,
+                            (GAsyncReadyCallback)_ic_set_engine_done,
+                            invocation);
+
+    g_object_unref (desc);
 }
 
 /**
@@ -1045,7 +1085,21 @@ bus_input_context_focus_in (BusInputContext *context)
 
     if (context->engine == NULL && context->enabled) {
         /* request an engine, e.g. a global engine if the feature is enabled. */
-        g_signal_emit (context, context_signals[REQUEST_ENGINE], 0, NULL);
+        IBusEngineDesc *desc = NULL;
+        g_signal_emit (context,
+                       context_signals[REQUEST_ENGINE], 0,
+                       NULL,
+                       &desc);
+
+        if (desc != NULL) {
+            bus_input_context_set_engine_by_desc (context,
+                            desc,
+                            g_gdbus_timeout, /* timeout in msec. */
+                            NULL, /* we do not cancel the call. */
+                            NULL, /* use the default callback function. */
+                            NULL);
+            g_object_unref (desc);
+        }
     }
 
     if (context->engine && context->enabled) {
@@ -1927,7 +1981,20 @@ bus_input_context_enable (BusInputContext *context)
     }
 
     if (context->engine == NULL) {
-        g_signal_emit (context, context_signals[REQUEST_ENGINE], 0, NULL);
+        IBusEngineDesc *desc = NULL;
+        g_signal_emit (context,
+                       context_signals[REQUEST_ENGINE], 0,
+                       NULL,
+                       &desc);
+        if (desc != NULL) {
+            bus_input_context_set_engine_by_desc (context,
+                            desc,
+                            g_gdbus_timeout, /* timeout in msec. */
+                            NULL, /* we do not cancel the call. */
+                            NULL, /* use the default callback function. */
+                            NULL);
+            g_object_unref (desc);
+        }
     }
 
     if (context->engine == NULL)
diff --git a/bus/marshalers.list b/bus/marshalers.list
index 15bdf02..159bc24 100644
--- a/bus/marshalers.list
+++ b/bus/marshalers.list
@@ -1,13 +1,13 @@
-VOID:VOID
-VOID:STRING
-VOID:OBJECT
+BOOL:UINT,UINT,UINT
+OBJECT:STRING
 VOID:INT,UINT
-VOID:UINT,UINT,UINT
 VOID:INT,INT,INT,INT
-VOID:STRING,INT
 VOID:OBJECT
-VOID:STRING,STRING,STRING
 VOID:OBJECT,BOOLEAN
 VOID:OBJECT,UINT,BOOLEAN
 VOID:OBJECT,UINT,BOOLEAN,UINT
-BOOL:UINT,UINT,UINT
+VOID:STRING
+VOID:STRING,INT
+VOID:STRING,STRING,STRING
+VOID:UINT,UINT,UINT
+VOID:VOID
-- 
1.7.4.1

From a9a7d77b540826259889aa8c8936b7a3cae1593d Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Fri, 25 Mar 2011 13:57:31 +0900
Subject: [PATCH] Set WM_CLASS name instead of main.py

---
 ui/gtk/panel.py |   11 ++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/ui/gtk/panel.py b/ui/gtk/panel.py
index 07b0fa2..9d63a17 100644
--- a/ui/gtk/panel.py
+++ b/ui/gtk/panel.py
@@ -37,7 +37,7 @@
 
 from i18n import _, N_
 
-ICON_KEYBOARD = "ibus-keyboard"
+ICON_KEYBOARD = "input-keyboard-symbolic"
 ICON_ENGINE = "ibus-engine"
 
 def show_uri(screen, link):
@@ -103,6 +103,16 @@ class Panel(ibus.PanelBase):
 
 
         self.__status_icon = gtk.StatusIcon()
+        # gnome-shell checks XClassHint.res_class with ShellTrayIcon.
+        # gtk_status_icon_set_name() can set XClassHint.res_class .
+        # However gtk_status_icon_new() also calls gtk_window_realize() so
+        # gtk_status_icon_set_visible() needs to be called to set WM_CLASS
+        # so that gtk_window_realize() is called later again.
+        # set_title is for gnome-shell notificationDaemon in bottom right.
+        self.__status_icon.set_visible(False)
+        self.__status_icon.set_name('ibus-ui-gtk')
+        self.__status_icon.set_title(_("IBus Panel"))
+        self.__status_icon.set_visible(True)
         self.__status_icon.connect("popup-menu", self.__status_icon_popup_menu_cb)
         self.__status_icon.connect("activate", self.__status_icon_activate_cb)
         self.__status_icon.set_from_icon_name(ICON_KEYBOARD)
-- 
1.7.4.1