Hello community,

here is the log from the commit of package gnome-tweak-tool for openSUSE:Factory
checked in at Tue May 31 17:28:30 CEST 2011.



--------
--- GNOME/gnome-tweak-tool/gnome-tweak-tool.changes     2011-04-28 
13:16:46.000000000 +0200
+++ /mounts/work_src_done/STABLE/gnome-tweak-tool/gnome-tweak-tool.changes      
2011-05-26 22:42:11.000000000 +0200
@@ -1,0 +2,11 @@
+Sun May 22 13:36:07 CEST 2011 - [email protected]
+
+- Update to version 3.0.4:
+  + bgo#648751: Support system wide themes
+  + bgo#649687: Fix duplicate themes
+  + A theming specification for shell themes has been developed and
+    agreed upon by a number of theme authors. If installing a theme
+    matching this specification, show the appropriate name.
+  + Support management of Shell extensions (in home directory)
+
+-------------------------------------------------------------------

calling whatdependson for head-i586


Old:
----
  gnome-tweak-tool-3.0.3.tar.bz2

New:
----
  gnome-tweak-tool-3.0.4.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gnome-tweak-tool.spec ++++++
--- /var/tmp/diff_new_pack.CCFM5T/_old  2011-05-31 17:27:51.000000000 +0200
+++ /var/tmp/diff_new_pack.CCFM5T/_new  2011-05-31 17:27:51.000000000 +0200
@@ -19,7 +19,7 @@
 
 
 Name:           gnome-tweak-tool
-Version:        3.0.3
+Version:        3.0.4
 Release:        1
 License:        GPLv3+
 Summary:        A tool to customize advanced GNOME 3 options

++++++ gnome-tweak-tool-3.0.3.tar.bz2 -> gnome-tweak-tool-3.0.4.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/NEWS 
new/gnome-tweak-tool-3.0.4/NEWS
--- old/gnome-tweak-tool-3.0.3/NEWS     2011-04-27 14:03:55.000000000 +0200
+++ new/gnome-tweak-tool-3.0.4/NEWS     2011-05-22 11:27:40.000000000 +0200
@@ -1,3 +1,12 @@
+3.0.4
+   * Support system wide themes (bug 648751)
+   * Fix duplicate themes (bug 649687)
+   * A theming specification for shell themes has been developed and agreed 
upon
+     by a number of theme authors. If installing a theme matching this 
specification
+     show the appropriate name
+     http://www.fpmurphy.com/public/gnome_theme_packaging_spec_d2.txt
+   * Support management of Shell extensions (in home directory)
+
 3.0.3
    * Autostart nautilus at login if it is configured to show
      desktop icons (bug 648087)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/configure 
new/gnome-tweak-tool-3.0.4/configure
--- old/gnome-tweak-tool-3.0.3/configure        2011-04-27 21:52:38.000000000 
+0200
+++ new/gnome-tweak-tool-3.0.4/configure        2011-05-22 11:24:04.000000000 
+0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for gnome-tweak-tool 3.0.3.
+# Generated by GNU Autoconf 2.67 for gnome-tweak-tool 3.0.4.
 #
 # Report bugs to <[email protected]>.
 #
@@ -552,8 +552,8 @@
 # Identity of this package.
 PACKAGE_NAME='gnome-tweak-tool'
 PACKAGE_TARNAME='gnome-tweak-tool'
-PACKAGE_VERSION='3.0.3'
-PACKAGE_STRING='gnome-tweak-tool 3.0.3'
+PACKAGE_VERSION='3.0.4'
+PACKAGE_STRING='gnome-tweak-tool 3.0.4'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL=''
 
@@ -1287,7 +1287,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures gnome-tweak-tool 3.0.3 to adapt to many kinds of 
systems.
+\`configure' configures gnome-tweak-tool 3.0.4 to adapt to many kinds of 
systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1358,7 +1358,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gnome-tweak-tool 3.0.3:";;
+     short | recursive ) echo "Configuration of gnome-tweak-tool 3.0.4:";;
    esac
   cat <<\_ACEOF
 
@@ -1473,7 +1473,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-gnome-tweak-tool configure 3.0.3
+gnome-tweak-tool configure 3.0.4
 generated by GNU Autoconf 2.67
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1720,7 +1720,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by gnome-tweak-tool $as_me 3.0.3, which was
+It was created by gnome-tweak-tool $as_me 3.0.4, which was
 generated by GNU Autoconf 2.67.  Invocation command line was
 
   $ $0 $@
@@ -2537,7 +2537,7 @@
 
 # Define the identity of the package.
  PACKAGE='gnome-tweak-tool'
- VERSION='3.0.3'
+ VERSION='3.0.4'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -7828,7 +7828,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by gnome-tweak-tool $as_me 3.0.3, which was
+This file was extended by gnome-tweak-tool $as_me 3.0.4, which was
 generated by GNU Autoconf 2.67.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -7885,7 +7885,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-gnome-tweak-tool config.status 3.0.3
+gnome-tweak-tool config.status 3.0.4
 configured by $0, generated by GNU Autoconf 2.67,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/configure.ac 
new/gnome-tweak-tool-3.0.4/configure.ac
--- old/gnome-tweak-tool-3.0.3/configure.ac     2011-04-26 23:57:24.000000000 
+0200
+++ new/gnome-tweak-tool-3.0.4/configure.ac     2011-04-27 21:59:58.000000000 
+0200
@@ -1,4 +1,4 @@
-AC_INIT([gnome-tweak-tool], [3.0.3], [[email protected]])
+AC_INIT([gnome-tweak-tool], [3.0.4], [[email protected]])
 
 AM_INIT_AUTOMAKE([foreign])
 
Files old/gnome-tweak-tool-3.0.3/data/welcome.png and 
new/gnome-tweak-tool-3.0.4/data/welcome.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/defs.py 
new/gnome-tweak-tool-3.0.4/gtweak/defs.py
--- old/gnome-tweak-tool-3.0.3/gtweak/defs.py   2011-04-27 21:52:53.000000000 
+0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/defs.py   2011-05-22 11:29:56.000000000 
+0200
@@ -2,4 +2,4 @@
 PKG_DATA_DIR = "/usr/local/share/gnome-tweak-tool"
 GSETTINGS_SCHEMA_DIR = "/usr/local/share/glib-2.0/schemas"
 TWEAK_DIR = "/usr/local/lib/python2.7/dist-packages/gtweak/tweaks"
-VERSION = "3.0.3"
+VERSION = "3.0.4"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/gsettings.py 
new/gnome-tweak-tool-3.0.4/gtweak/gsettings.py
--- old/gnome-tweak-tool-3.0.3/gtweak/gsettings.py      2011-04-27 
10:34:07.000000000 +0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/gsettings.py      2011-05-10 
22:32:14.000000000 +0200
@@ -41,11 +41,18 @@
             for schema in dom.getElementsByTagName("schema"):
                 if schema_name == schema.getAttribute("id"):
                     for key in schema.getElementsByTagName("key"):
+                        #summary is compulsory, description is optional
+                        summary = 
key.getElementsByTagName("summary")[0].childNodes[0].data
+                        try:
+                            description = 
key.getElementsByTagName("description")[0].childNodes[0].data
+                        except:
+                            description = ""
                         self._schema[key.getAttribute("name")] = {
-                                "summary"       :   
key.getElementsByTagName("summary")[0].childNodes[0].data,
-                                "description"   :   
key.getElementsByTagName("description")[0].childNodes[0].data}
+                                "summary"       :   summary,
+                                "description"   :   description
+                        }
         except:
-            logging.critical("Error parsing schema", exc_info=True)
+            logging.critical("Error parsing schema %s (%s)" % (schema_name, 
schema_path), exc_info=True)
 
     def __repr__(self):
         return "<gtweak.gsettings._GSettingsSchema: %s>" % self._schema_name
@@ -61,6 +68,10 @@
 
         self._schema = _SCHEMA_CACHE[schema_name]
 
+    def _setting_check_is_list(self, key):
+        variant = Gio.Settings.get_value(self, key)
+        return variant.get_type_string() == "as"
+
     def schema_get_summary(self, key):
         return self._schema._schema[key]["summary"]
         
@@ -70,13 +81,42 @@
     def schema_get_all(self, key):
         return self._schema._schema[key]
 
-    def get_value(self, key):
-        return Gio.Settings.get_value(self,key).unpack()
-
-    def set_value(self, key, value):
-        Gio.Settings.set_value(self, key, GLib.Variant('s', value))
+    def setting_add_to_list(self, key, value):
+        """ helper function, ensures value is present in the GSettingsList at 
key """
+        assert self._setting_check_is_list(key)
+
+        vals = self[key]
+        if value not in vals:
+            vals.append(value)
+            self[key] = vals
+            return True
+
+    def setting_remove_from_list(self, key, value):
+        """ helper function, removes value in the GSettingsList at key (if 
present)"""
+        assert self._setting_check_is_list(key)
+
+        vals = self[key]
+        try:
+            vals.remove(value)
+            self[key] = vals
+            return True
+        except ValueError:
+            #not present
+            pass
+
+    def setting_is_in_list(self, key, value):
+        assert self._setting_check_is_list(key)
+        return value in self[key]
 
 if __name__ == "__main__":
+    gtweak.GSETTINGS_SCHEMA_DIR = "/usr/share/glib-2.0/schemas/"
+
     key = "draw-background"
     s = GSettingsSetting("org.gnome.desktop.background")
     print s.schema_get_summary(key), s.schema_get_description(key)
+
+    key = "disabled-extensions"
+    s = GSettingsSetting("org.gnome.shell")
+    assert s.setting_add_to_list(key, "foo")
+    assert s.setting_remove_from_list(key, "foo")
+    assert not s.setting_remove_from_list(key, "foo")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/tweakmodel.py 
new/gnome-tweak-tool-3.0.4/gtweak/tweakmodel.py
--- old/gnome-tweak-tool-3.0.3/gtweak/tweakmodel.py     2011-04-15 
15:45:50.000000000 +0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/tweakmodel.py     2011-05-10 
22:13:28.000000000 +0200
@@ -46,13 +46,17 @@
     def set_notify_cb(self, func):
         self._notify_cb = func
 
-    def notify_action_required(self, desc, btn, func):
+    def notify_action_required(self, desc, btn, func, error=False):
         if self._notify_cb:
-            self._notify_cb(self, desc, btn, func)
+            self._notify_cb(self, desc, error, btn, func)
 
     def notify_error(self, desc):
         if self._notify_cb:
-            self._notify_cb(self, desc, None, None)
+            self._notify_cb(self, desc, True, None, None)
+
+    def notify_info(self, desc):
+        if self._notify_cb:
+            self._notify_cb(self, desc, False, None, None)
 
 class TweakGroup:
     def __init__(self, name, *tweaks):
@@ -72,6 +76,12 @@
         self._tweak_dir = gtweak.TWEAK_DIR
         assert(os.path.exists(self._tweak_dir))
 
+        self.set_sort_func(self.COLUMN_NAME, self._sort_tweak_groups)
+        self.set_sort_column_id(self.COLUMN_NAME, Gtk.SortType.ASCENDING)
+
+    def _sort_tweak_groups(self, model, iter1, iter2, user_data):
+        return cmp(model.get_value(iter1, self.COLUMN_NAME), 
model.get_value(iter2, self.COLUMN_NAME))
+
     @property
     def tweaks(self):
         return [t for row in self for t in row[TweakModel.COLUMN_TWEAK].tweaks]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/tweaks/tweak_shell.py 
new/gnome-tweak-tool-3.0.4/gtweak/tweaks/tweak_shell.py
--- old/gnome-tweak-tool-3.0.3/gtweak/tweaks/tweak_shell.py     2011-04-27 
14:03:20.000000000 +0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/tweaks/tweak_shell.py     2011-05-22 
11:19:00.000000000 +0200
@@ -16,19 +16,19 @@
 # along with gnome-tweak-tool.  If not, see <http://www.gnu.org/licenses/>.
 
 import os.path
-import shutil
 import zipfile
 import tempfile
 import logging
+import json
 
 from gi.repository import Gtk
 from gi.repository import GLib
 
-from gtweak.utils import walk_directories
+from gtweak.utils import walk_directories, extract_zip_file
 from gtweak.gsettings import GSettingsSetting
 from gtweak.gshellwrapper import GnomeShell
 from gtweak.tweakmodel import Tweak, TweakGroup
-from gtweak.widgets import GConfComboTweak, GSettingsComboEnumTweak, 
GSettingsSwitchTweak, build_label_beside_widget, build_horizontal_sizegroup, 
build_combo_box_text
+from gtweak.widgets import ZipFileChooserButton, GConfComboTweak, 
GSettingsComboEnumTweak, GSettingsSwitchTweak, build_label_beside_widget, 
build_horizontal_sizegroup, build_combo_box_text
 
 class ShowWindowButtons(GConfComboTweak):
     def __init__(self, **options):
@@ -41,17 +41,6 @@
             (':minimize,maximize,close', 'All')),
             **options)
 
-class _ThemeZipChooser(Gtk.FileChooserButton):
-    def __init__(self):
-        Gtk.FileChooserButton.__init__(self, title="Select theme file")
-
-        f = Gtk.FileFilter()
-        f.add_mime_type("application/zip")
-        self.set_filter(f)
-
-        #self.set_width_chars(15)
-        self.set_local_only(True)
-
 class ShellThemeTweak(Tweak):
 
     THEME_EXT_NAME = "[email protected]"
@@ -60,7 +49,7 @@
     THEME_DIR = os.path.join(GLib.get_home_dir(), ".themes")
 
     def __init__(self, **options):
-        Tweak.__init__(self, "Shell theme", "Install custom or user themes for 
gnome-shell", **options)
+        Tweak.__init__(self, "Shell Theme", "Install custom or user themes for 
gnome-shell", **options)
 
         #check the shell is running and the usertheme extension is present
         error = "Unknown"
@@ -74,7 +63,7 @@
                 #check the correct gsettings key is present
                 try:
                     self._settings = 
GSettingsSetting(ShellThemeTweak.THEME_GSETTINGS_SCHEMA)
-                    name = 
self._settings.get_value(ShellThemeTweak.THEME_GSETTINGS_NAME)
+                    name = 
self._settings.get_string(ShellThemeTweak.THEME_GSETTINGS_NAME)
 
                     #assume the usertheme version is that version of the shell 
which
                     #it most supports (this is a poor assumption)
@@ -98,81 +87,98 @@
         else:
             hb = Gtk.HBox()
 
-            #build a combo box with all the valid theme options
-            valid = walk_directories( (ShellThemeTweak.THEME_DIR,), lambda d:
+            #include both system, and user themes
+            #note: the default theme lives in 
/system/data/dir/gnome-shell/theme
+            #      and not themes/, so add it manually later
+            dirs = [os.path.join(d, "themes") for d in 
GLib.get_system_data_dirs()]
+            dirs += [ShellThemeTweak.THEME_DIR]
+
+            valid = walk_directories(dirs, lambda d:
                         os.path.exists(os.path.join(d, "gnome-shell")) and \
                         os.path.exists(os.path.join(d, "gnome-shell", 
"gnome-shell.css")))
-            #manually add Adwiata to represent the default
-            #valid.append( ("Adwiata", "") )
 
+            #build a combo box with all the valid theme options
+            #manually add Adwaita to represent the default
             cb = build_combo_box_text(
                     
self._settings.get_string(ShellThemeTweak.THEME_GSETTINGS_NAME),
-                    ("", "Adwiata"),
+                    ("", "Adwaita"),
                     *[(v,v) for v in valid])
             cb.connect('changed', self._on_combo_changed)
             hb.pack_start(cb, False, False, 5)
             self.combo = cb
 
-            chooser = _ThemeZipChooser()
+            chooser = ZipFileChooserButton("Select a theme file")
             chooser.connect("file-set", self._on_file_set)
             hb.pack_start(chooser, False, False, 0)
 
             self.widget = build_label_beside_widget(self.name, hb)
             self.widget_for_size_group = chooser
     
-    def _extract_theme_zip(self, z, theme_name, theme_members_path):
-        tmp = tempfile.mkdtemp()
-        dest = os.path.join(ShellThemeTweak.THEME_DIR, theme_name, 
"gnome-shell")
-
-        logging.info("Extracting theme %s to %s" % (theme_name, tmp))
-
-        try:
-            if os.path.exists(dest):
-                shutil.rmtree(dest)
-            z.extractall(tmp)
-            shutil.copytree(os.path.join(tmp, theme_members_path), dest)
-            return theme_name
-        except OSError:
-            self.notify_error("Error installing theme")
-            return None
-
     def _on_file_set(self, chooser):
         f = chooser.get_filename()
 
         with zipfile.ZipFile(f, 'r') as z:
             try:
                 fragment = ()
+                theme_name = None
                 for n in z.namelist():
                     if n.endswith("gnome-shell.css"):
                         fragment = n.split("/")[0:-1]
-                        break
+                    if n.endswith("gnome-shell/theme.json"):
+                        logging.info("New style theme detected (theme.json)")
+                        #new style theme - extract the name from the json file
+                        tmp = tempfile.mkdtemp()
+                        z.extract(n, tmp)
+                        with open(os.path.join(tmp,n)) as f:
+                            try:
+                                theme_name = 
json.load(f)["shell-theme"]["name"]
+                            except:
+                                logging.warning("Invalid theme format", 
exc_info=True)
 
                 if not fragment:
                     raise Exception("Could not find gnome-shell.css")
 
-                #old style themes name was taken from the zip name
-                if fragment[0] == "theme" and len(fragment) == 1:
-                    theme_name = os.path.basename(f)
-                else:
-                    theme_name = fragment[0]
+                if not theme_name:
+                    logging.info("Old style theme detected (theme.json)")
+                    #old style themes name was taken from the zip name
+                    if fragment[0] == "theme" and len(fragment) == 1:
+                        theme_name = os.path.basename(f)
+                    else:
+                        theme_name = fragment[0]
+
                 theme_members_path = "/".join(fragment)
 
-                installed_name = self._extract_theme_zip(
-                                        z,
-                                        theme_name,
-                                        theme_members_path)
-                if installed_name:
-                    print self.combo.get_model().append( (installed_name, 
installed_name) )
+                ok, updated = extract_zip_file(
+                                z,
+                                theme_members_path,
+                                os.path.join(ShellThemeTweak.THEME_DIR, 
theme_name, "gnome-shell"))
+
+                if ok:
+                    if updated:
+                        self.notify_info("%s theme updated successfully" % 
theme_name)
+                    else:
+                        self.notify_info("%s theme installed successfully" % 
theme_name)
+
+                    #I suppose I could rely on updated as indicating whether 
to add the theme
+                    #name to the combo, but just check to see if it is already 
there
+                    model = self.combo.get_model()
+                    if theme_name not in [r[0] for r in model]:
+                        model.append( (theme_name, theme_name) )
+                else:
+                    self.notify_error("Error installing theme")
+
 
             except:
                 #does not look like a valid theme
                 self.notify_error("Invalid theme file")
+                logging.warning("Error parsing theme zip", exc_info=True)
+
         #set button back to default state
         chooser.unselect_all()
 
     def _on_combo_changed(self, combo):
         val = combo.get_model().get_value(combo.get_active_iter(), 0)
-        self._settings.set_value(ShellThemeTweak.THEME_GSETTINGS_NAME, val)
+        self._settings.set_string(ShellThemeTweak.THEME_GSETTINGS_NAME, val)
 
         #reloading the theme is not really necessary, the user-theme should 
pick
         #pick up the change.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnome-tweak-tool-3.0.3/gtweak/tweaks/tweak_shell_extensions.py 
new/gnome-tweak-tool-3.0.4/gtweak/tweaks/tweak_shell_extensions.py
--- old/gnome-tweak-tool-3.0.3/gtweak/tweaks/tweak_shell_extensions.py  
1970-01-01 01:00:00.000000000 +0100
+++ new/gnome-tweak-tool-3.0.4/gtweak/tweaks/tweak_shell_extensions.py  
2011-05-22 11:28:18.000000000 +0200
@@ -0,0 +1,161 @@
+import os.path
+import shutil
+import zipfile
+import tempfile
+import logging
+import json
+
+from gi.repository import Gtk
+from gi.repository import GLib
+
+from gtweak.utils import extract_zip_file
+from gtweak.gsettings import GSettingsSetting
+from gtweak.gshellwrapper import GnomeShell
+from gtweak.tweakmodel import Tweak, TweakGroup
+from gtweak.widgets import ZipFileChooserButton, build_label_beside_widget, 
build_horizontal_sizegroup
+
+class _ShellExtensionTweak(Tweak):
+
+    EXTENSION_DISABLED_KEY = "disabled-extensions"
+
+    def __init__(self, shell, ext, settings, **options):
+        Tweak.__init__(self, ext["name"], ext.get("description",""), **options)
+
+        self._shell = shell
+        self._settings = settings
+
+        sw = Gtk.Switch()
+        state = ext.get("state")
+        sw.set_active(
+                state == 1 and \
+                not 
self._settings.setting_is_in_list(self.EXTENSION_DISABLED_KEY, ext["uuid"])
+        )
+        sw.set_sensitive(state in (1,2))
+        sw.connect('notify::active', self._on_extension_toggled, ext["uuid"])
+
+        self.widget = build_label_beside_widget(
+                        "%s Extension" % ext["name"],
+                        sw)
+        self.widget_for_size_group = sw
+
+    def _on_extension_toggled(self, sw, active, uuid):
+        if not sw.get_active():
+            self._settings.setting_add_to_list(self.EXTENSION_DISABLED_KEY, 
uuid)
+        else:
+            
self._settings.setting_remove_from_list(self.EXTENSION_DISABLED_KEY, uuid)
+
+        self.notify_action_required(
+            "The shell must be restarted for changes to take effect",
+            "Restart",
+            lambda: self._shell.restart())
+
+class _ShellExtensionInstallerTweak(Tweak):
+
+    EXTENSION_DIR = os.path.join(GLib.get_user_data_dir(), "gnome-shell", 
"extensions")
+
+    def __init__(self, shell, **options):
+        Tweak.__init__(self, "Install Shell Extension", "", **options)
+
+        self._shell = shell
+
+        chooser = ZipFileChooserButton("Select a theme file")
+        chooser.connect("file-set", self._on_file_set)
+
+        self.widget = build_label_beside_widget(self.name, chooser)
+        self.widget_for_size_group = chooser
+
+    def _on_file_set(self, chooser):
+        f = chooser.get_filename()
+
+        with zipfile.ZipFile(f, 'r') as z:
+            try:
+                fragment = ()
+                file_extension = None
+                file_metadata = None
+                for n in z.namelist():
+                    if n.endswith("metadata.json"):
+                        fragment = n.split("/")[0:-1]
+                        file_metadata = n
+                    if n.endswith("extension.js"):
+                        extension = True
+                        if file_extension:
+                            raise Exception("Only one extension per zip file")
+                        file_extension = n
+
+                if not file_metadata:
+                    raise Exception("Could not find metadata.json")
+                if not file_extension:
+                    raise Exception("Could not find extension.js")
+
+                #extract the extension uuid
+                extension_uuid = None
+                tmp = tempfile.mkdtemp()
+                z.extract(file_metadata, tmp)
+                with open(os.path.join(tmp,file_metadata)) as f:
+                    try:
+                        extension_uuid = json.load(f)["uuid"]
+                    except:
+                        logging.warning("Invalid extension format", 
exc_info=True)
+
+                ok = False
+                if extension_uuid:
+                    ok, updated = extract_zip_file(
+                                    z,
+                                    "/".join(fragment),
+                                    os.path.join(self.EXTENSION_DIR, 
extension_uuid))
+
+                if ok:
+                    if updated:
+                        verb = "%s extension updated successfully" % 
extension_uuid
+                    else:
+                        verb = "%s extension installed successfully" % 
extension_uuid
+
+                    self.notify_action_required(
+                        verb,
+                        "Restart",
+                        lambda: self._shell.restart())
+
+                else:
+                    self.notify_error("Error installing extension")
+
+
+            except:
+                #does not look like a valid theme
+                self.notify_error("Invalid extension file")
+                logging.warning("Error parsing theme zip", exc_info=True)
+
+        #set button back to default state
+        chooser.unselect_all()
+
+class ShellExtensionTweakGroup(TweakGroup):
+    def __init__(self):
+        extension_tweaks = []
+        sg = build_horizontal_sizegroup()
+
+        #check the shell is running
+        try:
+            shell = GnomeShell()
+
+            #add the extension installer
+            #extension_tweaks.append(
+            #    _ShellExtensionInstallerTweak(shell, size_group=sg))
+
+            try:
+                settings = GSettingsSetting("org.gnome.shell")
+                #add a tweak for each installed extension
+                for extension in shell.list_extensions().values():
+                    try:
+                        extension_tweaks.append(
+                            _ShellExtensionTweak(shell, extension, settings, 
size_group=sg))
+                    except:
+                        logging.warning("Invalid extension", exc_info=True)
+            except:
+                logging.warning("Error listing extensions", exc_info=True)
+        except:
+            logging.warning("Error detecting shell")
+
+        TweakGroup.__init__(self, "Shell Extensions", *extension_tweaks)
+
+TWEAK_GROUPS = (
+        ShellExtensionTweakGroup(),
+)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/tweaks/tweak_test.py 
new/gnome-tweak-tool-3.0.4/gtweak/tweaks/tweak_test.py
--- old/gnome-tweak-tool-3.0.3/gtweak/tweaks/tweak_test.py      2011-04-15 
15:45:50.000000000 +0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/tweaks/tweak_test.py      2011-05-04 
23:58:26.000000000 +0200
@@ -32,6 +32,7 @@
         self.widget = Gtk.Button(name)
         self.widget.connect("clicked", self._on_click)
         self._need_action = options.get("need_action")
+        self._action_error = options.get("action_error")
 
     def _on_click(self, sender):
         if self._need_action:
@@ -40,7 +41,10 @@
                     Gtk.STOCK_OK,
                     lambda : print("GOT CALLBACK"))
         else:
-            self.notify_error(self.name)
+            if self._action_error:
+                self.notify_error(self.name)
+            else:
+                self.notify_info(self.name)
 
 TWEAK_GROUPS = (
         TweakGroup(
@@ -48,7 +52,8 @@
             _TestTweak("foo bar", "does foo bar"),
             _TestTweak("foo baz", "does foo baz"),
             _TestButtonTweak("Need Action", "foo bar", need_action=True),
-            _TestButtonTweak("Report Error", "foo baz", need_action=False)),
+            _TestButtonTweak("Report Error", "foo baz", action_error=True),
+            _TestButtonTweak("Report Info", "foo bob", action_error=False)),
         TweakGroup(
             "Test Many Settings",
             *[_TestTweak("name: " + str(d), "desc: " + str(d)) for d in 
range(50)]),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/tweakview.py 
new/gnome-tweak-tool-3.0.4/gtweak/tweakview.py
--- old/gnome-tweak-tool-3.0.3/gtweak/tweakview.py      2011-04-01 
12:10:44.000000000 +0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/tweakview.py      2011-05-04 
23:54:00.000000000 +0200
@@ -88,17 +88,20 @@
         self._detail_vbox.remove(info)
         func()
 
-    def _on_tweak_notify(self, tweak, desc, btn, func):
+    def _on_tweak_notify(self, tweak, desc, error, btn, func):
         info = Gtk.InfoBar()
         info.get_content_area().add(Gtk.Label(desc))
         self._detail_vbox.pack_end(info, False, False, 0)
 
-        if btn and func:
+        if error:
+            info.props.message_type = Gtk.MessageType.ERROR
+        else:
             info.props.message_type = Gtk.MessageType.INFO
+
+        if btn and func:
             info.add_button(btn, Gtk.ResponseType.OK)
             info.connect("response", self._on_tweak_notify_response, func)
         else:
-            info.props.message_type = Gtk.MessageType.ERROR
             GObject.timeout_add_seconds(2, lambda box, widget: 
box.remove(widget), self._detail_vbox, info)
 
         info.show_all()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/utils.py 
new/gnome-tweak-tool-3.0.4/gtweak/utils.py
--- old/gnome-tweak-tool-3.0.3/gtweak/utils.py  2011-04-27 10:24:25.000000000 
+0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/utils.py  2011-05-10 23:02:15.000000000 
+0200
@@ -17,6 +17,8 @@
 
 import os.path
 import logging
+import tempfile
+import shutil
 
 from gi.repository import GLib
 
@@ -32,14 +34,42 @@
         logging.critical("Error parsing directories", exc_info=True)
     return valid
 
+def extract_zip_file(z, members_path, dest):
+    """ returns (true_if_extracted_ok, true_if_updated) """
+    tmp = tempfile.mkdtemp()
+    tmpdest = os.path.join(tmp, members_path)
+
+    ok = True
+    updated = False
+    try:
+        if os.path.exists(dest):
+            shutil.rmtree(dest)
+            updated = True
+        z.extractall(tmp)
+        shutil.copytree(tmpdest, dest)
+    except OSError:
+        ok = False
+        logging.warning("Error extracting zip", exc_info=True)
+
+    if ok:
+        logging.info("Extracted zip to %s, copied to %s" % (tmpdest, dest))
+
+    return ok, updated
+
 class AutostartManager:
     def __init__(self, DATA_DIR, desktop_filename, exec_cmd="", 
extra_exec_args=""):
         self._desktop_filename = desktop_filename
         self._desktop_file = os.path.join(DATA_DIR, "applications", 
desktop_filename)
-        self._autostart_file = os.path.join(
-                                    GLib.get_user_config_dir(), "autostart", 
desktop_filename)
         self._exec_cmd = exec_cmd
         self._extra_exec_args = " %s\n" % extra_exec_args
+        
+        user_autostart_dir = os.path.join(GLib.get_user_config_dir(), 
"autostart")
+        if not os.path.isdir(user_autostart_dir):
+            try:
+                os.makedirs(user_autostart_dir)
+            except:
+                logging.critical("Could not create autostart dir: %s" % 
user_autostart_dir)
+        self._autostart_file = os.path.join(user_autostart_dir, 
desktop_filename)
 
     def is_start_at_login_enabled(self):
         if os.path.exists(self._autostart_file):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/gtweak/widgets.py 
new/gnome-tweak-tool-3.0.4/gtweak/widgets.py
--- old/gnome-tweak-tool-3.0.3/gtweak/widgets.py        2011-04-27 
13:19:08.000000000 +0200
+++ new/gnome-tweak-tool-3.0.4/gtweak/widgets.py        2011-05-10 
22:47:29.000000000 +0200
@@ -131,17 +131,20 @@
     def _on_combo_changed(self, combo):
         val = self.combo.get_model().get_value(self.combo.get_active_iter(), 0)
         if self._values_are_different():
-            self.settings.set_value(self.key_name, val)
+            self.settings.set_string(self.key_name, val)
 
 class GSettingsComboTweak(_GSettingsTweak):
     def __init__(self, schema_name, key_name, key_options, **options):
         _GSettingsTweak.__init__(self, schema_name, key_name, **options)
 
-        assert len(key_options) > 0
-        assert len(key_options[0]) == 2
+        #check key_options is iterable
+        #and if supplied, check it is a list of 2-tuples
+        assert len(key_options) >= 0
+        if len(key_options):
+            assert len(key_options[0]) == 2
 
         combo = build_combo_box_text(
-                    self.settings.get_value(self.key_name),
+                    self.settings.get_string(self.key_name),
                     *key_options)
         combo.connect('changed', self._on_combo_changed)
         self.widget = build_label_beside_widget(self.name, combo)
@@ -151,7 +154,7 @@
         _iter = combo.get_active_iter()
         if _iter:
             value = combo.get_model().get_value(_iter, 0)
-            self.settings.set_value(self.key_name, value)
+            self.settings.set_string(self.key_name, value)
 
 class _GConfTweak(Tweak):
     def __init__(self, key_name, key_type, **options):
@@ -165,8 +168,11 @@
     def __init__(self, key_name, key_type, key_options, **options):
         _GConfTweak.__init__(self, key_name, key_type, **options)
 
-        assert len(key_options) > 0
-        assert len(key_options[0]) == 2
+        #check key_options is iterable
+        #and if supplied, check it is a list of 2-tuples
+        assert len(key_options) >= 0
+        if len(key_options):
+            assert len(key_options[0]) == 2
 
         combo = build_combo_box_text(
             self.gconf.get_value(),
@@ -194,3 +200,14 @@
     def _on_fontbutton_changed(self, btn, param):
         self.gconf.set_value(btn.props.font_name)
 
+class ZipFileChooserButton(Gtk.FileChooserButton):
+    def __init__(self, title):
+        Gtk.FileChooserButton.__init__(self, title=title)
+
+        f = Gtk.FileFilter()
+        f.add_mime_type("application/zip")
+        self.set_filter(f)
+
+        #self.set_width_chars(15)
+        self.set_local_only(True)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/po/LINGUAS 
new/gnome-tweak-tool-3.0.4/po/LINGUAS
--- old/gnome-tweak-tool-3.0.3/po/LINGUAS       2011-04-27 10:10:41.000000000 
+0200
+++ new/gnome-tweak-tool-3.0.4/po/LINGUAS       2011-05-22 11:19:00.000000000 
+0200
@@ -1,6 +1,7 @@
 cs
 da
 de
+el
 es
 ja
 lv
@@ -11,4 +12,5 @@
 sl
 sv
 vi
+uk
 zh_CN
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/po/el.po 
new/gnome-tweak-tool-3.0.4/po/el.po
--- old/gnome-tweak-tool-3.0.3/po/el.po 1970-01-01 01:00:00.000000000 +0100
+++ new/gnome-tweak-tool-3.0.4/po/el.po 2011-05-22 11:19:00.000000000 +0200
@@ -0,0 +1,34 @@
+# Greek translation for gnome-tweak-tool.
+# Copyright (C) 2011 gnome-tweak-tool's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-tweak-tool 
package.
+# BunnyDee <[email protected]>, 2011.
+# Mel Argyropoulou <[email protected]>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-tweak-tool master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-05-21 23:50+0300\n"
+"PO-Revision-Date: 2011-05-18 23:38+0300\n"
+"Last-Translator: Mel Argyropoulou <[email protected]>\n"
+"Language-Team: Greek <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ../data/shell.ui.h:1
+msgid "Tweak Tool"
+msgstr "Εργαλείο μικρορυθμίσεων"
+
+#: ../data/shell.ui.h:2
+msgid "tweaks"
+msgstr "μικρορυθμίσεις"
+
+#: ../data/shell.ui.h:3
+msgid "welcome"
+msgstr "καλωσήλθατε"
+
+#: ../data/gnome-tweak-tool.desktop.in.h:1
+msgid "Tweak Advanced Settings"
+msgstr "Προχωρημένες μικρορυθμίσεις"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnome-tweak-tool-3.0.3/po/uk.po 
new/gnome-tweak-tool-3.0.4/po/uk.po
--- old/gnome-tweak-tool-3.0.3/po/uk.po 1970-01-01 01:00:00.000000000 +0100
+++ new/gnome-tweak-tool-3.0.4/po/uk.po 2011-05-02 23:37:40.000000000 +0200
@@ -0,0 +1,35 @@
+# Ukrainian translation for gnome-tweak-tool.
+# Copyright (C) 2011 gnome-tweak-tool's COPYRIGHT HOLDER
+# This file is distributed under the same license as the gnome-tweak-tool 
package.
+# Sergiy Gavrylov <[email protected]>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnome-tweak-tool master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-";
+"tweak-tool&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-04-20 12:20+0000\n"
+"PO-Revision-Date: 2011-04-21 18:33+0300\n"
+"Last-Translator: Sergiy Gavrylov <[email protected]>\n"
+"Language-Team: Ukrainian <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../data/shell.ui.h:1
+msgid "Tweak Tool"
+msgstr "Інструмент оптимізації"
+
+#: ../data/shell.ui.h:2
+msgid "tweaks"
+msgstr "оптимізації"
+
+#: ../data/shell.ui.h:3
+msgid "welcome"
+msgstr "ласкаво просимо!"
+
+#: ../data/gnome-tweak-tool.desktop.in.h:1
+msgid "Tweak Advanced Settings"
+msgstr "Оптимізація додаткових налаштувань"


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



Remember to have fun...

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to