# vim:set et sts=4 sw=4: # # ibus - The Input Bus # # Copyright (c) 2007-2008 Huang Peng # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library 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 Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the # Free Software Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307 USA import weakref import gobject import ibus class Engine(ibus.Object): __gsignals__ = { "commit-string" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, )), "forward-key-event" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_UINT, gobject.TYPE_BOOLEAN, gobject.TYPE_UINT )), "update-preedit" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, gobject.TYPE_INT, gobject.TYPE_BOOLEAN)), "show-preedit" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "hide-preedit" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "update-aux-string" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN)), "show-aux-string" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "hide-aux-string" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "update-lookup-table" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN)), "show-lookup-table" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "hide-lookup-table" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "page-up-lookup-table" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "page-down-lookup-table" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "cursor-up-lookup-table" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "cursor-down-lookup-table" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()), "register-properties" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, )), "update-property" : ( gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, )), } def __init__(self, factory, ibusconn, object_path): super(Engine, self).__init__() self.__factory = factory self.__ibusconn = ibusconn self.__object_path = object_path self.__engine = ibusconn.get_object(self.__object_path) self.__lookup_table = ibus.LookupTable() self.__ibusconn.connect("destroy", self.__ibusconn_destroy_cb) def get_factory(self): return self.__factory def get_object_path(self): return self.__object_path def handle_dbus_signal(self, message): if message.is_signal(ibus.IBUS_ENGINE_IFACE, "CommitString"): args = message.get_args_list() self.emit("commit-string", args[0]) elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "ForwardKeyEvent"): args = message.get_args_list() self.emit("forward-key-event", args[0], bool(arg[1]), arg[2]) elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "UpdatePreedit"): args = message.get_args_list() self.emit("update-preedit", args[0], args[1], args[2], args[3]) elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "ShowPreedit"): self.emit("show-preedit") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "HidePreedit"): self.emit("hide-preedit") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "UpdateAuxString"): args = message.get_args_list() self.emit("update-aux-string", args[0], args[1], args[2]) elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "ShowAuxString"): self.emit("show-aux-string") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "HideAuxString"): self.emit("hide-aux-string") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "UpdateLookupTable"): args = message.get_args_list() self.emit("update-lookup-table", args[0], args[1]) elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "ShowLookupTable"): self.emit("show-lookup-table") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "HideLookupTable"): self.emit("hide-lookup-table") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "PageUpLookupTable"): self.emit("page-up-lookup-table") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "PageDownLookupTable"): self.emit("page-down-lookup-table") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "CursorUpLookupTable"): self.emit("cursor-up-lookup-table") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "CursorDownLookupTable"): self.emit("cursor-down-lookup-table") elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "RegisterProperties"): args = message.get_args_list() self.emit("register-properties", args[0]) elif message.is_signal(ibus.IBUS_ENGINE_IFACE, "UpdateProperty"): args = message.get_args_list() self.emit("update-property", args[0]) else: return False return True def focus_in(self): self.__engine.FocusIn(**ibus.DEFAULT_ASYNC_HANDLERS) def focus_out(self): self.__engine.FocusOut(**ibus.DEFAULT_ASYNC_HANDLERS) def reset(self): self.__engine.Reset(**ibus.DEFAULT_ASYNC_HANDLERS) def process_key_event(self, keyval, is_press, state, reply_cb, error_cb): self.__engine.ProcessKeyEvent(keyval, is_press, state, reply_handler = reply_cb, error_handler = error_cb) def set_cursor_location(self, x, y, w, h): self.__engine.SetCursorLocation(x, y, w, h, **ibus.DEFAULT_ASYNC_HANDLERS) def enable(self): self.__engine.Enable(**ibus.DEFAULT_ASYNC_HANDLERS) def disable(self): self.__engine.Disable(**ibus.DEFAULT_ASYNC_HANDLERS) # cursor for lookup table def page_up(self): self.__engine.PageUp(**ibus.DEFAULT_ASYNC_HANDLERS) def page_down(self): self.__engine.PageDown(**ibus.DEFAULT_ASYNC_HANDLERS) def cursor_up(self): self.__engine.CursorUp(**ibus.DEFAULT_ASYNC_HANDLERS) def cursor_down(self): self.__engine.CursorDown(**ibus.DEFAULT_ASYNC_HANDLERS) def property_activate(self, prop_name, prop_state): self.__engine.PropertyActivate(prop_name, prop_state, **ibus.DEFAULT_ASYNC_HANDLERS) def property_show(self, prop_name): self.__engine.PropertyShow(prop_name, **ibus.DEFAULT_ASYNC_HANDLERS) def property_hide(self, prop_name): self.__engine.PropertyHide(prop_name, **ibus.DEFAULT_ASYNC_HANDLERS) def destroy(self): ibus.Object.destroy(self) if self.__engine: self.__engine.Destroy(**ibus.DEFAULT_ASYNC_HANDLERS) self.__engine = None self.__ibusconn = None def __ibusconn_destroy_cb(self, ibusconn): self.__engine = None self.destroy() gobject.type_register(Engine)