ibus-anthy/ibus-anthy-HEAD.patch
Takao Fujiwara 591064e7c4 Fix bug 564268 - Crash with enabled global input method Fix bug 570680 -
Support NICOLA-F and NICOLA-A Fix romaji_typing_rule. #777 Fix Shift +
    char with CapsLock ON in romaji mode. Fix chattering bug.
2010-03-05 02:24:14 +00:00

1556 lines
64 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff --git a/engine/engine.py b/engine/engine.py
index c5841cb..56e5b28 100644
--- a/engine/engine.py
+++ b/engine/engine.py
@@ -22,6 +22,7 @@
import os
from os import path
+from locale import getpreferredencoding
import sys
import gobject
import ibus
@@ -96,6 +97,7 @@ class Engine(ibus.EngineBase):
__setup_pid = 0
__prefs = None
__keybind = {}
+ __thumb = None
def __init__(self, bus, object_path):
super(Engine, self).__init__(bus, object_path)
@@ -105,8 +107,10 @@ class Engine(ibus.EngineBase):
self.__context._set_encoding(anthy.ANTHY_UTF8_ENCODING)
# init state
+ self.__idle_id = 0
self.__input_mode = INPUT_MODE_HIRAGANA
self.__prop_dict = {}
+ self.__is_utf8 = (getpreferredencoding().lower() == "utf-8")
# self.__lookup_table = ibus.LookupTable(page_size=9, round=True)
size = self.__prefs.get_value('common', 'page_size')
@@ -130,7 +134,6 @@ class Engine(ibus.EngineBase):
self.__preedit_ja_string = jastring.JaString(Engine.__typing_mode)
self.__convert_chars = u""
self.__cursor_pos = 0
- self.__need_update = False
self.__convert_mode = CONV_MODE_OFF
self.__segments = list()
self.__lookup_table.clean()
@@ -138,6 +141,11 @@ class Engine(ibus.EngineBase):
self._MM = 0
self._SS = 0
self._H = 0
+ self._RMM = 0
+ self._RSS = 0
+ if self.__idle_id != 0:
+ gobject.source_remove(self.__idle_id)
+ self.__idle_id = 0
def __init_props(self):
anthy_props = ibus.PropList()
@@ -485,6 +493,8 @@ class Engine(ibus.EngineBase):
return True
self.__prop_dict[prop_name].set_state(state)
self.update_property(self.__prop_dict[prop_name])
+ if prop_name == u"TypingMode.ThumbShift":
+ self._reset_thumb()
mode, label = typing_modes[prop_name]
@@ -526,6 +536,12 @@ class Engine(ibus.EngineBase):
elif mode == 1:
self.__on_key_return()
+ def do_destroy(self):
+ if self.__idle_id != 0:
+ gobject.source_remove(self.__idle_id)
+ self.__idle_id = 0
+ super(Engine,self).do_destroy()
+
# begine convert
def __begin_anthy_convert(self):
if self.__convert_mode == CONV_MODE_ANTHY:
@@ -562,6 +578,15 @@ class Engine(ibus.EngineBase):
def __end_convert(self):
self.__end_anthy_convert()
+ def __candidate_cb(self, candidate):
+ if not self.__is_utf8:
+ return
+ for key in romaji_utf8_rule.keys():
+ if candidate.find(key) >= 0:
+ for value in romaji_utf8_rule[key]:
+ candidate = candidate.replace(key, value)
+ self.__lookup_table.append_candidate(ibus.Text(candidate))
+
def __fill_lookup_table(self):
if self.__convert_mode == CONV_MODE_PREDICTION:
seg_stat = anthy.anthy_prediction_stat()
@@ -573,7 +598,7 @@ class Engine(ibus.EngineBase):
buf = self.__context.get_prediction(i)
candidate = unicode(buf, "utf-8")
self.__lookup_table.append_candidate(ibus.Text(candidate))
-
+ self.__candidate_cb(candidate)
return
# get segment stat
@@ -586,13 +611,14 @@ class Engine(ibus.EngineBase):
buf = self.__context.get_segment(self.__cursor_pos, i)
candidate = unicode(buf, "utf-8")
self.__lookup_table.append_candidate(ibus.Text(candidate))
+ self.__candidate_cb(candidate)
def __invalidate(self):
- if self.__need_update:
+ if self.__idle_id != 0:
return
- self.__need_update = True
- gobject.idle_add(self.__update, priority = gobject.PRIORITY_LOW)
+ self.__idle_id = gobject.idle_add(self.__update,
+ priority = gobject.PRIORITY_LOW)
# def __get_preedit(self):
def __get_preedit(self, commit=False):
@@ -699,11 +725,11 @@ class Engine(ibus.EngineBase):
self.__lookup_table_visible)
def __update(self):
- self.__need_update = False
if self.__convert_mode == CONV_MODE_OFF:
self.__update_input_chars()
else:
self.__update_convert_chars()
+ self.__idle_id = 0
def __on_key_return(self):
if self.__preedit_ja_string.is_empty():
@@ -956,7 +982,7 @@ class Engine(ibus.EngineBase):
self.__invalidate()
return True
- def __on_key_common(self, keyval):
+ def __on_key_common(self, keyval, state=0):
if self.__input_mode == INPUT_MODE_LATIN:
# Input Latin chars
@@ -981,6 +1007,13 @@ class Engine(ibus.EngineBase):
elif self.__convert_mode != CONV_MODE_OFF:
self.__commit_string(self.__convert_chars)
+ # "n" + "'" == "nn" in romaji
+ if (keyval >= ord('A') and keyval <= ord('Z')) or \
+ (keyval >= ord('a') and keyval <= ord('z')):
+ shift = (state & modifier.SHIFT_MASK) != 0
+ else:
+ shift = False
+ self.__preedit_ja_string.set_shift(shift)
self.__preedit_ja_string.insert(unichr(keyval))
self.__invalidate()
return True
@@ -1024,6 +1057,9 @@ class Engine(ibus.EngineBase):
cls.__prefs.set_value(base_sec, name, value)
if name == 'shortcut_type':
cls.__keybind = cls._mk_keybind()
+ elif base_sec == 'thumb':
+ cls.__prefs.set_value(base_sec, name, value)
+ cls._reset_thumb()
elif base_sec:
cls.__prefs.set_value(base_sec, name, value)
else:
@@ -1056,6 +1092,15 @@ class Engine(ibus.EngineBase):
'alt+' in s and modifier.MOD1_MASK or 0)
return cls._mk_key(keyval, state)
+ @classmethod
+ def _reset_thumb(cls):
+ if cls.__thumb == None:
+ import thumb
+ cls.__thumb = thumb.ThumbShiftKeyboard(cls.__prefs)
+
+ else:
+ cls.__thumb.reset()
+
@staticmethod
def _mk_key(keyval, state):
if state & (modifier.CONTROL_MASK | modifier.MOD1_MASK):
@@ -1067,12 +1112,12 @@ class Engine(ibus.EngineBase):
return repr([int(state), int(keyval)])
def process_key_event_thumb(self, keyval, keycode, state):
- import gtk
- import thumb
+ if self.__thumb == None:
+ self._reset_thumb()
def on_timeout(keyval):
if self._MM:
- insert(thumb.table[self._MM][self._SS])
+ insert(self.__thumb.get_char(self._MM)[self._SS])
else:
cmd_exec([0, RS(), LS()][self._SS])
self._H = None
@@ -1089,6 +1134,7 @@ class Engine(ibus.EngineBase):
def insert(keyval):
try:
+ self._MM = self._SS = 0
ret = self.__on_key_common(ord(keyval))
if (keyval in u',.、。' and
self.__prefs.get_value('common', 'behavior_on_period')):
@@ -1109,16 +1155,16 @@ class Engine(ibus.EngineBase):
return False
def RS():
- return self.__prefs.get_value('common', 'thumb_rs')
+ return self.__thumb.get_rs()
def LS():
- return self.__prefs.get_value('common', 'thumb_ls')
+ return self.__thumb.get_ls()
def T1():
- return self.__prefs.get_value('common', 'thumb_t1')
+ return self.__thumb.get_t1()
def T2():
- return self.__prefs.get_value('common', 'thumb_t2')
+ return self.__thumb.get_t2()
state = state & (modifier.SHIFT_MASK |
modifier.CONTROL_MASK |
@@ -1132,12 +1178,16 @@ class Engine(ibus.EngineBase):
if state & modifier.RELEASE_MASK:
if keyval == self._MM:
if stop():
- insert(thumb.table[self._MM][self._SS])
+ insert(self.__thumb.get_char(self._MM)[self._SS])
self._MM = 0
elif (1 if keyval == RS() else 2) == self._SS:
if stop():
cmd_exec([0, RS(), LS()][self._SS])
self._SS = 0
+ if keyval in [RS(), LS()]:
+ self._RSS = 0
+ elif keyval == self._RMM:
+ self._RMM = 0
else:
if keyval in [LS(), RS()] and state == 0:
if self._SS:
@@ -1147,35 +1197,50 @@ class Engine(ibus.EngineBase):
start(T1())
elif self._MM:
stop()
- insert(thumb.table[self._MM][1 if keyval == RS() else 2])
+ self._RMM = self._MM
+ self._RSS = 1 if keyval == RS() else 2
+ insert(self.__thumb.get_char(self._MM)[1 if keyval == RS() else 2])
else:
- self._SS = 1 if keyval == RS() else 2
- start(T1())
- elif keyval in thumb.table.keys() and state == 0:
+ if self._RSS == (1 if keyval == RS() else 2):
+ if self._RMM:
+ insert(self.__thumb.get_char(self._RMM)[self._RSS])
+ else:
+ self._SS = 1 if keyval == RS() else 2
+ start(T1())
+ elif keyval in self.__thumb.get_chars() and state == 0:
if self._MM:
stop()
- insert(thumb.table[self._MM][self._SS])
+ insert(self.__thumb.get_char(self._MM)[self._SS])
start(T2())
self._MM = keyval
elif self._SS:
stop()
- insert(thumb.table[keyval][self._SS])
+ self._RMM = keyval
+ self._RSS = self._SS
+ insert(self.__thumb.get_char(keyval)[self._SS])
else:
- if cmd_exec(keyval, state):
- return True
- start(T2())
- self._MM = keyval
+ if self._RMM == keyval:
+ if self._RSS:
+ insert(self.__thumb.get_char(self._RMM)[self._RSS])
+ else:
+ if cmd_exec(keyval, state):
+ return True
+ start(T2())
+ self._MM = keyval
else:
if self._MM:
stop()
- insert(thumb.table[self._MM][self._SS])
+ insert(self.__thumb.get_char(self._MM)[self._SS])
elif self._SS:
stop()
cmd_exec([0, RS(), LS()][self._SS])
if cmd_exec(keyval, state):
return True
elif 0x21 <= keyval <= 0x7e and state & (modifier.CONTROL_MASK | modifier.MOD1_MASK) == 0:
- insert(thumb.shift_table.get(keyval, unichr(keyval)))
+ if state & modifier.SHIFT_MASK:
+ insert(self.__thumb.get_shift_char(keyval, unichr(keyval)))
+ elif self._SS == 0:
+ insert(unichr(keyval))
else:
if not self.__preedit_ja_string.is_empty():
return True
@@ -1220,7 +1285,7 @@ class Engine(ibus.EngineBase):
keyval = keysyms.asciitilde
elif keyval == keysyms.backslash and keycode in [132-8, 133-8]:
keyval = keysyms.yen
- ret = self.__on_key_common(keyval)
+ ret = self.__on_key_common(keyval, state)
if (unichr(keyval) in u',.' and
self.__prefs.get_value('common', 'behavior_on_period')):
return self.__cmd_convert(keyval, state)
diff --git a/engine/jastring.py b/engine/jastring.py
index 306691e..7aa2ff2 100644
--- a/engine/jastring.py
+++ b/engine/jastring.py
@@ -55,11 +55,15 @@ class JaString:
def reset(self):
self.__cursor = 0
self.__segments = list()
+ self.__shift = False
def set_mode(self, mode):
self.__mode = mode
self.reset()
+ def set_shift(self, shift):
+ self.__shift = shift
+
def insert(self, c):
segment_before = None
segment_after = None
@@ -70,14 +74,21 @@ class JaString:
if self.__cursor < len(self.__segments):
segment_after = self.__segments[self.__cursor]
if segment_before and not segment_before.is_finished():
- new_segments = segment_before.append(c)
+ if type(segment_before) == romaji.RomajiSegment:
+ new_segments = segment_before.append(c, self.__shift)
+ else:
+ new_segments = segment_before.append(c)
elif segment_after and not segment_after.is_finished():
- new_segments = segment_after.prepend(c)
+ if type(segment_after) == romaji.RomajiSegment:
+ new_segments = segment_after.prepend(c, self.__shift)
+ else:
+ new_segments = segment_after.prepend(c)
else:
if c != u"\0" and c != u"":
if self.__mode == TYPING_MODE_ROMAJI:
- new_segments = [romaji.RomajiSegment(c)]
+ new_segments = [romaji.RomajiSegment(c, u"", self.__shift)]
elif self.__mode == TYPING_MODE_KANA:
+ # kana mode doesn't have shift latin in MS.
new_segments = [kana.KanaSegment(c)]
elif self.__mode == TYPING_MODE_THUMB_SHIFT:
new_segments = [thumb.ThumbShiftSegment(c)]
@@ -126,7 +137,9 @@ class JaString:
ret = ''
for c in s:
c = c if not period else PeriodTable.get(c, c)
- c = c if not symbol else SymbolTable[symbol].get(c, c)
+ # thumb_left + '2' and '/' are different
+ if self.__mode != TYPING_MODE_THUMB_SHIFT:
+ c = c if not symbol else SymbolTable[symbol].get(c, c)
c = c if not half_symbol else HalfSymbolTable.get(c, c)
c = c if not half_number else HalfNumberTable.get(c, c)
ret += c
diff --git a/engine/romaji.py b/engine/romaji.py
index 12c6656..3deb8f9 100644
--- a/engine/romaji.py
+++ b/engine/romaji.py
@@ -28,8 +28,8 @@ def romaji_correction_rule_get(k, d):
return (u'ん', k[1:2]) if k[0:1] == u'n' and not k[1:2] in u"aiueony'" else d
class RomajiSegment(segment.Segment):
- def __init__(self, enchars=u"", jachars=u""):
- if not jachars:
+ def __init__(self, enchars=u"", jachars=u"", shift=False):
+ if not jachars and not shift:
jachars = romaji_typing_rule.get(enchars, None)
if jachars == None:
jachars = symbol_rule.get(enchars, u"")
@@ -38,13 +38,16 @@ class RomajiSegment(segment.Segment):
def is_finished(self):
return self._jachars != u""
- def append(self, enchar):
+ def append(self, enchar, shift=False):
if self.is_finished():
if enchar == u"" and enchar == u"\0":
return []
return [RomajiSegment(enchar)]
text = self._enchars + enchar
+ if shift:
+ self._enchars = text
+ return []
jachars = romaji_typing_rule.get(text, None)
if jachars == None:
@@ -98,7 +101,7 @@ class RomajiSegment(segment.Segment):
self._enchars = text
return []
- def prepend(self, enchar):
+ def prepend(self, enchar, shift=False):
if enchar == u"" or enchar == u"\0":
return []
@@ -106,6 +109,10 @@ class RomajiSegment(segment.Segment):
return [RomajiSegment(enchar)]
text = enchar + self._enchars
+ if shift:
+ self._enchars = text
+ return []
+
jachars = romaji_typing_rule.get(text, None)
if jachars == None:
jachars = symbol_rule.get(text, None)
diff --git a/engine/tables.py b/engine/tables.py
index 2ea67e0..a86a26a 100644
--- a/engine/tables.py
+++ b/engine/tables.py
@@ -38,12 +38,6 @@ romaji_typing_rule = {
u"lu" : u"ぅ",
u"le" : u"ぇ",
u"lo" : u"ぉ",
-# u"xka" : u"ゕ",
- u"xka" : u"ヵ",
-# u"xke" : u"ゖ",
- u"xke" : u"ヶ",
- u"wi" : u"うぃ",
- u"we" : u"うぇ",
u"wha" : u"うぁ",
u"whi" : u"うぃ",
u"whe" : u"うぇ",
@@ -58,6 +52,12 @@ romaji_typing_rule = {
u"ku" : u"く",
u"ke" : u"け",
u"ko" : u"こ",
+ u"lka" : u"ヵ",
+ u"lke" : u"ヶ",
+# u"xka" : u"ゕ",
+ u"xka" : u"ヵ",
+# u"xke" : u"ゖ",
+ u"xke" : u"ヶ",
u"ga" : u"が",
u"gi" : u"ぎ",
u"gu" : u"ぐ",
@@ -68,11 +68,13 @@ romaji_typing_rule = {
u"kyu" : u"きゅ",
u"kye" : u"きぇ",
u"kyo" : u"きょ",
+ u"kwa" : u"くぁ",
u"gya" : u"ぎゃ",
u"gyi" : u"ぎぃ",
u"gyu" : u"ぎゅ",
u"gye" : u"ぎぇ",
u"gyo" : u"ぎょ",
+ u"gwa" : u"ぐぁ",
u"sa" : u"さ",
u"si" : u"し",
u"su" : u"す",
@@ -128,6 +130,11 @@ romaji_typing_rule = {
u"tyu" : u"ちゅ",
u"tye" : u"ちぇ",
u"tyo" : u"ちょ",
+ u"cya" : u"ちゃ",
+ u"cyi" : u"ちぃ",
+ u"cyu" : u"ちゅ",
+ u"cye" : u"ちぇ",
+ u"cyo" : u"ちょ",
u"cha" : u"ちゃ",
u"chi" : u"ち",
u"chu" : u"ちゅ",
@@ -139,6 +146,7 @@ romaji_typing_rule = {
u"dye" : u"ぢぇ",
u"dyo" : u"ぢょ",
u"tsa" : u"つぁ",
+ u"tsi" : u"つぃ",
u"tse" : u"つぇ",
u"tso" : u"つぉ",
u"tha" : u"てゃ",
@@ -146,11 +154,13 @@ romaji_typing_rule = {
u"thu" : u"てゅ",
u"the" : u"てぇ",
u"tho" : u"てょ",
+ u"twu" : u"とぅ",
u"dha" : u"でゃ",
u"dhi" : u"でぃ",
u"dhu" : u"でゅ",
u"dhe" : u"でぇ",
u"dho" : u"でょ",
+ u"dwu" : u"どぅ",
u"na" : u"な",
u"ni" : u"に",
u"nu" : u"ぬ",
@@ -211,15 +221,21 @@ romaji_typing_rule = {
u"myu" : u"みゅ",
u"mye" : u"みぇ",
u"myo" : u"みょ",
- u"lya" : u"ゃ",
- u"xya" : u"ゃ",
u"ya" : u"や",
- u"lyu" : u"ゅ",
- u"xyu" : u"ゅ",
+ u"yi" : u"い",
u"yu" : u"ゆ",
+ u"ye" : u"いぇ",
+ u"yo" : u"よ",
+ u"lya" : u"ゃ",
+ u"lyi" : u"ぃ",
+ u"lyu" : u"ゅ",
+ u"lye" : u"ぇ",
u"lyo" : u"ょ",
+ u"xya" : u"ゃ",
+ u"xyi" : u"ぃ",
+ u"xyu" : u"ゅ",
+ u"xye" : u"ぇ",
u"xyo" : u"ょ",
- u"yo" : u"よ",
u"ra" : u"ら",
u"ri" : u"り",
u"ru" : u"る",
@@ -230,9 +246,13 @@ romaji_typing_rule = {
u"ryu" : u"りゅ",
u"rye" : u"りぇ",
u"ryo" : u"りょ",
- u"xwa" : u"ゎ",
u"wa" : u"わ",
+ u"wi" : u"うぃ",
+ u"wu" : u"う",
+ u"we" : u"うぇ",
u"wo" : u"を",
+ u"lwa" : u"ゎ",
+ u"xwa" : u"ゎ",
u"n'" : u"ん",
u"nn" : u"ん",
u"wyi" : u"ゐ",
@@ -337,6 +357,11 @@ romaji_correction_rule = {
u"n." : (u"ん", u"."),
}
+# EUC-JP and SJIS do not have the chars
+romaji_utf8_rule = {
+ u"ヴ" : (u"ゔ"),
+}
+
# a port of 101kana.sty from scim-anthy
kana_typing_rule = {
# no modifiers keys
diff --git a/engine/thumb.py b/engine/thumb.py
index b678cda..8c4baff 100644
--- a/engine/thumb.py
+++ b/engine/thumb.py
@@ -21,12 +21,20 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-import gtk
-import gobject
-import time
+__all__ = (
+ "ThumbShiftKeyboard",
+ "ThumbShiftSegment",
+ )
+from ibus import keysyms
+from ibus import modifier
import segment
+try:
+ from gtk.gdk import get_default_root_window
+except ImportError:
+ get_default_root_window = lambda : None
+
_table = {
'q': [u'。', u'', u'ぁ'],
@@ -76,6 +84,88 @@ _table = {
'7': [u'7', u'', u''],
'8': [u'8', u'', u''],
'9': [u'9', u'', u''],
+ '\\': [u'¥', u'', u''],
+}
+
+_nicola_j_table = {
+ ':': [u'', u'', u''],
+ '@': [u'、', u'', u''],
+ '[': [u'゛', u'゜', u''],
+ ']': [u'」', u'', u''],
+ '8': [u'8', u'', u''],
+ '9': [u'9', u'', u''],
+ '0': [u'0', u'', u''],
+}
+
+_nicola_a_table = {
+ ':': [u'', u'', u''],
+ '@': [u'', u'', u''],
+ '[': [u'、', u'', u''],
+ ']': [u'゛', u'゜', u''],
+ '8': [u'8', u'', u''],
+ '9': [u'9', u'', u''],
+ '0': [u'0', u'', u''],
+}
+
+_nicola_f_table = {
+ ':': [u'、', u'', u''],
+ '@': [u'', u'', u''],
+ '[': [u'゛', u'゜', u''],
+ ']': [u'」', u'', u''],
+ '8': [u'8', u'', u''],
+ '9': [u'9', u'', u''],
+ '0': [u'0', u'', u''],
+}
+
+_kb231_j_fmv_table = {
+ '3': [u'3', u'', u''],
+ '0': [u'0', u'『', u''],
+ '-': [u'-', u'』', u''],
+ '=': [u'=', u'', u''],
+}
+
+_kb231_a_fmv_table = {
+ '3': [u'3', u'', u''],
+ '0': [u'0', u'', u''],
+ '-': [u'-', u'『', u''],
+ '=': [u'=', u'』', u''],
+}
+
+_kb231_f_fmv_table = {
+ '3': [u'3', u'', u''],
+ '0': [u'0', u'『', u''],
+ '-': [u'-', u'』', u''],
+ '=': [u'=', u'', u''],
+}
+
+_kb611_j_fmv_table = {
+ '`': [u'', u'', u''],
+ '^': [u'々', u'£', u''],
+ ':': [u'', u'', u''],
+ '@': [u'、', u'¢', u''],
+ '[': [u'゛', u'゜', u''],
+ # keysyms are same and keycodes depend on the platforms.
+ #'¥': [u'¥', u'¬', u''],
+ '\\': [u'¥', u'¦', u''],
+}
+
+_kb611_a_fmv_table = {
+ '`': [u'々', u'', u'£'],
+ ':': [u'', u'', u''],
+ '@': [u'', u'', u''],
+ '[': [u'、', u'¢', u''],
+ #'¥': [u'¥', u'¬', u''],
+ '\\': [u'¥', u'¦', u''],
+}
+
+_kb611_f_fmv_table = {
+ '`': [u'', u'', u''],
+ '^': [u'々', u'£', u''],
+ ':': [u'、', u'¢', u''],
+ '@': [u'', u'', u''],
+ '[': [u'゛', u'゜', u''],
+ #'¥': [u'¥', u'¬', u''],
+ '\\': [u'¥', u'¦', u''],
}
_shift_table = {
@@ -87,7 +177,6 @@ _shift_table = {
}
table = {}
-shift_table = {}
r_table = {}
for k in _table.keys():
@@ -95,10 +184,6 @@ for k in _table.keys():
for c in _table[k]:
r_table[c] = k
-for k in _shift_table.keys():
- shift_table[ord(k)] = _shift_table[k]
- r_table[_shift_table[k]] = k
-
kana_voiced_consonant_rule = {
u"か゛" : u"が",
u"き゛" : u"ぎ",
@@ -129,6 +214,208 @@ kana_voiced_consonant_rule = {
_UNFINISHED_HIRAGANA = set(u"かきくけこさしすせそたちつてとはひふへほ")
+class ThumbShiftKeyboard:
+ def __init__(self, prefs=None):
+ self.__prefs = prefs
+ self.__table = table
+ self.__r_table = r_table
+ self.__shift_table = {}
+ self.__ls = 0
+ self.__rs = 0
+ self.__t1 = 0
+ self.__t2 = 0
+ self.__layout = 0
+ self.__fmv_extension = 2
+ self.__handakuten = False
+ if self.__prefs != None:
+ self.reset()
+ self.__reset_shift_table(False)
+
+ def __init_layout_table(self):
+ if self.__table != {}:
+ self.__table.clear()
+ if self.__r_table != {}:
+ self.__r_table.clear()
+ for k in _table.keys():
+ self.__table[ord(k)] = _table[k]
+ for c in _table[k]:
+ self.__r_table[c] = k
+
+ def __reset_layout_table(self, init, j_table, a_table, f_table):
+ if init:
+ self.__init_layout_table()
+ sub_table = None
+ if self.__layout == 0:
+ sub_table = j_table
+ elif self.__layout == 1:
+ sub_table = a_table
+ elif self.__layout == 2:
+ sub_table = f_table
+ if sub_table == None:
+ return
+ for k in sub_table.keys():
+ self.__table[ord(unicode(k))] = sub_table[k]
+ for c in sub_table[k]:
+ self.__r_table[c] = k
+
+ def __reset_extension_table(self, init):
+ self.__reset_layout_table(init,
+ _nicola_j_table,
+ _nicola_a_table,
+ _nicola_f_table)
+ if self.__fmv_extension == 0:
+ return
+ if self.__fmv_extension >= 1:
+ self.__reset_layout_table(False,
+ _kb231_j_fmv_table,
+ _kb231_a_fmv_table,
+ _kb231_f_fmv_table)
+ if self.__fmv_extension >= 2:
+ self.__reset_layout_table(False,
+ _kb611_j_fmv_table,
+ _kb611_a_fmv_table,
+ _kb611_f_fmv_table)
+
+ def __reset_shift_table(self, init):
+ self.__reset_extension_table(init)
+ if self.__handakuten:
+ for k in _shift_table.keys():
+ self.__shift_table[ord(k)] = _shift_table[k]
+ self.__r_table[_shift_table[k]] = k
+ elif self.__shift_table != {}:
+ for k in _shift_table.keys():
+ if ord(k) in self.__shift_table:
+ del self.__shift_table[ord(k)]
+ if _shift_table[k] in self.__r_table:
+ del self.__r_table[_shift_table[k]]
+
+ def __s_to_key_raw(self, s):
+ keyval = keysyms.name_to_keycode(s.split('+')[-1])
+ s = s.lower()
+ state = ('shift+' in s and modifier.SHIFT_MASK or 0) | (
+ 'ctrl+' in s and modifier.CONTROL_MASK or 0) | (
+ 'alt+' in s and modifier.MOD1_MASK or 0)
+ return (keyval, state)
+
+ def __get_xkb_layout(self):
+ root_window = get_default_root_window()
+ if not root_window:
+ return 0
+ prop = root_window.property_get("_XKB_RULES_NAMES")[2]
+ list = prop.split('\0')
+ layout = 0
+ for data in list:
+ if data == "jp":
+ layout = 0
+ elif data == "us":
+ layout = 1
+ elif data.find("japan:nicola_f_bs") >= 0:
+ layout = 2
+ elif data.find("japan:") >= 0:
+ layout = 0
+ return layout
+
+ def reset(self):
+ s = self.__prefs.get_value('thumb', 'ls')
+ ls, state = self.__s_to_key_raw(s)
+ if ls == 0xffffff:
+ ls = keysyms.Muhenkan
+ self.set_ls(ls)
+
+ s = self.__prefs.get_value('thumb', 'rs')
+ rs, state = self.__s_to_key_raw(s)
+ if rs == 0xffffff:
+ rs = keysyms.Henkan
+ self.set_rs(rs)
+
+ t1 = self.__prefs.get_value('thumb', 't1')
+ t2 = self.__prefs.get_value('thumb', 't2')
+ self.set_t1(t1)
+ self.set_t2(t2)
+
+ mode = self.__prefs.get_value('thumb', 'keyboard_layout_mode')
+ layout = 0
+ if mode == 1:
+ layout = self.__get_xkb_layout()
+ else:
+ layout = self.__prefs.get_value('thumb', 'keyboard_layout')
+ self.set_layout(layout)
+
+ fmv_extension = self.__prefs.get_value('thumb', 'fmv_extension')
+ self.set_fmv_extension(fmv_extension)
+ handakuten = self.__prefs.get_value('thumb', 'handakuten')
+ self.set_handakuten(handakuten)
+
+ def get_ls(self):
+ return self.__ls
+
+ def set_ls(self, ls):
+ self.__ls = ls
+
+ def get_rs(self):
+ return self.__rs
+
+ def set_rs(self, rs):
+ self.__rs = rs
+
+ def get_t1(self):
+ return self.__t1
+
+ def set_t1(self, t1):
+ self.__t1 = t1
+
+ def get_t2(self):
+ return self.__t2
+
+ def set_t2(self, t2):
+ self.__t2 = t2
+
+ def get_layout(self):
+ return self.__layout
+
+ def set_layout(self, layout):
+ if self.__layout == layout:
+ return
+ self.__layout = layout
+ self.__reset_shift_table(True)
+
+ def get_fmv_extension (self):
+ return self.__fmv_extension
+
+ def set_fmv_extension (self, fmv_extension):
+ if self.__fmv_extension == fmv_extension:
+ return
+ self.__fmv_extension = fmv_extension
+ self.__reset_shift_table(True)
+
+ def get_handakuten(self):
+ return self.__handakuten
+
+ def set_handakuten(self, handakuten):
+ if self.__handakuten == handakuten:
+ return
+ self.__handakuten = handakuten
+ self.__reset_shift_table(True)
+
+ def get_char(self, key, fallback=None):
+ return self.__table.get(key, fallback)
+
+ def get_chars(self):
+ return self.__table.keys()
+
+ def get_r_char(self, key, fallback=None):
+ return self.__r_table.get(key, fallback)
+
+ def get_r_chars(self):
+ return self.__r_table.keys()
+
+ def get_shift_char(self, key, fallback=None):
+ return self.__shift_table.get(key, fallback)
+
+ def get_shift_chars(self):
+ return self.__shift_table.keys()
+
+
class ThumbShiftSegment(segment.Segment):
def __init__(self, enchars=u"", jachars=u""):
diff --git a/ibus-anthy.spec.in b/ibus-anthy.spec.in
index ada402b..23e25fb 100644
--- a/ibus-anthy.spec.in
+++ b/ibus-anthy.spec.in
@@ -20,6 +20,7 @@ BuildRequires: swig
BuildRequires: pkgconfig
BuildRequires: intltool
+Requires: pygtk2 >= 2.15.2
Requires: ibus >= 1.2.0.20100111
Requires: anthy
%if %enable_kasumi
diff --git a/setup/anthyprefs.py b/setup/anthyprefs.py
index 9af9ba4..5444bab 100644
--- a/setup/anthyprefs.py
+++ b/setup/anthyprefs.py
@@ -170,11 +170,17 @@ _config = {
'dict_admin_command': ['/usr/bin/kasumi', 'kasumi'],
'add_word_command': ['/usr/bin/kasumi', 'kasumi', '-a'],
-
- 'thumb_rs': gtk.keysyms.Henkan,
- 'thumb_ls': gtk.keysyms.Muhenkan,
- 'thumb_t1': 100,
- 'thumb_t2': 75,
+ },
+
+ 'thumb': {
+ 'keyboard_layout_mode': True,
+ 'keyboard_layout': 0,
+ 'fmv_extension': 2,
+ 'handakuten': False,
+ 'rs': 'Henkan',
+ 'ls': 'Muhenkan',
+ 't1': 100,
+ 't2': 75,
}
}
diff --git a/setup/main.py b/setup/main.py
index 1da35f7..5921d24 100644
--- a/setup/main.py
+++ b/setup/main.py
@@ -24,7 +24,7 @@ from os import path, getenv
import gtk
import pango
from gtk import glade
-from ibus import keysyms, modifier
+from ibus import keysyms, modifier, Bus
from gettext import dgettext, bindtextdomain
from anthyprefs import AnthyPrefs
@@ -41,7 +41,10 @@ def s_to_l(s):
class AnthySetup(object):
def __init__(self):
- self.prefs = prefs = AnthyPrefs()
+ self.__config = Bus().get_config()
+ self.__thumb_kb_layout_mode = None
+ self.__thumb_kb_layout = None
+ self.prefs = prefs = AnthyPrefs(None, self.__config)
localedir = getenv("IBUS_LOCALEDIR")
bindtextdomain("ibus-anthy", localedir)
@@ -63,8 +66,11 @@ class AnthySetup(object):
for name in ['input_mode', 'typing_method',
'period_style', 'symbol_style', 'ten_key_mode',
'behavior_on_focus_out', 'behavior_on_period',
- 'half_width_symbol', 'half_width_number', 'half_width_space']:
- xml.get_widget(name).set_active(prefs.get_value('common', name))
+ 'half_width_symbol', 'half_width_number', 'half_width_space',
+ 'thumb:keyboard_layout_mode', 'thumb:keyboard_layout',
+ 'thumb:fmv_extension', 'thumb:handakuten']:
+ section, key = self.__get_section_key(name)
+ xml.get_widget(name).set_active(prefs.get_value(section, key))
l = ['default', 'atok', 'wnn']
s_type = prefs.get_value('common', 'shortcut_type')
@@ -89,6 +95,14 @@ class AnthySetup(object):
ls.append([k, l_to_s(self.prefs.get_value(sec, k))])
tv.set_model(ls)
+ self.__thumb_kb_layout_mode = xml.get_widget('thumb:keyboard_layout_mode')
+ self.__thumb_kb_layout = xml.get_widget('thumb:keyboard_layout')
+ self.__set_thumb_kb_label()
+
+ for name in ['thumb:ls', 'thumb:rs']:
+ section, key = self.__get_section_key(name)
+ xml.get_widget(name).set_text(prefs.get_value(section, key))
+
tv = xml.get_widget('treeview2')
tv.append_column(gtk.TreeViewColumn('', gtk.CellRendererText(), text=0))
tv.get_selection().connect_after('changed',
@@ -97,6 +111,32 @@ class AnthySetup(object):
xml.signal_autoconnect(self)
+ def __get_section_key(self, name):
+ i = name.find(':')
+ if i > 0:
+ section = name[:i]
+ key = name[i + 1:]
+ else:
+ section = 'common'
+ key = name
+ return (section, key)
+
+ def __set_thumb_kb_label(self):
+ if self.__thumb_kb_layout_mode == None or \
+ self.__thumb_kb_layout == None:
+ return
+ section, key = self.__get_section_key(self.__thumb_kb_layout_mode.name)
+ layout_mode = self.prefs.get_value(section, key)
+ if layout_mode:
+ self.__thumb_kb_layout.set_sensitive(False)
+ else:
+ self.__thumb_kb_layout.set_sensitive(True)
+ if layout_mode and \
+ not self.__config.get_value('general', 'use_system_keyboard_layout', True):
+ self.xml.get_widget('thumb:warning_hbox').show()
+ else:
+ self.xml.get_widget('thumb:warning_hbox').hide()
+
def on_selection_changed(self, widget, id):
set_sensitive = lambda a, b: self.xml.get_widget(a).set_sensitive(b)
flg = True if widget.get_selected()[1] else False
@@ -139,16 +179,22 @@ class AnthySetup(object):
widget.set_sensitive(False)
def on_cb_changed(self, widget):
- self.prefs.set_value('common', widget.name, widget.get_active())
+ section, key = self.__get_section_key(widget.name)
+ self.prefs.set_value(section, key, widget.get_active())
self.xml.get_widget('btn_apply').set_sensitive(True)
def on_sb_changed(self, widget):
- self.prefs.set_value('common', widget.name, widget.get_value_as_int())
+ section, key = self.__get_section_key(widget.name)
+ self.prefs.set_value(section, key, widget.get_value_as_int())
self.xml.get_widget('btn_apply').set_sensitive(True)
def on_ck_toggled(self, widget):
- self.prefs.set_value('common', widget.name, widget.get_active())
+ section, key = self.__get_section_key(widget.name)
+ self.prefs.set_value(section, key, widget.get_active())
self.xml.get_widget('btn_apply').set_sensitive(True)
+ if self.__thumb_kb_layout_mode and \
+ widget.name == self.__thumb_kb_layout_mode.name:
+ self.__set_thumb_kb_label()
def on_btn_edit_clicked(self, widget):
ls, it = self.xml.get_widget('shortcut').get_selection().get_selected()
@@ -179,6 +225,41 @@ class AnthySetup(object):
ls.set(it, 1, new)
self.xml.get_widget('btn_apply').set_sensitive(True)
+ def on_btn_thumb_key_clicked(self, widget):
+ if widget.name == 'thumb:button_ls':
+ entry = 'thumb:ls'
+ elif widget.name == 'thumb:button_rs':
+ entry = 'thumb:rs'
+ else:
+ return
+ text = self.xml.get_widget(entry).get_text()
+ m = self.xml.get_widget('treeview2').get_model()
+ m.clear()
+ if text != None:
+ m.append([text])
+ i = m.get_iter_first()
+ self.xml.get_widget('treeview2').get_selection().select_iter(i)
+ self.xml.get_widget('entry2').set_text('')
+ self.xml.get_widget('button4').hide()
+ self.xml.get_widget('button5').show()
+ self.xml.get_widget('button6').hide()
+ for w in ['checkbutton6', 'checkbutton7', 'checkbutton8']:
+ self.xml.get_widget(w).set_active(False)
+ dlg = self.xml.get_widget('edit_shortcut')
+ id = dlg.run()
+ dlg.hide()
+ self.xml.get_widget('button4').show()
+ self.xml.get_widget('button5').hide()
+ self.xml.get_widget('button6').show()
+ if id == gtk.RESPONSE_OK:
+ l, i = self.xml.get_widget('treeview2').get_selection().get_selected()
+ new = l[i][0]
+ if new != text:
+ section, key = self.__get_section_key(entry)
+ self.prefs.set_value(section, key, new)
+ self.xml.get_widget(entry).set_text(new)
+ self.xml.get_widget('btn_apply').set_sensitive(True)
+
def _get_shortcut_sec(self):
l = ['default', 'atok', 'wnn']
s_type = self.xml.get_widget('shortcut_type').get_active_text().lower()
@@ -195,7 +276,8 @@ class AnthySetup(object):
for k in self.prefs.keys(sec):
ls.append([k, l_to_s(self.prefs.get_value(sec, k))])
- self.prefs.set_value('common', widget.name, sec[len('shortcut/'):])
+ section, key = self.__get_section_key(widget.name)
+ self.prefs.set_value(section, key, sec[len('shortcut/'):])
self.xml.get_widget('btn_apply').set_sensitive(True)
def on_shortcut_key_release_event(self, widget, event):
@@ -262,6 +344,24 @@ class AnthySetup(object):
return True
l.append([s])
+ def on_button5_clicked(self, widget):
+ s = self.xml.get_widget('entry2').get_text()
+ if not s or not keysyms.name_to_keycode(s):
+ dlg = self.xml.get_widget('invalid_keysym')
+ dlg.set_markup('<big><b>%s</b></big>' % _('Invalid keysym'))
+ dlg.format_secondary_text(_('This keysym is not valid'))
+ dlg.run()
+ dlg.hide()
+ return True
+ for w, m in [('checkbutton6', 'Ctrl+'),
+ ('checkbutton7', 'Alt+'),
+ ('checkbutton8', 'Shift+')]:
+ if self.xml.get_widget(w).get_active():
+ s = m + s
+ l, i = self.xml.get_widget('treeview2').get_selection().get_selected()
+ l[i][0] = s
+ return True
+
def on_button6_clicked(self, widget):
l, i = self.xml.get_widget('treeview2').get_selection().get_selected()
if i:
diff --git a/setup/setup.glade b/setup/setup.glade
index f068938..39fc754 100644
--- a/setup/setup.glade
+++ b/setup/setup.glade
@@ -460,7 +460,7 @@ Hold
<property name="visible">True</property>
<property name="spacing">8</property>
<child>
- <widget class="GtkLabel" id="label4">
+ <widget class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="label" translatable="yes">_Shortcut Type:</property>
<property name="use_underline">True</property>
@@ -612,6 +612,373 @@ Wnn
</packing>
</child>
<child>
+ <widget class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="border_width">8</property>
+ <property name="spacing">4</property>
+ <child>
+ <widget class="GtkFrame" id="frame4">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="top_padding">8</property>
+ <property name="bottom_padding">8</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkTable" id="table4">
+ <property name="visible">True</property>
+ <property name="n_rows">8</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <widget class="GtkTable" id="table5">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">3</property>
+ <property name="column_spacing">8</property>
+ <property name="row_spacing">4</property>
+ <child>
+ <widget class="GtkLabel" id="label28">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">Thumb Shift _Left Key:</property>
+ <property name="mnemonic_widget">thumb:ls</property>
+ </widget>
+ <packing>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="thumb:ls">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="thumb:button_ls">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="on_btn_thumb_key_clicked"/>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label29">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Thumb Shift Right Key:</property>
+ <property name="mnemonic_widget">thumb:rs</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="thumb:rs">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="thumb:button_rs">
+ <property name="label">...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <signal name="clicked" handler="on_btn_thumb_key_clicked"/>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="thumb:keyboard_layout_mode">
+ <property name="label" translatable="yes">Adjust _input method layout to system keyboard layout</property>
+ <property name="tooltip_text" translatable="yes">Adjust IM layout to XKB layout</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_ck_toggled"/>
+ <accelerator key="I" signal="grab_focus" modifiers="GDK_MOD1_MASK"/>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox9">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <widget class="GtkLabel" id="label30">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">Input _Method Layout:</property>
+ <property name="mnemonic_widget">thumb:keyboard_layout</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkComboBox" id="thumb:keyboard_layout">
+ <property name="visible">True</property>
+ <property name="items" translatable="yes">NICOLA-J
+NICOLA-A
+NICOLA-F</property>
+ <signal name="changed" handler="on_cb_changed"/>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox10">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <widget class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-info</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label31">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="wrap">True</property>
+ <property name="label" translatable="yes">Restart ibus when you change the keyboard layout.</property>
+ <property name="tooltip_text" translatable="yes">Restart ibus when you change XKB</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="thumb:warning_hbox">
+ <property name="visible">False</property>
+ <property name="spacing">8</property>
+ <child>
+ <widget class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-warning</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label32">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="wrap">True</property>
+ <property name="label" translatable="yes">Strongly recommend to enable "Use system keyboard layout" check button in "Advanced" tab using 'ibus-setup' command</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox11">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <widget class="GtkLabel" id="label33">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_underline">True</property>
+ <property name="label" translatable="yes">_Additional Key Arrangement:</property>
+ <property name="mnemonic_widget">thumb:fmv_extension</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkComboBox" id="thumb:fmv_extension">
+ <property name="visible">True</property>
+ <property name="items" translatable="yes">None
+FMV KB231 key extension
+FMV KB611 key extension</property>
+ <property name="tooltip_text" translatable="yes">'', 『', '¢', '£' and so on can be output with Thumb Shift key</property>
+ <signal name="changed" handler="on_cb_changed"/>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox12">
+ <property name="visible">True</property>
+ <property name="spacing">8</property>
+ <child>
+ <widget class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-info</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label34">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="wrap">True</property>
+ <property name="label" translatable="yes">You do not have to reconfigure the system keyboard layout for "Additional Key Arrangement" since this option changes input method layout only in case input method is turned on.</property>
+ <property name="tooltip_text" translatable="yes">You do not have to reconfigure XKB since this option changes IM layout only with IM on.</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="thumb:handakuten">
+ <property name="label" translatable="yes">_Enable semi-voiced sound mark with Shift key</property>
+ <property name="tooltip_text" translatable="yes">Seion + Shift can output Handakuon</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_ck_toggled"/>
+ <accelerator key="E" signal="grab_focus" modifiers="GDK_MOD1_MASK"/>
+ </widget>
+ <packing>
+ <property name="top_attach">7</property>
+ <property name="bottom_attach">8</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label35">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Thumb Shift Layout&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Thumb S_hift</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">vbox3</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ <child>
<widget class="GtkLabel" id="about">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;span size='xx-large'&gt;&lt;b&gt;IBus-Anthy&lt;/b&gt;&lt;/span&gt;
@@ -626,18 +993,18 @@ URL : http://code.google.com/p/ibus/
<property name="ellipsize">start</property>
</widget>
<packing>
- <property name="position">2</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label3">
+ <widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Abo_ut</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">about</property>
</widget>
<packing>
- <property name="position">2</property>
+ <property name="position">3</property>
<property name="tab_fill">False</property>
<property name="type">tab</property>
</packing>
@@ -752,7 +1119,7 @@ URL : http://code.google.com/p/ibus/
<property name="visible">True</property>
<property name="spacing">8</property>
<child>
- <widget class="GtkLabel" id="label30">
+ <widget class="GtkLabel" id="label50">
<property name="visible">True</property>
<property name="label" translatable="yes">Key Code:</property>
</widget>
@@ -799,7 +1166,7 @@ URL : http://code.google.com/p/ibus/
<property name="visible">True</property>
<property name="spacing">8</property>
<child>
- <widget class="GtkLabel" id="label29">
+ <widget class="GtkLabel" id="label51">
<property name="visible">True</property>
<property name="label" translatable="yes">Modifier:</property>
</widget>