From 866a2668eb3d0f5fb237ca1b32f745b35935d968 Mon Sep 17 00:00:00 2001 From: fujiwarat Date: Fri, 12 Feb 2010 10:42:18 +0900 Subject: Fix Shift + char with CapsLock ON in romaji mode. --- engine/engine.py | 5 +++-- engine/jastring.py | 17 ++++++++++++++--- engine/romaji.py | 15 +++++++++++---- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/engine/engine.py b/engine/engine.py index 023d4d9..0ceaa11 100644 --- a/engine/engine.py +++ b/engine/engine.py @@ -958,7 +958,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 @@ -983,6 +983,7 @@ class Engine(ibus.EngineBase): elif self.__convert_mode != CONV_MODE_OFF: self.__commit_string(self.__convert_chars) + self.__preedit_ja_string.set_shift((state & modifier.SHIFT_MASK) != 0) self.__preedit_ja_string.insert(unichr(keyval)) self.__invalidate() return True @@ -1239,7 +1240,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..0ec4df6 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)] 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) -- cgit v1.2.1