Hello, I've rebased a patch from upstream <http://git.gnome.org/browse/gnome-tweak-tool/commit/?id=81ee17f1b0352347b1bf5f2bdad25e0fc2c7c3eb> which fixes the problem. Also, a bug related to this exists in libglib2.0-0, which I'm going to report separately (with a patch).
-- WBR, Andrew
From 81ee17f1b0352347b1bf5f2bdad25e0fc2c7c3eb Mon Sep 17 00:00:00 2001 From: John Stowers <john.stow...@gmail.com> Date: Wed, 18 Jan 2012 08:10:45 +0000 Subject: Dont crash on missing schemas --- a/gtweak/gsettings.py +++ b/gtweak/gsettings.py @@ -23,6 +23,12 @@ from gi.repository import Gio, GLib +_SCHEMA_CACHE = {} +_GSETTINGS_SCHEMAS = set(Gio.Settings.list_schemas()) + +class GSettingsMissingError(Exception): + pass + class _GSettingsSchema: def __init__(self, schema_name, schema_dir=None, schema_filename=None, **options): if not schema_dir: @@ -62,10 +68,25 @@ def __repr__(self): return "<gtweak.gsettings._GSettingsSchema: %s>" % self._schema_name -_SCHEMA_CACHE = {} +class GSettingsFakeSetting: + def __init__(self): + pass + + def get_range(self, *args, **kwargs): + return False, [] + + def get_string(self, *args, **kwargs): + return "" + + def __getattr__(self, name): + def noop(*args, **kwargs): + pass + return noop class GSettingsSetting(Gio.Settings): def __init__(self, schema_name, **options): + if schema_name not in _GSETTINGS_SCHEMAS: + raise GSettingsMissingError(schema_name) Gio.Settings.__init__(self, schema_name) if schema_name not in _SCHEMA_CACHE: _SCHEMA_CACHE[schema_name] = _GSettingsSchema(schema_name, **options) --- a/gtweak/tweakmodel.py +++ b/gtweak/tweakmodel.py @@ -35,6 +35,7 @@ self.name = name self.description = description self.group_name = options.get("group_name",_("Miscellaneous")) + self.loaded = True self._search_cache = None @@ -148,6 +149,8 @@ self._tweak_group_names[tweakgroup.name] = tweakgroup def add_tweak_auto_to_group(self, tweak): + if not tweak.loaded: + return name = tweak.group_name try: group = self._tweak_group_names[name] --- a/gtweak/widgets.py +++ b/gtweak/widgets.py @@ -15,10 +15,12 @@ # You should have received a copy of the GNU General Public License # along with gnome-tweak-tool. If not, see <http://www.gnu.org/licenses/>. +import logging + from gi.repository import Gtk, Gdk, Gio, Pango from gtweak.tweakmodel import Tweak -from gtweak.gsettings import GSettingsSetting +from gtweak.gsettings import GSettingsSetting, GSettingsFakeSetting, GSettingsMissingError from gtweak.gconf import GConfSetting def build_label_beside_widget(txt, *widget, **kwargs): @@ -97,11 +99,17 @@ def __init__(self, schema_name, key_name, **options): self.schema_name = schema_name self.key_name = key_name - self.settings = GSettingsSetting(schema_name, **options) - Tweak.__init__(self, - options.get("summary",self.settings.schema_get_summary(key_name)), - options.get("description",self.settings.schema_get_description(key_name)), - **options) + try: + self.settings = GSettingsSetting(schema_name, **options) + Tweak.__init__(self, + options.get("summary",self.settings.schema_get_summary(key_name)), + options.get("description",self.settings.schema_get_description(key_name)), + **options) + except GSettingsMissingError, e: + self.settings = GSettingsFakeSetting() + Tweak.__init__(self,"","") + self.loaded = False + logging.info("Missing gsettings %s (key %s)" % (e.message, key_name)) class GSettingsSwitchTweak(_GSettingsTweak): def __init__(self, schema_name, key_name, **options): @@ -109,7 +117,7 @@ w = Gtk.Switch() self.settings.bind(key_name, w, "active", Gio.SettingsBindFlags.DEFAULT) - self.widget = build_label_beside_widget(self.settings.schema_get_summary(key_name), w) + self.widget = build_label_beside_widget(self.name, w) # never change the size of a switch self.widget_for_size_group = None @@ -119,7 +127,7 @@ w = Gtk.FontButton() self.settings.bind(key_name, w, "font-name", Gio.SettingsBindFlags.DEFAULT) - self.widget = build_label_beside_widget(self.settings.schema_get_summary(key_name), w) + self.widget = build_label_beside_widget(self.name, w) self.widget_for_size_group = w class GSettingsRangeTweak(_GSettingsTweak): @@ -131,7 +139,7 @@ w = Gtk.HScale.new_with_range(_min, _max, options.get('adjustment_step', 1)) self.settings.bind(key_name, w.get_adjustment(), "value", Gio.SettingsBindFlags.DEFAULT) - self.widget = build_label_beside_widget(self.settings.schema_get_summary(key_name), w) + self.widget = build_label_beside_widget(self.name, w) self.widget_for_size_group = w class GSettingsComboEnumTweak(_GSettingsTweak): @@ -146,7 +154,7 @@ w.connect('changed', self._on_combo_changed) self.combo = w - self.widget = build_label_beside_widget(self.settings.schema_get_summary(key_name), w) + self.widget = build_label_beside_widget(self.name, w) self.widget_for_size_group = w @@ -231,7 +239,7 @@ w = Gtk.FontButton() w.props.font_name = self.gconf.get_value() w.connect("notify::font-name", self._on_fontbutton_changed) - self.widget = build_label_beside_widget(self.gconf.schema_get_summary(), w) + self.widget = build_label_beside_widget(self.name, w) self.widget_for_size_group = w def _on_fontbutton_changed(self, btn, param):
signature.asc
Description: PGP signature