[Xfce4-commits] <xfce4-settings:master> Make the script work for gtk-2.0 and xfwm4 themes.

Nick Schermer noreply at xfce.org
Sun Oct 23 12:26:01 CEST 2011


Updating branch refs/heads/master
         to ed1083bd59d943e59e6d510c33c1f17879d7082d (commit)
       from 2eb6b06c424d3a97f03c872e1ac447462b20c697 (commit)

commit ed1083bd59d943e59e6d510c33c1f17879d7082d
Author: Nick Schermer <nick at xfce.org>
Date:   Sun Oct 23 12:23:43 2011 +0200

    Make the script work for gtk-2.0 and xfwm4 themes.

 .../appearance-settings/appearance-install-theme   |  107 +++++++++++++++++++-
 dialogs/appearance-settings/main.c                 |   88 +++++++++++------
 2 files changed, 164 insertions(+), 31 deletions(-)

diff --git a/dialogs/appearance-settings/appearance-install-theme b/dialogs/appearance-settings/appearance-install-theme
old mode 100644
new mode 100755
index c52d3c2..59e10f4
--- a/dialogs/appearance-settings/appearance-install-theme
+++ b/dialogs/appearance-settings/appearance-install-theme
@@ -1,3 +1,108 @@
 #!/bin/sh
+#
+# Copyright (C) 2011 Nick Schermer <nick at xfce.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-exit 0
+dndfilename="$1"
+retval=0
+
+installtheme()
+{
+    file="$1"
+    suffix="$2"
+
+    basedir=${file#$tmpdir/}
+    themedir=${basedir%/$suffix}
+    themename=`basename "$themedir"`
+    themetype=`dirname "$suffix"`
+    src="$tmpdir/$themedir/$themetype"
+
+    dest="$HOME/.themes/$themename"
+    if test ! -d "$dest/$themetype"; then
+        # move theme to the users' theme directory
+        mkdir -p "$dest" && mv "$src" "$dest"
+    fi
+}
+
+# leave if no file is provided
+if test -z "$dndfilename" -o -z "$HOME"; then
+    # 1: common error, should never happen
+    exit 1
+fi
+
+# check file size, abort if bigger then 50Mb, only works for files
+if test x"`which stat 2>/dev/null`" != x""; then
+    dndsize=`stat -c %s "$dndfilename"`
+    if test "$dndsize" -gt 52428800; then
+        # 2: File too big
+        exit 2
+    fi
+fi
+
+# provide tempdir to extract the tarball or folder
+# we try $XDG_CACHE_HOME because it is more likely this is on the
+# same partition, so moving the theme after extract is faster
+if test x"`which mktemp 2>/dev/null`" != x""; then
+    tmpdir=`TMPDIR="$XDG_CACHE_HOME" mktemp -d`
+else
+    tmpdir="/tmp/tmp.$$.$RANDOM"
+    mkdir "$tmpdir"
+fi
+if test ! -d "$tmpdir"; then
+    # 3: Failed to create temp directory
+    exit 3
+fi
+
+# check if uri is directory or file
+if test -d "$dndfilename"; then
+    cp -r "$dndfilename" "$tmpdir" || retval=1
+elif test -f "$dndfilename"; then
+    case "$dndfilename" in
+        *.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tbz2|*.tbz|*.tar)
+            # extract the archive
+            tar -C "$tmpdir" -xf "$dndfilename" || retval=4
+        ;;
+        *.zip)
+            # extract the archive
+            unzip -d "$tmpdir" "$dndfilename" || retval=4
+        ;;
+        *)
+            # 5: unknow file format
+            retval=5
+        ;;
+    esac
+fi
+
+# detect theme type and move it to the correct location if
+# extracting or copying succeeded
+if test "$retval" -eq 0; then
+    # install gtk-2.0 themes
+    suffix="gtk-2.0/gtkrc"
+    find "$tmpdir" -path "$tmpdir/*/$suffix" -type f | while read file; do
+        installtheme "$file" "$suffix"
+    done
+
+    # install xfwm4 themes
+    suffix="xfwm4/themerc"
+    find "$tmpdir" -path "$tmpdir/*/$suffix" -type f | while read file; do
+        installtheme "$file" "$suffix"
+    done
+fi
+
+# cleanup
+rm -rf "$tmpdir"
+
+exit $retval
diff --git a/dialogs/appearance-settings/main.c b/dialogs/appearance-settings/main.c
index e324660..90972be 100644
--- a/dialogs/appearance-settings/main.c
+++ b/dialogs/appearance-settings/main.c
@@ -690,51 +690,79 @@ cb_theme_uri_dropped (GtkWidget        *widget,
     guint       i;
     GError     *error = NULL;
     gint        status;
-    GtkWidget  *toplevel;
+    GtkWidget  *toplevel = gtk_widget_get_toplevel (widget);
     gchar      *filename;
+    GdkCursor  *cursor;
+    GdkWindow  *gdkwindow;
 
     uris = gtk_selection_data_get_uris (data);
-    if (uris != NULL)
-    {
-        argv[0] = HELPERDIR G_DIR_SEPARATOR_S "appearance-install-theme";
-        argv[2] = NULL;
+    if (uris == NULL)
+        return;
 
-        toplevel = gtk_widget_get_toplevel (widget);
+    argv[0] = HELPERDIR G_DIR_SEPARATOR_S "appearance-install-theme";
+    argv[2] = NULL;
 
-        for (i = 0; uris[i] != NULL; i++)
-        {
-            filename = g_filename_from_uri (uris[i], NULL, NULL);
-            if (filename == NULL)
-                continue;
+    /* inform the user we are installing the theme */
+    gdkwindow = gtk_widget_get_window (widget);
+    cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_WATCH);
+    gdk_window_set_cursor (gdkwindow, cursor);
 
-            argv[1] = filename;
+    /* iterate main loop to show cursor */
+    while (gtk_events_pending ())
+        gtk_main_iteration ();
 
-            if (g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, &status, &error)
-                && status > 0)
-            {
-                switch (WEXITSTATUS (status))
-                {
-                    case 1:
+    for (i = 0; uris[i] != NULL; i++)
+    {
+        filename = g_filename_from_uri (uris[i], NULL, NULL);
+        if (filename == NULL)
+            continue;
 
-                        break;
+        argv[1] = filename;
 
-                    default:
-                        g_set_error_literal (&error, 0, 0, _("An unknown error occured"));
-                        break;
-                }
-            }
-
-            if (error != NULL)
+        if (g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, &status, &error)
+            && status > 0)
+        {
+            switch (WEXITSTATUS (status))
             {
-                xfce_dialog_show_error (GTK_WINDOW (toplevel), error, _("Failed to install theme"));
-                g_clear_error (&error);
+                case 2:
+                    g_set_error (&error, G_SPAWN_ERROR, 0,
+                        _("File is larger then %d MB, installation aborted"), 50);
+                    break;
+
+                case 3:
+                    g_set_error_literal (&error, G_SPAWN_ERROR, 0,
+                        _("Failed to create temporary directory"));
+                    break;
+
+                case 4:
+                    g_set_error_literal (&error, G_SPAWN_ERROR, 0,
+                        _("Failed to extract archive"));
+                    break;
+
+                case 5:
+                    g_set_error_literal (&error, G_SPAWN_ERROR, 0,
+                        _("Unknown format, only archives and directories are supported"));
+                    break;
+
+                default:
+                    g_set_error (&error, G_SPAWN_ERROR,
+                        0, _("An unknown error, exit code is %d"), WEXITSTATUS (status));
+                    break;
             }
+        }
 
-            g_free (filename);
+        if (error != NULL)
+        {
+            xfce_dialog_show_error (GTK_WINDOW (toplevel), error, _("Failed to install theme"));
+            g_clear_error (&error);
         }
 
-        g_strfreev (uris);
+        g_free (filename);
     }
+
+    g_strfreev (uris);
+    gdk_window_set_cursor (gdkwindow, NULL);
+    gdk_cursor_unref (cursor);
 }
 
 static void


More information about the Xfce4-commits mailing list