static gboolean setup_directory_structure (const gchar *theme_name, GError **error) { gchar *dir, *theme_name_dir; GnomeVFSURI *uri; gboolean retval = TRUE; theme_name_dir = str_remove_slash (theme_name); 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_dir, 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_dir, "index.theme", NULL); g_free (theme_name_dir); uri = gnome_vfs_uri_new (dir); g_free (dir); if (gnome_vfs_uri_exists (uri)) { GtkDialog *dialog; GtkWidget *button; gint response; dialog = (GtkDialog *) gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_CANCEL, _("The theme already exists. Would you like to replace it?")); button = gtk_dialog_add_button (dialog, _("_Overwrite"), GTK_RESPONSE_ACCEPT); gtk_button_set_image (GTK_BUTTON (button), gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_BUTTON)); response = gtk_dialog_run (dialog); gtk_widget_destroy (GTK_WIDGET (dialog)); retval = (response != GTK_RESPONSE_CANCEL); } gnome_vfs_uri_unref (uri); return retval; }
static gboolean setup_directory_structure (const gchar *theme_name, GError **error) { gchar *dir, *theme_name_dir; gboolean retval = TRUE; theme_name_dir = str_remove_slash (theme_name); dir = g_build_filename (g_get_home_dir (), ".themes", NULL); if (!g_file_test (dir, G_FILE_TEST_EXISTS)) g_mkdir (dir, 0775); g_free (dir); dir = g_build_filename (g_get_home_dir (), ".themes", theme_name_dir, NULL); if (!g_file_test (dir, G_FILE_TEST_EXISTS)) g_mkdir (dir, 0775); g_free (dir); dir = g_build_filename (g_get_home_dir (), ".themes", theme_name_dir, "index.theme", NULL); g_free (theme_name_dir); if (g_file_test (dir, G_FILE_TEST_EXISTS)) { GtkDialog *dialog; GtkWidget *button; gint response; dialog = (GtkDialog *) gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_CANCEL, _("The theme already exists. Would you like to replace it?")); button = gtk_dialog_add_button (dialog, _("_Overwrite"), GTK_RESPONSE_ACCEPT); gtk_button_set_image (GTK_BUTTON (button), gtk_image_new_from_icon_name ("document-save", GTK_ICON_SIZE_BUTTON)); response = gtk_dialog_run (dialog); gtk_widget_destroy (GTK_WIDGET (dialog)); retval = (response != GTK_RESPONSE_CANCEL); } g_free (dir); return retval; }
static gboolean write_theme_to_disk (MateThemeMetaInfo *theme_info, const gchar *theme_name, const gchar *theme_description, gboolean save_background, GError **error) { gchar* dir; gchar* theme_name_dir; GFile* tmp_file; GFile* target_file; GOutputStream* output; gchar* str; gchar* current_background; GSettings* settings; const gchar* theme_header = "" "[Desktop Entry]\n" "Name=%s\n" "Type=X-GNOME-Metatheme\n" "Comment=%s\n" "\n" "[X-GNOME-Metatheme]\n" "GtkTheme=%s\n" "MetacityTheme=%s\n" "IconTheme=%s\n"; theme_name_dir = str_remove_slash (theme_name); dir = g_build_filename (g_get_home_dir (), ".themes", theme_name_dir, "index.theme~", NULL); g_free (theme_name_dir); tmp_file = g_file_new_for_path (dir); dir [strlen (dir) - 1] = '\000'; target_file = g_file_new_for_path (dir); g_free (dir); /* start making the theme file */ str = g_strdup_printf(theme_header, theme_name, theme_description, theme_info->gtk_theme_name, theme_info->marco_theme_name, theme_info->icon_theme_name); output = G_OUTPUT_STREAM (g_file_replace (tmp_file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL)); g_output_stream_write (output, str, strlen (str), NULL, NULL); g_free (str); if (theme_info->gtk_color_scheme) { gchar *a, *tmp; tmp = g_strdup (theme_info->gtk_color_scheme); for (a = tmp; *a != '\0'; a++) if (*a == '\n') *a = ','; str = g_strdup_printf ("GtkColorScheme=%s\n", tmp); g_output_stream_write (output, str, strlen (str), NULL, NULL); g_free (str); g_free (tmp); } if (theme_info->cursor_theme_name) { #ifdef HAVE_XCURSOR str = g_strdup_printf ("CursorTheme=%s\n" "CursorSize=%i\n", theme_info->cursor_theme_name, theme_info->cursor_size); #else str = g_strdup_printf ("CursorFont=%s\n", theme_info->cursor_theme_name); #endif g_output_stream_write (output, str, strlen (str), NULL, NULL); g_free (str); } if (theme_info->notification_theme_name) { str = g_strdup_printf ("NotificationTheme=%s\n", theme_info->notification_theme_name); g_output_stream_write (output, str, strlen (str), NULL, NULL); g_free (str); } if (save_background) { settings = g_settings_new (WP_SCHEMA); current_background = g_settings_get_string (settings, WP_FILE_KEY); if (current_background != NULL) { str = g_strdup_printf ("BackgroundImage=%s\n", current_background); g_output_stream_write (output, str, strlen (str), NULL, NULL); g_free (current_background); g_free (str); } g_object_unref (settings); } g_file_move (tmp_file, target_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, NULL); g_output_stream_close (output, NULL, NULL); g_object_unref (tmp_file); g_object_unref (target_file); return TRUE; }
static gboolean write_theme_to_disk (GnomeThemeMetaInfo *theme_info, const gchar *theme_name, const gchar *theme_description, gboolean save_background, GError **error) { gchar *dir, *theme_name_dir; GnomeVFSURI *uri; GnomeVFSURI *target_uri; GnomeVFSHandle *handle = NULL; GnomeVFSFileSize bytes_written; gchar *str, *current_background; GConfClient *client; const gchar *theme_header = "[Desktop Entry]\n" "Name=%s\n" "Type=X-GNOME-Metatheme\n" "Comment=%s\n" "\n" "[X-GNOME-Metatheme]\n" "GtkTheme=%s\n" "MetacityTheme=%s\n" "IconTheme=%s\n"; theme_name_dir = str_remove_slash (theme_name); dir = g_build_filename (g_get_home_dir (), ".themes", theme_name_dir, "index.theme~", NULL); g_free (theme_name_dir); 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_description, theme_info->gtk_theme_name, theme_info->metacity_theme_name, theme_info->icon_theme_name); gnome_vfs_write (handle, str, strlen (str), &bytes_written); g_free (str); if (theme_info->gtk_color_scheme) { gchar *a, *tmp; tmp = g_strdup (theme_info->gtk_color_scheme); for (a = tmp; *a != '\0'; a++) if (*a == '\n') *a = ','; str = g_strdup_printf ("GtkColorScheme=%s\n", tmp); gnome_vfs_write (handle, str, strlen (str), &bytes_written); g_free (str); g_free (tmp); } if (theme_info->cursor_theme_name) { #ifdef HAVE_XCURSOR str = g_strdup_printf ("CursorTheme=%s\n" "CursorSize=%i\n", theme_info->cursor_theme_name, theme_info->cursor_size); #else str = g_strdup_printf ("CursorFont=%s\n", theme_info->cursor_theme_name); #endif gnome_vfs_write (handle, str, strlen (str), &bytes_written); g_free (str); } if (save_background) { client = gconf_client_get_default (); current_background = gconf_client_get_string (client, BACKGROUND_KEY, NULL); if (current_background != NULL) { str = g_strdup_printf ("BackgroundImage=%s\n", current_background); gnome_vfs_write (handle, str, strlen (str), &bytes_written); g_free (current_background); g_free (str); } g_object_unref (client); } 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; }