static gboolean prefs_themes_is_system_theme(const gchar *dirname) { gint len; gchar *system_theme_dir; gboolean is_sys = FALSE; cm_return_val_if_fail(dirname != NULL, FALSE); system_theme_dir = stock_pixmap_get_system_theme_dir_for_theme(NULL); len = strlen(system_theme_dir); if (strlen(dirname) > len && 0 == strncmp(dirname, system_theme_dir, len)) is_sys = TRUE; g_free(system_theme_dir); return is_sys; }
GList *stock_pixmap_themes_list_new(void) { gchar *defaulttheme; gchar *userthemes; gchar *systemthemes; GList *list = NULL; defaulttheme = g_strdup(DEFAULT_PIXMAP_THEME); userthemes = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, PIXMAP_THEME_DIR, NULL); systemthemes = stock_pixmap_get_system_theme_dir_for_theme(NULL); list = g_list_append(list, defaulttheme); stock_pixmap_find_themes_in_dir(&list, userthemes); stock_pixmap_find_themes_in_dir(&list, systemthemes); g_free(userthemes); g_free(systemthemes); return list; }
static void prefs_themes_btn_install_clicked_cb(GtkWidget *widget, gpointer data) { gchar *filename, *source; gchar *themeinfo, *themename; gchar *alert_title = NULL; CopyInfo *cinfo; AlertValue val = 0; ThemesData *tdata = prefs_themes_data; filename = filesel_select_file_open_folder(_("Select theme folder"), NULL); if (filename == NULL) return; if (filename[strlen(filename) - 1] != G_DIR_SEPARATOR) filename = g_strconcat(filename, G_DIR_SEPARATOR_S, NULL); else filename = g_strdup(filename); cinfo = g_new0(CopyInfo, 1); source = g_path_get_dirname(filename); themename = g_path_get_basename(source); debug_print("Installing '%s' theme from %s\n", themename, filename); themeinfo = g_strconcat(source, G_DIR_SEPARATOR_S, THEMEINFO_FILE, NULL); alert_title = g_strdup_printf(_("Install theme '%s'"), themename); if (file_exist(themeinfo, FALSE) == FALSE) { val = alertpanel(alert_title, _("This folder doesn't seem to be a theme folder.\nInstall anyway?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL); if (G_ALERTALTERNATE != val) goto end_inst; } if (superuser_p ()) { val = alertpanel(alert_title, _("Do you want to install theme for all users?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL); switch (val) { case G_ALERTALTERNATE: cinfo->dest = stock_pixmap_get_system_theme_dir_for_theme( themename); break; case G_ALERTDEFAULT: break; default: goto end_inst; } } g_free(alert_title); if (cinfo->dest == NULL) { cinfo->dest = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, PIXMAP_THEME_DIR, G_DIR_SEPARATOR_S, themename, NULL); } if (TRUE == is_dir_exist(cinfo->dest)) { AlertValue val = alertpanel_full(_("Theme exists"), _("A theme with the same name is\nalready installed in this location.\n\n" "Do you want to replace it?"), GTK_STOCK_CANCEL, _("Overwrite"), NULL, FALSE, NULL, ALERT_WARNING, G_ALERTDEFAULT); if (val == G_ALERTALTERNATE) { if (remove_dir_recursive(cinfo->dest) < 0) { alertpanel_error(_("Couldn't delete the old theme in %s."), cinfo->dest); goto end_inst; } } else { goto end_inst; } } if (0 != make_dir_hier(cinfo->dest)) { alertpanel_error(_("Couldn't create destination directory %s."), cinfo->dest); goto end_inst; } prefs_themes_foreach_file(source, prefs_themes_file_install, cinfo); if (cinfo->status == NULL) { GList *insted; /* update interface to show newly installed theme */ prefs_themes_get_themes_and_names(tdata); insted = g_list_find_custom(tdata->themes, (gpointer)(cinfo->dest), (GCompareFunc)strcmp2); if (NULL != insted) { alertpanel_notice(_("Theme installed successfully.")); tdata->displayed = (gchar *)(insted->data); prefs_themes_set_themes_menu(GTK_COMBO_BOX(tdata->page->op_menu), tdata); prefs_themes_display_global_stats(tdata); prefs_themes_get_theme_info(tdata); } else alertpanel_error(_("Failed installing theme")); } else alertpanel_error(_("File %s failed\nwhile installing theme."), cinfo->status); end_inst: g_free(cinfo->dest); g_free(filename); g_free(source); g_free(themeinfo); g_free(cinfo); g_free(themename); }