[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