diff options
Diffstat (limited to 'ibus/bus.py')
-rw-r--r-- | ibus/bus.py | 358 |
1 files changed, 72 insertions, 286 deletions
diff --git a/ibus/bus.py b/ibus/bus.py index eb708a6..6ca5f7d 100644 --- a/ibus/bus.py +++ b/ibus/bus.py @@ -23,95 +23,27 @@ __all__ = ( "Bus", ) -import sys -import gobject import dbus import dbus.lowlevel import dbus.connection import dbus.mainloop.glib -import ibus +import gobject +import common +import object +import serializable +import config dbus.mainloop.glib.DBusGMainLoop(set_as_default = True) -class Bus(ibus.Object): +class Bus(object.Object): __gsignals__ = { - "commit-string" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, gobject.TYPE_STRING) - ), - "update-preedit" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT, gobject.TYPE_INT, gobject.TYPE_BOOLEAN) - ), - "show-preedit" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "hide-preedit" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "update-aux-string" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN) - ), - "show-aux-string" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "hide-aux-string" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "update-lookup-table" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN) - ), - "show-lookup-table" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "hide-lookup-table" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "page-up-lookup-table" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "page-down-lookup-table" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "cursor-up-lookup-table" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "cursor-down-lookup-table" : ( - gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, - (gobject.TYPE_STRING, ) - ), - "config-value-changed" : ( - gobject.SIGNAL_RUN_FIRST, + "disconnected" : ( + gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, - (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) + () ), "config-reloaded" : ( - gobject.SIGNAL_RUN_FIRST, + gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), @@ -119,29 +51,36 @@ class Bus(ibus.Object): def __init__(self): super(Bus, self).__init__() - self.__dbusconn = dbus.connection.Connection(ibus.IBUS_ADDR) - self.__ibus = self.__dbusconn.get_object(ibus.IBUS_NAME, - ibus.IBUS_PATH) + self.__dbusconn = dbus.connection.Connection(common.IBUS_ADDR) self.__dbus = self.__dbusconn.get_object(dbus.BUS_DAEMON_NAME, - dbus.BUS_DAEMON_PATH) - self.__dbusconn.add_message_filter(self.__dbus_message_cb) + dbus.BUS_DAEMON_PATH) self.__unique_name = self.hello() + self.__ibus = self.__dbusconn.get_object(common.IBUS_SERVICE_IBUS, + common.IBUS_PATH_IBUS) - try: - unique_name = self.get_name_owner(ibus.IBUS_CONFIG_NAME) - self.__config = self.__dbusconn.get_object(unique_name, - ibus.IBUS_CONFIG_PATH) - except: - self.__config = None - self.add_match( - "type='signal'," - "interface='" + dbus.BUS_DAEMON_IFACE + "'," - "member='NameOwnerChanged'," - "arg0='" + ibus.IBUS_CONFIG_NAME + "'") + self.__dbusconn.call_on_disconnection(self.__dbusconn_disconnected_cb) + # self.__dbusconn.add_message_filter(self.__filter_cb) + + def __filter_cb(self, conn, message): + if message.get_type() == 4: + print "Signal %s" % message.get_member() + print " sender = %s" % message.get_sender() + print " path = %s" % message.get_path() + return dbus.lowlevel.HANDLER_RESULT_NOT_YET_HANDLED + + def __dbusconn_disconnected_cb(self, dbusconn): + assert self.__dbusconn == dbusconn + self.__dbusconn = None + self.emit("disconnected") def get_name(self): return self.__unique_name + def get_is_connected(self): + if self.__dbusconn == None: + return False + return self.__dbusconn.get_is_connected() + # define dbus methods def get_dbus(self): return self.__dbus @@ -150,7 +89,7 @@ class Bus(ibus.Object): return self.__dbus.Hello() def request_name(self, name, flags): - return self.__dbus.RequestName(name, flags) + return self.__dbus.RequestName(name, dbus.UInt32 (flags)) def release_name(self, name): return self.__dbus.ReleaseName(name) @@ -168,209 +107,56 @@ class Bus(ibus.Object): return self.__dbusconn def get_address(self): - return ibus.IBUS_ADDR - - def create_input_context(self, client_name): - return self.__ibus.CreateInputContext(client_name) - - def release_input_context(self, ic): - return self.__ibus.ReleaseInputContext(ic) - - def process_key_event(self, ic, keyval, is_press, state): - return self.__ibus.ProcessKeyEvent(ic, keyval, is_press, state) - - def set_cursor_location(self, ic, x, y, w, h): - return self.__ibus.SetCursorLocation(ic, x, y, w, h) - - def foucs_in(self, ic): - return self.__ibus.FocusIn(ic) - - def foucs_out(self, ic): - return self.__ibus.FocusOut(ic) - - def reset(self, ic): - return self.__ibus.Reset(ic) + return common.IBUS_ADDR - def is_enabled(self, ic): - return self.__ibus.IsEnabled(ic) + # define ibus methods + def register_component(self, component): + component = serializable.serialize_object(component) + return self.__ibus.RegisterComponent(component) - def set_capabilities(self, ic, caps): - return self.__ibus.SetCapabilities(ic, caps) + def list_engines(self): + engines = self.__ibus.ListEngines() + return map(serializable.deserialize_object, engines) - def register_factories(self, object_paths): - object_paths = dbus.Array(object_paths, signature="o") - return self.__ibus.RegisterFactories(object_paths, **ibus.DEFAULT_ASYNC_HANDLERS) + def list_active_engines(self): + engines = self.__ibus.ListActiveEngines() + return map(serializable.deserialize_object, engines) - def unregister_factories(self, object_paths): - return self.__ibus.UnregisterFactories(object_paths) - - def register_config(self, object_path, replace = False): - return self.__ibus.RegisterConfig(object_path, replace) - - def get_factories(self): - return self.__ibus.GetFactories() - - def get_factory_info(self, factory_path): - return self.__ibus.GetFactoryInfo(factory_path) - - def set_factory(self, factory_path): - return self.__ibus.SetFactory(factory_path) - - def get_input_context_states(self, ic): - return self.__ibus.GetInputContextStates(ic) - - def config_add_watch(self, section): - return self.add_match( - "type='signal'," - "interface='" + ibus.IBUS_CONFIG_NAME + "'," - "member='ValueChanged'," - "arg0='" + section + "'" - ) + def create_input_context(self, client_name): + return self.__ibus.CreateInputContext(client_name) - def config_remove_watch(self, section): - return self.remove_match( - "type='signal'," - "interface='" + ibus.IBUS_CONFIG_NAME + "'," - "member='ValueChanged'," - "arg0='" + section + "'" - ) + def kill(self): + return self.__ibus.Kill() - def config_set_value(self, section, name, value): - return self.__config.SetValue(section, name, value) + def get_config(self): + try: + return self.__config + except: + self.__config = config.Config(self) + return self.__config - def config_set_list(self, section, name, value, list_type): - value = dbus.Array(value, signature = list_type) - return self.__config.SetValue(section, name, value) +def test(): + import glib + import factory + import text - def config_get_value(self, section, name, default_value = None): - try: - return self.__config.GetValue(section, name) - except Exception, e: - return default_value + mainloop = glib.MainLoop() - def register_list_engines(self): - return self.__ibus.RegisterListEngines() + def __disconnected_cb(*args): + print "Disconnected", args + mainloop.quit() - def register_reload_engines(self): - return self.__ibus.RegisterReloadEngines() + b = Bus() + b.connect("disconnected", __disconnected_cb) - def register_start_engine(self, lang, name): - return self.__ibus.RegisterStartEngine(lang, name) + print "unique_name =", b.get_name() - def register_restart_engine(self, lang, name): - return self.__ibus.RegisterRestartEngine(lang, name) + for i in b.list_factories(): + print i.name - def register_stop_engine(self, lang, name): - return self.__ibus.RegisterStopEngine(lang, name) + mainloop.run() + print "Exit" - def kill(self): - return self.__ibus.Kill() - def __dbus_message_cb(self, conn, message): - # name owner changed signal - if message.is_signal(dbus.BUS_DAEMON_IFACE, "NameOwnerChanged"): - args = message.get_args_list() - if args[0] == ibus.IBUS_CONFIG_NAME: - if args[2] != "": - self.__config = self.__dbusconn.get_object(args[2], ibus.IBUS_CONFIG_PATH) - else: - self.__config = None - self.emit("config-reloaded") - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - # commit string signal - elif message.is_signal(ibus.IBUS_IFACE, "CommitString"): - args = message.get_args_list() - ic, string = args[0:2] - self.emit("commit-string", ic, string.encode("utf-8")) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - - # preedit signals - elif message.is_signal(ibus.IBUS_IFACE, "UpdatePreedit"): - args = message.get_args_list() - ic, preedit, attrs, cursor_pos, visible = args[0:5] - attrs = ibus.attr_list_from_dbus_value(attrs) - self.emit("update-preedit", ic, preedit.encode("utf-8"), - attrs, cursor_pos, visible) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "ShowPreedit"): - args = message.get_args_list() - ic = args[0] - self.emit("show-preedit", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "HidePreedit"): - args = message.get_args_list() - ic = args[0] - self.emit("hide-preedit", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - - # aux string signals - elif message.is_signal(ibus.IBUS_IFACE, "UpdateAuxString"): - args = message.get_args_list() - ic, aux_string, attrs, visible = args[0:4] - attrs = ibus.attr_list_from_dbus_value(attrs) - self.emit("update-aux-string", ic, aux_string.encode("utf-8"), - attrs, visible) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "ShowAuxString"): - args = message.get_args_list() - ic = args[0] - self.emit("show-aux-string", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "HideAuxString"): - args = message.get_args_list() - ic = args[0] - self.emit("hide-aux-string", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - - # lookup table signals - elif message.is_signal(ibus.IBUS_IFACE, "UpdateLookupTable"): - args = message.get_args_list() - ic, lookup_table, visible = args[0:3] - lookup_table = ibus.lookup_table_from_dbus_value(lookup_table) - self.emit("update-lookup-table", ic, lookup_table, visible) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "ShowLookupTable"): - args = message.get_args_list() - ic = args[0] - self.emit("show-lookup-table", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "HideLookupTable"): - args = message.get_args_list() - ic = args[0] - self.emit("hide-lookup-table", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "PageUpLookupTable"): - args = message.get_args_list() - ic = args[0] - self.emit("page-up-lookup-table", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "PageDownLookupTable"): - args = message.get_args_list() - ic = args[0] - self.emit("page-down-lookup-table", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "CursorUpLookupTable"): - args = message.get_args_list() - ic = args[0] - self.emit("cursor-up-lookup-table", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - elif message.is_signal(ibus.IBUS_IFACE, "CursorDownLookupTable"): - args = message.get_args_list() - ic = args[0] - self.emit("cursor-down-lookup-table", ic) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - - # Config signals - elif message.is_signal(ibus.IBUS_CONFIG_IFACE, "ValueChanged"): - args = message.get_args_list() - section, name, value = args[0:3] - self.emit("config-value-changed", section, name, value) - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - - # DBUS Disconnected signal - elif message.is_signal(dbus.LOCAL_IFACE, "Disconnected"): - self.destroy() - retval = dbus.lowlevel.HANDLER_RESULT_HANDLED - else: - retval = dbus.lowlevel.HANDLER_RESULT_NOT_YET_HANDLED - return retval +if __name__ == "__main__": + test() |