From 628bc1ce2c86ad59bb8c2cad5a54f4c093013a50 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Fri, 6 Dec 2002 21:56:37 +0000 Subject: [PATCH] New file. Really saves now. Doesn't notice when a new metatheme is added, Fri Dec 6 16:54:14 2002 Jonathan Blandford * gnome-theme-save-data.c: New file. Really saves now. Doesn't notice when a new metatheme is added, though. Fri Dec 6 16:13:54 2002 Jonathan Blandford * gnome-theme-info.c (top_theme_dir_changed_callback): I know C. Really, I do. --- capplets/common/ChangeLog | 5 + capplets/common/gnome-theme-info.c | 19 +++- capplets/theme-switcher/ChangeLog | 5 + capplets/theme-switcher/gnome-theme-details.c | 2 +- capplets/theme-switcher/gnome-theme-manager.c | 5 +- .../theme-switcher/gnome-theme-save-data.c | 9 ++ capplets/theme-switcher/gnome-theme-save.c | 101 +++++++++++++++++- .../theme-switcher/theme-properties.glade | 9 -- 8 files changed, 133 insertions(+), 22 deletions(-) create mode 100644 capplets/theme-switcher/gnome-theme-save-data.c diff --git a/capplets/common/ChangeLog b/capplets/common/ChangeLog index 3a8269b1a..71123f88c 100644 --- a/capplets/common/ChangeLog +++ b/capplets/common/ChangeLog @@ -1,3 +1,8 @@ +Fri Dec 6 16:13:54 2002 Jonathan Blandford + + * gnome-theme-info.c (top_theme_dir_changed_callback): I know C. + Really, I do. + 2002-11-23 Jody Goldberg * Release 2.1.3 diff --git a/capplets/common/gnome-theme-info.c b/capplets/common/gnome-theme-info.c index 5ff22abca..935e42deb 100644 --- a/capplets/common/gnome-theme-info.c +++ b/capplets/common/gnome-theme-info.c @@ -210,6 +210,7 @@ update_theme_dir (const gchar *theme_dir) { GList *list; + g_print ("changed!\n"); for (list = callbacks; list; list = list->next) { ThemeCallbackData *callback_data = list->data; @@ -217,6 +218,10 @@ update_theme_dir (const gchar *theme_dir) (* callback_data->func) ((gpointer)theme_dir, callback_data->data); } } + else + { + g_print ("no change!\n"); + } } @@ -262,7 +267,11 @@ top_theme_dir_changed_callback (GnomeVFSMonitorHandle *handle, GnomeVFSMonitorEventType event_type, gpointer user_data) { - GFreeFunc *func = user_data; + typedef void (*ThemeChangedFunc) (const gchar *uri); + ThemeChangedFunc func; + + + func = user_data; switch (event_type) { @@ -270,9 +279,13 @@ top_theme_dir_changed_callback (GnomeVFSMonitorHandle *handle, case GNOME_VFS_MONITOR_EVENT_CREATED: case GNOME_VFS_MONITOR_EVENT_DELETED: if (!strncmp (info_uri, "file://", strlen ("file://"))) - (*func) ((char *)info_uri + strlen ("file://")); + { + func (info_uri + strlen ("file://")); + } else - (*func) ((char *)info_uri); + { + func (info_uri); + } break; default: break; diff --git a/capplets/theme-switcher/ChangeLog b/capplets/theme-switcher/ChangeLog index 6d7979960..3fdb8e8f0 100644 --- a/capplets/theme-switcher/ChangeLog +++ b/capplets/theme-switcher/ChangeLog @@ -1,3 +1,8 @@ +Fri Dec 6 16:54:14 2002 Jonathan Blandford + + * gnome-theme-save-data.c: New file. Really saves now. Doesn't + notice when a new metatheme is added, though. + Tue Dec 3 20:45:17 2002 Jonathan Blandford * gnome-theme-save.c: Add saving support. Almost to a working diff --git a/capplets/theme-switcher/gnome-theme-details.c b/capplets/theme-switcher/gnome-theme-details.c index 377457267..73d71f0f8 100644 --- a/capplets/theme-switcher/gnome-theme-details.c +++ b/capplets/theme-switcher/gnome-theme-details.c @@ -502,7 +502,7 @@ gnome_theme_details_update_from_gconf (void) gnome_window_manager_get_settings (window_manager, &wm_settings); update_list_something (tree_view, wm_settings.theme); - tree_view = WID ("window_theme_treeview"); + tree_view = WID ("icon_theme_treeview"); theme = gconf_client_get_string (client, ICON_THEME_KEY, NULL); update_list_something (tree_view, theme); g_free (theme); diff --git a/capplets/theme-switcher/gnome-theme-manager.c b/capplets/theme-switcher/gnome-theme-manager.c index 5fa952717..1fd8ce4ff 100644 --- a/capplets/theme-switcher/gnome-theme-manager.c +++ b/capplets/theme-switcher/gnome-theme-manager.c @@ -288,13 +288,9 @@ meta_theme_setup_info (GnomeThemeMetaInfo *meta_theme_info, GladeXML *dialog) { GtkWidget *notebook; - GtkWidget *toggle; notebook = WID ("meta_theme_notebook"); - /* Undo all signals */ - toggle = WID ("meta_theme_font1_toggle"); - if (meta_theme_info == NULL) { gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 0); @@ -703,6 +699,7 @@ theme_changed_func (gpointer uri, dialog = gnome_theme_manager_get_theme_dialog (); + g_print ("theme_changed_func:\n"); update_themes_from_disk ((GladeXML *)user_data); gnome_theme_details_reread_themes_from_disk (); gtk_widget_grab_focus (WID ("meta_theme_treeview")); diff --git a/capplets/theme-switcher/gnome-theme-save-data.c b/capplets/theme-switcher/gnome-theme-save-data.c new file mode 100644 index 000000000..e487194fc --- /dev/null +++ b/capplets/theme-switcher/gnome-theme-save-data.c @@ -0,0 +1,9 @@ +static const gchar *theme_header = +"[Desktop Entry]\n\ +Name=%s\n\ +Type=X-GNOME-Metatheme\n\ +Comment=%s\n\ +Encoding=UTF-8\n\ +\n\ +[X-GNOME-Metatheme]\n\ +"; diff --git a/capplets/theme-switcher/gnome-theme-save.c b/capplets/theme-switcher/gnome-theme-save.c index 89de52e25..43e29aa62 100644 --- a/capplets/theme-switcher/gnome-theme-save.c +++ b/capplets/theme-switcher/gnome-theme-save.c @@ -2,7 +2,9 @@ #include "gnome-theme-save.h" #include "gnome-theme-manager.h" #include "capplet-util.h" +#include +#include "gnome-theme-save-data.c" static GQuark error_quark; enum @@ -12,20 +14,109 @@ enum static gboolean -save_theme_to_disk (GnomeThemeMetaInfo *meta_theme_info, - const gchar *theme_name, - GError **error) +check_theme_name (const gchar *theme_name, + GError **error) { if (theme_name == NULL) { g_set_error (error, error_quark, INVALID_THEME_NAME, - "ff"); + _("Theme name must be present")); + return FALSE; } return TRUE; } +static gboolean +setup_directory_structure (const gchar *theme_name, + GError **error) +{ + gchar *dir; + GnomeVFSURI *uri; + + dir = g_build_filename (g_get_home_dir (), ".themes", NULL); + uri = gnome_vfs_uri_new (dir); + if (!gnome_vfs_uri_exists (uri)) + gnome_vfs_make_directory_for_uri (uri, 0775); + gnome_vfs_uri_unref (uri); + g_free (dir); + + dir = g_build_filename (g_get_home_dir (), ".themes", theme_name, NULL); + uri = gnome_vfs_uri_new (dir); + if (!gnome_vfs_uri_exists (uri)) + gnome_vfs_make_directory_for_uri (uri, 0775); + gnome_vfs_uri_unref (uri); + g_free (dir); + + return TRUE; +} + +static gboolean +write_theme_to_disk (GnomeThemeMetaInfo *meta_theme_info, + const gchar *theme_name, + GError **error) +{ + gchar *dir; + GnomeVFSURI *uri; + GnomeVFSURI *target_uri; + GnomeVFSHandle *handle = NULL; + GnomeVFSFileSize bytes_written; + gchar *str; + + dir = g_build_filename (g_get_home_dir (), ".themes", theme_name, "index.theme~", NULL); + uri = gnome_vfs_uri_new (dir); + dir [strlen (dir) - 1] = '\000'; + target_uri = gnome_vfs_uri_new (dir); + g_free (dir); + gnome_vfs_create_uri (&handle, uri, GNOME_VFS_OPEN_READ | GNOME_VFS_OPEN_WRITE, FALSE, 0644); + + gnome_vfs_truncate_handle (handle, 0); + + /* start making the theme file */ + str = g_strdup_printf (theme_header, theme_name, theme_name); + gnome_vfs_write (handle, str, strlen (str), &bytes_written); + g_free (str); + + str = g_strdup_printf ("GtkTheme=%s\n", meta_theme_info->gtk_theme_name); + gnome_vfs_write (handle, str, strlen (str), &bytes_written); + g_free (str); + + str = g_strdup_printf ("MetacityTheme=%s\n", meta_theme_info->metacity_theme_name); + gnome_vfs_write (handle, str, strlen (str), &bytes_written); + g_free (str); + + str = g_strdup_printf ("IconTheme=%s\n", meta_theme_info->icon_theme_name); + gnome_vfs_write (handle, str, strlen (str), &bytes_written); + g_free (str); + + gnome_vfs_close (handle); + + + gnome_vfs_move_uri (uri, target_uri, TRUE); + gnome_vfs_uri_unref (uri); + gnome_vfs_uri_unref (target_uri); + + return TRUE; +} + +static gboolean +save_theme_to_disk (GnomeThemeMetaInfo *meta_theme_info, + const gchar *theme_name, + GError **error) +{ + if (! check_theme_name (theme_name, error)) + return FALSE; + + if (! setup_directory_structure (theme_name, error)) + return FALSE; + + if (! write_theme_to_disk (meta_theme_info, theme_name, error)) + return FALSE; + + return TRUE; +} + static void save_dialog_response (GtkWidget *save_dialog, gint response_id, @@ -44,7 +135,7 @@ save_dialog_response (GtkWidget *save_dialog, entry = WID ("save_dialog_entry"); theme_name = gtk_entry_get_text (GTK_ENTRY (entry)); - meta_theme_info = (GnomeThemeMetaInfo *) g_object_get_data (G_OBJECT (save_dialog), "meta_theme_info"); + meta_theme_info = (GnomeThemeMetaInfo *) g_object_get_data (G_OBJECT (save_dialog), "meta-theme-info"); if (! save_theme_to_disk (meta_theme_info, theme_name, &error)) { goto out; diff --git a/capplets/theme-switcher/theme-properties.glade b/capplets/theme-switcher/theme-properties.glade index d859cc5a1..8ab2c1c8f 100644 --- a/capplets/theme-switcher/theme-properties.glade +++ b/capplets/theme-switcher/theme-properties.glade @@ -114,7 +114,6 @@ True True - _Details... True GTK_RELIEF_NORMAL @@ -160,7 +159,6 @@ True True - _Install theme... True GTK_RELIEF_NORMAL @@ -201,7 +199,6 @@ True True - _Save theme True GTK_RELIEF_NORMAL @@ -709,7 +706,6 @@ font and background True True - _Install theme... True GTK_RELIEF_NORMAL @@ -740,7 +736,6 @@ font and background True True - _Go to theme folder True GTK_RELIEF_NORMAL @@ -907,7 +902,6 @@ font and background True True - _Install theme... True GTK_RELIEF_NORMAL @@ -938,7 +932,6 @@ font and background True True - _Go to theme folder True GTK_RELIEF_NORMAL @@ -1105,7 +1098,6 @@ font and background True True - _Install theme... True GTK_RELIEF_NORMAL @@ -1136,7 +1128,6 @@ font and background True True - _Go to theme folder True GTK_RELIEF_NORMAL