1935274
From fbdd157b2ab1e6e873818132530dd9e55e4f94dd Mon Sep 17 00:00:00 2001
1935274
From: Peng Huang <shawn.p.huang@gmail.com>
1935274
Date: Mon, 7 Mar 2011 10:26:04 -0500
1935274
Subject: [PATCH] Move gtk_key_snooper_remove from function object_fini to class_fini.
1935274
1935274
BUG=http://crosbug.com/12803
1935274
TEST=Linux desktop
1935274
1935274
Review URL: http://codereview.appspot.com/4267044
1935274
---
1935274
 client/gtk2/ibusimcontext.c |   24 +++++++++++++++---------
1935274
 1 files changed, 15 insertions(+), 9 deletions(-)
1935274
1935274
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
1935274
index a634d0e..31a415d 100644
1935274
--- a/client/gtk2/ibusimcontext.c
1935274
+++ b/client/gtk2/ibusimcontext.c
1935274
@@ -88,6 +88,7 @@ static GtkWidget *_input_widget = NULL;
1935274
 
1935274
 /* functions prototype */
1935274
 static void     ibus_im_context_class_init  (IBusIMContextClass    *class);
1935274
+static void     ibus_im_context_class_fini  (IBusIMContextClass    *class);
1935274
 static void     ibus_im_context_init        (GObject               *obj);
1935274
 static void     ibus_im_context_finalize    (GObject               *obj);
1935274
 static void     ibus_im_context_reset       (GtkIMContext          *context);
1935274
@@ -152,10 +153,10 @@ ibus_im_context_register_type (GTypeModule *type_module)
1935274
 
1935274
     static const GTypeInfo ibus_im_context_info = {
1935274
         sizeof (IBusIMContextClass),
1935274
-        (GBaseInitFunc)        NULL,
1935274
-        (GBaseFinalizeFunc)     NULL,
1935274
+        (GBaseInitFunc)      NULL,
1935274
+        (GBaseFinalizeFunc)  NULL,
1935274
         (GClassInitFunc)     ibus_im_context_class_init,
1935274
-        NULL,            /* class finialize */
1935274
+        (GClassFinalizeFunc) ibus_im_context_class_fini,
1935274
         NULL,            /* class data */
1935274
         sizeof (IBusIMContext),
1935274
         0,
1935274
@@ -477,6 +478,16 @@ ibus_im_context_class_init (IBusIMContextClass *class)
1935274
         _key_snooper_id = gtk_key_snooper_install (_key_snooper_cb, NULL);
1935274
 }
1935274
 
1935274
+static void
1935274
+ibus_im_context_class_fini (IBusIMContextClass *class)
1935274
+{
1935274
+    if (_key_snooper_id != 0) {
1935274
+        IDEBUG ("snooper is terminated.");
1935274
+        gtk_key_snooper_remove (_key_snooper_id);
1935274
+        _key_snooper_id = 0;
1935274
+    }
1935274
+}
1935274
+
1935274
 /* Copied from gtk+2.0-2.20.1/modules/input/imcedilla.c to fix crosbug.com/11421.
1935274
  * Overwrite the original Gtk+'s compose table in gtk+-2.x.y/gtk/gtkimcontextsimple.c. */
1935274
 
1935274
@@ -601,12 +612,6 @@ ibus_im_context_finalize (GObject *obj)
1935274
         pango_attr_list_unref (ibusimcontext->preedit_attrs);
1935274
     }
1935274
 
1935274
-    if (_key_snooper_id != 0) {
1935274
-        IDEBUG ("snooper is terminated.");
1935274
-        gtk_key_snooper_remove (_key_snooper_id);
1935274
-        _key_snooper_id = 0;
1935274
-    }
1935274
-
1935274
     G_OBJECT_CLASS(parent_class)->finalize (obj);
1935274
 }
1935274
 
1935274
-- 
1935274
1.7.4.1
1935274
1935274
From c0489ba017f298e51efe86bc7f5def1928389197 Mon Sep 17 00:00:00 2001
1935274
From: fujiwarat <takao.fujiwara1@gmail.com>
1935274
Date: Fri, 11 Mar 2011 15:53:53 +0900
1935274
Subject: [PATCH] Fix preedit_string = NULL in ibus-x11 _free_ic()
1935274
1935274
---
1935274
 client/x11/main.c |    1 +
1935274
 1 files changed, 1 insertions(+), 0 deletions(-)
1935274
1935274
diff --git a/client/x11/main.c b/client/x11/main.c
1935274
index a2967cc..16104de 100644
1935274
--- a/client/x11/main.c
1935274
+++ b/client/x11/main.c
1935274
@@ -526,6 +526,7 @@ _free_ic (gpointer data, gpointer user_data)
1935274
     g_return_if_fail (x11ic != NULL);
1935274
 
1935274
     g_free (x11ic->preedit_string);
1935274
+    x11ic->preedit_string = NULL;
1935274
 
1935274
     if (x11ic->preedit_attrs) {
1935274
         g_object_unref (x11ic->preedit_attrs);
1935274
-- 
1935274
1.7.4.1
38194cc
1640e30
From b9b2c42596e1a7394e89c11025074aed2fcb099a Mon Sep 17 00:00:00 2001
1640e30
From: Peng Huang <shawn.p.huang@gmail.com>
1640e30
Date: Wed, 16 Mar 2011 10:02:47 -0400
1640e30
Subject: [PATCH] Fix issue of InputContext.SetEngine.
1640e30
1640e30
InputContext.SetEngine returns error sometimes, because "request-engine"
1640e30
signal handler calls an async function to set the engine of the context.
1640e30
So checking context->engine != NULL just after emiting "request-engine"
1640e30
signal is not correct.
1640e30
1640e30
BUG=none
1640e30
TEST=Linux desktop
1640e30
1640e30
Review URL: http://codereview.appspot.com/4287049
1640e30
---
1640e30
 bus/ibusimpl.c      |   68 ++++++++++++++++++++++++-----------
1640e30
 bus/inputcontext.c  |   97 +++++++++++++++++++++++++++++++++++++++++++--------
1640e30
 bus/marshalers.list |   14 ++++----
1640e30
 3 files changed, 136 insertions(+), 43 deletions(-)
1640e30
1640e30
diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
1640e30
index 8d4ec36..5a8e134 100644
1640e30
--- a/bus/ibusimpl.c
1640e30
+++ b/bus/ibusimpl.c
1640e30
@@ -186,6 +186,9 @@ static BusInputContext
1640e30
                                                 (BusIBusImpl        *ibus,
1640e30
                                                  BusConnection      *connection,
1640e30
                                                  const gchar        *client);
1640e30
+static IBusEngineDesc
1640e30
+               *bus_ibus_impl_get_engine_desc   (BusIBusImpl        *ibus,
1640e30
+                                                 const gchar        *engine_name);
1640e30
 /* some callback functions */
1640e30
 static void     _context_engine_changed_cb      (BusInputContext    *context,
1640e30
                                                  BusIBusImpl        *ibus);
1640e30
@@ -975,21 +978,30 @@ _find_engine_desc_by_name (BusIBusImpl *ibus,
1640e30
  *
1640e30
  * A callback function to be called when the "request-engine" signal is sent to the context.
1640e30
  */
1640e30
-static void
1640e30
+static IBusEngineDesc *
1640e30
 _context_request_engine_cb (BusInputContext *context,
1640e30
                             const gchar     *engine_name,
1640e30
                             BusIBusImpl     *ibus)
1640e30
 {
1640e30
-    IBusEngineDesc *desc = NULL;
1640e30
+    return bus_ibus_impl_get_engine_desc (ibus, engine_name);
1640e30
+}
1640e30
 
1640e30
-    /* context should has focus before request an engine */
1640e30
-    g_return_if_fail (bus_input_context_has_focus (context) ||
1640e30
-                      context == ibus->focused_context);
1640e30
+/**
1640e30
+ * bus_ibus_impl_get_engine_desc:
1640e30
+ *
1640e30
+ * Get the IBusEngineDesc by engine_name. If the engine_name is NULL, return
1640e30
+ * a default engine desc.
1640e30
+ */
1640e30
+static IBusEngineDesc *
1640e30
+bus_ibus_impl_get_engine_desc (BusIBusImpl *ibus,
1640e30
+                               const gchar *engine_name)
1640e30
+{
1640e30
+    IBusEngineDesc *desc = NULL;
1640e30
 
1640e30
     if (engine_name != NULL && engine_name[0] != '\0') {
1640e30
         /* request engine by name */
1640e30
         desc = _find_engine_desc_by_name (ibus, engine_name);
1640e30
-        g_return_if_fail (desc != NULL);
1640e30
+        g_return_val_if_fail (desc != NULL, NULL);
1640e30
     }
1640e30
     else {
1640e30
         /* Use global engine if possible. */
1640e30
@@ -1018,11 +1030,11 @@ _context_request_engine_cb (BusInputContext *context,
1640e30
              * not find any default engines. another possiblity is that the
1640e30
              * user hasn't installed an engine yet? just give up. */
1640e30
             g_warning ("No engine is available. Run ibus-setup first.");
1640e30
-            return;
1640e30
+            return NULL;
1640e30
         }
1640e30
     }
1640e30
 
1640e30
-    bus_ibus_impl_set_context_engine_from_desc (ibus, context, desc);
1640e30
+    return desc;
1640e30
 }
1640e30
 
1640e30
 /**
1640e30
@@ -1041,7 +1053,11 @@ bus_ibus_impl_context_request_next_engine_in_menu (BusIBusImpl     *ibus,
1640e30
 
1640e30
     engine = bus_input_context_get_engine (context);
1640e30
     if (engine == NULL) {
1640e30
-        _context_request_engine_cb (context, NULL, ibus);
1640e30
+        desc = bus_ibus_impl_get_engine_desc (ibus, NULL);
1640e30
+        if (desc != NULL)
1640e30
+            bus_ibus_impl_set_context_engine_from_desc (ibus,
1640e30
+                                                        context,
1640e30
+                                                        desc);
1640e30
         return;
1640e30
     }
1640e30
 
1640e30
@@ -1112,7 +1128,14 @@ bus_ibus_impl_context_request_previous_engine (BusIBusImpl     *ibus,
1640e30
         bus_ibus_impl_context_request_next_engine_in_menu (ibus, context);
1640e30
         return;
1640e30
     }
1640e30
-    _context_request_engine_cb (context, engine_name, ibus);
1640e30
+
1640e30
+    IBusEngineDesc *desc = NULL;
1640e30
+    desc = bus_ibus_impl_get_engine_desc (ibus, engine_name);
1640e30
+    if (desc != NULL) {
1640e30
+        bus_ibus_impl_set_context_engine_from_desc (ibus,
1640e30
+                                                    context,
1640e30
+                                                    desc);
1640e30
+    }
1640e30
 }
1640e30
 
1640e30
 static void
1640e30
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
1640e30
index c226a20..6d65830 100644
1640e30
--- a/bus/inputcontext.c
1640e30
+++ b/bus/inputcontext.c
1640e30
@@ -20,11 +20,13 @@
1640e30
  * Boston, MA 02111-1307, USA.
1640e30
  */
1640e30
 #include "inputcontext.h"
1640e30
-#include "types.h"
1640e30
-#include "marshalers.h"
1640e30
-#include "ibusimpl.h"
1640e30
+
1640e30
 #include "engineproxy.h"
1640e30
 #include "factoryproxy.h"
1640e30
+#include "ibusimpl.h"
1640e30
+#include "marshalers.h"
1640e30
+#include "option.h"
1640e30
+#include "types.h"
1640e30
 
1640e30
 struct _SetEngineByDescData {
1640e30
     /* context related to the data */
1640e30
@@ -565,8 +567,8 @@ bus_input_context_class_init (BusInputContextClass *class)
1640e30
             G_SIGNAL_RUN_LAST,
1640e30
             0,
1640e30
             NULL, NULL,
1640e30
-            bus_marshal_VOID__STRING,
1640e30
-            G_TYPE_NONE,
1640e30
+            bus_marshal_OBJECT__STRING,
1640e30
+            IBUS_TYPE_ENGINE_DESC,
1640e30
             1,
1640e30
             G_TYPE_STRING);
1640e30
 
1640e30
@@ -917,6 +919,26 @@ _ic_is_enabled (BusInputContext       *context,
1640e30
     g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", context->enabled));
1640e30
 }
1640e30
 
1640e30
+static void
1640e30
+_ic_set_engine_done (BusInputContext       *context,
1640e30
+                     GAsyncResult          *res,
1640e30
+                     GDBusMethodInvocation *invocation)
1640e30
+{
1640e30
+    gboolean retval = FALSE;
1640e30
+    GError *error = NULL;
1640e30
+
1640e30
+    retval = bus_input_context_set_engine_by_desc_finish (context,
1640e30
+                    res, &error);
1640e30
+
1640e30
+    if (!retval) {
1640e30
+        g_dbus_method_invocation_return_gerror (invocation, error);
1640e30
+        g_error_free (error);
1640e30
+    }
1640e30
+    else {
1640e30
+        g_dbus_method_invocation_return_value (invocation, NULL);
1640e30
+    }
1640e30
+}
1640e30
+
1640e30
 /**
1640e30
  * _ic_set_engine:
1640e30
  *
1640e30
@@ -930,16 +952,34 @@ _ic_set_engine (BusInputContext       *context,
1640e30
     gchar *engine_name = NULL;
1640e30
     g_variant_get (parameters, "(&s)", &engine_name);
1640e30
 
1640e30
-    g_signal_emit (context, context_signals[REQUEST_ENGINE], 0, engine_name);
1640e30
-
1640e30
-    if (context->engine == NULL) {
1640e30
-        g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
1640e30
-                        "Can not find engine '%s'.", engine_name);
1640e30
+    if (!bus_input_context_has_focus (context)) {
1640e30
+        g_dbus_method_invocation_return_error (invocation,
1640e30
+                G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
1640e30
+                "Context which does not has focus can not change engine to %s.",
1640e30
+                engine_name);
1640e30
+        return;
1640e30
     }
1640e30
-    else {
1640e30
-        bus_input_context_enable (context);
1640e30
-        g_dbus_method_invocation_return_value (invocation, NULL);
1640e30
+
1640e30
+    IBusEngineDesc *desc = NULL;
1640e30
+    g_signal_emit (context,
1640e30
+                   context_signals[REQUEST_ENGINE], 0,
1640e30
+                   engine_name,
1640e30
+                   &desc);
1640e30
+    if (desc == NULL) {
1640e30
+        g_dbus_method_invocation_return_error (invocation,
1640e30
+                        G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
1640e30
+                        "Can not find engine %s.", engine_name);
1640e30
+        return;
1640e30
     }
1640e30
+
1640e30
+    bus_input_context_set_engine_by_desc (context,
1640e30
+                            desc,
1640e30
+                            g_gdbus_timeout,
1640e30
+                            NULL,
1640e30
+                            (GAsyncReadyCallback)_ic_set_engine_done,
1640e30
+                            invocation);
1640e30
+
1640e30
+    g_object_unref (desc);
1640e30
 }
1640e30
 
1640e30
 /**
1640e30
@@ -1045,7 +1085,21 @@ bus_input_context_focus_in (BusInputContext *context)
1640e30
 
1640e30
     if (context->engine == NULL && context->enabled) {
1640e30
         /* request an engine, e.g. a global engine if the feature is enabled. */
1640e30
-        g_signal_emit (context, context_signals[REQUEST_ENGINE], 0, NULL);
1640e30
+        IBusEngineDesc *desc = NULL;
1640e30
+        g_signal_emit (context,
1640e30
+                       context_signals[REQUEST_ENGINE], 0,
1640e30
+                       NULL,
1640e30
+                       &desc);
1640e30
+
1640e30
+        if (desc != NULL) {
1640e30
+            bus_input_context_set_engine_by_desc (context,
1640e30
+                            desc,
1640e30
+                            g_gdbus_timeout, /* timeout in msec. */
1640e30
+                            NULL, /* we do not cancel the call. */
1640e30
+                            NULL, /* use the default callback function. */
1640e30
+                            NULL);
1640e30
+            g_object_unref (desc);
1640e30
+        }
1640e30
     }
1640e30
 
1640e30
     if (context->engine && context->enabled) {
1640e30
@@ -1927,7 +1981,20 @@ bus_input_context_enable (BusInputContext *context)
1640e30
     }
1640e30
 
1640e30
     if (context->engine == NULL) {
1640e30
-        g_signal_emit (context, context_signals[REQUEST_ENGINE], 0, NULL);
1640e30
+        IBusEngineDesc *desc = NULL;
1640e30
+        g_signal_emit (context,
1640e30
+                       context_signals[REQUEST_ENGINE], 0,
1640e30
+                       NULL,
1640e30
+                       &desc);
1640e30
+        if (desc != NULL) {
1640e30
+            bus_input_context_set_engine_by_desc (context,
1640e30
+                            desc,
1640e30
+                            g_gdbus_timeout, /* timeout in msec. */
1640e30
+                            NULL, /* we do not cancel the call. */
1640e30
+                            NULL, /* use the default callback function. */
1640e30
+                            NULL);
1640e30
+            g_object_unref (desc);
1640e30
+        }
1640e30
     }
1640e30
 
1640e30
     if (context->engine == NULL)
1640e30
diff --git a/bus/marshalers.list b/bus/marshalers.list
1640e30
index 15bdf02..159bc24 100644
1640e30
--- a/bus/marshalers.list
1640e30
+++ b/bus/marshalers.list
1640e30
@@ -1,13 +1,13 @@
1640e30
-VOID:VOID
1640e30
-VOID:STRING
1640e30
-VOID:OBJECT
1640e30
+BOOL:UINT,UINT,UINT
1640e30
+OBJECT:STRING
1640e30
 VOID:INT,UINT
1640e30
-VOID:UINT,UINT,UINT
1640e30
 VOID:INT,INT,INT,INT
1640e30
-VOID:STRING,INT
1640e30
 VOID:OBJECT
1640e30
-VOID:STRING,STRING,STRING
1640e30
 VOID:OBJECT,BOOLEAN
1640e30
 VOID:OBJECT,UINT,BOOLEAN
1640e30
 VOID:OBJECT,UINT,BOOLEAN,UINT
1640e30
-BOOL:UINT,UINT,UINT
1640e30
+VOID:STRING
1640e30
+VOID:STRING,INT
1640e30
+VOID:STRING,STRING,STRING
1640e30
+VOID:UINT,UINT,UINT
1640e30
+VOID:VOID
1640e30
-- 
1640e30
1.7.4.1
1640e30
9aff0cb
From a9a7d77b540826259889aa8c8936b7a3cae1593d Mon Sep 17 00:00:00 2001
9aff0cb
From: fujiwarat <takao.fujiwara1@gmail.com>
9aff0cb
Date: Fri, 25 Mar 2011 13:57:31 +0900
9aff0cb
Subject: [PATCH] Set WM_CLASS name instead of main.py
9aff0cb
9aff0cb
---
7a52852
 ui/gtk/panel.py |   11 ++++++++++-
7a52852
 1 files changed, 11 insertions(+), 1 deletions(-)
9aff0cb
9aff0cb
diff --git a/ui/gtk/panel.py b/ui/gtk/panel.py
9aff0cb
index 07b0fa2..9d63a17 100644
9aff0cb
--- a/ui/gtk/panel.py
9aff0cb
+++ b/ui/gtk/panel.py
7a52852
@@ -37,7 +37,7 @@
7a52852
 
7a52852
 from i18n import _, N_
7a52852
 
7a52852
-ICON_KEYBOARD = "ibus-keyboard"
7a52852
+ICON_KEYBOARD = "input-keyboard-symbolic"
7a52852
 ICON_ENGINE = "ibus-engine"
7a52852
 
7a52852
 def show_uri(screen, link):
9aff0cb
@@ -103,6 +103,16 @@ class Panel(ibus.PanelBase):
9aff0cb
 
9aff0cb
 
9aff0cb
         self.__status_icon = gtk.StatusIcon()
9aff0cb
+        # gnome-shell checks XClassHint.res_class with ShellTrayIcon.
9aff0cb
+        # gtk_status_icon_set_name() can set XClassHint.res_class .
9aff0cb
+        # However gtk_status_icon_new() also calls gtk_window_realize() so
9aff0cb
+        # gtk_status_icon_set_visible() needs to be called to set WM_CLASS
9aff0cb
+        # so that gtk_window_realize() is called later again.
9aff0cb
+        # set_title is for gnome-shell notificationDaemon in bottom right.
9aff0cb
+        self.__status_icon.set_visible(False)
9aff0cb
+        self.__status_icon.set_name('ibus-ui-gtk')
9aff0cb
+        self.__status_icon.set_title(_("IBus Panel"))
9aff0cb
+        self.__status_icon.set_visible(True)
9aff0cb
         self.__status_icon.connect("popup-menu", self.__status_icon_popup_menu_cb)
9aff0cb
         self.__status_icon.connect("activate", self.__status_icon_activate_cb)
9aff0cb
         self.__status_icon.set_from_icon_name(ICON_KEYBOARD)
9aff0cb
-- 
9aff0cb
1.7.4.1
9aff0cb