New install procedure: See bug #102216. Remove

2005-02-01  David Sedeo <david@alderia.com>

	New install procedure: See bug #102216.
	* gnome-theme-details.c: Remove gnome_theme_installer_run_cb,
	gnome_icon_theme_installer_run_cb because gnome_theme_installer_run
	function now detects if it is a icon or theme.
	(gnome_theme_details_init): Remove install buttons in theme details
	window.
	* gnome-theme-installer.c (file_theme_type): Detects the type of the
	theme inspecting the content of the file.
	(transfer_done_targz_idle_cb, transfer_done_tarbz2_idle_cb): Install
	the theme in the correct temp dir.
	(transfer_done_cb): Detects if the file to install it is in the
	correct format and informs the user if it is not supported. Unpack the
	file (informs the user if there are not the correct utility in the
	system) and install the theme in the correct directory.
	(gnome_theme_installer_run): Remove parameter. Now we detect the file
	type.
	* gnome-theme-manager.c (gnome_meta_theme_installer_run_cb,
	gnome_theme_manager_drag_data_received_cb): Call
	gnome_theme_installer_run without the third parameter. Now we detect
	the file type.
	* theme-properties.glade: Removes install buttons in details window.
This commit is contained in:
David Sedeo 2005-02-01 22:33:47 +00:00 committed by David Sedeño Fernández
parent ffdb4ad80a
commit 0b8267577e
6 changed files with 417 additions and 274 deletions

View file

@ -1,3 +1,27 @@
2005-02-01 David Sedeño <david@alderia.com>
New install procedure: See bug #102216.
* gnome-theme-details.c: Remove gnome_theme_installer_run_cb,
gnome_icon_theme_installer_run_cb because gnome_theme_installer_run
function now detects if it is a icon or theme.
(gnome_theme_details_init): Remove install buttons in theme details
window.
* gnome-theme-installer.c (file_theme_type): Detects the type of the
theme inspecting the content of the file.
(transfer_done_targz_idle_cb, transfer_done_tarbz2_idle_cb): Install
the theme in the correct temp dir.
(transfer_done_cb): Detects if the file to install it is in the
correct format and informs the user if it is not supported. Unpack the
file (informs the user if there are not the correct utility in the
system) and install the theme in the correct directory.
(gnome_theme_installer_run): Remove parameter. Now we detect the file
type.
* gnome-theme-manager.c (gnome_meta_theme_installer_run_cb,
gnome_theme_manager_drag_data_received_cb): Call
gnome_theme_installer_run without the third parameter. Now we detect
the file type.
* theme-properties.glade: Removes install buttons in details window.
2005-01-06 Sebastien Bacher <seb128@debian.org> 2005-01-06 Sebastien Bacher <seb128@debian.org>
* gnome-theme-installer.c: (install_dialog_response): check the * gnome-theme-installer.c: (install_dialog_response): check the

View file

@ -159,21 +159,6 @@ window_theme_selection_changed (GtkTreeSelection *selection,
g_free (window_theme_name); g_free (window_theme_name);
} }
static void
gnome_theme_installer_run_cb (GtkWidget *button,
GtkWidget *parent_window)
{
gnome_theme_installer_run (parent_window, NULL, FALSE);
}
static void
gnome_icon_theme_installer_run_cb (GtkWidget *button,
GtkWidget *parent_window)
{
gnome_theme_installer_run (parent_window, NULL, TRUE);
}
static void static void
icon_theme_selection_changed (GtkTreeSelection *selection, icon_theme_selection_changed (GtkTreeSelection *selection,
gpointer data) gpointer data)
@ -309,20 +294,14 @@ gnome_theme_details_init (void)
dialog); dialog);
/* gtk themes */ /* gtk themes */
widget = WID ("control_install_button");
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_installer_run_cb), parent);
widget = WID ("control_manage_button"); widget = WID ("control_manage_button");
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_manager_show_manage_themes), dialog); g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_manager_show_manage_themes), dialog);
/* window manager themes */ /* window manager themes */
widget = WID ("window_install_button");
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_installer_run_cb), parent);
widget = WID ("window_manage_button"); widget = WID ("window_manage_button");
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_manager_window_show_manage_themes), dialog); g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_manager_window_show_manage_themes), dialog);
/* icon themes */ /* icon themes */
widget = WID ("icon_install_button");
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_icon_theme_installer_run_cb), parent);
widget = WID ("icon_manage_button"); widget = WID ("icon_manage_button");
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_manager_icon_show_manage_themes), dialog); g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_manager_icon_show_manage_themes), dialog);

View file

@ -17,6 +17,92 @@
#include "file-transfer-dialog.h" #include "file-transfer-dialog.h"
#include "gnome-theme-installer.h" #include "gnome-theme-installer.h"
enum {
THEME_INVALID,
THEME_ICON,
THEME_GNOME,
THEME_GTK,
THEME_ENGINE,
THEME_METACITY
};
enum {
TARGZ,
TARBZ
};
typedef struct {
gint theme_type;
gint filetype;
gchar *filename;
gchar *target_dir;
gchar *theme_tmp_dir;
gchar *target_tmp_dir;
gchar *user_message;
} theme_properties;
static void
cleanup_tmp_dir(theme_properties *theme_props)
{
GList *list;
if (gnome_vfs_remove_directory (theme_props->target_tmp_dir) == GNOME_VFS_ERROR_DIRECTORY_NOT_EMPTY) {
list = g_list_prepend (NULL, gnome_vfs_uri_new (theme_props->target_tmp_dir));
gnome_vfs_xfer_delete_list (list, GNOME_VFS_XFER_RECURSIVE,
GNOME_VFS_XFER_ERROR_MODE_ABORT, NULL, NULL);
gnome_vfs_uri_list_free(list);
}
}
static int
file_theme_type(gchar *dir)
{
gchar *file_contents;
gchar *filename = NULL;
gint file_size;
GPatternSpec *pattern;
char *uri;
GnomeVFSURI *src_uri;
filename = g_strdup_printf ("%s/index.theme",dir);
src_uri = gnome_vfs_uri_new (filename);
if (gnome_vfs_uri_exists(src_uri)) {
uri = gnome_vfs_get_uri_from_local_path (filename);
gnome_vfs_read_entire_file (uri,&file_size,&file_contents);
pattern = g_pattern_spec_new ("*[Icon Theme]*");
if (g_pattern_match_string(pattern,file_contents)) {
return THEME_ICON;
}
pattern = g_pattern_spec_new ("*[X-GNOME-Metatheme]*");
if (g_pattern_match_string(pattern,file_contents)) {
return THEME_GNOME;
}
}
filename = g_strdup_printf ("%s/gtk-2.0/gtkrc",dir);
src_uri = gnome_vfs_uri_new (filename);
if (gnome_vfs_uri_exists(src_uri)) {
return THEME_GTK;
}
filename = g_strdup_printf ("%s/metacity-1/metacity-theme-1.xml",dir);
src_uri = gnome_vfs_uri_new (filename);
if (gnome_vfs_uri_exists (src_uri)) {
return THEME_METACITY;
}
filename = g_strdup_printf ("%s/configure.in",dir);
src_uri = gnome_vfs_uri_new (filename);
if (gnome_vfs_uri_exists (src_uri)) {
return THEME_ENGINE;
}
return THEME_INVALID;
}
static void static void
transfer_cancel_cb (GtkWidget *dlg, gchar *path) transfer_cancel_cb (GtkWidget *dlg, gchar *path)
@ -40,18 +126,21 @@ static gboolean
transfer_done_targz_idle_cb (gpointer data) transfer_done_targz_idle_cb (gpointer data)
{ {
int status; int status;
gchar *command; gchar *command, *filename;
gchar *path = data; theme_properties *theme_props = data;
/* this should be something more clever and nonblocking */ /* this should be something more clever and nonblocking */
command = g_strdup_printf ("sh -c 'cd \"%s/.themes\"; gzip -d -c < \"%s\" | tar xf -'", filename = g_shell_quote(theme_props->filename);
g_get_home_dir (), path); command = g_strdup_printf ("sh -c 'cd \"%s\"; /bin/gzip -d -c < \"%s\" | /bin/tar xf - '",
if (g_spawn_command_line_sync (command, NULL, NULL, &status, NULL) && status == 0) theme_props->target_tmp_dir, filename);
gnome_vfs_unlink (path); g_free(filename);
g_free (command); if (g_spawn_command_line_sync (command, NULL, NULL, &status, NULL) && status == 0) {
g_free (path); g_free (command);
return TRUE;
return FALSE; } else {
g_free (command);
return FALSE;
}
} }
@ -69,18 +158,21 @@ static gboolean
transfer_done_tarbz2_idle_cb (gpointer data) transfer_done_tarbz2_idle_cb (gpointer data)
{ {
int status; int status;
gchar *command; gchar *command, *filename;
gchar *path = data; theme_properties *theme_props = data;
filename = g_shell_quote(theme_props->filename);
/* this should be something more clever and nonblocking */ /* this should be something more clever and nonblocking */
command = g_strdup_printf ("sh -c 'cd \"%s/.themes\"; bzip2 -d -c < \"%s\" | tar xf -'", command = g_strdup_printf ("sh -c 'cd \"%s\"; /usr/bin/bzip2 -d -c < \"%s\" | /bin/tar xf - '",
g_get_home_dir (), path); theme_props->target_tmp_dir, filename);
if (g_spawn_command_line_sync (command, NULL, NULL, &status, NULL) && status == 0) g_free (filename);
gnome_vfs_unlink (path); if (g_spawn_command_line_sync (command, NULL, NULL, &status, NULL) && status == 0) {
g_free (command); g_free (command);
g_free (path); return TRUE;
} else {
return FALSE; g_free (command);
return FALSE;
}
} }
static void static void
@ -88,23 +180,199 @@ transfer_done_cb (GtkWidget *dlg, gchar *path)
{ {
GtkWidget *dialog; GtkWidget *dialog;
int len = strlen (path); int len = strlen (path);
gchar *command,**dir, *first_line, *filename;
int status,theme_type;
theme_properties *theme_props;
GnomeVFSURI *theme_source_dir, *theme_dest_dir;
gtk_widget_destroy (dlg); gtk_widget_destroy (dlg);
if (path && len > 7 && !strcmp (path + len - 7, ".tar.gz"))
g_idle_add (transfer_done_targz_idle_cb, path); theme_props = g_new(theme_properties,1);
else if (path && len > 4 && !strcmp (path + len - 4, ".tgz"))
g_idle_add (transfer_done_targz_idle_cb, path); theme_props->target_tmp_dir = g_strdup_printf ("%s/.themes/.theme-%u",
else if (path && len > 8 && !strcmp (path + len - 8, ".tar.bz2")) g_get_home_dir(),
g_idle_add (transfer_done_tarbz2_idle_cb, path); g_random_int());
else {
if (path && len > 7 && ( (!strcmp (path + len - 7, ".tar.gz")) || (!strcmp (path + len - 4, ".tgz")) )) {
filename = g_shell_quote (path);
command = g_strdup_printf ("sh -c '/bin/gzip -d -c < \"%s\" | /bin/tar ft - | head -1'",
filename);
theme_props->filetype=TARGZ;
g_free (filename);
} else if (path && len > 8 && !strcmp (path + len - 8, ".tar.bz2")) {
filename = g_shell_quote (path);
command = g_strdup_printf ("sh -c '/usr/bin/bzip2 -d -c < \"%s\" | /bin/tar ft - | head -1'",
filename);
theme_props->filetype=TARBZ;
g_free (filename);
} else {
dialog = gtk_message_dialog_new (NULL, dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL, GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR, GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK, GTK_BUTTONS_OK,
_("This theme is not in a supported format.")); _("This theme is not in a supported format."));
gtk_dialog_run (GTK_DIALOG (dialog)); gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog); gtk_widget_destroy (dialog);
gnome_vfs_unlink (path); gnome_vfs_unlink(path);
return;
} }
if ((gnome_vfs_make_directory(theme_props->target_tmp_dir,0700)) != GNOME_VFS_OK) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("Failed to create temporal directory"));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
return;
}
/* Uncompress the file in the temp directory */
theme_props->filename=g_strdup(path);
if (theme_props->filetype == TARBZ ) {
if (!g_file_test ("/usr/bin/bzip2", G_FILE_TEST_EXISTS)) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("Can not install theme. \nThere are not bzip2 utility in the system."));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
gnome_vfs_unlink(path);
return;
}
if (!transfer_done_tarbz2_idle_cb(theme_props)) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("Installation Failed"));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
cleanup_tmp_dir (theme_props);
return;
}
}
if (theme_props->filetype == TARGZ ) {
if (!g_file_test ("/bin/gzip", G_FILE_TEST_EXISTS)) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("Can not install themes. \nThere are not gzip utility in the system."));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
gnome_vfs_unlink(path);
return;
}
if (!transfer_done_targz_idle_cb(theme_props)) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("Installation Failed"));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
cleanup_tmp_dir (theme_props);
return;
}
}
/* What type of theme it is ? */
if (g_spawn_command_line_sync (command, &first_line, NULL, &status, NULL) && status == 0) {
dir = g_strsplit(g_strchomp(first_line),"/",0);
theme_props->theme_tmp_dir=g_strdup(g_build_filename(theme_props->target_tmp_dir,dir[0],NULL));
theme_type = file_theme_type(theme_props->theme_tmp_dir);
gnome_vfs_unlink (theme_props->filename);
if (theme_type == THEME_ICON) {
theme_props->target_dir=g_strdup_printf("%s/.icons/%s",g_get_home_dir(),dir[0]);
theme_props->user_message=g_strdup_printf(_("Icon Theme %s correctly installed.\nYou can select it in the theme details."),dir[0]);
} else if (theme_type == THEME_GNOME) {
theme_props->target_dir = g_strdup_printf("%s/.themes/%s",g_get_home_dir(),dir[0]);
theme_props->user_message=g_strdup_printf(_("Gnome Theme %s correctly installed"),dir[0]);
} else if (theme_type == THEME_METACITY) {
theme_props->target_dir = g_strdup_printf("%s/.themes/%s",g_get_home_dir(),dir[0]);
theme_props->user_message=g_strdup_printf(_("Windows Border Theme %s correctly installed.\nYou can select it in the theme details."),dir[0]);
} else if (theme_type == THEME_GTK) {
theme_props->target_dir = g_strdup_printf("%s/.themes/%s",g_get_home_dir(),dir[0]);
theme_props->user_message=g_strdup_printf(_("Controls Theme %s correctly installed.\nYou can select it in the theme details."),dir[0]);
} else if (theme_type == THEME_ENGINE) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("The theme is a engine. You need to compile the theme."));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
cleanup_tmp_dir(theme_props);
return;
} else {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("The file format is invalid"));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
return;
}
/* Move the Dir to the target dir */
theme_source_dir = gnome_vfs_uri_new (theme_props->theme_tmp_dir);
theme_dest_dir = gnome_vfs_uri_new (theme_props->target_dir);
if (gnome_vfs_xfer_uri (theme_source_dir,theme_dest_dir,
GNOME_VFS_XFER_DELETE_ITEMS | GNOME_VFS_XFER_RECURSIVE | GNOME_VFS_XFER_REMOVESOURCE,
GNOME_VFS_XFER_ERROR_MODE_ABORT,
GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
NULL,NULL) != GNOME_VFS_OK) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("Installation Failed"));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
cleanup_tmp_dir(theme_props);
return;
} else {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
theme_props->user_message );
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
cleanup_tmp_dir (theme_props);
return;
}
}
g_free(theme_props);
} }
static void static void
@ -183,17 +451,23 @@ install_dialog_response (GtkWidget *widget, int response_id, gpointer data)
gchar *file_tmp; gchar *file_tmp;
int len = strlen (base); int len = strlen (base);
if (base && len > 7 && !strcmp (base + len - 7, ".tar.gz")) if (base && len > 7 && ( (!strcmp (base + len - 7, ".tar.gz")) || (!strcmp (base + len - 4, ".tgz")) ))
file_tmp = g_strdup_printf("gnome-theme-%d.tar.gz", rand ()); file_tmp = g_strdup_printf("gnome-theme-%d.tar.gz", rand ());
else if (base && len > 8 && !strcmp (base + len - 8, ".tar.bz2")) else if (base && len > 8 && !strcmp (base + len - 8, ".tar.bz2"))
file_tmp = g_strdup_printf("gnome-theme-%d.tar.bz2", rand ()); file_tmp = g_strdup_printf("gnome-theme-%d.tar.bz2", rand ());
else else {
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("The file format is invalid."));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
gnome_vfs_unlink(path);
return; return;
}
if (icon_theme) path = g_build_filename (g_get_home_dir (), ".themes", file_tmp, NULL);
path = g_build_filename (g_get_home_dir (), ".icons", file_tmp, NULL);
else
path = g_build_filename (g_get_home_dir (), ".themes", file_tmp, NULL);
g_free(file_tmp); g_free(file_tmp);
if (!gnome_vfs_uri_exists (gnome_vfs_uri_new (path))) if (!gnome_vfs_uri_exists (gnome_vfs_uri_new (path)))
@ -248,7 +522,7 @@ install_dialog_response (GtkWidget *widget, int response_id, gpointer data)
} }
void void
gnome_theme_installer_run (GtkWidget *parent, gchar *filename, gboolean icon_theme) gnome_theme_installer_run (GtkWidget *parent, gchar *filename)
{ {
static gboolean running_theme_install = FALSE; static gboolean running_theme_install = FALSE;
GladeXML *dialog; GladeXML *dialog;
@ -259,10 +533,22 @@ gnome_theme_installer_run (GtkWidget *parent, gchar *filename, gboolean icon_the
running_theme_install = TRUE; running_theme_install = TRUE;
if (!g_file_test ("/bin/tar", G_FILE_TEST_EXISTS)) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
_("Cannot install theme.\nThe tar program is not installed on your system."));
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
return;
}
dialog = glade_xml_new (GLADEDIR "/theme-install.glade", NULL, NULL); dialog = glade_xml_new (GLADEDIR "/theme-install.glade", NULL, NULL);
widget = WID ("install_dialog"); widget = WID ("install_dialog");
g_object_set_data (G_OBJECT (widget), "icon_theme", GINT_TO_POINTER (icon_theme));
g_signal_connect (G_OBJECT (widget), "response", G_CALLBACK (install_dialog_response), dialog); g_signal_connect (G_OBJECT (widget), "response", G_CALLBACK (install_dialog_response), dialog);
gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (parent)); gtk_window_set_transient_for (GTK_WINDOW (widget), GTK_WINDOW (parent));
gtk_window_set_position (GTK_WINDOW (widget), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_position (GTK_WINDOW (widget), GTK_WIN_POS_CENTER_ON_PARENT);

View file

@ -24,6 +24,6 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
void gnome_theme_installer_run (GtkWidget *parent, gchar *filename, gboolean icon_theme); void gnome_theme_installer_run (GtkWidget *parent, gchar *filename);
#endif /* GNOME_THEME_INSTALLER_H */ #endif /* GNOME_THEME_INSTALLER_H */

View file

@ -1070,7 +1070,7 @@ static void
gnome_meta_theme_installer_run_cb (GtkWidget *button, gnome_meta_theme_installer_run_cb (GtkWidget *button,
GtkWidget *parent_window) GtkWidget *parent_window)
{ {
gnome_theme_installer_run (parent_window, NULL, FALSE); gnome_theme_installer_run (parent_window, NULL);
} }
@ -1388,7 +1388,7 @@ gnome_theme_manager_drag_data_received_cb (GtkWidget *widget, GdkDragContext *co
gnome_vfs_uri_list_unref (uris); gnome_vfs_uri_list_unref (uris);
} }
gnome_theme_installer_run (widget, filename, FALSE); gnome_theme_installer_run (widget, filename);
g_free (filename); g_free (filename);
} }

View file

@ -12,6 +12,11 @@
<property name="modal">False</property> <property name="modal">False</property>
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="destroy_with_parent">False</property> <property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="has_separator">False</property> <property name="has_separator">False</property>
<child internal-child="vbox"> <child internal-child="vbox">
@ -33,6 +38,7 @@
<property name="label">gtk-help</property> <property name="label">gtk-help</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-11</property> <property name="response_id">-11</property>
</widget> </widget>
</child> </child>
@ -44,6 +50,7 @@
<property name="label">gtk-close</property> <property name="label">gtk-close</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-7</property> <property name="response_id">-7</property>
</widget> </widget>
</child> </child>
@ -112,6 +119,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<child> <child>
<widget class="GtkAlignment" id="alignment8"> <widget class="GtkAlignment" id="alignment8">
@ -120,6 +128,10 @@
<property name="yalign">0.5</property> <property name="yalign">0.5</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child> <child>
<widget class="GtkHBox" id="hbox15"> <widget class="GtkHBox" id="hbox15">
@ -181,6 +193,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<child> <child>
<widget class="GtkAlignment" id="alignment7"> <widget class="GtkAlignment" id="alignment7">
@ -189,6 +202,10 @@
<property name="yalign">0.5</property> <property name="yalign">0.5</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child> <child>
<widget class="GtkHBox" id="hbox14"> <widget class="GtkHBox" id="hbox14">
@ -250,6 +267,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<child> <child>
<widget class="GtkAlignment" id="alignment9"> <widget class="GtkAlignment" id="alignment9">
@ -258,6 +276,10 @@
<property name="yalign">0.5</property> <property name="yalign">0.5</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child> <child>
<widget class="GtkHBox" id="hbox16"> <widget class="GtkHBox" id="hbox16">
@ -328,6 +350,10 @@
<property name="yalign">0.5</property> <property name="yalign">0.5</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child> <child>
<widget class="GtkHBox" id="hbox26"> <widget class="GtkHBox" id="hbox26">
@ -480,6 +506,7 @@
<property name="label" translatable="yes">Apply _Font</property> <property name="label" translatable="yes">Apply _Font</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</widget> </widget>
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
@ -547,6 +574,7 @@
<property name="label" translatable="yes">Apply _Background</property> <property name="label" translatable="yes">Apply _Background</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</widget> </widget>
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
@ -614,6 +642,7 @@
<property name="label" translatable="yes">Apply _Font</property> <property name="label" translatable="yes">Apply _Font</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</widget> </widget>
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
@ -629,6 +658,7 @@
<property name="label" translatable="yes">Apply _Background</property> <property name="label" translatable="yes">Apply _Background</property>
<property name="use_underline">True</property> <property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
</widget> </widget>
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
@ -687,6 +717,11 @@
<property name="modal">False</property> <property name="modal">False</property>
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="destroy_with_parent">False</property> <property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="has_separator">False</property> <property name="has_separator">False</property>
<child internal-child="vbox"> <child internal-child="vbox">
@ -708,6 +743,7 @@
<property name="label">gtk-help</property> <property name="label">gtk-help</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-11</property> <property name="response_id">-11</property>
</widget> </widget>
</child> </child>
@ -719,6 +755,7 @@
<property name="label">gtk-close</property> <property name="label">gtk-close</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-7</property> <property name="response_id">-7</property>
</widget> </widget>
</child> </child>
@ -793,80 +830,12 @@
<property name="homogeneous">False</property> <property name="homogeneous">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child>
<widget class="GtkButton" id="control_install_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<child>
<widget class="GtkAlignment" id="alignment15">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<widget class="GtkHBox" id="hbox22">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<child>
<widget class="GtkImage" id="image14">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label49">
<property name="visible">True</property>
<property name="label" translatable="yes">_Install Theme...</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child> <child>
<widget class="GtkButton" id="control_manage_button"> <widget class="GtkButton" id="control_manage_button">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<child> <child>
<widget class="GtkAlignment" id="alignment14"> <widget class="GtkAlignment" id="alignment14">
@ -875,6 +844,10 @@
<property name="yalign">0.5</property> <property name="yalign">0.5</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child> <child>
<widget class="GtkHBox" id="hbox21"> <widget class="GtkHBox" id="hbox21">
@ -1070,80 +1043,12 @@
<property name="homogeneous">False</property> <property name="homogeneous">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child>
<widget class="GtkButton" id="window_install_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<child>
<widget class="GtkAlignment" id="alignment10">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<widget class="GtkHBox" id="hbox17">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<child>
<widget class="GtkImage" id="image9">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label44">
<property name="visible">True</property>
<property name="label" translatable="yes">_Install Theme...</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child> <child>
<widget class="GtkButton" id="window_manage_button"> <widget class="GtkButton" id="window_manage_button">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<child> <child>
<widget class="GtkAlignment" id="alignment11"> <widget class="GtkAlignment" id="alignment11">
@ -1152,6 +1057,10 @@
<property name="yalign">0.5</property> <property name="yalign">0.5</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child> <child>
<widget class="GtkHBox" id="hbox18"> <widget class="GtkHBox" id="hbox18">
@ -1347,80 +1256,12 @@
<property name="homogeneous">False</property> <property name="homogeneous">False</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child>
<widget class="GtkButton" id="icon_install_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<child>
<widget class="GtkAlignment" id="alignment12">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<child>
<widget class="GtkHBox" id="hbox19">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<child>
<widget class="GtkImage" id="image11">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label46">
<property name="visible">True</property>
<property name="label" translatable="yes">_Install Theme...</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child> <child>
<widget class="GtkButton" id="icon_manage_button"> <widget class="GtkButton" id="icon_manage_button">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<child> <child>
<widget class="GtkAlignment" id="alignment13"> <widget class="GtkAlignment" id="alignment13">
@ -1429,6 +1270,10 @@
<property name="yalign">0.5</property> <property name="yalign">0.5</property>
<property name="xscale">0</property> <property name="xscale">0</property>
<property name="yscale">0</property> <property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child> <child>
<widget class="GtkHBox" id="hbox20"> <widget class="GtkHBox" id="hbox20">
@ -1593,6 +1438,11 @@
<property name="modal">True</property> <property name="modal">True</property>
<property name="resizable">True</property> <property name="resizable">True</property>
<property name="destroy_with_parent">False</property> <property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="has_separator">False</property> <property name="has_separator">False</property>
<child internal-child="vbox"> <child internal-child="vbox">
@ -1614,6 +1464,7 @@
<property name="label">gtk-cancel</property> <property name="label">gtk-cancel</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-6</property> <property name="response_id">-6</property>
</widget> </widget>
</child> </child>
@ -1627,6 +1478,7 @@
<property name="label">gtk-save</property> <property name="label">gtk-save</property>
<property name="use_stock">True</property> <property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property> <property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-5</property> <property name="response_id">-5</property>
</widget> </widget>
</child> </child>
@ -1759,6 +1611,8 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="editable">True</property> <property name="editable">True</property>
<property name="overwrite">False</property>
<property name="accepts_tab">True</property>
<property name="justification">GTK_JUSTIFY_LEFT</property> <property name="justification">GTK_JUSTIFY_LEFT</property>
<property name="wrap_mode">GTK_WRAP_WORD</property> <property name="wrap_mode">GTK_WRAP_WORD</property>
<property name="cursor_visible">True</property> <property name="cursor_visible">True</property>