diff options
author | Eitan Isaacson <eitan@monotonous.org> | 2011-03-09 13:15:51 -0500 |
---|---|---|
committer | Eitan Isaacson <eitan@monotonous.org> | 2011-03-09 13:15:51 -0500 |
commit | ae6c487d93ec33f25d391d5521f870d5abbc9fda (patch) | |
tree | 1bf9c34ea84ecdc8da844d78cb7254eb1e17bef6 | |
parent | 6fcd4a48ca8a7fabb6c76cf6691ea4e8b7e08b5a (diff) | |
parent | 6c5d8df157e084fc930be8a0b94522d1111296c8 (diff) | |
download | caribou-ae6c487d93ec33f25d391d5521f870d5abbc9fda.tar.gz |
Merge branch 'gsettings'
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | caribou/common/setting_types.py | 56 | ||||
-rw-r--r-- | caribou/common/settings.py | 39 | ||||
-rw-r--r-- | caribou/common/settings_manager.py | 42 | ||||
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | data/Makefile.am | 27 | ||||
-rw-r--r-- | po/POTFILES.skip | 2 |
7 files changed, 65 insertions, 110 deletions
@@ -24,3 +24,4 @@ data/caribou.desktop po/.intltool-merge-cache data/caribou.schemas data/caribou.schemas.in +data/org.gnome.caribou.gschema.* diff --git a/caribou/common/setting_types.py b/caribou/common/setting_types.py index 5b8aa95..109bf1b 100644 --- a/caribou/common/setting_types.py +++ b/caribou/common/setting_types.py @@ -1,7 +1,5 @@ import gobject -from gi.repository import GConf - -GCONF_DIR="/apps/caribou/osk/" +from gi.repository import GLib ENTRY_DEFAULT=0 ENTRY_COMBO=1 @@ -56,7 +54,7 @@ class SettingsGroup(Setting): pass class ValueSetting(Setting): - gconf_type = GConf.ValueType.INVALID + variant_type = '' entry_type=ENTRY_DEFAULT def __init__(self, name, label, default, short_desc="", long_desc="", allowed=[], entry_type=ENTRY_DEFAULT, sensitive=None, @@ -73,6 +71,7 @@ class ValueSetting(Setting): self.default = default self.insensitive_when_false = insensitive_when_false self.insensitive_when_true = insensitive_when_true + self.hush = False @property def value(self): @@ -80,61 +79,34 @@ class ValueSetting(Setting): @value.setter def value(self, val): - _val = self.convert_value(self._from_gconf_value(val)) + _val = self.convert_value(val) if self.allowed and _val not in [a for a, b in self.allowed]: raise ValueError, "'%s' not a valid value" % _val self._value = _val - self.emit('value-changed', _val) + if not self.hush: + self.emit('value-changed', _val) @property - def gconf_key(self): - return GCONF_DIR + self.name + def gsettings_key(self): + return self.name.replace('_', '-') @property def is_true(self): return bool(self.value) @property - def gconf_default(self): - return self.default - - def set_gconf_value(self, val): - if val.type == GConf.ValueType.BOOL: - return val.set_bool(self.value) - if val.type == GConf.ValueType.FLOAT: - return val.set_float(self.value) - if val.type == GConf.ValueType.INT: - return val.set_int(self.value) - if val.type == GConf.ValueType.STRING: - return val.set_string(self.value) - - def _from_gconf_value(self, val): - if not isinstance(val, GConf.Value): - return val - if val.type == GConf.ValueType.BOOL: - return val.get_bool() - if val.type == GConf.ValueType.FLOAT: - return val.get_float() - if val.type == GConf.ValueType.INT: - return val.get_int() - if val.type == GConf.ValueType.STRING: - return val.get_string() - - return val.to_string() + def gvariant(self): + return GLib.Variant(self.variant_type, self.value) class BooleanSetting(ValueSetting): - gconf_type = GConf.ValueType.BOOL + variant_type = 'b' entry_type = ENTRY_CHECKBOX def convert_value(self, val): # Almost anything could be a boolean. return bool(val) - @property - def gconf_default(self): - str(self.default).lower() - class IntegerSetting(ValueSetting): - gconf_type = GConf.ValueType.INT + variant_type = 'i' entry_type = ENTRY_SPIN def __init__(self, *args, **kwargs): self.min = kwargs.pop('min', gobject.G_MININT) @@ -145,7 +117,7 @@ class IntegerSetting(ValueSetting): return int(val) class FloatSetting(ValueSetting): - gconf_type = GConf.ValueType.FLOAT + variant_type = 'd' entry_type = ENTRY_SPIN def __init__(self, *args, **kwargs): self.min = kwargs.pop('min', gobject.G_MINFLOAT) @@ -156,7 +128,7 @@ class FloatSetting(ValueSetting): return float(val) class StringSetting(ValueSetting): - gconf_type = GConf.ValueType.STRING + variant_type = 's' def convert_value(self, val): return str(val) diff --git a/caribou/common/settings.py b/caribou/common/settings.py index 3f13b17..86ad86f 100644 --- a/caribou/common/settings.py +++ b/caribou/common/settings.py @@ -5,6 +5,8 @@ import caribou.common.const as const import caribou.ui.i18n import xml.dom.minidom +GSETTINGS_SCHEMA = "org.gnome.caribou" + try: import json except ImportError: @@ -120,15 +122,19 @@ settings = SettingsGroup("_top", "", [ ]) if __name__ == "__main__": + from gi.repository import GLib + class SchemasMaker: def create_schemas(self): doc = xml.dom.minidom.Document() - gconfschemafile = doc.createElement('gconfschemafile') - schemalist = doc.createElement('schemalist') - gconfschemafile.appendChild(schemalist) - self._create_schema(settings, doc, schemalist) + schemafile = doc.createElement('schemalist') + schema = doc.createElement('schema') + schema.setAttribute("id", GSETTINGS_SCHEMA) + schema.setAttribute("path", "/apps/caribou/osk/") + schemafile.appendChild(schema) + self._create_schema(settings, doc, schema) - self._pretty_xml(gconfschemafile) + self._pretty_xml(schemafile) def _attribs(self, e): if not e.attributes.items(): @@ -155,21 +161,16 @@ if __name__ == "__main__": element.appendChild(el) def _create_schema(self, setting, doc, schemalist): - if hasattr(setting, 'gconf_key'): - schema = doc.createElement('schema') - schemalist.appendChild(schema) - self._append_children_element_value_pairs( - doc, schema, [('key', '/schemas' + setting.gconf_key), - ('applyto', setting.gconf_key), - ('owner', 'caribou'), - ('type', setting.gconf_type.value_nick), - ('default', setting.gconf_default)]) - locale = doc.createElement('locale') - locale.setAttribute('name', 'C') - schema.appendChild(locale) + if hasattr(setting, 'gsettings_key'): + key = doc.createElement('key') + key.setAttribute('name', setting.gsettings_key) + key.setAttribute('type', setting.variant_type) + schemalist.appendChild(key) self._append_children_element_value_pairs( - doc, locale, [('short', setting.short_desc), - ('long', setting.long_desc)]) + doc, key, [('default', + getattr(setting.gvariant, "print")(False)), + ('_summary', setting.short_desc), + ('_description', setting.long_desc)]) for s in setting: self._create_schema(s, doc, schemalist) diff --git a/caribou/common/settings_manager.py b/caribou/common/settings_manager.py index 37d178b..66119f8 100644 --- a/caribou/common/settings_manager.py +++ b/caribou/common/settings_manager.py @@ -1,15 +1,14 @@ import os -from gi.repository import GConf +from gi.repository import Gio from setting_types import * -from settings import settings +from settings import settings, GSETTINGS_SCHEMA import const class _SettingsManager(object): def __init__(self, settings): self.groups = settings - self.gconf_client = GConf.Client.get_default() - self.gconf_client.add_dir(const.CARIBOU_GCONF, - GConf.ClientPreloadType.PRELOAD_NONE) + self._gsettings = Gio.Settings(GSETTINGS_SCHEMA) + self._gsettings.connect("changed", self._gsettings_changed_cb) self._settings_map = {} self._map_settings(self.groups) @@ -34,21 +33,12 @@ class _SettingsManager(object): for setting in self._settings_map.values(): if isinstance(setting, SettingsGroup): continue - try: - setting.value = self.gconf_client.get(setting.gconf_key) - except ValueError: - val = GConf.Value.new(setting.gconf_type) - setting.set_gconf_value(val) - self.gconf_client.set(setting.gconf_key, val) + setting.value = \ + self._gsettings.get_value(setting.gsettings_key).unpack() self._change_dependant_sensitivity(setting) - handler_id = setting.connect('value-changed', - self._on_value_changed) - - #self.gconf_client.notify_add(setting.gconf_key, - # self._gconf_setting_changed_cb, - # (setting, handler_id)) + setting.connect('value-changed', self._on_value_changed) def _change_dependant_sensitivity(self, setting): for name in setting.insensitive_when_false: @@ -61,20 +51,18 @@ class _SettingsManager(object): child.sensitive = i == index def _on_value_changed(self, setting, value): - if value != self.gconf_client.get(setting.gconf_key): - print setting.gconf_type - val = GConf.Value.new(setting.gconf_type) - setting.set_gconf_value(val) - self.gconf_client.set(setting.gconf_key, val) + if value != \ + self._gsettings.get_value(setting.gsettings_key).unpack(): + self._gsettings.set_value(setting.gsettings_key, setting.gvariant) self._change_dependant_sensitivity(setting) - def _gconf_setting_changed_cb(self, client, connection_id, entry, data): - setting, handler_id = data - new_value = client.get_value(setting.gconf_key) + def _gsettings_changed_cb(self, gsettings, key): + setting = getattr(self, key.replace('-', '_')) + new_value = gsettings.get_value(key).unpack() if setting.value != new_value: - setting.handler_block(handler_id) + setting.hush = True setting.value = new_value - setting.handler_unblock(handler_id) + setting.hush = False def __call__(self): return self diff --git a/configure.ac b/configure.ac index c8b5830..25f5b7a 100644 --- a/configure.ac +++ b/configure.ac @@ -20,12 +20,14 @@ AC_PATH_PROG(GCONFTOOL, gconftool-2) AM_GCONF_SOURCE_2 dnl == Library dependencies == +PYGOBJECT_REQUIRED=2.27.92 GTK_REQUIRED=2.91.8 CLUTTER_REQUIRED=1.5.11 PKG_CHECK_MODULES(CARIBOU, [ - gtk+-3.0 >= $GTK_REQUIRED, - clutter-1.0 >= $CLUTTER_REQUIRED]) + pygobject-2.0 >= $PYGOBJECT_REQUIRED, + gtk+-3.0 >= $GTK_REQUIRED, + clutter-1.0 >= $CLUTTER_REQUIRED]) AC_SUBST(CARIBOU_CFLAGS) AC_SUBST(CARIBOU_LIBS) @@ -35,6 +37,8 @@ AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package]) AM_GLIB_GNU_GETTEXT +GLIB_GSETTINGS + dnl == intltool check == IT_PROG_INTLTOOL([0.35.0]) diff --git a/data/Makefile.am b/data/Makefile.am index ffdaa39..afe1950 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,9 +1,9 @@ SUBDIRS = keyboards -schemasdir = $(GCONF_SCHEMA_FILE_DIR) -schemas_in_files = caribou.schemas.in -schemas_DATA = $(schemas_in_files:.schemas.in=.schemas) -@INTLTOOL_SCHEMAS_RULE@ +@GSETTINGS_RULES@ +@INTLTOOL_XML_NOMERGE_RULE@ +gsettings_schemas_in_files = org.gnome.caribou.gschema.xml.in +gsettings_SCHEMAS = $(gsettings_schemas_in_files:.gschema.xml.in=.gschema.xml) desktopdir = $(datadir)/applications desktop_in_files = caribou.desktop.in @@ -12,20 +12,9 @@ desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) EXTRA_DIST = $(desktop_in_files) -caribou.schemas.in: $(top_srcdir)/caribou/common/settings.py - PYTHONPATH=$(top_srcdir) $(PYTHON) $< > $@ +org.gnome.caribou.gschema.xml.in: $(top_srcdir)/caribou/common/settings.py + PYTHONPATH=${PYTHONPATH}:$(top_srcdir) $(PYTHON) $< > $@ CLEANFILES = $(desktop_DATA) \ - $(schemas_in_files) \ - $(schemas_DATA) - -# installation of schemas -if GCONF_SCHEMAS_INSTALL -install-data-hook: - GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ - $(GCONFTOOL) --makefile-install-rule $(schemas_DATA) - -uninstall-hook: - GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ - $(GCONFTOOL) --makefile-uninstall-rule $(schemas_DATA) -endif + $(gsettings_schemas_in_files) \ + $(gsettings_SCHEMAS) diff --git a/po/POTFILES.skip b/po/POTFILES.skip index e3c0a47..7386c06 100644 --- a/po/POTFILES.skip +++ b/po/POTFILES.skip @@ -1 +1 @@ -data/caribou.schemas.in +data/org.gnome.caribou.gschema.xml.in |