Index: ui_plugin.c =================================================================== RCS file: /var/cvs/xfce/xfce4/xfce-mcs-plugins/plugins/ui_plugin/ui_plugin.c,v retrieving revision 1.24 diff -u -u -r1.24 ui_plugin.c --- ui_plugin.c 17 Mar 2004 19:30:21 -0000 1.24 +++ ui_plugin.c 29 Mar 2004 11:36:31 -0000 @@ -115,6 +115,7 @@ #define PLUGIN_NAME "ui" #define DEFAULT_THEME "Default" #define INITIAL_THEME "Xfce" +#define DEFAULT_ICON_THEME "Curve" #define DEFAULT_TOOLBAR_STYLE "icons" #define DEFAULT_FONT "Sans 10" #define DEFAULT_XFT_ANTIALIAS 1 @@ -126,9 +127,11 @@ #define MAX_ELEMENTS_BEFORE_SCROLLING 6 static gboolean setting_model = FALSE; +static gboolean setting_itheme_model = FALSE; static gboolean initial_scroll = TRUE; static gboolean is_running = FALSE; static gchar *current_theme = NULL; +static gchar *current_icon_theme = NULL; static gchar *current_font = NULL; static gchar *current_toolbar_style = NULL; static gint current_xft_antialias = DEFAULT_XFT_ANTIALIAS; @@ -142,6 +145,10 @@ struct _Itf { McsPlugin *mcs_plugin; + + GtkWidget *themes_notebook; + GtkWidget *theme_label; + GtkWidget *icon_theme_label; GtkWidget *theme_dialog; GtkWidget *dialog_vbox1; @@ -164,6 +171,12 @@ GtkWidget *menuitem2; GtkWidget *menuitem3; GtkWidget *menuitem4; + + GtkWidget *icon_theme_treeview; + GtkWidget *icon_theme_swindow; + GtkWidget *frame4; + GtkWidget *vbox4; + GtkWidget *hbox3; GtkWidget *aa_framebox; GtkWidget *aa_checkbox1; @@ -228,6 +241,40 @@ } } +static void icon_theme_selection_changed(GtkTreeSelection * selection, gpointer data) +{ + GtkTreeModel *model; + gchar *new_key; + GtkTreeIter iter; + McsPlugin *mcs_plugin; + + if(setting_itheme_model) + return; + + mcs_plugin = (McsPlugin *) data; + + if(gtk_tree_selection_get_selected(selection, &model, &iter)) + { + gtk_tree_model_get(model, &iter, THEME_NAME_COLUMN, &new_key, -1); + } + else + { + new_key = NULL; + } + + if(new_key != NULL) + { + if(current_icon_theme && strcmp(current_icon_theme, new_key)) + { + g_free(current_icon_theme); + current_icon_theme = new_key; + mcs_manager_set_string(mcs_plugin->manager, "Net/IconThemeName", CHANNEL, current_icon_theme); + mcs_manager_notify(mcs_plugin->manager, CHANNEL); + write_options(mcs_plugin); + } + } +} + static void read_themes(Itf * dialog) { static GList *gtk_theme_list = NULL; @@ -309,6 +356,129 @@ setting_model = FALSE; } +static void read_icon_themes(Itf * dialog) +{ + static GHashTable *theme_names = NULL; + gchar **icon_theme_dirs; + GList *list; + GtkTreeModel *model; + GtkTreeView *tree_view; + gint i, j = 0; + gboolean current_theme_found = FALSE; + GtkTreeRowReference *row_ref = NULL; + GDir *dir; + const gchar *file; + + if(theme_names) { + g_hash_table_destroy(theme_names); + theme_names = NULL; + } + theme_names = g_hash_table_new_full(g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL); + + xfce_resource_push_path(XFCE_RESOURCE_DATA, DATADIR "/xfce4"); + icon_theme_dirs = xfce_resource_lookup_all(XFCE_RESOURCE_DATA, "icons/"); + xfce_resource_pop_path(XFCE_RESOURCE_DATA); + tree_view = GTK_TREE_VIEW(dialog->icon_theme_treeview); + model = gtk_tree_view_get_model(tree_view); + + setting_itheme_model = TRUE; + gtk_list_store_clear(GTK_LIST_STORE(model)); + + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dialog->icon_theme_swindow), GTK_POLICY_NEVER, GTK_POLICY_NEVER); + gtk_widget_set_size_request(dialog->icon_theme_swindow, -1, -1); + + for(i=0; icon_theme_dirs[i]; i++) + { + GtkTreeIter iter; + XfceRc *themefile; + gchar *themeindex, *themename; + + dir = g_dir_open(icon_theme_dirs[i], 0, NULL); + if(!dir) + continue; + + while((file = g_dir_read_name(dir))) { + if(strcmp(file, "hicolor") == 0) + continue; + + themeindex = g_build_path(G_DIR_SEPARATOR_S, icon_theme_dirs[i], file, "index.theme", NULL); + themefile = xfce_rc_simple_open(themeindex, TRUE); + g_free(themeindex); + if(!themefile) + continue; + + xfce_rc_set_group(themefile, "Icon Theme"); + + if(strcmp(xfce_rc_read_entry(themefile, "Hidden", "false"), "true") == 0) { + xfce_rc_close(themefile); + continue; + } + + themename = g_strdup(xfce_rc_read_entry(themefile, "Name", file)); + xfce_rc_close(themefile); + if(g_hash_table_lookup(theme_names, themename)) { + g_free(themename); + continue; + } + g_hash_table_insert(theme_names, themename, GINT_TO_POINTER(1)); + gtk_list_store_prepend(GTK_LIST_STORE(model), &iter); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, THEME_NAME_COLUMN, themename, -1); + + if(strcmp(current_icon_theme, file) == 0) + { + GtkTreePath *path = gtk_tree_model_get_path(model, &iter); + row_ref = gtk_tree_row_reference_new(model, path); + gtk_tree_path_free(path); + current_theme_found = TRUE; + } + + if(j == MAX_ELEMENTS_BEFORE_SCROLLING) + { + GtkRequisition rectangle; + gtk_widget_size_request(GTK_WIDGET(tree_view), &rectangle); + gtk_widget_set_size_request(dialog->icon_theme_swindow, -1, rectangle.height); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dialog->icon_theme_swindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + } + j++; + } + + g_dir_close(dir); + } + + g_strfreev(icon_theme_dirs); + + if(!current_theme_found) + { + GtkTreeIter iter; + GtkTreePath *path; + + gtk_list_store_prepend(GTK_LIST_STORE(model), &iter); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, THEME_NAME_COLUMN, DEFAULT_ICON_THEME, -1); + + path = gtk_tree_model_get_path(model, &iter); + row_ref = gtk_tree_row_reference_new(model, path); + gtk_tree_path_free(path); + } + + if(row_ref) + { + GtkTreePath *path; + + path = gtk_tree_row_reference_get_path(row_ref); + gtk_tree_view_set_cursor(tree_view, path, NULL, FALSE); + + if(initial_scroll) + { + gtk_tree_view_scroll_to_cell(tree_view, path, NULL, TRUE, 0.5, 0.0); + initial_scroll = FALSE; + } + + gtk_tree_path_free(path); + gtk_tree_row_reference_free(row_ref); + } + setting_itheme_model = FALSE; +} + static void font_selection_ok(GtkWidget * w, gpointer user_data) { Itf *itf = (Itf *) user_data; @@ -360,6 +530,7 @@ { gchar *a_str = NULL; gchar *b_str = NULL; + gchar *theme_name = (gchar *)user_data; gtk_tree_model_get(model, a, 0, &a_str, -1); gtk_tree_model_get(model, b, 0, &b_str, -1); @@ -369,9 +540,9 @@ if(b_str == NULL) b_str = g_strdup(""); - if(!strcmp(a_str, DEFAULT_THEME)) + if(!strcmp(a_str, theme_name)) return -1; - if(!strcmp(b_str, DEFAULT_THEME)) + if(!strcmp(b_str, theme_name)) return 1; return g_utf8_collate(a_str, b_str); @@ -666,9 +837,17 @@ gtk_box_pack_start(GTK_BOX(dialog->dialog_vbox1), dialog->hbox1, TRUE, TRUE, 0); gtk_container_set_border_width(GTK_CONTAINER(dialog->hbox1), 5); + dialog->themes_notebook = gtk_notebook_new(); + gtk_notebook_set_show_border(GTK_NOTEBOOK(dialog->themes_notebook), FALSE); + gtk_widget_show(dialog->themes_notebook); + gtk_box_pack_start(GTK_BOX(dialog->hbox1), dialog->themes_notebook, TRUE, TRUE, 0); + dialog->frame1 = xfce_framebox_new (_("Select theme"), FALSE); gtk_widget_show(dialog->frame1); - gtk_box_pack_start(GTK_BOX(dialog->hbox1), dialog->frame1, TRUE, TRUE, 0); + //gtk_box_pack_start(GTK_BOX(dialog->hbox1), dialog->frame1, TRUE, TRUE, 0); + dialog->theme_label = gtk_label_new_with_mnemonic(_("_Theme")); + gtk_widget_show(dialog->theme_label); + gtk_notebook_append_page(GTK_NOTEBOOK(dialog->themes_notebook), dialog->frame1, dialog->theme_label); dialog->vbox2 = gtk_vbox_new(FALSE, 5); gtk_widget_show(dialog->vbox2); @@ -687,7 +866,31 @@ gtk_widget_show(dialog->theme_treeview); gtk_container_add(GTK_CONTAINER(dialog->theme_swindow), dialog->theme_treeview); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dialog->theme_treeview), FALSE); - + + dialog->frame4 = xfce_framebox_new(_("Select icon theme"), FALSE); + gtk_widget_show(dialog->frame4); + dialog->icon_theme_label = gtk_label_new_with_mnemonic(_("_Icon Theme")); + gtk_widget_show(dialog->icon_theme_label); + gtk_notebook_append_page(GTK_NOTEBOOK(dialog->themes_notebook), dialog->frame4, dialog->icon_theme_label); + + dialog->vbox4 = gtk_vbox_new(FALSE, 5); + gtk_widget_show(dialog->vbox4); + xfce_framebox_add (XFCE_FRAMEBOX (dialog->frame4), dialog->vbox4); + + dialog->hbox3 = gtk_hbox_new(FALSE, 8); + gtk_widget_show(dialog->hbox3); + gtk_box_pack_start(GTK_BOX(dialog->vbox4), dialog->hbox3, TRUE, TRUE, 0); + + dialog->icon_theme_swindow = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(dialog->icon_theme_swindow); + gtk_box_pack_start(GTK_BOX(dialog->hbox3), dialog->icon_theme_swindow, TRUE, TRUE, 0); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(dialog->icon_theme_swindow), GTK_SHADOW_IN); + + dialog->icon_theme_treeview = gtk_tree_view_new(); + gtk_widget_show(dialog->icon_theme_treeview); + gtk_container_add(GTK_CONTAINER(dialog->icon_theme_swindow), dialog->icon_theme_treeview); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dialog->icon_theme_treeview), FALSE); + dialog->vbox3 = gtk_vbox_new(FALSE, 0); gtk_widget_show(dialog->vbox3); gtk_box_pack_start(GTK_BOX(dialog->hbox1), dialog->vbox3, TRUE, TRUE, 0); @@ -905,14 +1108,24 @@ gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(itf->theme_treeview), -1, NULL, gtk_cell_renderer_text_new(), "text", THEME_NAME_COLUMN, NULL); model = (GtkTreeModel *) gtk_list_store_new(N_COLUMNS, G_TYPE_STRING); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model), 0, sort_func, NULL, NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model), 0, sort_func, DEFAULT_THEME, NULL); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), 0, GTK_SORT_ASCENDING); gtk_tree_view_set_model(GTK_TREE_VIEW(itf->theme_treeview), model); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(itf->theme_treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE); g_signal_connect(G_OBJECT(selection), "changed", (GCallback) theme_selection_changed, itf->mcs_plugin); + + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(itf->icon_theme_treeview), -1, NULL, gtk_cell_renderer_text_new(), "text", THEME_NAME_COLUMN, NULL); + model = (GtkTreeModel *) gtk_list_store_new(N_COLUMNS, G_TYPE_STRING); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model), 0, sort_func, DEFAULT_ICON_THEME, NULL); + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), 0, GTK_SORT_ASCENDING); + gtk_tree_view_set_model(GTK_TREE_VIEW(itf->icon_theme_treeview), model); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(itf->icon_theme_treeview)); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE); + g_signal_connect(G_OBJECT(selection), "changed", (GCallback) icon_theme_selection_changed, itf->mcs_plugin); read_themes(itf); + read_icon_themes(itf); g_signal_connect(G_OBJECT(itf->theme_dialog), "response", G_CALLBACK(cb_dialog_response), itf->mcs_plugin); g_signal_connect(G_OBJECT(itf->button3), "clicked", G_CALLBACK(show_font_selection), itf); @@ -990,6 +1203,27 @@ current_theme = g_strdup(INITIAL_THEME); mcs_manager_set_string(mcs_plugin->manager, "Net/ThemeName", CHANNEL, current_theme); } + + setting = mcs_manager_setting_lookup(mcs_plugin->manager, + "Net/IconThemeName", CHANNEL); + if(setting) + { + if(current_icon_theme) + { + g_free(current_icon_theme); + } + current_icon_theme = g_strdup(setting->data.v_string); + } + else + { + if(current_icon_theme) + { + g_free(current_icon_theme); + } + + current_icon_theme = g_strdup(DEFAULT_ICON_THEME); + mcs_manager_set_string(mcs_plugin->manager, "Net/IconThemeName", CHANNEL, current_theme); + } setting = mcs_manager_setting_lookup(mcs_plugin->manager, "Gtk/FontName", CHANNEL); if(setting) Index: Makefile.am =================================================================== RCS file: /var/cvs/xfce/xfce4/xfce-mcs-plugins/plugins/ui_plugin/Makefile.am,v retrieving revision 1.11 diff -u -u -r1.11 Makefile.am --- Makefile.am 10 Mar 2004 23:09:50 -0000 1.11 +++ Makefile.am 29 Mar 2004 11:36:31 -0000 @@ -12,7 +12,8 @@ @LIBX11_CFLAGS@ \ @LIBXFCEGUI4_CFLAGS@ \ @XFCE_MCS_MANAGER_CFLAGS@ \ - -DLOCALEDIR=\""$(localedir)"\" + -DLOCALEDIR=\""$(localedir)"\" \ + -DDATADIR=\"$(datadir)\" ui_plugin_la_LDFLAGS = \ -avoid-version \ Index: Makefile.in =================================================================== RCS file: /var/cvs/xfce/xfce4/xfce-mcs-plugins/plugins/ui_plugin/Makefile.in,v retrieving revision 1.27 diff -u -u -r1.27 Makefile.in --- Makefile.in 10 Mar 2004 23:09:50 -0000 1.27 +++ Makefile.in 29 Mar 2004 11:36:32 -0000 @@ -227,7 +227,8 @@ @LIBX11_CFLAGS@ \ @LIBXFCEGUI4_CFLAGS@ \ @XFCE_MCS_MANAGER_CFLAGS@ \ - -DLOCALEDIR=\""$(localedir)"\" + -DLOCALEDIR=\""$(localedir)"\" \ + -DDATADIR=\"$(datadir)\" ui_plugin_la_LDFLAGS = \ -avoid-version \