diff options
Diffstat (limited to 'ibus/config.py')
-rw-r--r-- | ibus/config.py | 96 |
1 files changed, 88 insertions, 8 deletions
diff --git a/ibus/config.py b/ibus/config.py index 24b4edc..70bc89a 100644 --- a/ibus/config.py +++ b/ibus/config.py @@ -21,17 +21,20 @@ __all__ = ( "ConfigBase", - "IBUS_CONFIG_NAME", - "IBUS_CONFIG_PATH" + "IBUS_SERVICE_CONFIG", + "IBUS_PATH_CONFIG" ) -IBUS_CONFIG_NAME = "org.freedesktop.ibus.Config" -IBUS_CONFIG_PATH = "/org/freedesktop/ibus/Config" +IBUS_SERVICE_CONFIG = "org.freedesktop.IBus.Config" +IBUS_PATH_CONFIG = "/org/freedesktop/IBus/Config" -import ibus -from ibus import interface +import gobject +import object +import interface +import dbus +from dbus.proxies import ProxyObject -class ConfigBase(ibus.Object): +class ConfigBase(object.Object): def __init__(self, bus): super(ConfigBase, self).__init__() self.__proxy = ConfigProxy(self, bus.get_dbusconn()) @@ -48,7 +51,7 @@ class ConfigBase(ibus.Object): class ConfigProxy(interface.IConfig): def __init__ (self, config, dbusconn): - super(ConfigProxy, self).__init__(dbusconn, IBUS_CONFIG_PATH) + super(ConfigProxy, self).__init__(dbusconn, IBUS_PATH_CONFIG) self.__dbusconn = dbusconn self.__config = config @@ -60,3 +63,80 @@ class ConfigProxy(interface.IConfig): def Destroy(self): self.__config.destroy() + +class Config(object.Object): + __gsignals__ = { + "reloaded" : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + () + ), + "value-changed" : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) + ), + } + + def __init__(self, bus): + super(Config, self).__init__() + self.__bus = bus + self.__bus_name = None + + self.__bus.add_match("type='signal',\ + sender='org.freedesktop.DBus',\ + member='NameOwnerChanged',\ + arg0='org.freedesktop.IBus.Config'") + self.__bus.get_dbusconn().add_signal_receiver(self.__name_owner_changed_cb, signal_name="NameOwnerChanged") + + try: + self.__init_config() + except: + self.__config = None + + def __name_owner_changed_cb(self, name, old_name, new_name): + if name == "org.freedesktop.IBus.Config": + if new_name == "": + self.__config = None + else: + self.__init_config(new_name) + + def __init_config(self, bus_name=None): + if bus_name == None: + bus_name = self.__bus.get_name_owner(IBUS_SERVICE_CONFIG) + + match_rule = "type='signal',\ + sender='%s',\ + member='ValueChanged',\ + path='/org/freedesktop/IBus/Config'" + + if self.__bus_name: + self.__bus.remove_match(match_rule % self.__bus_name) + self.__bus_name = None + + self.__config = self.__bus.get_dbusconn().get_object(bus_name, IBUS_PATH_CONFIG) + self.__config.connect_to_signal("ValueChanged", self.__value_changed_cb) + + self.__bus_name = bus_name + self.__bus.add_match(match_rule % self.__bus_name) + self.emit("reloaded") + + def __value_changed_cb(self, section, name, value): + self.emit("value-changed", section, name, value) + + def get_value(self, section, name, default_value): + try: + return self.__config.GetValue(section, name) + except: + return default_value + + def set_value(self, section, name, value): + try: + return self.__config.SetValue(section, name, value) + except: + return + + def set_list(self, section, name, value, signature): + return self.set_value(section, name, dbus.Array(value, signature=signature)) + +gobject.type_register(Config) |