def __init__(self): super(UniEmojiIBusEngine, self).__init__() self.uniemoji = UniEmoji() self.is_invalidate = False self.preedit_string = '' self.lookup_table = IBus.LookupTable.new(10, 0, True, True) self.prop_list = IBus.PropList() debug("Create UniEmoji engine OK")
def __init__(self): super(UniEmojiIBusEngine, self).__init__() self.candidates = [] self.uniemoji = UniEmoji() self.is_invalidate = False self.preedit_string = '' self.lookup_table = IBus.LookupTable.new(10, 0, True, True) self.prop_list = IBus.PropList() logger.info('Create UniEmojiIBusEngine: OK')
class UniEmojiIBusEngine(IBus.Engine): __gtype_name__ = 'UniEmojiIBusEngine' def __init__(self): super(UniEmojiIBusEngine, self).__init__() self.uniemoji = UniEmoji() self.is_invalidate = False self.preedit_string = '' self.lookup_table = IBus.LookupTable.new(10, 0, True, True) self.prop_list = IBus.PropList() debug("Create UniEmoji engine OK") def set_lookup_table_cursor_pos_in_current_page(self, index): '''Sets the cursor in the lookup table to index in the current page Returns True if successful, False if not. ''' page_size = self.lookup_table.get_page_size() if index > page_size: return False page, pos_in_page = divmod(self.lookup_table.get_cursor_pos(), page_size) new_pos = page * page_size + index if new_pos > self.lookup_table.get_number_of_candidates(): return False self.lookup_table.set_cursor_pos(new_pos) return True def do_candidate_clicked(self, index, dummy_button, dummy_state): if self.set_lookup_table_cursor_pos_in_current_page(index): self.commit_candidate() def do_process_key_event(self, keyval, keycode, state): debug("process_key_event(%04x, %04x, %04x)" % (keyval, keycode, state)) # ignore key release events is_press = ((state & IBus.ModifierType.RELEASE_MASK) == 0) if not is_press: return False if self.preedit_string: if keyval in (IBus.Return, IBus.KP_Enter): if self.lookup_table.get_number_of_candidates() > 0: self.commit_candidate() else: self.commit_string(self.preedit_string) return True elif keyval == IBus.Escape: self.preedit_string = '' self.update_candidates() return True elif keyval == IBus.BackSpace: self.preedit_string = self.preedit_string[:-1] self.invalidate() return True elif keyval in num_keys: index = num_keys.index(keyval) if self.set_lookup_table_cursor_pos_in_current_page(index): self.commit_candidate() return True return False elif keyval in numpad_keys: index = numpad_keys.index(keyval) if self.set_lookup_table_cursor_pos_in_current_page(index): self.commit_candidate() return True return False elif keyval in (IBus.Page_Up, IBus.KP_Page_Up, IBus.Left, IBus.KP_Left): self.page_up() return True elif keyval in (IBus.Page_Down, IBus.KP_Page_Down, IBus.Right, IBus.KP_Right): self.page_down() return True elif keyval in (IBus.Up, IBus.KP_Up): self.cursor_up() return True elif keyval in (IBus.Down, IBus.KP_Down): self.cursor_down() return True if keyval == IBus.space and len(self.preedit_string) == 0: # Insert space if that's all you typed (so you can more easily # type a bunch of emoji separated by spaces) return False # Allow typing all ASCII letters and punctuation, except digits if ord(' ') <= keyval < ord('0') or \ ord('9') < keyval <= ord('~'): if state & (IBus.ModifierType.CONTROL_MASK | IBus.ModifierType.MOD1_MASK) == 0: self.preedit_string += chr(keyval) self.invalidate() return True else: if keyval < 128 and self.preedit_string: self.commit_string(self.preedit_string) return False def invalidate(self): if self.is_invalidate: return self.is_invalidate = True GLib.idle_add(self.update_candidates) def page_up(self): if self.lookup_table.page_up(): self._update_lookup_table() return True return False def page_down(self): if self.lookup_table.page_down(): self._update_lookup_table() return True return False def cursor_up(self): if self.lookup_table.cursor_up(): self._update_lookup_table() return True return False def cursor_down(self): if self.lookup_table.cursor_down(): self._update_lookup_table() return True return False def commit_string(self, text): self.commit_text(IBus.Text.new_from_string(text)) self.preedit_string = '' self.update_candidates() def commit_candidate(self): self.commit_string(self.candidates[self.lookup_table.get_cursor_pos()]) def update_candidates(self): preedit_len = len(self.preedit_string) attrs = IBus.AttrList() self.lookup_table.clear() self.candidates = [] if preedit_len > 0: uniemoji_results = self.uniemoji.find_characters( self.preedit_string) for char_sequence, display_str in uniemoji_results: candidate = IBus.Text.new_from_string(display_str) self.candidates.append(char_sequence) self.lookup_table.append_candidate(candidate) text = IBus.Text.new_from_string(self.preedit_string) text.set_attributes(attrs) self.update_auxiliary_text(text, preedit_len > 0) attrs.append( IBus.Attribute.new(IBus.AttrType.UNDERLINE, IBus.AttrUnderline.SINGLE, 0, preedit_len)) text = IBus.Text.new_from_string(self.preedit_string) text.set_attributes(attrs) self.update_preedit_text(text, preedit_len, preedit_len > 0) self._update_lookup_table() self.is_invalidate = False def _update_lookup_table(self): visible = self.lookup_table.get_number_of_candidates() > 0 self.update_lookup_table(self.lookup_table, visible) def do_focus_in(self): debug("focus_in") self.register_properties(self.prop_list) def do_focus_out(self): debug("focus_out") self.do_reset() def do_reset(self): debug("reset") self.preedit_string = '' def do_property_activate(self, prop_name): debug("PropertyActivate(%s)" % prop_name) def do_page_up(self): return self.page_up() def do_page_down(self): return self.page_down() def do_cursor_up(self): return self.cursor_up() def do_cursor_down(self): return self.cursor_down()
class UniEmojiIBusEngine(IBus.Engine): __gtype_name__ = 'UniEmojiIBusEngine' def __init__(self): super(UniEmojiIBusEngine, self).__init__() self.uniemoji = UniEmoji() self.is_invalidate = False self.preedit_string = '' self.lookup_table = IBus.LookupTable.new(10, 0, True, True) self.prop_list = IBus.PropList() debug("Create UniEmoji engine OK") def set_lookup_table_cursor_pos_in_current_page(self, index): '''Sets the cursor in the lookup table to index in the current page Returns True if successful, False if not. ''' page_size = self.lookup_table.get_page_size() if index > page_size: return False page, pos_in_page = divmod(self.lookup_table.get_cursor_pos(), page_size) new_pos = page * page_size + index if new_pos > self.lookup_table.get_number_of_candidates(): return False self.lookup_table.set_cursor_pos(new_pos) return True def do_candidate_clicked(self, index, dummy_button, dummy_state): if self.set_lookup_table_cursor_pos_in_current_page(index): self.commit_candidate() def do_process_key_event(self, keyval, keycode, state): debug("process_key_event(%04x, %04x, %04x)" % (keyval, keycode, state)) # ignore key release events is_press = ((state & IBus.ModifierType.RELEASE_MASK) == 0) if not is_press: return False if self.preedit_string: if keyval in (IBus.Return, IBus.KP_Enter): if self.lookup_table.get_number_of_candidates() > 0: self.commit_candidate() else: self.commit_string(self.preedit_string) return True elif keyval == IBus.Escape: self.preedit_string = '' self.update_candidates() return True elif keyval == IBus.BackSpace: self.preedit_string = self.preedit_string[:-1] self.invalidate() return True elif keyval in num_keys: index = num_keys.index(keyval) if self.set_lookup_table_cursor_pos_in_current_page(index): self.commit_candidate() return True return False elif keyval in numpad_keys: index = numpad_keys.index(keyval) if self.set_lookup_table_cursor_pos_in_current_page(index): self.commit_candidate() return True return False elif keyval in (IBus.Page_Up, IBus.KP_Page_Up, IBus.Left, IBus.KP_Left): self.page_up() return True elif keyval in (IBus.Page_Down, IBus.KP_Page_Down, IBus.Right, IBus.KP_Right): self.page_down() return True elif keyval in (IBus.Up, IBus.KP_Up): self.cursor_up() return True elif keyval in (IBus.Down, IBus.KP_Down): self.cursor_down() return True if keyval == IBus.space and len(self.preedit_string) == 0: # Insert space if that's all you typed (so you can more easily # type a bunch of emoji separated by spaces) return False # Allow typing all ASCII letters and punctuation, except digits if ord(' ') <= keyval < ord('0') or \ ord('9') < keyval <= ord('~'): if state & (IBus.ModifierType.CONTROL_MASK | IBus.ModifierType.MOD1_MASK) == 0: self.preedit_string += chr(keyval) self.invalidate() return True else: if keyval < 128 and self.preedit_string: self.commit_string(self.preedit_string) return False def invalidate(self): if self.is_invalidate: return self.is_invalidate = True GLib.idle_add(self.update_candidates) def page_up(self): if self.lookup_table.page_up(): self._update_lookup_table() return True return False def page_down(self): if self.lookup_table.page_down(): self._update_lookup_table() return True return False def cursor_up(self): if self.lookup_table.cursor_up(): self._update_lookup_table() return True return False def cursor_down(self): if self.lookup_table.cursor_down(): self._update_lookup_table() return True return False def commit_string(self, text): self.commit_text(IBus.Text.new_from_string(text)) self.preedit_string = '' self.update_candidates() def commit_candidate(self): self.commit_string(self.candidates[self.lookup_table.get_cursor_pos()]) def update_candidates(self): preedit_len = len(self.preedit_string) attrs = IBus.AttrList() self.lookup_table.clear() self.candidates = [] if preedit_len > 0: uniemoji_results = self.uniemoji.find_characters(self.preedit_string) for char_sequence, display_str in uniemoji_results: candidate = IBus.Text.new_from_string(display_str) self.candidates.append(char_sequence) self.lookup_table.append_candidate(candidate) text = IBus.Text.new_from_string(self.preedit_string) text.set_attributes(attrs) self.update_auxiliary_text(text, preedit_len > 0) attrs.append(IBus.Attribute.new(IBus.AttrType.UNDERLINE, IBus.AttrUnderline.SINGLE, 0, preedit_len)) text = IBus.Text.new_from_string(self.preedit_string) text.set_attributes(attrs) self.update_preedit_text(text, preedit_len, preedit_len > 0) self._update_lookup_table() self.is_invalidate = False def _update_lookup_table(self): visible = self.lookup_table.get_number_of_candidates() > 0 self.update_lookup_table(self.lookup_table, visible) def do_focus_in(self): debug("focus_in") self.register_properties(self.prop_list) def do_focus_out(self): debug("focus_out") self.do_reset() def do_reset(self): debug("reset") self.preedit_string = '' def do_property_activate(self, prop_name): debug("PropertyActivate(%s)" % prop_name) def do_page_up(self): return self.page_up() def do_page_down(self): return self.page_down() def do_cursor_up(self): return self.cursor_up() def do_cursor_down(self): return self.cursor_down()