Add the engine preference button on ibus-setup
authorfujiwarat <takao.fujiwara1@gmail.com>
Wed, 30 Nov 2011 03:28:22 +0000 (12:28 +0900)
committerfujiwarat <takao.fujiwara1@gmail.com>
Wed, 30 Nov 2011 03:28:22 +0000 (12:28 +0900)
The new preference button launches $libexecdir/ibus-setup- + engine.name
by default. The engine is IBusEngineDesc.
If engine.setup has a value, the button launches it instead.

BUG=RH#618229
TEST=Linux desktop

Review URL: http://codereview.appspot.com/5437062

ibus/enginedesc.py
setup/ibus-setup.in
setup/main.py
setup/setup.ui
src/ibusenginedesc.c
src/ibusenginedesc.h

index 3ca7f24..055a3a0 100644 (file)
@@ -31,7 +31,7 @@ from serializable import *
 class EngineDesc(Serializable):
     __gtype_name__ = "PYIBusEngineDesc"
     __NAME__ = "IBusEngineDesc"
-    def __init__(self, name="", longname="", description="", language="", license="", author="", icon="", layout="", hotkeys="", rank=0, symbol=""):
+    def __init__(self, name="", longname="", description="", language="", license="", author="", icon="", layout="", hotkeys="", rank=0, symbol="", setup=""):
         super(EngineDesc, self).__init__()
         self.__name = name
         self.__longname = longname
@@ -44,6 +44,7 @@ class EngineDesc(Serializable):
         self.__rank = rank
         self.__hotkeys = hotkeys
         self.__symbol = symbol
+        self.__setup = setup
 
     def get_name(self):
         return self.__name
@@ -78,6 +79,9 @@ class EngineDesc(Serializable):
     def get_symbol(self):
         return self.__symbol
 
+    def get_setup(self):
+        return self.__setup
+
     name        = property(get_name)
     longname    = property(get_longname)
     description = property(get_description)
@@ -89,6 +93,7 @@ class EngineDesc(Serializable):
     rank        = property(get_rank)
     hotkeys     = property(get_hotkeys)
     symbol      = property(get_symbol)
+    setup       = property(get_setup)
 
     def serialize(self, struct):
         super(EngineDesc, self).serialize(struct)
@@ -103,6 +108,7 @@ class EngineDesc(Serializable):
         struct.append(dbus.UInt32(self.__rank))
         struct.append(dbus.String(self.__hotkeys))
         struct.append(dbus.String(self.__symbol))
+        struct.append(dbus.String(self.__setup))
 
     def deserialize(self, struct):
         super(EngineDesc, self).deserialize(struct)
@@ -117,9 +123,10 @@ class EngineDesc(Serializable):
         self.__rank = struct.pop(0)
         self.__hotkeys = struct.pop(0)
         self.__symbol = struct.pop(0)
+        self.__setup  = struct.pop(0)
 
 def test():
-    engine = EngineDesc("Hello", "", "", "", "", "", "", "", "", 0, "")
+    engine = EngineDesc("Hello", "", "", "", "", "", "", "", "", 0, "", "")
     value = serialize_object(engine)
     engine = deserialize_object(value)
 
index 72bc1a4..f3c3730 100644 (file)
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 datarootdir=@datarootdir@
+libexecdir=@libexecdir@
 export IBUS_PREFIX=@prefix@
 export IBUS_DATAROOTDIR=@datarootdir@
 export IBUS_LOCALEDIR=@localedir@
+export IBUS_LIBEXECDIR=${libexecdir}
 exec @PYTHON@ @prefix@/share/ibus/setup/main.py $@
 
index a22bb0c..6c0fb0e 100644 (file)
@@ -238,6 +238,10 @@ class Setup(object):
         button = self.__builder.get_object("button_engine_about")
         button.connect("clicked", self.__button_engine_about_cb)
 
+        self.__engine_setup_exec_list = {}
+        button = self.__builder.get_object("button_engine_preferences")
+        button.connect("clicked", self.__button_engine_preferences_cb)
+
         self.__combobox.connect("notify::active-engine", self.__combobox_notify_active_engine_cb)
         self.__treeview.connect("notify", self.__treeview_notify_cb)
 
@@ -246,6 +250,24 @@ class Setup(object):
         button = self.__builder.get_object("button_engine_add")
         button.set_sensitive(engine != None and engine not in self.__treeview.get_engines())
 
+    def __get_engine_setup_exec_args(self, engine):
+        args = []
+        if engine == None:
+           return args
+        setup = str(engine.setup)
+        if len(setup) != 0:
+            args = setup.split()
+            args.insert(1, path.basename(args[0]))
+            return args
+        name = str(engine.name)
+        libexecdir = os.environ['IBUS_LIBEXECDIR']
+        setup_path = (libexecdir + '/' + 'ibus-setup-' if libexecdir != None \
+            else 'ibus-setup-') + name.split(':')[0]
+        if path.exists(setup_path):
+            args.append(setup_path)
+            args.append(path.basename(setup_path))
+        return args
+
     def __treeview_notify_cb(self, treeview, property):
         if property.name != "active-engine" and property.name != "engines":
             return
@@ -258,6 +280,12 @@ class Setup(object):
         self.__builder.get_object("button_engine_up").set_sensitive(engine not in engines[:1])
         self.__builder.get_object("button_engine_down").set_sensitive(engine not in engines[-1:])
 
+        obj = self.__builder.get_object("button_engine_preferences")
+        if len(self.__get_engine_setup_exec_args(engine)) != 0:
+            obj.set_sensitive(True)
+        else:
+            obj.set_sensitive(False)
+
         if property.name == "engines":
             engine_names = map(lambda e: e.name, engines)
             self.__config.set_list("general", "preload_engines", engine_names, "s")
@@ -273,6 +301,24 @@ class Setup(object):
             about.run()
             about.destroy()
 
+    def __button_engine_preferences_cb(self, button):
+        engine = self.__treeview.get_active_engine()
+        args = self.__get_engine_setup_exec_args(engine)
+        if len(args) == 0:
+            return
+        name = engine.name
+        if name in self.__engine_setup_exec_list.keys():
+            try:
+                wpid, sts = os.waitpid(self.__engine_setup_exec_list[name],
+                                       os.WNOHANG)
+                # the setup is still running.
+                if wpid == 0:
+                    return
+            except OSError:
+                pass
+            del self.__engine_setup_exec_list[name]
+        self.__engine_setup_exec_list[name] = os.spawnl(os.P_NOWAIT, *args)
+
     def __init_bus(self):
         try:
             self.__bus = ibus.Bus()
index 0a69df8..c7ff564 100644 (file)
                                     <property name="position">4</property>
                                   </packing>
                                 </child>
+                                <child>
+                                  <object class="GtkButton" id="button_engine_preferences">
+                                    <property name="label">gtk-preferences</property>
+                                    <property name="visible">True</property>
+                                    <property name="sensitive">False</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">True</property>
+                                    <property name="tooltip_text" translatable="yes">Show setup of the selected input method</property>
+                                    <property name="use_stock">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">5</property>
+                                  </packing>
+                                </child>
                               </object>
                             </child>
                           </object>
index fa3a768..48ecb07 100644 (file)
@@ -40,6 +40,7 @@ enum {
     PROP_RANK,
     PROP_HOTKEYS,
     PROP_SYMBOL,
+    PROP_SETUP,
 };
 
 
@@ -56,6 +57,7 @@ struct _IBusEngineDescPrivate {
     guint       rank;
     gchar      *hotkeys;
     gchar      *symbol;
+    gchar      *setup;
 };
 
 #define IBUS_ENGINE_DESC_GET_PRIVATE(o)  \
@@ -247,6 +249,19 @@ ibus_engine_desc_class_init (IBusEngineDescClass *class)
                         "The icon symbol chars of engine description",
                         "",
                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+    /**
+     * IBusEngineDesc:setup:
+     *
+     * The exec lists of the engine setup command
+     */
+    g_object_class_install_property (gobject_class,
+                    PROP_SETUP,
+                    g_param_spec_string ("setup",
+                        "setup args",
+                        "The exec lists of the engine setup command",
+                        "",
+                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 }
 
 static void
@@ -265,6 +280,7 @@ ibus_engine_desc_init (IBusEngineDesc *desc)
     desc->priv->rank = 0;
     desc->priv->hotkeys = NULL;
     desc->priv->symbol = NULL;
+    desc->priv->setup = NULL;
 }
 
 static void
@@ -280,6 +296,7 @@ ibus_engine_desc_destroy (IBusEngineDesc *desc)
     g_free (desc->priv->layout);
     g_free (desc->priv->hotkeys);
     g_free (desc->priv->symbol);
+    g_free (desc->priv->setup);
 
     IBUS_OBJECT_CLASS (ibus_engine_desc_parent_class)->destroy (IBUS_OBJECT (desc));
 }
@@ -334,6 +351,10 @@ ibus_engine_desc_set_property (IBusEngineDesc *desc,
         g_assert (desc->priv->symbol == NULL);
         desc->priv->symbol = g_value_dup_string (value);
         break;
+    case PROP_SETUP:
+        g_assert (desc->priv->setup == NULL);
+        desc->priv->setup = g_value_dup_string (value);
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec);
     }
@@ -379,6 +400,9 @@ ibus_engine_desc_get_property (IBusEngineDesc *desc,
     case PROP_SYMBOL:
         g_value_set_string (value, ibus_engine_desc_get_symbol (desc));
         break;
+    case PROP_SETUP:
+        g_value_set_string (value, ibus_engine_desc_get_setup (desc));
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec);
     }
@@ -410,6 +434,7 @@ ibus_engine_desc_serialize (IBusEngineDesc  *desc,
     g_variant_builder_add (builder, "u", desc->priv->rank);
     g_variant_builder_add (builder, "s", NOTNULL (desc->priv->hotkeys));
     g_variant_builder_add (builder, "s", NOTNULL (desc->priv->symbol));
+    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->setup));
 #undef NOTNULL
 
     return TRUE;
@@ -439,6 +464,7 @@ ibus_engine_desc_deserialize (IBusEngineDesc *desc,
     g_variant_get_child (variant, retval++, "u", &desc->priv->rank);
     g_variant_get_child (variant, retval++, "s", &desc->priv->hotkeys);
     g_variant_get_child (variant, retval++, "s", &desc->priv->symbol);
+    g_variant_get_child (variant, retval++, "s", &desc->priv->setup);
 
     return retval;
 }
@@ -464,6 +490,7 @@ ibus_engine_desc_copy (IBusEngineDesc       *dest,
     dest->priv->rank             = src->priv->rank;
     dest->priv->hotkeys          = g_strdup (src->priv->hotkeys);
     dest->priv->symbol           = g_strdup (src->priv->symbol);
+    dest->priv->setup            = g_strdup (src->priv->setup);
     return TRUE;
 }
 
@@ -502,6 +529,7 @@ ibus_engine_desc_output (IBusEngineDesc *desc,
     OUTPUT_ENTRY_1(layout);
     OUTPUT_ENTRY_1(hotkeys);
     OUTPUT_ENTRY_1(symbol);
+    OUTPUT_ENTRY_1(setup);
     g_string_append_indent (output, indent + 1);
     g_string_append_printf (output, "<rank>%u</rank>\n", desc->priv->rank);
 #undef OUTPUT_ENTRY
@@ -536,6 +564,7 @@ ibus_engine_desc_parse_xml_node (IBusEngineDesc *desc,
         PARSE_ENTRY_1(layout);
         PARSE_ENTRY_1(hotkeys);
         PARSE_ENTRY_1(symbol);
+        PARSE_ENTRY_1(setup);
 #undef PARSE_ENTRY
 #undef PARSE_ENTRY_1
         if (g_strcmp0 (sub_node->name , "rank") == 0) {
@@ -565,6 +594,7 @@ IBUS_ENGINE_DESC_GET_PROPERTY (layout, const gchar *)
 IBUS_ENGINE_DESC_GET_PROPERTY (rank, guint)
 IBUS_ENGINE_DESC_GET_PROPERTY (hotkeys, const gchar *)
 IBUS_ENGINE_DESC_GET_PROPERTY (symbol, const gchar *)
+IBUS_ENGINE_DESC_GET_PROPERTY (setup, const gchar *)
 #undef IBUS_ENGINE_DESC_GET_PROPERTY
 
 IBusEngineDesc *
@@ -613,6 +643,7 @@ ibus_engine_desc_new_varargs (const gchar *first_property_name, ...)
     g_assert (desc->priv->layout);
     g_assert (desc->priv->hotkeys);
     g_assert (desc->priv->symbol);
+    g_assert (desc->priv->setup);
 
     return desc;
 }
index 76a7adc..928743e 100644 (file)
@@ -255,8 +255,16 @@ const gchar     *ibus_engine_desc_get_hotkeys   (IBusEngineDesc *info);
  *
  * Return the symbol property in IBusEngineDesc. It should not be freed.
  */
-const gchar     *ibus_engine_desc_get_symbol
-                                                (IBusEngineDesc *info);
+const gchar     *ibus_engine_desc_get_symbol    (IBusEngineDesc *info);
+
+/**
+ * ibus_engine_desc_get_setup:
+ * @info: An IBusEngineDesc
+ * @returns: setup property in IBusEngineDesc
+ *
+ * Return the setup property in IBusEngineDesc. It should not be freed.
+ */
+const gchar     *ibus_engine_desc_get_setup     (IBusEngineDesc *info);
 
 /**
  * ibus_engine_desc_output: