[ibus-skk] Update to 1.3.5-2.

Daiki Ueno ueno at fedoraproject.org
Tue Mar 8 06:26:50 UTC 2011


commit c4649c472815f77ca4519430399ad788013fc5ef
Author: Daiki Ueno <ueno at unixuser.org>
Date:   Tue Mar 8 15:28:09 2011 +0900

    Update to 1.3.5-2.

 ibus-skk-vkbd.patch | 2374 +++++++++++++++++++++++++++++++++++++++++++++++++++
 ibus-skk.spec       |    7 +-
 2 files changed, 2380 insertions(+), 1 deletions(-)
---
diff --git a/ibus-skk-vkbd.patch b/ibus-skk-vkbd.patch
new file mode 100644
index 0000000..8627304
--- /dev/null
+++ b/ibus-skk-vkbd.patch
@@ -0,0 +1,2374 @@
+diff --git a/engine/Makefile.am b/engine/Makefile.am
+index 3140cfe..153e487 100644
+--- a/engine/Makefile.am
++++ b/engine/Makefile.am
+@@ -25,9 +25,15 @@ engine_skk_PYTHON = \
+ 	skk.py \
+ 	kzik.py \
+ 	nicola.py \
++	vkbd.py \
+ 	$(NULL)
+ engine_skkdir = $(pkgdatadir)/engine
+ 
++dist_engine_vkbd_DATA = \
++	qwerty.xml \
++	table.xml
++engine_vkbddir = $(pkgdatadir)/vkbd
++
+ libexec_SCRIPTS = ibus-engine-skk
+ engine_DATA = skk.xml
+ enginedir = $(datadir)/ibus/component
+diff --git a/engine/engine.py b/engine/engine.py
+index a998307..bc2b124 100644
+--- a/engine/engine.py
++++ b/engine/engine.py
+@@ -28,6 +28,10 @@ import sys, os, os.path, time
+ import skk
+ import nicola
+ try:
++    import vkbd
++except:
++    pass
++try:
+     from gtk import clipboard_get
+ except ImportError:
+     clipboard_get = lambda a : None
+@@ -36,10 +40,6 @@ from gettext import dgettext
+ _  = lambda a : dgettext("ibus-skk", a)
+ N_ = lambda a : a
+ 
+-# Work-around for older IBus releases.
+-if not hasattr(ibus, 'ORIENTATION_HORIZONTAL'):
+-    ibus.ORIENTATION_HORIZONTAL = 0
+-
+ class CandidateSelector(skk.CandidateSelector):
+     def __init__(self, lookup_table, keys, page_size, pagination_start):
+         self.__lookup_table = lookup_table
+@@ -57,7 +57,7 @@ class CandidateSelector(skk.CandidateSelector):
+         if self.index() >= self.pagination_start:
+             return True
+         return False
+-        
++    
+     def next_candidate(self, move_over_pages=True):
+         super(CandidateSelector, self).next_candidate(move_over_pages)
+         if self.lookup_table_visible():
+@@ -80,7 +80,7 @@ class CandidateSelector(skk.CandidateSelector):
+ 
+     __emacsclient_paths = ('/usr/bin/emacsclient',
+                            '/usr/local/bin/emacsclient')
+-                     
++    
+     def candidate(self):
+         candidate = super(CandidateSelector, self).candidate()
+         if candidate is None:
+@@ -129,7 +129,7 @@ class Engine(ibus.EngineBase):
+     __select_keys = [u'a', u's', u'd', u'f', u'j', u'k', u'l',
+                      u'q', u'w', u'e', u'r', u'u', u'i', u'o',
+                      u'z', u'x', u'c', u'v', u'm', u',', u'.']
+-     
++    
+     __input_mode_prop_names = {
+         skk.INPUT_MODE_HIRAGANA : u"InputMode.Hiragana",
+         skk.INPUT_MODE_KATAKANA : u"InputMode.Katakana",
+@@ -187,11 +187,21 @@ class Engine(ibus.EngineBase):
+             _(u'Kuten([MM]KKTT) ').decode('UTF-8')
+         self.__skk.custom_rom_kana_rule = \
+             self.config.get_value('custom_rom_kana_rule')
++
++        vkbd_qwerty_path = os.path.join(os.getenv('IBUS_SKK_PKGDATADIR'),
++                                        'vkbd', 'qwerty.xml')
++        vkbd_table_path = os.path.join(os.getenv('IBUS_SKK_PKGDATADIR'),
++                                       'vkbd', 'table.xml')
++        try:
++            self.__vkbd = vkbd.Vkbd(self, vkbd_qwerty_path, vkbd_table_path)
++        except:
++            self.__vkbd = None
++
+         self.__skk.reset()
+         self.__skk.activate_input_mode(self.__initial_input_mode)
+         self.__prop_dict = dict()
+         self.__prop_list = self.__init_props()
+-        self.__input_mode = skk.INPUT_MODE_NONE
++        self.__input_mode = None
+         self.__update_input_mode()
+         self.__suspended_mode = None
+         if self.config.get_value('use_nicola'):
+@@ -200,6 +210,7 @@ class Engine(ibus.EngineBase):
+         else:
+             self.__nicola = None
+ 
++    input_mode = property(lambda self: self.__input_mode)
+ 
+     def __init_props(self):
+         skk_props = ibus.PropList()
+@@ -235,9 +246,15 @@ class Engine(ibus.EngineBase):
+         input_mode_prop.set_sub_props(props)
+         skk_props.append(input_mode_prop)
+ 
++        if self.__vkbd:
++            keyboard_prop = ibus.Property(key=u"Keyboard",
++                                          icon=u"eekboard",
++                                          tooltip=_(u"Launch on-screen keyboard"))
++            skk_props.append(keyboard_prop)
++
+         skk_props.append(ibus.Property(key=u"setup",
+                                        tooltip=_(u"Configure SKK")))
+-
++        
+         return skk_props
+ 
+     def __update_input_mode(self):
+@@ -250,6 +267,8 @@ class Engine(ibus.EngineBase):
+         prop = self.__prop_dict[u"InputMode"]
+         prop.label = self.__input_mode_labels[self.__input_mode]
+         self.update_property(prop)
++        if self.__vkbd:
++            self.__vkbd.update_input_mode(self.__input_mode)
+         self.__invalidate()
+ 
+     def __get_clipboard(self, clipboard, text, data):
+@@ -299,9 +318,9 @@ class Engine(ibus.EngineBase):
+                 except IndexError:
+                     pass
+         elif (self.__skk.dict_edit_level() > 0 or \
+-                self.__skk.conv_state == skk.CONV_STATE_START) and \
+-                (state & modifier.CONTROL_MASK) and \
+-                unichr(keyval).lower() in (u'y', u'v'):
++                  self.__skk.conv_state == skk.CONV_STATE_START) and \
++                  (state & modifier.CONTROL_MASK) and \
++                  unichr(keyval).lower() in (u'y', u'v'):
+             if unichr(keyval).lower() == u'y':
+                 clipboard = clipboard_get ("PRIMARY")
+             else:
+@@ -323,10 +342,17 @@ class Engine(ibus.EngineBase):
+             keychr = u'rshift'
+         else:
+             keychr = unichr(keyval)
+-            if 0x20 > ord(keychr) or ord(keychr) > 0x7E:
++            if self.__vkbd and \
++                    self.__vkbd.keyboard_mode == vkbd.KEYBOARD_MODE_KANA:
++                if keyval == keysyms.Kanji:
++                    keychr = u'kana+kanji'
++                else:
++                    keychr = u'kana+' + keychr
++            elif 0x20 > ord(keychr) or ord(keychr) > 0x7E:
+                 # If the pre-edit buffer is visible, always handle key events:
+                 # http://github.com/ueno/ibus-skk/issues/#issue/5
+                 return len(self.__skk.preedit) > 0
++
+         if state & modifier.CONTROL_MASK:
+             # Some systems return 'J' if ctrl:nocaps xkb option is
+             # enabled and the user press CapsLock + 'j':
+@@ -526,6 +552,8 @@ class Engine(ibus.EngineBase):
+             self.__skk.activate_input_mode(self.__suspended_mode)
+             self.__suspended_mode = None
+         self.__update_input_mode()
++        if self.__vkbd:
++            self.__vkbd.enable()
+ 
+     def focus_out(self):
+         self.__suspended_mode = self.__skk.input_mode
+@@ -534,6 +562,8 @@ class Engine(ibus.EngineBase):
+         self.__lookup_table.clean()
+         self.__update()
+         self.reset()
++        if self.__vkbd:
++            self.__vkbd.disable()
+ 
+     def reset(self):
+         self.__skk.reset()
+@@ -541,10 +571,17 @@ class Engine(ibus.EngineBase):
+ 
+     def property_activate(self, prop_name, state):
+         # print "PropertyActivate(%s, %d)" % (prop_name, state)
+-        if state == ibus.PROP_STATE_CHECKED:
+-            input_mode = self.__prop_name_input_modes[prop_name]
+-            self.__skk.activate_input_mode(input_mode)
+-            self.__update_input_mode()
++        if prop_name.startswith('InputMode'):
++            if state == ibus.PROP_STATE_CHECKED:
++                input_mode = self.__prop_name_input_modes[prop_name]
++                self.__skk.activate_input_mode(input_mode)
++                self.__update_input_mode()
++        elif prop_name == 'Keyboard' and self.__vkbd:
++            if self.__vkbd.keyboard_mode is None:
++                keyboard_mode = vkbd.KEYBOARD_MODE_US
++            else:
++                keyboard_mode = None
++            self.__vkbd.set_keyboard_mode(keyboard_mode)
+         else:
+             if prop_name == 'setup':
+                 self.__start_setup()
+diff --git a/engine/qwerty.xml b/engine/qwerty.xml
+new file mode 100644
+index 0000000..bf7e2fa
+--- /dev/null
++++ b/engine/qwerty.xml
+@@ -0,0 +1,739 @@
++<?xml version="1.0"?>
++<keyboard version="0.90">
++    <bounds>0.000000,0.000000,410.000000,152.000000</bounds>
++    <section name="Alpha">
++        <bounds>10.000000,10.000000,390.000000,129.000000</bounds>
++        <angle>0</angle>
++        <row>
++            <columns>14</columns>
++            <orientation>1</orientation>
++        </row>
++        <row>
++            <columns>14</columns>
++            <orientation>1</orientation>
++        </row>
++        <row>
++            <columns>13</columns>
++            <orientation>1</orientation>
++        </row>
++        <row>
++            <columns>12</columns>
++            <orientation>1</orientation>
++        </row>
++        <row>
++            <columns>8</columns>
++            <orientation>1</orientation>
++        </row>
++        <key id="keycode105" name="RCTL" column="7" row="4">
++            <bounds>359.000000,104.000000,31.000000,24.000000</bounds>
++            <oref>outline10</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65407" icon="phone">Num_Lock</keysym>
++            </symbols>
++        </key>
++        <key id="keycode65" name="SPCE" column="3" row="4">
++            <bounds>106.000000,104.000000,153.000000,24.000000</bounds>
++            <oref>outline11</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="32">space</keysym>
++            </symbols>
++        </key>
++        <key id="keycode37" name="LCTL" column="0" row="4">
++            <bounds>2.000000,104.000000,36.000000,24.000000</bounds>
++            <oref>outline9</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="65319" label="あいう">Hiragana_Katakana</keysym>
++                <keysym></keysym>
++                <keysym keyval="65328" label="ABC">Eisu_toggle</keysym>
++                <keysym></keysym>
++                <keysym keyval="65328" label="ABC">Eisu_toggle</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode62" name="RTSH" column="11" row="3">
++            <bounds>320.000000,78.000000,70.000000,24.000000</bounds>
++            <oref>outline8</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65506">Shift_R</keysym>
++            </symbols>
++        </key>
++        <key id="keycode61" name="AB10" column="10" row="3">
++            <bounds>294.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="47">slash</keysym>
++                <keysym keyval="63">question</keysym>
++                <keysym keyval="47" label="メ">slash</keysym>
++                <keysym keyval="63" label="・">question</keysym>
++                <keysym keyval="47" label="め">slash</keysym>
++                <keysym keyval="63" label="・">question</keysym>
++            </symbols>
++        </key>
++        <key id="keycode60" name="AB09" column="9" row="3">
++            <bounds>268.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="46">period</keysym>
++                <keysym keyval="62">greater</keysym>
++                <keysym keyval="46" label="ル">period</keysym>
++                <keysym keyval="62" label="。">greater</keysym>
++                <keysym keyval="46" label="る">period</keysym>
++                <keysym keyval="62" label="。">greater</keysym>
++            </symbols>
++        </key>
++        <key id="keycode59" name="AB08" column="8" row="3">
++            <bounds>242.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="44">comma</keysym>
++                <keysym keyval="60">less</keysym>
++                <keysym keyval="44" label="ネ">comma</keysym>
++                <keysym keyval="60" label="、">less</keysym>
++                <keysym keyval="44" label="ね">comma</keysym>
++                <keysym keyval="60" label="、">less</keysym>
++            </symbols>
++        </key>
++        <key id="keycode58" name="AB07" column="7" row="3">
++            <bounds>216.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="109">m</keysym>
++                <keysym keyval="77">M</keysym>
++                <keysym keyval="109" label="モ">m</keysym>
++                <keysym keyval="77" label="">M</keysym>
++                <keysym keyval="109" label="も">m</keysym>
++                <keysym keyval="77" label="">M</keysym>
++            </symbols>
++        </key>
++        <key id="keycode57" name="AB06" column="6" row="3">
++            <bounds>190.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="110">n</keysym>
++                <keysym keyval="78">N</keysym>
++                <keysym keyval="110" label="ミ">n</keysym>
++                <keysym keyval="78" label="">N</keysym>
++                <keysym keyval="110" label="み">n</keysym>
++                <keysym keyval="78" label="">N</keysym>
++            </symbols>
++        </key>
++        <key id="keycode56" name="AB05" column="5" row="3">
++            <bounds>164.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="98">b</keysym>
++                <keysym keyval="66">B</keysym>
++                <keysym keyval="98" label="コ">b</keysym>
++                <keysym keyval="66" label="">B</keysym>
++                <keysym keyval="98" label="こ">b</keysym>
++                <keysym keyval="66" label="">B</keysym>
++            </symbols>
++        </key>
++        <key id="keycode55" name="AB04" column="4" row="3">
++            <bounds>138.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="118">v</keysym>
++                <keysym keyval="86">V</keysym>
++                <keysym keyval="118" label="ヒ">v</keysym>
++                <keysym keyval="86" label="">V</keysym>
++                <keysym keyval="118" label="ひ">v</keysym>
++                <keysym keyval="86" label="">V</keysym>
++            </symbols>
++        </key>
++        <key id="keycode54" name="AB03" column="3" row="3">
++            <bounds>113.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="99">c</keysym>
++                <keysym keyval="67">C</keysym>
++                <keysym keyval="99" label="ソ">c</keysym>
++                <keysym keyval="67" label="">C</keysym>
++                <keysym keyval="99" label="そ">c</keysym>
++                <keysym keyval="67" label="">C</keysym>
++            </symbols>
++        </key>
++        <key id="keycode53" name="AB02" column="2" row="3">
++            <bounds>87.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="120">x</keysym>
++                <keysym keyval="88">X</keysym>
++                <keysym keyval="120" label="サ">x</keysym>
++                <keysym keyval="88" label="">X</keysym>
++                <keysym keyval="120" label="さ">x</keysym>
++                <keysym keyval="88" label="">X</keysym>
++            </symbols>
++        </key>
++        <key id="keycode52" name="AB01" column="1" row="3">
++            <bounds>61.000000,78.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="122">z</keysym>
++                <keysym keyval="90">Z</keysym>
++                <keysym keyval="122" label="ツ">z</keysym>
++                <keysym keyval="90" label="ッ">Z</keysym>
++                <keysym keyval="122" label="つ">z</keysym>
++                <keysym keyval="90" label="っ">Z</keysym>
++            </symbols>
++        </key>
++        <key id="keycode50" name="LFSH" column="0" row="3">
++            <bounds>2.000000,78.000000,57.000000,24.000000</bounds>
++            <oref>outline7</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65505">Shift_L</keysym>
++            </symbols>
++        </key>
++        <key id="keycode36" name="RTRN" column="12" row="2">
++            <bounds>333.000000,53.000000,57.000000,24.000000</bounds>
++            <oref>outline6</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65293">Return</keysym>
++            </symbols>
++        </key>
++        <key id="keycode48" name="AC11" column="11" row="2">
++            <bounds>307.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="39">quoteright</keysym>
++                <keysym keyval="34">quotedbl</keysym>
++                <keysym keyval="58" label="ケ">colon</keysym>
++                <keysym keyval="34" label="">quotedbl</keysym>
++                <keysym keyval="58" label="け">colon</keysym>
++                <keysym keyval="34" label="">quotedbl</keysym>
++            </symbols>
++        </key>
++        <key id="keycode47" name="AC10" column="10" row="2">
++            <bounds>281.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="59">semicolon</keysym>
++                <keysym keyval="58">colon</keysym>
++                <keysym keyval="59" label="レ">semicolon</keysym>
++                <keysym keyval="58" label="">colon</keysym>
++                <keysym keyval="59" label="れ">semicolon</keysym>
++                <keysym keyval="58" label="">colon</keysym>
++            </symbols>
++        </key>
++        <key id="keycode46" name="AC09" column="9" row="2">
++            <bounds>256.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="108">l</keysym>
++                <keysym keyval="76">L</keysym>
++                <keysym keyval="108" label="リ">l</keysym>
++                <keysym keyval="76" label="">L</keysym>
++                <keysym keyval="108" label="り">l</keysym>
++                <keysym keyval="76" label="">L</keysym>
++            </symbols>
++        </key>
++        <key id="keycode45" name="AC08" column="8" row="2">
++            <bounds>230.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="107">k</keysym>
++                <keysym keyval="75">K</keysym>
++                <keysym keyval="107" label="ノ">k</keysym>
++                <keysym keyval="75" label="">K</keysym>
++                <keysym keyval="107" label="の">k</keysym>
++                <keysym keyval="75" label="">K</keysym>
++            </symbols>
++        </key>
++        <key id="keycode44" name="AC07" column="7" row="2">
++            <bounds>204.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="106">j</keysym>
++                <keysym keyval="74">J</keysym>
++                <keysym keyval="106" label="マ">j</keysym>
++                <keysym keyval="74" label="">J</keysym>
++                <keysym keyval="106" label="ま">j</keysym>
++                <keysym keyval="74" label="">J</keysym>
++            </symbols>
++        </key>
++        <key id="keycode43" name="AC06" column="6" row="2">
++            <bounds>178.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="104">h</keysym>
++                <keysym keyval="72">H</keysym>
++                <keysym keyval="104" label="ク">h</keysym>
++                <keysym keyval="72" label="">H</keysym>
++                <keysym keyval="104" label="く">h</keysym>
++                <keysym keyval="72" label="">H</keysym>
++            </symbols>
++        </key>
++        <key id="keycode42" name="AC05" column="5" row="2">
++            <bounds>152.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="103">g</keysym>
++                <keysym keyval="71">G</keysym>
++                <keysym keyval="103" label="キ">g</keysym>
++                <keysym keyval="71" label="">G</keysym>
++                <keysym keyval="103" label="き">g</keysym>
++                <keysym keyval="71" label="">G</keysym>
++            </symbols>
++        </key>
++        <key id="keycode41" name="AC04" column="4" row="2">
++            <bounds>126.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="102">f</keysym>
++                <keysym keyval="70">F</keysym>
++                <keysym keyval="102" label="ハ">f</keysym>
++                <keysym keyval="70" label="">F</keysym>
++                <keysym keyval="102" label="は">f</keysym>
++                <keysym keyval="70" label="">F</keysym>
++            </symbols>
++        </key>
++        <key id="keycode40" name="AC03" column="3" row="2">
++            <bounds>100.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="100">d</keysym>
++                <keysym keyval="68">D</keysym>
++                <keysym keyval="100" label="シ">d</keysym>
++                <keysym keyval="68" label="">D</keysym>
++                <keysym keyval="100" label="し">d</keysym>
++                <keysym keyval="68" label="">D</keysym>
++            </symbols>
++        </key>
++        <key id="keycode39" name="AC02" column="2" row="2">
++            <bounds>74.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="115">s</keysym>
++                <keysym keyval="83">S</keysym>
++                <keysym keyval="115" label="ト">s</keysym>
++                <keysym keyval="83" label="">S</keysym>
++                <keysym keyval="115" label="と">s</keysym>
++                <keysym keyval="83" label="">S</keysym>
++            </symbols>
++        </key>
++        <key id="keycode38" name="AC01" column="1" row="2">
++            <bounds>49.000000,53.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="97">a</keysym>
++                <keysym keyval="65">A</keysym>
++                <keysym keyval="97" label="チ">a</keysym>
++                <keysym keyval="65" label="">A</keysym>
++                <keysym keyval="97" label="ち">a</keysym>
++                <keysym keyval="65" label="">A</keysym>
++            </symbols>
++        </key>
++        <key id="keycode66" name="CAPS" column="0" row="2">
++            <bounds>2.000000,53.000000,44.000000,24.000000</bounds>
++            <oref>outline5</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65507">Control_L</keysym>
++            </symbols>
++        </key>
++        <key id="keycode51" name="BKSL" column="13" row="1">
++            <bounds>352.000000,27.000000,38.000000,24.000000</bounds>
++            <oref>outline4</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="92">backslash</keysym>
++                <keysym keyval="124">bar</keysym>
++                <keysym keyval="93" label="ム">bracketright</keysym>
++                <keysym keyval="125" label="」">braceright</keysym>
++                <keysym keyval="93" label="む">bracketright</keysym>
++                <keysym keyval="125" label="」">braceright</keysym>
++            </symbols>
++        </key>
++        <key id="keycode35" name="AD12" column="12" row="1">
++            <bounds>326.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="93">bracketright</keysym>
++                <keysym keyval="125">braceright</keysym>
++                <keysym keyval="91" label="゜">bracketleft</keysym>
++                <keysym keyval="123" label="「">braceleft</keysym>
++                <keysym keyval="91" label="゜">bracketleft</keysym>
++                <keysym keyval="123" label="「">braceleft</keysym>
++            </symbols>
++        </key>
++        <key id="keycode34" name="AD11" column="11" row="1">
++            <bounds>300.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="91">bracketleft</keysym>
++                <keysym keyval="123">braceleft</keysym>
++                <keysym keyval="64" label="゛">at</keysym>
++                <keysym keyval="123" label="">braceleft</keysym>
++                <keysym keyval="64" label="゛">at</keysym>
++                <keysym keyval="123" label="">braceleft</keysym>
++            </symbols>
++        </key>
++        <key id="keycode33" name="AD10" column="10" row="1">
++            <bounds>275.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="112">p</keysym>
++                <keysym keyval="80">P</keysym>
++                <keysym keyval="112" label="セ">p</keysym>
++                <keysym keyval="80" label="">P</keysym>
++                <keysym keyval="112" label="せ">p</keysym>
++                <keysym keyval="80" label="">P</keysym>
++            </symbols>
++        </key>
++        <key id="keycode32" name="AD09" column="9" row="1">
++            <bounds>249.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="111">o</keysym>
++                <keysym keyval="79">O</keysym>
++                <keysym keyval="111" label="ラ">o</keysym>
++                <keysym keyval="79" label="">O</keysym>
++                <keysym keyval="111" label="ら">o</keysym>
++                <keysym keyval="79" label="">O</keysym>
++            </symbols>
++        </key>
++        <key id="keycode31" name="AD08" column="8" row="1">
++            <bounds>223.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="105">i</keysym>
++                <keysym keyval="73">I</keysym>
++                <keysym keyval="105" label="ニ">i</keysym>
++                <keysym keyval="73" label="">I</keysym>
++                <keysym keyval="105" label="に">i</keysym>
++                <keysym keyval="73" label="">I</keysym>
++            </symbols>
++        </key>
++        <key id="keycode30" name="AD07" column="7" row="1">
++            <bounds>197.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="117">u</keysym>
++                <keysym keyval="85">U</keysym>
++                <keysym keyval="117" label="ナ">u</keysym>
++                <keysym keyval="85" label="">U</keysym>
++                <keysym keyval="117" label="な">u</keysym>
++                <keysym keyval="85" label="">U</keysym>
++            </symbols>
++        </key>
++        <key id="keycode29" name="AD06" column="6" row="1">
++            <bounds>171.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="121">y</keysym>
++                <keysym keyval="89">Y</keysym>
++                <keysym keyval="121" label="ン">y</keysym>
++                <keysym keyval="89" label="">Y</keysym>
++                <keysym keyval="121" label="ん">y</keysym>
++                <keysym keyval="89" label="">Y</keysym>
++            </symbols>
++        </key>
++        <key id="keycode28" name="AD05" column="5" row="1">
++            <bounds>145.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="116">t</keysym>
++                <keysym keyval="84">T</keysym>
++                <keysym keyval="116" label="カ">t</keysym>
++                <keysym keyval="84" label="">T</keysym>
++                <keysym keyval="116" label="か">t</keysym>
++                <keysym keyval="84" label="">T</keysym>
++            </symbols>
++        </key>
++        <key id="keycode27" name="AD04" column="4" row="1">
++            <bounds>119.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="114">r</keysym>
++                <keysym keyval="82">R</keysym>
++                <keysym keyval="114" label="ス">r</keysym>
++                <keysym keyval="82" label="">R</keysym>
++                <keysym keyval="114" label="す">r</keysym>
++                <keysym keyval="82" label="">R</keysym>
++            </symbols>
++        </key>
++        <key id="keycode26" name="AD03" column="3" row="1">
++            <bounds>93.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="101">e</keysym>
++                <keysym keyval="69">E</keysym>
++                <keysym keyval="101" label="イ">e</keysym>
++                <keysym keyval="69" label="ィ">E</keysym>
++                <keysym keyval="101" label="い">e</keysym>
++                <keysym keyval="69" label="ぃ">E</keysym>
++            </symbols>
++        </key>
++        <key id="keycode25" name="AD02" column="2" row="1">
++            <bounds>68.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="119">w</keysym>
++                <keysym keyval="87">W</keysym>
++                <keysym keyval="119" label="テ">w</keysym>
++                <keysym keyval="87" label="">W</keysym>
++                <keysym keyval="119" label="て">w</keysym>
++                <keysym keyval="87" label="">W</keysym>
++            </symbols>
++        </key>
++        <key id="keycode24" name="AD01" column="1" row="1">
++            <bounds>42.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="113">q</keysym>
++                <keysym keyval="81">Q</keysym>
++                <keysym keyval="113" label="タ">q</keysym>
++                <keysym keyval="81" label="">Q</keysym>
++                <keysym keyval="113" label="た">q</keysym>
++                <keysym keyval="81" label="">Q</keysym>
++            </symbols>
++        </key>
++        <key id="keycode23" name="TAB" column="0" row="1">
++            <bounds>2.000000,27.000000,38.000000,24.000000</bounds>
++            <oref>outline3</oref>
++            <symbols groups="1" levels="2">
++                <keysym keyval="65289">Tab</keysym>
++                <keysym keyval="65056">ISO_Left_Tab</keysym>
++            </symbols>
++        </key>
++        <key id="keycode22" name="BKSP" column="13" row="0">
++            <bounds>339.000000,1.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65288">BackSpace</keysym>
++            </symbols>
++        </key>
++        <key id="keycode21" name="AE12" column="12" row="0">
++            <bounds>313.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="61">equal</keysym>
++                <keysym keyval="43">plus</keysym>
++                <keysym keyval="94" label="ヘ">asciicircum</keysym>
++                <keysym keyval="43" label="">plus</keysym>
++                <keysym keyval="94" label="へ">asciicircum</keysym>
++                <keysym keyval="43" label="">plus</keysym>
++            </symbols>
++        </key>
++        <key id="keycode20" name="AE11" column="11" row="0">
++            <bounds>287.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="45">minus</keysym>
++                <keysym keyval="95">underscore</keysym>
++                <keysym keyval="61" label="ホ">equal</keysym>
++                <keysym keyval="95" label="">underscore</keysym>
++                <keysym keyval="61" label="ほ">equal</keysym>
++                <keysym keyval="95" label="">underscore</keysym>
++            </symbols>
++        </key>
++        <key id="keycode19" name="AE10" column="10" row="0">
++            <bounds>261.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="48">0</keysym>
++                <keysym keyval="41">parenright</keysym>
++                <keysym keyval="48" label="ワ">0</keysym>
++                <keysym keyval="126" label="ヲ">asciitilde</keysym>
++                <keysym keyval="48" label="わ">0</keysym>
++                <keysym keyval="126" label="を">asciitilde</keysym>
++            </symbols>
++        </key>
++        <key id="keycode18" name="AE09" column="9" row="0">
++            <bounds>235.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="57">9</keysym>
++                <keysym keyval="40">parenleft</keysym>
++                <keysym keyval="57" label="ヨ">9</keysym>
++                <keysym keyval="41" label="ョ">parenright</keysym>
++                <keysym keyval="57" label="よ">9</keysym>
++                <keysym keyval="41" label="ょ">parenright</keysym>
++            </symbols>
++        </key>
++        <key id="keycode17" name="AE08" column="8" row="0">
++            <bounds>209.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="56">8</keysym>
++                <keysym keyval="42">asterisk</keysym>
++                <keysym keyval="56" label="ユ">8</keysym>
++                <keysym keyval="40" label="ュ">parenleft</keysym>
++                <keysym keyval="56" label="ゆ">8</keysym>
++                <keysym keyval="40" label="ゅ">parenleft</keysym>
++            </symbols>
++        </key>
++        <key id="keycode16" name="AE07" column="7" row="0">
++            <bounds>183.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="55">7</keysym>
++                <keysym keyval="38">ampersand</keysym>
++                <keysym keyval="55" label="ヤ">7</keysym>
++                <keysym keyval="39" label="ャ">quoteright</keysym>
++                <keysym keyval="55" label="や">7</keysym>
++                <keysym keyval="39" label="ゃ">quoteright</keysym>
++            </symbols>
++        </key>
++        <key id="keycode15" name="AE06" column="6" row="0">
++            <bounds>157.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="54">6</keysym>
++                <keysym keyval="94">asciicircum</keysym>
++                <keysym keyval="54" label="オ">6</keysym>
++                <keysym keyval="38" label="ォ">ampersand</keysym>
++                <keysym keyval="54" label="お">6</keysym>
++                <keysym keyval="38" label="ぉ">ampersand</keysym>
++            </symbols>
++        </key>
++        <key id="keycode14" name="AE05" column="5" row="0">
++            <bounds>132.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="53">5</keysym>
++                <keysym keyval="37">percent</keysym>
++                <keysym keyval="53" label="エ">5</keysym>
++                <keysym keyval="37" label="ェ">percent</keysym>
++                <keysym keyval="53" label="え">5</keysym>
++                <keysym keyval="37" label="ぇ">percent</keysym>
++            </symbols>
++        </key>
++        <key id="keycode13" name="AE04" column="4" row="0">
++            <bounds>106.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="52">4</keysym>
++                <keysym keyval="36">dollar</keysym>
++                <keysym keyval="52" label="ウ">4</keysym>
++                <keysym keyval="36" label="ゥ">dollar</keysym>
++                <keysym keyval="52" label="う">4</keysym>
++                <keysym keyval="36" label="ぅ">dollar</keysym>
++            </symbols>
++        </key>
++        <key id="keycode12" name="AE03" column="3" row="0">
++            <bounds>80.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="51">3</keysym>
++                <keysym keyval="35">numbersign</keysym>
++                <keysym keyval="51" label="ア">3</keysym>
++                <keysym keyval="35" label="ァ">numbersign</keysym>
++                <keysym keyval="51" label="あ">3</keysym>
++                <keysym keyval="35" label="ぁ">numbersign</keysym>
++            </symbols>
++        </key>
++        <key id="keycode11" name="AE02" column="2" row="0">
++            <bounds>54.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="50">2</keysym>
++                <keysym keyval="64">at</keysym>
++                <keysym keyval="34" label="フ">quotedbl</keysym>
++                <keysym keyval="64" label="">at</keysym>
++                <keysym keyval="34" label="ふ">quotedbl</keysym>
++                <keysym keyval="64" label="">at</keysym>
++            </symbols>
++        </key>
++        <key id="keycode10" name="AE01" column="1" row="0">
++            <bounds>28.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="49">1</keysym>
++                <keysym keyval="33">exclam</keysym>
++                <keysym keyval="49" label="ヌ">1</keysym>
++                <keysym keyval="33" label="">exclam</keysym>
++                <keysym keyval="49" label="ぬ">1</keysym>
++                <keysym keyval="33" label="">exclam</keysym>
++            </symbols>
++        </key>
++        <key id="keycode49" name="TLDE" column="0" row="0">
++            <bounds>2.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="96">quoteleft</keysym>
++                <keysym keyval="126">asciitilde</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++            </symbols>
++        </key>
++    </section>
++    <outline id="outline1">
++        <point>0.000000,0.000000</point>
++        <point>24.000000,0.000000</point>
++        <point>24.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline3">
++        <point>0.000000,0.000000</point>
++        <point>38.000000,0.000000</point>
++        <point>38.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline4">
++        <point>0.000000,0.000000</point>
++        <point>38.000000,0.000000</point>
++        <point>38.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline5">
++        <point>0.000000,0.000000</point>
++        <point>44.000000,0.000000</point>
++        <point>44.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline6">
++        <point>0.000000,0.000000</point>
++        <point>57.000000,0.000000</point>
++        <point>57.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline7">
++        <point>0.000000,0.000000</point>
++        <point>57.000000,0.000000</point>
++        <point>57.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline8">
++        <point>0.000000,0.000000</point>
++        <point>70.000000,0.000000</point>
++        <point>70.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline9">
++        <point>0.000000,0.000000</point>
++        <point>36.000000,0.000000</point>
++        <point>36.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline10">
++        <point>0.000000,0.000000</point>
++        <point>31.000000,0.000000</point>
++        <point>31.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline11">
++        <point>0.000000,0.000000</point>
++        <point>153.000000,0.000000</point>
++        <point>153.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline12">
++        <point>0.000000,0.000000</point>
++        <point>24.000000,0.000000</point>
++        <point>24.000000,50.000000</point>
++        <point>0.000000,50.000000</point>
++    </outline>
++    <outline id="outline13">
++        <point>0.000000,0.000000</point>
++        <point>50.000000,0.000000</point>
++        <point>50.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline2">
++        <point>0.000000,0.000000</point>
++        <point>51.000000,0.000000</point>
++        <point>51.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++</keyboard>
+diff --git a/engine/skk.py b/engine/skk.py
+index a5741b7..86b6fe9 100644
+--- a/engine/skk.py
++++ b/engine/skk.py
+@@ -407,16 +407,14 @@ AUTO_START_HENKAN_KEYWORDS = (u'を', u'、', u'。', u'.', u',', u'?', u'
+                               u'”', u'】', u'』', u'》', u'〉', u'}', u']',
+                               u'〕', u'}', u']', u'?', u'.', u',', u'!')
+ 
+-CONV_STATE_NONE, \
+ CONV_STATE_START, \
+-CONV_STATE_SELECT = range(3)
++CONV_STATE_SELECT = range(2)
+ 
+-INPUT_MODE_NONE, \
+ INPUT_MODE_HIRAGANA, \
+ INPUT_MODE_KATAKANA, \
+ INPUT_MODE_LATIN, \
+ INPUT_MODE_WIDE_LATIN, \
+-INPUT_MODE_HANKAKU_KATAKANA = range(6)
++INPUT_MODE_HANKAKU_KATAKANA = range(5)
+ 
+ INPUT_MODE_TRANSITION_RULE = {
+     u'q': {
+@@ -468,6 +466,119 @@ TRANSLATED_STRINGS = {
+     u'kuten-prompt': u'Kuten([MM]KKTT) '
+ }
+ 
++# a port of 101kana.sty from scim-anthy, via ibus-anthy
++KANA_TYPING_RULE = {
++    # no modifiers keys
++    u"1" : u"ぬ",
++    u"2" : u"ふ",
++    u"3" : u"あ",
++    u"4" : u"う",
++    u"5" : u"え",
++    u"6" : u"お",
++    u"7" : u"や",
++    u"8" : u"ゆ",
++    u"9" : u"よ",
++    u"0" : u"わ",
++    u"-" : u"ほ",
++    u"^" : u"へ",
++
++    u"q" : u"た",
++    u"w" : u"て",
++    u"e" : u"い",
++    u"r" : u"す",
++    u"t" : u"か",
++    u"y" : u"ん",
++    u"u" : u"な",
++    u"i" : u"に",
++    u"o" : u"ら",
++    u"p" : u"せ",
++    u"@" : u"゛",
++    u"[" : u"゜",
++
++    u"a" : u"ち",
++    u"s" : u"と",
++    u"d" : u"し",
++    u"f" : u"は",
++    u"g" : u"き",
++    u"h" : u"く",
++    u"j" : u"ま",
++    u"k" : u"の",
++    u"l" : u"り",
++    u";" : u"れ",
++    u":" : u"け",
++    u"]" : u"む",
++
++    u"z" : u"つ",
++    u"x" : u"さ",
++    u"c" : u"そ",
++    u"v" : u"ひ",
++    u"b" : u"こ",
++    u"n" : u"み",
++    u"m" : u"も",
++    u"," : u"ね",
++    u"." : u"る",
++    u"/" : u"め",
++    # u"\\" : u"ー",
++    u"\\" : u"ろ",
++
++    # shift modifiered keys
++    u"!" : u"ぬ",
++    u"\"" : u"ふ",
++    u"#" : u"ぁ",
++    u"$" : u"ぅ",
++    u"%" : u"ぇ",
++    u"&" : u"ぉ",
++    u"'" : u"ゃ",
++    u"(" : u"ゅ",
++    u")" : u"ょ",
++    u"~" : u"を",
++    u"=" : u"ほ",
++    u"|" : u"ー",
++
++    u"Q" : u"た",
++    u"W" : u"て",
++    u"E" : u"ぃ",
++    u"R" : u"す",
++    u"T" : u"ヵ",
++    u"Y" : u"ん",
++    u"U" : u"な",
++    u"I" : u"に",
++    u"O" : u"ら",
++    u"P" : u"せ",
++    u"`" : u"゛",
++
++    u"{" : u"「",
++
++    u"A" : u"ち",
++    u"S" : u"と",
++    u"D" : u"し",
++    u"F" : u"ゎ",
++    u"G" : u"き",
++    u"H" : u"く",
++    u"J" : u"ま",
++    u"K" : u"の",
++    u"L" : u"り",
++    u"+" : u"れ",
++    u"*" : u"ヶ",
++
++    u"}" : u"」",
++
++    u"Z" : u"っ",
++    u"X" : u"さ",
++    u"C" : u"そ",
++    u"V" : u"ゐ",
++    u"B" : u"こ",
++    u"M" : u"も",
++    u"N" : u"み",
++    u"<" : u"、",
++    u">" : u"。",
++
++    u"?" : u"・",
++    u"_" : u"ろ",
++
++    u"¥" : u"ー",
++}
++
+ class DictBase(object):
+     ENCODING = 'EUC-JIS-2004'
+ 
+@@ -1049,8 +1160,8 @@ class State(object):
+         self.dict_edit_output = u''
+ 
+     def reset(self):
+-        self.conv_state = CONV_STATE_NONE
+-        self.input_mode = INPUT_MODE_NONE
++        self.conv_state = None
++        self.input_mode = None
+ 
+         # Current midasi in conversion.
+         self.midasi = None
+@@ -1106,12 +1217,18 @@ class Key(object):
+     letter = property(lambda self: self.__letter)
+     keyval = property(lambda self: self.__keyval)
+ 
++    def is_letter(self):
++        return len(self.__modifiers) == 0
++
+     def is_ctrl(self):
+         return 'ctrl' in self.__modifiers
+ 
+     def is_nicola(self):
+         return 'nicola' in self.__modifiers
+ 
++    def is_kana(self):
++        return 'kana' in self.__modifiers
++
+     def is_lshift(self):
+         return 'lshift' in self.__modifiers
+ 
+@@ -1291,7 +1408,7 @@ class Context(object):
+     def __rom_kana_key_is_acceptable(self, key):
+         if self.__current_state().rom_kana_state is None:
+             return False
+-        if key.is_nicola():
++        if key.is_nicola() or key.is_kana():
+             return False
+         output, pending, tree = self.__current_state().rom_kana_state
+         return len(pending) > 0 and \
+@@ -1313,9 +1430,9 @@ class Context(object):
+         key = Key(keystr)
+         if str(key) == 'ctrl+g':
+             if self.dict_edit_level() > 0 and \
+-                    self.__current_state().conv_state == CONV_STATE_NONE:
++                    self.__current_state().conv_state == None:
+                 self.__abort_dict_edit()
+-            elif self.__current_state().conv_state in (CONV_STATE_NONE,
++            elif self.__current_state().conv_state in (None,
+                                                        CONV_STATE_START):
+                 input_mode = self.__current_state().input_mode
+                 self.reset()
+@@ -1337,7 +1454,7 @@ class Context(object):
+         if str(key) in ('ctrl+h', 'backspace'):
+             return self.delete_char()
+ 
+-        if self.__current_state().conv_state == CONV_STATE_NONE:
++        if self.__current_state().conv_state == None:
+             # If KEY will be consumed in the next rom-kana conversion,
+             # skip input mode transition.
+             if not self.__rom_kana_key_is_acceptable(key):
+@@ -1363,7 +1480,7 @@ class Context(object):
+             # Ignore ctrl+key and non-ASCII characters.
+             if key.is_ctrl() or \
+                     str(key) in ('return', 'escape', 'backspace') or \
+-                    (len(key.letter) == 1 and \
++                    (not key.is_kana() and len(key.letter) == 1 and \
+                          (0x20 > ord(key.letter) or ord(key.letter) > 0x7E)):
+                 return (False, u'')
+ 
+@@ -1405,27 +1522,29 @@ class Context(object):
+ 
+             # Start rom-kan mode with abbrev enabled (/).
+             if not self.__rom_kana_key_is_acceptable(key) and \
+-                    ((not key.is_nicola() and key.letter == '/') or \
++                    ((not key.is_nicola() and not key.is_kana() and \
++                          key.letter == '/') or \
+                          (key.is_nicola() and key.letter == '[gh]')):
+                 self.__current_state().conv_state = CONV_STATE_START
+                 self.__current_state().abbrev = True
+                 return (True, u'')
+ 
+             # Start rom-kan mode (Q).
+-            if key.letter == 'Q' or \
+-                    (key.is_nicola() and key.letter == '[fj]'):
++            if (key.is_letter() and key.letter == 'Q') or \
++                    (key.is_nicola() and key.letter == '[fj]') or \
++                    (key.is_kana() and key.letter == 'kanji'):
+                 self.__current_state().conv_state = CONV_STATE_START
+                 return (True, u'')
+ 
+             # Start rom-kan mode and insert a character which
+             # triggered the transition.
+-            if key.letter.isupper():
++            if key.is_letter() and key.letter.isupper():
+                 self.__current_state().conv_state = CONV_STATE_START
+ 
+             self.__current_state().rom_kana_state = \
+                 self.__convert_kana(key, self.__current_state().rom_kana_state)
+             output = self.__current_state().rom_kana_state[0]
+-            if self.__current_state().conv_state == CONV_STATE_NONE and \
++            if self.__current_state().conv_state == None and \
+                     len(output) > 0:
+                 self.__current_state().rom_kana_state = \
+                     (u'',
+@@ -1574,11 +1693,11 @@ class Context(object):
+                         self.__current_state().auto_start_henkan_keyword = keyword
+                         break
+ 
+-            # If midasi is empty, switch back to CONV_STATE_NONE
++            # If midasi is empty, switch back to None
+             # instead of CONV_STATE_SELECT.
+             if key.letter == u' ' and \
+                     len(self.__current_state().rom_kana_state[0]) == 0:
+-                self.__current_state().conv_state = CONV_STATE_NONE
++                self.__current_state().conv_state = None
+                 return (True, u'')
+ 
+             # Start okuri-nasi conversion.
+@@ -1607,7 +1726,8 @@ class Context(object):
+ 
+             if (key.letter.isupper() and \
+                     not self.__rom_kana_key_is_acceptable(key)) or \
+-                    (key.is_nicola() and key.letter == '[fj]'):
++                    (key.is_nicola() and key.letter == '[fj]') or \
++                    (key.is_kana() and key.letter == 'kanji'):
+                 rom_kana_state = self.__convert_nn(self.__current_state().rom_kana_state)
+                 if len(rom_kana_state[1]) == 0 and \
+                         not self.__current_state().okuri_rom_kana_state:
+@@ -1616,7 +1736,8 @@ class Context(object):
+                         (u'', u'', self.__rom_kana_rule_tree)
+ 
+             if self.__current_state().okuri_rom_kana_state and \
+-                    not (key.is_nicola() and key.letter == '[fj]'):
++                    not (key.is_nicola() and key.letter == '[fj]') and \
++                    not (key.is_kana() and key.letter == 'kanji'):
+                 okuri = None
+                 # Issue#10: check OUTPUT was produced by 'n'
+                 for nn in (u'ん', u'ン', u'ン'):
+@@ -1625,7 +1746,7 @@ class Context(object):
+                         okuri = u'n'
+                         break
+                 if not okuri:
+-                    if key.is_nicola():
++                    if key.is_nicola() or key.is_kana():
+                         okuri_rom_kana_state = \
+                             self.__convert_kana(key, (u'', u'', dict()))
+                         okuri = OKURI_RULE[okuri_rom_kana_state[0]]
+@@ -1685,7 +1806,7 @@ class Context(object):
+                 input_mode = self.__current_state().input_mode
+                 self.reset()
+                 self.activate_input_mode(input_mode)
+-                self.__current_state().conv_state = CONV_STATE_NONE
++                self.__current_state().conv_state = None
+                 return (True, u'')
+             else:
+                 output = self.kakutei()
+@@ -1719,7 +1840,7 @@ class Context(object):
+     def delete_char(self):
+         '''Delete a character at the end of the buffer.'''
+         if self.__current_state().conv_state == CONV_STATE_SELECT:
+-            self.__current_state().conv_state = CONV_STATE_NONE
++            self.__current_state().conv_state = None
+             output = self.kakutei()
+             if self.dict_edit_level() > 0:
+                 self.__current_state().dict_edit_output += output[:-1]
+@@ -1835,7 +1956,7 @@ elements will be "[[DictEdit]] かんが*え ", "▽", "かんが", "*え" .'''
+         else:
+             prompt = u''
+             prefix = u''
+-        if self.__current_state().conv_state == CONV_STATE_NONE:
++        if self.__current_state().conv_state == None:
+             if self.__current_state().rom_kana_state:
+                 return (prompt,
+                         prefix,
+@@ -1909,6 +2030,8 @@ elements will be "[[DictEdit]] かんが*え ", "▽", "かんが", "*え" .'''
+     def __convert_kana(self, key, state):
+         if key.is_nicola():
+             return self.__convert_nicola_kana(key, state)
++        elif key.is_kana():
++            return self.__convert_kana_kana(key, state)
+         else:
+             return self.__convert_rom_kana(key.letter.lower(), state)
+             
+@@ -1960,6 +2083,16 @@ elements will be "[[DictEdit]] かんが*え ", "▽", "かんが", "*え" .'''
+             output += self.__convert_kana_by_input_mode(katakana, hiragana)
+         return (output, pending, tree)
+ 
++    def __convert_kana_kana(self, key, state):
++        assert key.is_kana()
++        hiragana = KANA_TYPING_RULE.get(key.letter)
++        if not hiragana:
++            return state
++        output, pending, tree = state
++        katakana = hiragana_to_katakana(hiragana)
++        output += self.__convert_kana_by_input_mode(katakana, hiragana)
++        return (output, pending, tree)
++
+     def __convert_kana_by_input_mode(self, katakana, hiragana):
+         if self.__current_state().input_mode == INPUT_MODE_HANKAKU_KATAKANA:
+             katakana = hankaku_katakana(katakana)
+diff --git a/engine/table.xml b/engine/table.xml
+new file mode 100644
+index 0000000..0165d59
+--- /dev/null
++++ b/engine/table.xml
+@@ -0,0 +1,887 @@
++<?xml version="1.0"?>
++<keyboard version="0.90">
++    <bounds>0.000000,0.000000,410.000000,152.000000</bounds>
++    <section name="LeftModifiers">
++        <bounds>10.000000,10.000000,60.000000,129.000000</bounds>
++        <angle>0</angle>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <key id="keycode64" name="TLDE" column="0" row="0">
++            <bounds>2.000000,1.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="96">quoteleft</keysym>
++                <keysym keyval="126">asciitilde</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++                <keysym keyval="65313" label="漢">Kanji</keysym>
++            </symbols>
++        </key>
++        <key id="keycode61" name="TAB" column="1" row="0">
++            <bounds>2.000000,27.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="1" levels="2">
++                <keysym keyval="65289">Tab</keysym>
++                <keysym keyval="65056">ISO_Left_Tab</keysym>
++            </symbols>
++        </key>
++        <key id="keycode56" name="CAPS" column="2" row="0">
++            <bounds>2.000000,53.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65507">Control_L</keysym>
++            </symbols>
++        </key>
++        <key id="keycode57" name="LFSH" column="3" row="0">
++            <bounds>2.000000,78.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65505">Shift_L</keysym>
++            </symbols>
++        </key>
++        <key id="keycode58" name="LCTL" column="4" row="0">
++            <bounds>2.000000,104.000000,36.000000,24.000000</bounds>
++            <oref>outline9</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="65319" label="あいう">Hiragana_Katakana</keysym>
++                <keysym></keysym>
++                <keysym keyval="65328" label="ABC">Eisu_toggle</keysym>
++                <keysym></keysym>
++                <keysym keyval="65328" label="ABC">Eisu_toggle</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode60" name="BKSP" column="0" row="1">
++            <bounds>331.000000,1.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65288">BackSpace</keysym>
++            </symbols>
++        </key>
++        <key id="keycode65" name="SPCE" column="1" row="1">
++            <bounds>331.000000,28.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="3" levels="1">
++                <keysym keyval="32">space</keysym>
++                <keysym keyval="65315" label="変換">Henkan</keysym>
++                <keysym keyval="65315" label="変換">Henkan</keysym>
++            </symbols>
++        </key>
++        <key id="keycode62" name="RTRN" column="1" row="1">
++            <bounds>331.000000,53.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65293">Return</keysym>
++            </symbols>
++        </key>
++        <key id="keycode63" name="RTSH" column="2" row="1">
++            <bounds>331.000000,78.000000,51.000000,24.000000</bounds>
++            <oref>outline2</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65506">Shift_R</keysym>
++            </symbols>
++        </key>
++        <key id="keycode59" name="RCTL" column="3" row="1">
++            <bounds>359.000000,104.000000,31.000000,24.000000</bounds>
++            <oref>outline10</oref>
++            <symbols groups="1" levels="1">
++                <keysym keyval="65407" icon="input-keyboard">Num_Lock</keysym>
++            </symbols>
++        </key>
++    </section>
++    <section name="Alpha">
++        <bounds>63.000000,10.000000,300.000000,129.000000</bounds>
++        <angle>0</angle>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <row>
++            <columns>5</columns>
++            <orientation>0</orientation>
++        </row>
++        <key id="keycode1" name="AE03" column="0" row="0">
++            <bounds>2.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="97">a</keysym>
++                <keysym keyval="65">A</keysym>
++                <keysym keyval="51" label="ア">3</keysym>
++                <keysym keyval="35" label="ァ">numbersign</keysym>
++                <keysym keyval="51" label="あ">3</keysym>
++                <keysym keyval="35" label="ぁ">numbersign</keysym>
++            </symbols>
++        </key>
++        <key id="keycode2" name="AD03" column="1" row="0">
++            <bounds>2.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="98">b</keysym>
++                <keysym keyval="66">B</keysym>
++                <keysym keyval="101" label="イ">e</keysym>
++                <keysym keyval="69" label="ィ">E</keysym>
++                <keysym keyval="101" label="い">e</keysym>
++                <keysym keyval="69" label="ぃ">E</keysym>
++            </symbols>
++        </key>
++        <key id="keycode3" name="AE04" column="2" row="0">
++            <bounds>2.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="99">c</keysym>
++                <keysym keyval="67">C</keysym>
++                <keysym keyval="52" label="ウ">4</keysym>
++                <keysym keyval="36" label="ゥ">dollar</keysym>
++                <keysym keyval="52" label="う">4</keysym>
++                <keysym keyval="36" label="ぅ">dollar</keysym>
++            </symbols>
++        </key>
++        <key id="keycode4" name="AE05" column="3" row="0">
++            <bounds>2.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="100">d</keysym>
++                <keysym keyval="68">D</keysym>
++                <keysym keyval="53" label="エ">5</keysym>
++                <keysym keyval="37" label="ェ">percent</keysym>
++                <keysym keyval="53" label="え">5</keysym>
++                <keysym keyval="37" label="ぇ">percent</keysym>
++            </symbols>
++        </key>
++        <key id="keycode5" name="AE06" column="4" row="0">
++            <bounds>2.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="101">e</keysym>
++                <keysym keyval="69">E</keysym>
++                <keysym keyval="54" label="オ">6</keysym>
++                <keysym keyval="38" label="ォ">ampersand</keysym>
++                <keysym keyval="54" label="お">6</keysym>
++                <keysym keyval="38" label="ぉ">ampersand</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode6" name="AE03" column="0" row="1">
++            <bounds>27.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="102">f</keysym>
++                <keysym keyval="70">F</keysym>
++                <keysym keyval="116" label="カ">t</keysym>
++                <keysym keyval="84" label="">T</keysym>
++                <keysym keyval="116" label="か">t</keysym>
++                <keysym keyval="84" label="">T</keysym>
++            </symbols>
++        </key>
++        <key id="keycode7" name="AD03" column="1" row="1">
++            <bounds>27.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="103">g</keysym>
++                <keysym keyval="71">G</keysym>
++                <keysym keyval="103" label="キ">g</keysym>
++                <keysym keyval="71" label="">G</keysym>
++                <keysym keyval="103" label="き">g</keysym>
++                <keysym keyval="71" label="">G</keysym>
++            </symbols>
++        </key>
++        <key id="keycode8" name="AE04" column="2" row="1">
++            <bounds>27.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="104">h</keysym>
++                <keysym keyval="72">H</keysym>
++                <keysym keyval="104" label="ク">h</keysym>
++                <keysym keyval="72" label="">H</keysym>
++                <keysym keyval="104" label="く">h</keysym>
++                <keysym keyval="72" label="">H</keysym>
++            </symbols>
++        </key>
++        <key id="keycode9" name="AE05" column="3" row="1">
++            <bounds>27.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="105">i</keysym>
++                <keysym keyval="73">I</keysym>
++                <keysym keyval="58" label="ケ">colon</keysym>
++                <keysym keyval="34" label="">quotedbl</keysym>
++                <keysym keyval="58" label="け">colon</keysym>
++                <keysym keyval="34" label="">quotedbl</keysym>
++            </symbols>
++        </key>
++        <key id="keycode10" name="AE06" column="4" row="1">
++            <bounds>27.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="106">j</keysym>
++                <keysym keyval="74">J</keysym>
++                <keysym keyval="98" label="コ">b</keysym>
++                <keysym keyval="66" label="">B</keysym>
++                <keysym keyval="98" label="こ">b</keysym>
++                <keysym keyval="66" label="">B</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode11" name="AE03" column="0" row="2">
++            <bounds>52.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="107">k</keysym>
++                <keysym keyval="75">K</keysym>
++                <keysym keyval="120" label="サ">x</keysym>
++                <keysym keyval="88" label="">X</keysym>
++                <keysym keyval="120" label="さ">x</keysym>
++                <keysym keyval="88" label="">X</keysym>
++            </symbols>
++        </key>
++        <key id="keycode12" name="AD03" column="1" row="2">
++            <bounds>52.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="108">l</keysym>
++                <keysym keyval="76">L</keysym>
++                <keysym keyval="100" label="シ">d</keysym>
++                <keysym keyval="68" label="">D</keysym>
++                <keysym keyval="100" label="し">d</keysym>
++                <keysym keyval="68" label="">D</keysym>
++            </symbols>
++        </key>
++        <key id="keycode13" name="AE04" column="2" row="0">
++            <bounds>52.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="109">m</keysym>
++                <keysym keyval="77">M</keysym>
++                <keysym keyval="114" label="ス">r</keysym>
++                <keysym keyval="82" label="">R</keysym>
++                <keysym keyval="114" label="す">r</keysym>
++                <keysym keyval="82" label="">R</keysym>
++            </symbols>
++        </key>
++        <key id="keycode14" name="AE05" column="3" row="2">
++            <bounds>52.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="110">n</keysym>
++                <keysym keyval="78">N</keysym>
++                <keysym keyval="112" label="セ">p</keysym>
++                <keysym keyval="80" label="">P</keysym>
++                <keysym keyval="112" label="せ">p</keysym>
++                <keysym keyval="80" label="">P</keysym>
++            </symbols>
++        </key>
++        <key id="keycode15" name="AE06" column="4" row="2">
++            <bounds>52.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="111">o</keysym>
++                <keysym keyval="79">O</keysym>
++                <keysym keyval="99" label="ソ">c</keysym>
++                <keysym keyval="67" label="">C</keysym>
++                <keysym keyval="99" label="そ">c</keysym>
++                <keysym keyval="67" label="">C</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode16" name="AE03" column="0" row="3">
++            <bounds>77.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="112">p</keysym>
++                <keysym keyval="80">P</keysym>
++                <keysym keyval="113" label="タ">q</keysym>
++                <keysym keyval="81" label="">Q</keysym>
++                <keysym keyval="113" label="た">q</keysym>
++                <keysym keyval="81" label="">Q</keysym>
++            </symbols>
++        </key>
++        <key id="keycode17" name="AD03" column="1" row="3">
++            <bounds>77.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="113">q</keysym>
++                <keysym keyval="81">Q</keysym>
++                <keysym keyval="97" label="チ">a</keysym>
++                <keysym keyval="65" label="">A</keysym>
++                <keysym keyval="97" label="ち">a</keysym>
++                <keysym keyval="65" label="">A</keysym>
++            </symbols>
++        </key>
++        <key id="keycode18" name="AE04" column="2" row="3">
++            <bounds>77.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="114">r</keysym>
++                <keysym keyval="82">R</keysym>
++                <keysym keyval="122" label="ツ">z</keysym>
++                <keysym keyval="90" label="ッ">Z</keysym>
++                <keysym keyval="122" label="つ">z</keysym>
++                <keysym keyval="90" label="っ">Z</keysym>
++            </symbols>
++        </key>
++        <key id="keycode19" name="AE05" column="3" row="3">
++            <bounds>77.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="115">s</keysym>
++                <keysym keyval="83">S</keysym>
++                <keysym keyval="119" label="テ">w</keysym>
++                <keysym keyval="87" label="">W</keysym>
++                <keysym keyval="119" label="て">w</keysym>
++                <keysym keyval="87" label="">W</keysym>
++            </symbols>
++        </key>
++        <key id="keycode20" name="AE06" column="4" row="3">
++            <bounds>77.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="116">t</keysym>
++                <keysym keyval="84">T</keysym>
++                <keysym keyval="115" label="ト">s</keysym>
++                <keysym keyval="83" label="">S</keysym>
++                <keysym keyval="115" label="と">s</keysym>
++                <keysym keyval="83" label="">S</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode21" name="AE03" column="0" row="4">
++            <bounds>102.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="117">u</keysym>
++                <keysym keyval="85">U</keysym>
++                <keysym keyval="117" label="ナ">u</keysym>
++                <keysym keyval="85" label="">U</keysym>
++                <keysym keyval="117" label="な">u</keysym>
++                <keysym keyval="85" label="">U</keysym>
++            </symbols>
++        </key>
++        <key id="keycode22" name="AD03" column="1" row="4">
++            <bounds>102.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="118">v</keysym>
++                <keysym keyval="86">V</keysym>
++                <keysym keyval="105" label="ニ">i</keysym>
++                <keysym keyval="73" label="">I</keysym>
++                <keysym keyval="105" label="に">i</keysym>
++                <keysym keyval="73" label="">I</keysym>
++            </symbols>
++        </key>
++        <key id="keycode23" name="AE04" column="2" row="4">
++            <bounds>102.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="119">w</keysym>
++                <keysym keyval="87">W</keysym>
++                <keysym keyval="33" label="ヌ">exclam</keysym>
++                <keysym keyval="49" label="">1</keysym>
++                <keysym keyval="33" label="ぬ">exclam</keysym>
++                <keysym keyval="49" label="">1</keysym>
++            </symbols>
++        </key>
++        <key id="keycode24" name="AE05" column="3" row="4">
++            <bounds>102.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="120">x</keysym>
++                <keysym keyval="88">X</keysym>
++                <keysym keyval="44" label="ネ">comma</keysym>
++                <keysym></keysym>
++                <keysym keyval="44" label="ね">comma</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode25" name="AE06" column="4" row="4">
++            <bounds>102.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="121">y</keysym>
++                <keysym keyval="89">Y</keysym>
++                <keysym keyval="107" label="ノ">k</keysym>
++                <keysym keyval="75" label="">K</keysym>
++                <keysym keyval="107" label="の">k</keysym>
++                <keysym keyval="75" label="">K</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode26" name="AE03" column="0" row="5">
++            <bounds>127.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="122">z</keysym>
++                <keysym keyval="90">Z</keysym>
++                <keysym keyval="102" label="ハ">f</keysym>
++                <keysym keyval="70" label="">F</keysym>
++                <keysym keyval="102" label="は">f</keysym>
++                <keysym keyval="70" label="">F</keysym>
++            </symbols>
++        </key>
++        <key id="keycode27" name="AD03" column="1" row="5">
++            <bounds>127.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym></keysym>
++                <keysym></keysym>
++                <keysym keyval="118" label="ヒ">v</keysym>
++                <keysym keyval="86" label="">V</keysym>
++                <keysym keyval="118" label="ひ">v</keysym>
++                <keysym keyval="86" label="">V</keysym>
++            </symbols>
++        </key>
++        <key id="keycode28" name="AE04" column="2" row="5">
++            <bounds>127.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym></keysym>
++                <keysym></keysym>
++                <keysym keyval="34" label="フ">quotedbl</keysym>
++                <keysym keyval="64" label="">at</keysym>
++                <keysym keyval="34" label="ふ">quotedbl</keysym>
++                <keysym keyval="64" label="">at</keysym>
++            </symbols>
++        </key>
++        <key id="keycode29" name="AE05" column="3" row="5">
++            <bounds>127.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym></keysym>
++                <keysym></keysym>
++                <keysym keyval="94" label="ヘ">asciicircum</keysym>
++                <keysym keyval="43" label="">plus</keysym>
++                <keysym keyval="94" label="へ">asciicircum</keysym>
++                <keysym keyval="43" label="">plus</keysym>
++            </symbols>
++        </key>
++        <key id="keycode30" name="AE06" column="4" row="5">
++            <bounds>127.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym></keysym>
++                <keysym></keysym>
++                <keysym keyval="61" label="ホ">equal</keysym>
++                <keysym keyval="95" label="">underscore</keysym>
++                <keysym keyval="61" label="ほ">equal</keysym>
++                <keysym keyval="95" label="">underscore</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode31" name="AE03" column="0" row="6">
++            <bounds>152.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="49">1</keysym>
++                <keysym keyval="33">exclam</keysym>
++                <keysym keyval="106" label="マ">j</keysym>
++                <keysym keyval="74" label="">J</keysym>
++                <keysym keyval="106" label="ま">j</keysym>
++                <keysym keyval="74" label="">J</keysym>
++            </symbols>
++        </key>
++        <key id="keycode32" name="AD03" column="1" row="6">
++            <bounds>152.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="50">2</keysym>
++                <keysym keyval="64">at</keysym>
++                <keysym keyval="110" label="ミ">n</keysym>
++                <keysym keyval="78" label="">N</keysym>
++                <keysym keyval="110" label="み">n</keysym>
++                <keysym keyval="78" label="">N</keysym>
++            </symbols>
++        </key>
++        <key id="keycode33" name="AE04" column="2" row="6">
++            <bounds>152.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="51">3</keysym>
++                <keysym keyval="35">numbersign</keysym>
++                <keysym keyval="93" label="ム">bracketright</keysym>
++                <keysym></keysym>
++                <keysym keyval="93" label="む">bracketright</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode34" name="AE05" column="3" row="6">
++            <bounds>152.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="52">4</keysym>
++                <keysym keyval="36">dollar</keysym>
++                <keysym keyval="47" label="メ">slash</keysym>
++                <keysym></keysym>
++                <keysym keyval="47" label="め">slash</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode35" name="AE06" column="4" row="6">
++            <bounds>152.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="53">5</keysym>
++                <keysym keyval="37">percent</keysym>
++                <keysym keyval="109" label="モ">m</keysym>
++                <keysym keyval="77" label="">M</keysym>
++                <keysym keyval="109" label="も">m</keysym>
++                <keysym keyval="77" label="">M</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode36" name="AE03" column="0" row="7">
++            <bounds>177.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="54">6</keysym>
++                <keysym keyval="38">ampersand</keysym>
++                <keysym keyval="55" label="ヤ">7</keysym>
++                <keysym keyval="39" label="ャ">quoteright</keysym>
++                <keysym keyval="55" label="や">7</keysym>
++                <keysym keyval="39" label="ゃ">quoteright</keysym>
++            </symbols>
++        </key>
++        <key id="keycode37" name="AD03" column="1" row="7">
++            <bounds>177.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="55">7</keysym>
++                <keysym keyval="39">quoteright</keysym>
++                <keysym keyval="48" label="ヰ">0</keysym>
++                <keysym></keysym>
++                <keysym keyval="48" label="ゐ">0</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode38" name="AE04" column="2" row="7">
++            <bounds>177.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="56">8</keysym>
++                <keysym keyval="40">parenleft</keysym>
++                <keysym keyval="56" label="ユ">8</keysym>
++                <keysym keyval="40" label="ュ">parenleft</keysym>
++                <keysym keyval="56" label="ゆ">8</keysym>
++                <keysym keyval="40" label="ゅ">parenleft</keysym>
++            </symbols>
++        </key>
++        <key id="keycode39" name="AE05" column="3" row="7">
++            <bounds>177.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="57">9</keysym>
++                <keysym keyval="41">parenright</keysym>
++                <keysym keyval="48" label="ヱ">0</keysym>
++                <keysym></keysym>
++                <keysym keyval="48" label="ゑ">0</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode40" name="AE06" column="4" row="7">
++            <bounds>177.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="48">0</keysym>
++                <keysym></keysym>
++                <keysym keyval="57" label="ヨ">9</keysym>
++                <keysym keyval="41" label="ョ">parenright</keysym>
++                <keysym keyval="57" label="よ">9</keysym>
++                <keysym keyval="41" label="ょ">parenright</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode41" name="AE03" column="0" row="8">
++            <bounds>202.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="45">minus</keysym>
++                <keysym keyval="61">equal</keysym>
++                <keysym keyval="111" label="ラ">o</keysym>
++                <keysym keyval="79" label="">O</keysym>
++                <keysym keyval="111" label="ら">o</keysym>
++                <keysym keyval="79" label="">O</keysym>
++            </symbols>
++        </key>
++        <key id="keycode42" name="AD03" column="1" row="8">
++            <bounds>202.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="94">asciicircum</keysym>
++                <keysym keyval="126">asciitilde</keysym>
++                <keysym keyval="108" label="リ">l</keysym>
++                <keysym keyval="76" label="">L</keysym>
++                <keysym keyval="108" label="り">l</keysym>
++                <keysym keyval="76" label="">L</keysym>
++            </symbols>
++        </key>
++        <key id="keycode43" name="AE04" column="2" row="8">
++            <bounds>202.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="92">backslash</keysym>
++                <keysym keyval="124">bar</keysym>
++                <keysym keyval="46" label="ル">period</keysym>
++                <keysym></keysym>
++                <keysym keyval="46" label="る">period</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode44" name="AE05" column="3" row="8">
++            <bounds>202.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="64">at</keysym>
++                <keysym keyval="96">quoteleft</keysym>
++                <keysym keyval="59" label="レ">semicolon</keysym>
++                <keysym></keysym>
++                <keysym keyval="59" label="れ">semicolon</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode45" name="AE06" column="4" row="8">
++            <bounds>202.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="91">bracketleft</keysym>
++                <keysym keyval="123">braceleft</keysym>
++                <keysym keyval="92" label="ロ">backslash</keysym>
++                <keysym></keysym>
++                <keysym keyval="92" label="ろ">backslash</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode46" name="AE03" column="0" row="9">
++            <bounds>227.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="59">semicolon</keysym>
++                <keysym keyval="43">plus</keysym>
++                <keysym keyval="48" label="ワ">0</keysym>
++                <keysym></keysym>
++                <keysym keyval="48" label="わ">0</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode47" name="AD03" column="1" row="9">
++            <bounds>227.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="58">colon</keysym>
++                <keysym keyval="42">asterisk</keysym>
++                <keysym></keysym>
++                <keysym></keysym>
++                <keysym></keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode48" name="AE04" column="2" row="9">
++            <bounds>227.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="93">bracketright</keysym>
++                <keysym keyval="125">braceright</keysym>
++                <keysym keyval="126" label="ヲ">asciitilde</keysym>
++                <keysym keyval="63" label="・">question</keysym>
++                <keysym keyval="126" label="を">asciitilde</keysym>
++                <keysym keyval="63" label="・">question</keysym>
++            </symbols>
++        </key>
++        <key id="keycode49" name="AE05" column="3" row="9">
++            <bounds>227.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="44">comma</keysym>
++                <keysym keyval="60">less</keysym>
++                <keysym></keysym>
++                <keysym keyval="123" label="「">braceleft</keysym>
++                <keysym></keysym>
++                <keysym keyval="123" label="「">braceleft</keysym>
++            </symbols>
++        </key>
++        <key id="keycode50" name="AE06" column="4" row="9">
++            <bounds>227.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="46">period</keysym>
++                <keysym keyval="62">greater</keysym>
++                <keysym keyval="121" label="ン">y</keysym>
++                <keysym keyval="125" label="」">braceright</keysym>
++                <keysym keyval="121" label="ん">y</keysym>
++                <keysym keyval="125" label="」">braceright</keysym>
++            </symbols>
++        </key>
++
++        <key id="keycode51" name="AE03" column="0" row="10">
++            <bounds>252.000000,2.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="47">slash</keysym>
++                <keysym keyval="63">question</keysym>
++                <keysym keyval="64" label="゛">at</keysym>
++                <keysym></keysym>
++                <keysym keyval="64" label="゛">at</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode52" name="AD03" column="1" row="10">
++            <bounds>252.000000,27.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="2">
++                <keysym keyval="92">backslash</keysym>
++                <keysym keyval="95">underscore</keysym>
++                <keysym keyval="91" label="゜">bracketleft</keysym>
++                <keysym></keysym>
++                <keysym keyval="91" label="゜">bracketleft</keysym>
++                <keysym></keysym>
++            </symbols>
++        </key>
++        <key id="keycode53" name="AE04" column="2" row="10">
++            <bounds>252.000000,52.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="1">
++                <keysym></keysym>
++                <keysym keyval="124" label="ー">bar</keysym>
++                <keysym keyval="124" label="ー">bar</keysym>
++            </symbols>
++        </key>
++        <key id="keycode54" name="AE05" column="3" row="10">
++            <bounds>252.000000,77.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="1">
++                <keysym></keysym>
++                <keysym keyval="60" label="、">less</keysym>
++                <keysym keyval="60" label="、">less</keysym>
++            </symbols>
++        </key>
++        <key id="keycode55" name="AE06" column="4" row="10">
++            <bounds>252.000000,102.000000,24.000000,24.000000</bounds>
++            <oref>outline1</oref>
++            <symbols groups="3" levels="1">
++                <keysym></keysym>
++                <keysym keyval="62" label="。">greater</keysym>
++                <keysym keyval="62" label="。">greater</keysym>
++            </symbols>
++        </key>
++    </section>
++    <outline id="outline1">
++        <point>0.000000,0.000000</point>
++        <point>24.000000,0.000000</point>
++        <point>24.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline3">
++        <point>0.000000,0.000000</point>
++        <point>38.000000,0.000000</point>
++        <point>38.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline4">
++        <point>0.000000,0.000000</point>
++        <point>38.000000,0.000000</point>
++        <point>38.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline5">
++        <point>0.000000,0.000000</point>
++        <point>44.000000,0.000000</point>
++        <point>44.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline6">
++        <point>0.000000,0.000000</point>
++        <point>57.000000,0.000000</point>
++        <point>57.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline7">
++        <point>0.000000,0.000000</point>
++        <point>57.000000,0.000000</point>
++        <point>57.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline8">
++        <point>0.000000,0.000000</point>
++        <point>70.000000,0.000000</point>
++        <point>70.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline9">
++        <point>0.000000,0.000000</point>
++        <point>36.000000,0.000000</point>
++        <point>36.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline10">
++        <point>0.000000,0.000000</point>
++        <point>31.000000,0.000000</point>
++        <point>31.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline11">
++        <point>0.000000,0.000000</point>
++        <point>153.000000,0.000000</point>
++        <point>153.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline12">
++        <point>0.000000,0.000000</point>
++        <point>24.000000,0.000000</point>
++        <point>24.000000,50.000000</point>
++        <point>0.000000,50.000000</point>
++    </outline>
++    <outline id="outline13">
++        <point>0.000000,0.000000</point>
++        <point>50.000000,0.000000</point>
++        <point>50.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++    <outline id="outline2">
++        <point>0.000000,0.000000</point>
++        <point>51.000000,0.000000</point>
++        <point>51.000000,24.000000</point>
++        <point>0.000000,24.000000</point>
++    </outline>
++</keyboard>
++
+diff --git a/engine/test.py b/engine/test.py
+index 1903127..6b7794d 100644
+--- a/engine/test.py
++++ b/engine/test.py
+@@ -361,15 +361,6 @@ class TestSKK(unittest.TestCase):
+         self.__skk.press_key(u'>')
+         self.assertEqual(self.__skk.preedit, u'▼超')
+ 
+-        # Issue#28
+-        self.__skk.reset()
+-        self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
+-        self.__skk.press_key(u'S')
+-        self.__skk.press_key(u'a')
+-        self.__skk.press_key(u's')
+-        self.__skk.press_key(u'S')
+-        self.assertEqual(self.__skk.preedit, u'▽さっ*s')
+-
+     def testcompletion(self):
+         self.__skk.reset()
+         self.__skk.activate_input_mode(skk.INPUT_MODE_HIRAGANA)
+diff --git a/engine/vkbd.py b/engine/vkbd.py
+new file mode 100644
+index 0000000..8d01b65
+--- /dev/null
++++ b/engine/vkbd.py
+@@ -0,0 +1,165 @@
++# vim:set et sts=4 sw=4:
++# -*- coding: utf-8 -*-
++#
++# ibus-skk - The SKK engine for IBus
++#
++# Copyright (C) 2011 Daiki Ueno <ueno at unixuser.org>
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License
++# as published by the Free Software Foundation; either version 2
++# of the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
++# 02110-1301, USA.
++
++from ibus import keysyms
++from ibus import modifier
++import eekboard, virtkey
++
++KEYBOARD_MODE_US, KEYBOARD_MODE_KANA = range(2)
++KEYBOARD_TYPE_QWERTY, KEYBOARD_TYPE_TABLE = range(2)
++
++INPUT_MODE_HIRAGANA, \
++INPUT_MODE_KATAKANA, \
++INPUT_MODE_HALF_WIDTH_KATAKANA, \
++INPUT_MODE_LATIN, \
++INPUT_MODE_WIDE_LATIN = range(5)
++
++class Vkbd(object):
++    def __init__(self, engine, qwerty_path, table_path):
++        self.__engine = engine
++        self.__input_mode = None
++
++        self.__eekboard = eekboard.Eekboard()
++        self.__context = self.__eekboard.create_context("")
++
++        self.__qwerty_keyboard = \
++            eekboard.XmlKeyboard(qwerty_path,
++                                 eekboard.MODIFIER_BEHAVIOR_LATCH)
++        self.__qwerty_keyboard.connect('key-pressed', self.__key_pressed_cb)
++        self.__qwerty_keyboard.connect('key-released', self.__key_released_cb)
++        self.__qwerty_keyboard_id = \
++            self.__context.add_keyboard(self.__qwerty_keyboard)
++
++        self.__table_keyboard = \
++            eekboard.XmlKeyboard(table_path,
++                                 eekboard.MODIFIER_BEHAVIOR_LATCH)
++        self.__table_keyboard.connect('key-pressed', self.__key_pressed_cb)
++        self.__table_keyboard.connect('key-released', self.__key_released_cb)
++        self.__table_keyboard_id = \
++            self.__context.add_keyboard(self.__table_keyboard)
++
++        self.__virtkey = virtkey.virtkey()
++        self.__keyboard_mode = None
++        self.set_keyboard_type(KEYBOARD_TYPE_QWERTY)
++        self.set_keyboard_mode(None)
++
++    keyboard_mode = property(lambda self: self.__keyboard_mode)
++
++    def enable(self):
++        self.__eekboard.push_context(self.__context)
++
++    def disable(self):
++        self.__eekboard.pop_context()
++
++    def update_input_mode(self, input_mode):
++        if self.__input_mode != input_mode:
++            self.set_input_mode(input_mode)
++
++    def set_input_mode(self, input_mode):
++        self.__input_mode = input_mode
++        if self.__keyboard_mode == KEYBOARD_MODE_US:
++            self.__context.set_group(0)
++        elif self.__keyboard_mode == KEYBOARD_MODE_KANA:
++            if self.__input_mode == INPUT_MODE_KATAKANA:
++                self.__context.set_group(1)
++            elif self.__input_mode == INPUT_MODE_HIRAGANA:
++                self.__context.set_group(2)
++
++    def update_keyboard_mode(self, keyboard_mode):
++        if self.__keyboard_mode != keyboard_mode:
++            self.set_keyboard_mode(keyboard_mode)
++
++    def set_keyboard_mode(self, keyboard_mode):
++        self.__keyboard_mode = keyboard_mode
++        if self.__keyboard_mode is None:
++            self.__context.hide_keyboard()
++        else:
++            if self.__keyboard_mode == KEYBOARD_MODE_US:
++                self.__context.set_group(0)
++            else:
++                self.__context.set_group(2)
++            self.__context.show_keyboard()
++
++    def update_keyboard_type(self, keyboard_type):
++        if self.__keyboard_type != keyboard_type:
++            self.set_keyboard_type(keyboard_type)
++
++    def set_keyboard_type(self, keyboard_type):
++        self.__keyboard_type = keyboard_type
++        if self.__keyboard_type == KEYBOARD_TYPE_QWERTY:
++            self.__keyboard = self.__qwerty_keyboard
++            self.__context.set_keyboard(self.__qwerty_keyboard_id)
++        elif self.__keyboard_type == KEYBOARD_TYPE_TABLE:
++            self.__keyboard = self.__table_keyboard
++            self.__context.set_keyboard(self.__table_keyboard_id)
++        self.set_keyboard_mode(self.__keyboard_mode)
++
++    def __process_key_event(self, key, modifiers):
++        symbol = key.get_symbol()
++        if symbol.is_modifier() or not isinstance(symbol, eekboard.Keysym):
++            return False
++
++        keysym = symbol.get_xkeysym()
++
++        # handle special keys
++        if keysym == keysyms.Eisu_toggle:
++            if modifiers & modifier.RELEASE_MASK:
++                self.update_keyboard_mode(KEYBOARD_MODE_US)
++            return True
++
++        if keysym == keysyms.Hiragana_Katakana:
++            if modifiers & modifier.RELEASE_MASK:
++                self.update_keyboard_mode(KEYBOARD_MODE_KANA)
++                self.set_input_mode(self.__input_mode)
++            return True
++
++        if keysym == keysyms.Num_Lock:
++            if modifiers & modifier.RELEASE_MASK:
++                if self.__keyboard_type == KEYBOARD_TYPE_QWERTY:
++                    keyboard_type = KEYBOARD_TYPE_TABLE
++                elif self.__keyboard_type == KEYBOARD_TYPE_TABLE:
++                    keyboard_type = KEYBOARD_TYPE_QWERTY
++                if self.__keyboard_type != keyboard_type:
++                    self.set_keyboard_type(keyboard_type)
++            return True
++
++        if keysym == keysyms.Henkan:
++            keysym = keysyms.space
++            
++        # let the engine handle the key event
++        modifiers |= self.__keyboard.get_modifiers()
++        if self.__engine.process_key_event(keysym, \
++                                               key.get_keycode(), \
++                                               modifiers):
++            return True
++
++        # if the event is not handled, pass it back with virtkey
++        if modifiers & modifier.RELEASE_MASK:
++            self.__virtkey.release_keysym(symbol.get_xkeysym())
++        else:
++            self.__virtkey.press_keysym(symbol.get_xkeysym())
++
++    def __key_pressed_cb(self, keyboard, key):
++        return self.__process_key_event(key, 0)
++
++    def __key_released_cb(self, keyboard, key):
++        return self.__process_key_event(key, modifier.RELEASE_MASK)
diff --git a/ibus-skk.spec b/ibus-skk.spec
index 5c2a6f3..57b7589 100644
--- a/ibus-skk.spec
+++ b/ibus-skk.spec
@@ -1,12 +1,13 @@
 Name:		ibus-skk
 Version:	1.3.5
-Release:	2%{?dist}
+Release:	3%{?dist}
 Summary:	Japanese SKK input method for ibus
 
 Group:		System Environment/Libraries
 License:	GPLv2+
 URL:		http://github.com/ueno/ibus-skk
 Source0:	http://cloud.github.com/downloads/ueno/ibus-skk/%{name}-%{version}.tar.gz
+Patch0:		ibus-skk-vkbd.patch
 BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 BuildArch:	noarch
@@ -19,6 +20,7 @@ A Japanese Simple Kana Kanji Input Method Engine for ibus.
 
 %prep
 %setup -q
+%patch0 -p1 -b .vkbd
 
 
 %build
@@ -47,6 +49,9 @@ rm -rf $RPM_BUILD_ROOT
 
 
 %changelog
+* Tue Mar  8 2011 Daiki Ueno <dueno at redhat.com> - 1.3.5-3
+- add ibus-skk-vkbd.patch
+
 * Wed Feb 09 2011 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 1.3.5-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
 


More information about the scm-commits mailing list