Add xkb layouts switch support and add three demo xkb layouts.
authorPeng Huang <shawn.p.huang@gmail.com>
Mon, 5 Dec 2011 20:57:06 +0000 (15:57 -0500)
committerPeng Huang <shawn.p.huang@gmail.com>
Tue, 21 Feb 2012 16:51:01 +0000 (11:51 -0500)
bus/ibusimpl.c
engine/simple.xml.in.in
src/ibusenginesimple.c
ui/gtk3/panel.vala

index 05c7fcd..85890d7 100644 (file)
@@ -353,7 +353,7 @@ bus_ibus_impl_init (BusIBusImpl *ibus)
 
     ibus->keymap = ibus_keymap_get ("us");
 
-    ibus->use_sys_layout = FALSE;
+    ibus->use_sys_layout = TRUE;
     ibus->embed_preedit_text = TRUE;
     ibus->enable_by_default = TRUE;
     ibus->use_global_engine = TRUE;
index 4f626a5..350e50f 100644 (file)
@@ -8,4 +8,36 @@
        <license>GPL</license>
        <homepage>http://code.google.com/p/ibus</homepage>
        <textdomain>ibus</textdomain>
+       <engines>
+               <engine>
+                       <name>xkb:layout:us</name>
+                       <language>en</language>
+                       <license>GPL</license>
+                       <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+                       <layout>us</layout>
+                       <longname>English (United States)</longname>
+                       <description>English (United States)</description>
+                       <rank>99</rank>
+               </engine>
+               <engine>
+                       <name>xkb:layout:us-intl</name>
+                       <language>en</language>
+                       <license>GPL</license>
+                       <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+                       <layout>us(intl)</layout>
+                       <longname>English (United States)</longname>
+                       <description>English (United States)</description>
+                       <rank>99</rank>
+               </engine>
+               <engine>
+                       <name>xkb:layout:fr</name>
+                       <language>fr</language>
+                       <license>GPL</license>
+                       <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+                       <layout>fr</layout>
+                       <longname>France</longname>
+                       <description>France</description>
+                       <rank>99</rank>
+               </engine>
+       </engines>
 </component>
index 1ad58c4..759a0ec 100644 (file)
@@ -315,6 +315,7 @@ check_table (IBusEngineSimple *simple,
              IBusComposeTable *table,
              gint              n_compose)
 {
+    g_debug("check_table");
     IBusEngineSimplePrivate *priv = simple->priv;
     gint row_stride = table->max_seq_len + 2;
     guint16 *seq;
@@ -868,6 +869,7 @@ ibus_engine_simple_process_key_event (IBusEngine *engine,
             if (check_table (simple,
                              (IBusComposeTable *)list->data,
                              n_compose)) {
+                g_debug("check_table returns true");
                 return TRUE;
             }
             list = list->next;
index 7e4162a..dd2bfa9 100644 (file)
@@ -92,7 +92,7 @@ class Panel : IBus.PanelService {
         }
         m_engines[0] = tmp;
 
-        m_bus.set_global_engine(m_engines[0].get_name());
+        switch_engine_by_desc(m_engines[0]);
     }
 
     private void handle_engine_switch(Gdk.Event event, bool revert) {
@@ -118,7 +118,7 @@ class Panel : IBus.PanelService {
         if (variant != null)
             engine_names = variant.dup_strv();
         else
-            engine_names = {"xkb:us:eng", "pinyin", "anthy"};
+            engine_names = {"xkb:layout:us", "pinyin", "anthy"};
 
         m_engines = m_bus.get_engines_by_names(engine_names);
         m_ime_menu = null;
@@ -141,6 +141,23 @@ class Panel : IBus.PanelService {
                    Gtk.get_current_event_time());
     }
 
+    private void switch_engine_by_desc(IBus.EngineDesc engine) {
+        if (!m_bus.set_global_engine(engine.get_name())) {
+            warning("Switch engine to %s failed.", engine.get_name());
+            return;
+        }
+        // set xkb layout
+        string cmdline = "setxkbmap %s".printf(engine.get_layout());
+        try {
+            if (!GLib.Process.spawn_command_line_sync(cmdline)) {
+                warning("Switch xkb layout to %s failed.",
+                    engine.get_layout());
+            }
+        } catch (GLib.SpawnError e) {
+            warning("execute setxkblayout failed");
+        }
+    }
+
     private void status_icon_activate(Gtk.StatusIcon status_icon) {
         if (m_ime_menu == null) {
             int width, height;
@@ -158,7 +175,7 @@ class Panel : IBus.PanelService {
                 // https://bugzilla.gnome.org/show_bug.cgi?id=628336
                 var e = engine;
                 item.activate.connect((i) => {
-                    m_bus.set_global_engine(e.get_name());
+                    switch_engine_by_desc(e);
                 });
                 m_ime_menu.add(item);
             }