[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