5
#include <gconf/gconf-client.h>
6
#include <glade/glade.h>
7
#include <libgnomevfs/gnome-vfs-async-ops.h>
8
#include <libgnomevfs/gnome-vfs-ops.h>
9
#include <libgnomevfs/gnome-vfs-utils.h>
11
#include <libwindow-settings/gnome-wm-manager.h>
13
#include "capplet-util.h"
14
#include "gnome-theme-manager.h"
15
#include "gnome-theme-details.h"
16
#include "gnome-theme-installer.h"
17
#include "gnome-theme-info.h"
18
#include "gtkrc-utils.h"
20
#define MAX_ELEMENTS_BEFORE_SCROLLING 12
22
static gboolean theme_details_initted = FALSE;
23
static gboolean setting_model = FALSE;
32
/* Function Prototypes */
33
static void cb_dialog_response (GtkDialog *dialog,
35
static void setup_tree_view (GtkTreeView *tree_view,
36
GCallback changed_callback,
38
static void gtk_theme_selection_changed (GtkTreeSelection *selection,
40
static void window_theme_selection_changed (GtkTreeSelection *selection,
42
static void icon_theme_selection_changed (GtkTreeSelection *selection,
44
static void update_gconf_key_from_selection (GtkTreeSelection *selection,
45
const gchar *gconf_key);
46
static void load_theme_names (GtkTreeView *tree_view,
48
const gchar *default_theme);
49
static char *path_to_theme_id (const char *path);
50
static void update_color_buttons_from_string (gchar *color_scheme);
51
static void color_scheme_changed (GObject *settings,
55
void revert_color_scheme_key (GtkWidget *checkbutton, gpointer *data);
58
path_to_theme_id (const char *path)
63
dirname = g_path_get_dirname(path);
64
result = g_path_get_basename(dirname);
71
cb_dialog_response (GtkDialog *dialog, gint response_id)
73
if (response_id == GTK_RESPONSE_HELP)
74
capplet_help (GTK_WINDOW (dialog), "user-guide.xml", "goscustdesk-12");
76
gtk_widget_hide (GTK_WIDGET (dialog));
80
details_tree_sort_func (GtkTreeModel *model,
91
gtk_tree_model_get (model, a,
92
THEME_NAME_COLUMN, &a_name,
93
THEME_FLAG_COLUMN, &a_flag,
95
gtk_tree_model_get (model, b,
96
THEME_NAME_COLUMN, &b_name,
97
THEME_FLAG_COLUMN, &b_flag,
100
retval = gnome_theme_manager_sort_func (a_name, b_name, a_flag, b_flag);
109
setup_tree_view (GtkTreeView *tree_view,
110
GCallback changed_callback,
114
GtkTreeSelection *selection;
115
GtkCellRenderer *renderer;
117
model = (GtkTreeModel *) gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT);
118
gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model), 0, details_tree_sort_func, NULL, NULL);
119
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), 0, GTK_SORT_ASCENDING);
120
gtk_tree_view_set_model (tree_view, model);
122
selection = gtk_tree_view_get_selection (tree_view);
123
gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
124
g_signal_connect (G_OBJECT (selection), "changed", changed_callback, dialog);
126
renderer = gtk_cell_renderer_text_new ();
127
gtk_tree_view_insert_column_with_attributes (tree_view,
130
"text", THEME_NAME_COLUMN,
132
g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
136
gtk_theme_update_remove_button (GtkTreeSelection *selection,
137
GtkWidget *remove_button,
140
gchar *theme_selected;
143
GList *theme_list=NULL, *list;
144
gchar *theme_base=NULL;
145
GnomeVFSResult vfs_result;
146
GnomeVFSFileInfo *vfs_info;
148
if (gtk_tree_selection_get_selected (selection, &model, &iter))
149
gtk_tree_model_get (model, &iter,
150
THEME_NAME_COLUMN, &theme_selected,
153
theme_selected = NULL;
155
if (theme_selected != NULL)
157
switch (theme_type) {
158
case THEME_GTK: theme_base = g_strdup("/gtk-2.0/");
159
theme_list = gnome_theme_info_find_by_type (GNOME_THEME_GTK_2);
161
case THEME_ICON: theme_list = gnome_theme_icon_info_find_all();
163
case THEME_WINDOW: theme_base = g_strdup("/metacity-1/");
164
theme_list = gnome_theme_info_find_by_type (GNOME_THEME_METACITY);
166
default: theme_list = NULL;
171
vfs_info = gnome_vfs_file_info_new ();
173
for (list = theme_list; list; list = list->next)
175
GnomeThemeInfo *info = list->data;
176
gchar *theme_dir = NULL;
178
if (!strcmp(info->name, theme_selected))
180
if (theme_type == THEME_ICON)
181
theme_dir = g_strdup(info->path);
183
theme_dir = g_strdup_printf("%s/%s", info->path, theme_base);
185
vfs_result = gnome_vfs_get_file_info (theme_dir,
187
GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS);
190
if (vfs_result == GNOME_VFS_OK)
192
if ((vfs_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_ACCESS) &&
193
!(vfs_info->permissions & GNOME_VFS_PERM_ACCESS_WRITABLE))
194
gtk_widget_set_sensitive(remove_button, FALSE);
196
gtk_widget_set_sensitive(remove_button, TRUE);
198
gtk_widget_set_sensitive(remove_button, FALSE);
203
gnome_vfs_file_info_unref(vfs_info);
205
g_free (theme_selected);
209
update_color_scheme_tab (const gchar *theme)
211
GSList *symbolic_colors = NULL;
212
GSList *engines = NULL;
213
gboolean fg, bg, base, text, fg_s, bg_s, enable_colors, enable_revert;
215
gchar *theme_name = NULL;
216
gchar *color_scheme= NULL;
217
GtkSettings *settings;
221
dialog = gnome_theme_manager_get_theme_dialog ();
224
settings = gtk_settings_get_default ();
225
g_object_get (G_OBJECT (settings), "gtk-theme-name", &theme_name, NULL);
228
filename = gtkrc_find_named (theme);
230
gtkrc_get_details (filename, &engines, &symbolic_colors);
231
fg = (g_slist_find_custom (symbolic_colors, "fg_color", g_str_equal) != NULL);
232
bg = (g_slist_find_custom (symbolic_colors, "bg_color", g_str_equal) != NULL);
233
base = (g_slist_find_custom (symbolic_colors, "base_color", g_str_equal) != NULL);
234
text = (g_slist_find_custom (symbolic_colors, "text_color", g_str_equal) != NULL);
235
fg_s = (g_slist_find_custom (symbolic_colors, "selected_fg_color", g_str_equal) != NULL);
236
bg_s = (g_slist_find_custom (symbolic_colors, "selected_bg_color", g_str_equal) != NULL);
238
enable_colors = enable_revert = (fg && bg && base && text && fg_s && bg_s);
240
client = gconf_client_get_default ();
241
color_scheme = gconf_client_get_string (client, COLOR_SCHEME_KEY, NULL);
242
if (color_scheme == NULL || strcmp (color_scheme, "") == 0)
243
enable_revert = FALSE;
244
g_free (color_scheme);
245
g_object_unref (client);
247
gtk_widget_set_sensitive (WID ("color_scheme_table"), enable_colors);
248
gtk_widget_set_sensitive (WID ("color_scheme_revert_button"), enable_revert);
251
gtk_widget_hide (WID ("color_scheme_message_hbox"));
253
gtk_widget_show (WID ("color_scheme_message_hbox"));
255
g_slist_foreach (engines, (GFunc) g_free, NULL);
256
g_slist_free (engines);
257
g_slist_foreach (symbolic_colors, (GFunc) g_free, NULL);
258
g_slist_free (symbolic_colors);
264
gtk_theme_selection_changed (GtkTreeSelection *selection,
271
dialog = gnome_theme_manager_get_theme_dialog ();
273
update_gconf_key_from_selection (selection, GTK_THEME_KEY);
274
gtk_theme_update_remove_button(selection, WID("control_remove_button"), THEME_GTK);
276
if (gtk_tree_selection_get_selected (selection, &model, &iter))
280
gtk_tree_model_get (model, &iter,
281
THEME_ID_COLUMN, &theme,
283
update_color_scheme_tab (theme);
289
window_theme_selection_changed (GtkTreeSelection *selection,
292
GnomeWindowManager *window_manager = NULL;
293
GnomeWMSettings wm_settings;
295
gchar *window_theme_name;
301
if (gtk_tree_selection_get_selected (selection, &model, &iter))
303
gtk_tree_model_get (model, &iter,
304
THEME_ID_COLUMN, &window_theme_name,
312
window_manager = gnome_wm_manager_get_current (gdk_display_get_default_screen (gdk_display_get_default ()));
313
if (window_manager != NULL && strcmp (gnome_window_manager_get_name (window_manager), "No name")) {
314
wm_settings.flags = GNOME_WM_SETTING_THEME;
315
wm_settings.theme = window_theme_name;
316
gnome_window_manager_change_settings (window_manager, &wm_settings);
318
g_free (window_theme_name);
322
icon_theme_selection_changed (GtkTreeSelection *selection,
327
dialog = gnome_theme_manager_get_theme_dialog ();
328
update_gconf_key_from_selection (selection, ICON_THEME_KEY);
329
gtk_theme_update_remove_button(selection, WID("icon_remove_button"), THEME_ICON);
333
load_theme_names (GtkTreeView *tree_view,
335
const gchar *default_theme)
342
swindow = GTK_WIDGET (tree_view)->parent;
343
model = gtk_tree_view_get_model (tree_view);
346
setting_model = TRUE;
347
gtk_list_store_clear (GTK_LIST_STORE (model));
349
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
350
GTK_POLICY_NEVER, GTK_POLICY_NEVER);
351
gtk_widget_set_size_request (swindow, -1, -1);
353
for (list = theme_list; list; list = list->next->next)
355
const char *name = list->data;
356
const char *id = list->next->data;
360
gtk_list_store_prepend (GTK_LIST_STORE (model), &iter);
362
if (default_theme && strcmp (default_theme, name) == 0)
367
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
368
THEME_NAME_COLUMN, name,
370
THEME_FLAG_COLUMN, is_default,
373
if (i == MAX_ELEMENTS_BEFORE_SCROLLING)
375
GtkRequisition rectangle;
376
gtk_widget_size_request (GTK_WIDGET (tree_view), &rectangle);
377
gtk_widget_set_size_request (swindow, -1, rectangle.height);
378
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
379
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
383
setting_model = FALSE;
386
/* Shared by icons and gtk+ */
388
update_gconf_key_from_selection (GtkTreeSelection *selection,
389
const gchar *gconf_key)
399
client = gconf_client_get_default ();
401
if (gtk_tree_selection_get_selected (selection, &model, &iter))
403
gtk_tree_model_get (model, &iter,
404
THEME_ID_COLUMN, &new_key,
408
/* This shouldn't happen */
417
old_key = gconf_client_get_string (client, gconf_key, NULL);
418
if (old_key && strcmp (old_key, new_key))
420
gconf_client_set_string (client, gconf_key, new_key, NULL);
426
gconf_client_unset (client, gconf_key, NULL);
429
g_object_unref (client);
433
remove_theme(GtkWidget *button, gpointer data)
436
GtkWidget *confirm_dialog, *info_dialog;
437
GList *theme_list, *string_list, *list;
438
GtkTreeSelection *selection;
441
gchar *theme_dir, *theme_selected, *treeview;
442
gint response, theme_type;
444
GnomeVFSResult result;
446
confirm_dialog = gtk_message_dialog_new (NULL,
448
GTK_MESSAGE_QUESTION,
449
GTK_BUTTONS_OK_CANCEL,
450
_("Would you like to remove this theme?"));
451
response = gtk_dialog_run (GTK_DIALOG (confirm_dialog));
452
gtk_widget_destroy(confirm_dialog);
453
if (response == GTK_RESPONSE_CANCEL)
456
theme_type = (gint)data;
457
switch (theme_type) {
458
case THEME_GTK: theme_dir = g_strdup("/gtk-2.0/");
459
theme_list = gnome_theme_info_find_by_type (GNOME_THEME_GTK_2);
460
treeview=g_strdup("control_theme_treeview");
462
case THEME_ICON: theme_list = gnome_theme_icon_info_find_all();
463
treeview=g_strdup("icon_theme_treeview");
466
case THEME_WINDOW: theme_dir = g_strdup("/metacity-1/");
467
theme_list = gnome_theme_info_find_by_type (GNOME_THEME_METACITY);
468
treeview=g_strdup("window_theme_treeview");
470
default: theme_list = NULL;
477
if (treeview != NULL) {
478
dialog = gnome_theme_manager_get_theme_dialog ();
479
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(WID(treeview)));
480
if (gtk_tree_selection_get_selected (selection, &model, &iter))
482
gtk_tree_model_get (model, &iter,
483
THEME_NAME_COLUMN, &theme_selected,
486
theme_selected = NULL;
489
if (theme_selected!=NULL)
493
for (list = theme_list; list; list = list->next)
495
GnomeThemeInfo *info = list->data;
496
if (!strcmp(info->name, theme_selected))
499
if (theme_type == THEME_ICON)
500
theme_dir = g_strdup(g_path_get_dirname(info->path));
502
theme_dir = g_strdup_printf("%s/%s", info->path, theme_dir);
504
uri_list = g_list_prepend(NULL, gnome_vfs_uri_new (theme_dir));
506
result = gnome_vfs_xfer_delete_list (uri_list, GNOME_VFS_XFER_ERROR_MODE_ABORT,
507
GNOME_VFS_XFER_RECURSIVE,
509
if (result == GNOME_VFS_OK)
511
info_dialog = gtk_message_dialog_new (NULL,
514
GTK_BUTTONS_OK_CANCEL,
515
_("Theme deleted succesfully. Please select another theme."));
516
gtk_list_store_remove (GTK_LIST_STORE(model), &iter);
517
gtk_dialog_run (GTK_DIALOG (info_dialog));
520
info_dialog = gtk_message_dialog_new (NULL,
524
_("Theme can not be deleted"));
525
gtk_dialog_run (GTK_DIALOG (info_dialog));
527
gtk_widget_destroy (info_dialog);
528
gnome_vfs_uri_list_free (uri_list);
536
gtk_color_scheme_changed (GtkWidget *colorbutton, GladeXML *dialog)
538
GConfClient *client = NULL;
541
gchar *bg, *fg, *text, *base, *selected_fg, *selected_bg;
544
widget = WID ("fg_colorbutton");
545
gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &colors[0]);
546
widget = WID ("bg_colorbutton");
547
gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &colors[1]);
548
widget = WID ("text_colorbutton");
549
gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &colors[2]);
550
widget = WID ("base_colorbutton");
551
gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &colors[3]);
552
widget = WID ("selected_fg_colorbutton");
553
gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &colors[4]);
554
widget = WID ("selected_bg_colorbutton");
555
gtk_color_button_get_color (GTK_COLOR_BUTTON (widget), &colors[5]);
557
fg = g_strdup_printf ("fg_color:#%04x%04x%04x\n", colors[0].red, colors[0].green, colors[0].blue);
558
bg = g_strdup_printf ("bg_color:#%04x%04x%04x\n", colors[1].red, colors[1].green, colors[1].blue);
559
text = g_strdup_printf ("text_color:#%04x%04x%04x\n", colors[2].red, colors[2].green, colors[2].blue);
560
base = g_strdup_printf ("base_color:#%04x%04x%04x\n", colors[3].red, colors[3].green, colors[3].blue);
561
selected_fg = g_strdup_printf ("selected_fg_color:#%04x%04x%04x\n", colors[4].red, colors[4].green, colors[4].blue);
562
selected_bg = g_strdup_printf ("selected_bg_color:#%04x%04x%04x", colors[5].red, colors[5].green, colors[5].blue);
564
new_scheme = g_strconcat (fg, bg, text, base, selected_fg, selected_bg, NULL);
566
client = gconf_client_get_default ();
568
/* Currently we assume this has only been called when one of the colours has
569
* actually changed, so we don't check the original key first
571
gconf_client_set_string (client, COLOR_SCHEME_KEY, new_scheme, NULL);
573
g_object_unref (G_OBJECT (client));
574
free_all (fg, bg, text, base, selected_fg, selected_bg, new_scheme, NULL);
578
revert_color_scheme_key (GtkWidget *checkbutton, gpointer *data)
580
GConfClient *client = NULL;
583
dialog = gnome_theme_manager_get_theme_dialog ();
585
client = gconf_client_get_default ();
586
gconf_client_set_string (client, COLOR_SCHEME_KEY, "", NULL);
587
g_object_unref (G_OBJECT (client));
591
gnome_theme_details_init (void)
593
GtkWidget *parent, *widget;
597
if (theme_details_initted)
599
theme_details_initted = TRUE;
601
dialog = gnome_theme_manager_get_theme_dialog ();
602
parent = WID ("theme_details_dialog");
604
setup_tree_view (GTK_TREE_VIEW (WID ("control_theme_treeview")),
605
(GCallback) gtk_theme_selection_changed,
607
setup_tree_view (GTK_TREE_VIEW (WID ("window_theme_treeview")),
608
(GCallback) window_theme_selection_changed,
610
setup_tree_view (GTK_TREE_VIEW (WID ("icon_theme_treeview")),
611
(GCallback) icon_theme_selection_changed,
615
widget = WID ("control_remove_button");
616
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remove_theme), (gint*)THEME_GTK);
617
widget = WID ("control_install_button");
618
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_installer_run_cb), parent);
620
/* window manager themes */
621
widget = WID ("window_remove_button");
622
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remove_theme), (gint*)THEME_WINDOW);
623
widget = WID ("window_install_button");
624
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_installer_run_cb), parent);
627
widget = WID ("icon_remove_button");
628
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (remove_theme), (gint*)THEME_ICON);
629
widget = WID ("icon_install_button");
630
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (gnome_theme_installer_run_cb), parent);
632
/* color preferences */
633
widget = WID ("fg_colorbutton");
634
g_signal_connect (G_OBJECT (widget), "color_set", G_CALLBACK (gtk_color_scheme_changed), dialog);
635
widget = WID ("bg_colorbutton");
636
g_signal_connect (G_OBJECT (widget), "color_set", G_CALLBACK (gtk_color_scheme_changed), dialog);
637
widget = WID ("text_colorbutton");
638
g_signal_connect (G_OBJECT (widget), "color_set", G_CALLBACK (gtk_color_scheme_changed), dialog);
639
widget = WID ("base_colorbutton");
640
g_signal_connect (G_OBJECT (widget), "color_set", G_CALLBACK (gtk_color_scheme_changed), dialog);
641
widget = WID ("selected_fg_colorbutton");
642
g_signal_connect (G_OBJECT (widget), "color_set", G_CALLBACK (gtk_color_scheme_changed), dialog);
643
widget = WID ("selected_bg_colorbutton");
644
g_signal_connect (G_OBJECT (widget), "color_set", G_CALLBACK (gtk_color_scheme_changed), dialog);
646
widget = WID ("color_scheme_revert_button");
647
g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (revert_color_scheme_key), parent);
649
g_object_get (G_OBJECT (gtk_settings_get_default()), "gtk-color-scheme", &theme, NULL);
650
update_color_buttons_from_string (theme);
652
g_signal_connect (gtk_settings_get_default(), "notify::gtk-color-scheme",
653
G_CALLBACK (color_scheme_changed), NULL);
655
/* general signals */
656
g_signal_connect (G_OBJECT (parent), "response", G_CALLBACK (cb_dialog_response), NULL);
657
g_signal_connect (G_OBJECT (parent), "delete-event", G_CALLBACK (gtk_true), NULL);
659
gtk_drag_dest_set (parent, GTK_DEST_DEFAULT_ALL,
660
drop_types, n_drop_types,
661
GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_MOVE);
662
g_signal_connect (G_OBJECT (parent), "drag-motion", G_CALLBACK (gnome_theme_manager_drag_motion_cb), NULL);
663
g_signal_connect (G_OBJECT (parent), "drag-leave", G_CALLBACK (gnome_theme_manager_drag_leave_cb), NULL);
664
g_signal_connect (G_OBJECT (parent), "drag-data-received", G_CALLBACK (gnome_theme_manager_drag_data_received_cb), NULL);
666
capplet_set_icon (parent, "gnome-settings-theme");
668
gnome_theme_details_reread_themes_from_disk ();
672
gnome_theme_details_show (void)
677
gnome_theme_details_init ();
679
dialog = gnome_theme_manager_get_theme_dialog ();
680
parent = WID ("theme_details_dialog");
681
gtk_widget_show (parent);
682
gtk_window_present (GTK_WINDOW (parent));
686
warn_about_no_themes (void)
688
static GtkWidget *dialog;
692
dialog = gtk_message_dialog_new (NULL,
696
_("No themes could be found on your system. This probably means that your \"Theme Preferences\" dialog was improperly installed, or you haven't installed the \"gnome-themes\" package."));
697
gtk_dialog_run (GTK_DIALOG (dialog));
698
gtk_widget_destroy (dialog);
704
gnome_theme_details_reread_themes_from_disk (void)
710
GnomeWindowManager *window_manager;
712
gboolean have_gtk_theme;
713
gboolean have_window_theme;
714
gboolean have_icon_theme;
717
gnome_theme_details_init ();
719
dialog = gnome_theme_manager_get_theme_dialog ();
720
window_manager = gnome_wm_manager_get_current (gdk_display_get_default_screen (gdk_display_get_default ()));
722
/* First, we update the GTK+ themes page */
723
theme_list = gnome_theme_info_find_by_type (GNOME_THEME_GTK_2);
725
for (list = theme_list; list; list = list->next)
727
GnomeThemeInfo *info = list->data;
728
/* Use same string for ID as for name with GTK themes */
729
string_list = g_list_prepend (string_list, info->name);
730
string_list = g_list_prepend (string_list, info->name);
733
if (string_list == NULL)
735
have_gtk_theme = FALSE;
736
gtk_widget_hide (WID ("control_theme_hbox"));
740
have_gtk_theme = TRUE;
741
gtk_widget_show (WID ("control_theme_hbox"));
742
load_theme_names (GTK_TREE_VIEW (WID ("control_theme_treeview")), string_list, gtk_theme_default_name);
743
g_list_free (string_list);
745
g_list_free (theme_list);
747
/* Next, we do the window managers */
748
theme_list = window_manager ? gnome_window_manager_get_theme_list (window_manager) : NULL;
750
for (list = theme_list; list; list = list->next)
752
/* Use same string for ID as for name with Window themes */
753
string_list = g_list_prepend (string_list, list->data);
754
string_list = g_list_prepend (string_list, list->data);
756
if (string_list == NULL)
758
have_window_theme = FALSE;
759
gtk_widget_hide (WID ("window_theme_hbox"));
763
have_window_theme = TRUE;
764
gtk_widget_show (WID ("window_theme_hbox"));
765
load_theme_names (GTK_TREE_VIEW (WID ("window_theme_treeview")), string_list, window_theme_default_name);
766
g_list_free (string_list);
768
g_list_free (theme_list);
770
/* Third, we do the icon theme */
771
theme_list = gnome_theme_icon_info_find_all ();
774
for (list = theme_list; list; list = list->next)
776
GnomeThemeIconInfo *info = list->data;
777
string_list = g_list_prepend (string_list, path_to_theme_id(info->path));
778
string_list = g_list_prepend (string_list, info->name);
781
if (string_list == NULL)
783
have_icon_theme = FALSE;
784
gtk_widget_hide (WID ("icon_theme_hbox"));
788
have_icon_theme = TRUE;
789
gtk_widget_show (WID ("icon_theme_hbox"));
790
load_theme_names (GTK_TREE_VIEW (WID ("icon_theme_treeview")), string_list, icon_theme_default_name);
791
g_list_free (string_list);
793
g_list_free (theme_list);
795
if (! have_gtk_theme && ! have_window_theme && ! have_icon_theme)
796
warn_about_no_themes ();
798
gnome_theme_details_update_from_gconf ();
803
update_list_something (GtkWidget *tree_view, const gchar *theme)
807
GtkTreeIter next_iter;
809
gboolean theme_found;
811
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
814
valid = gtk_tree_model_get_iter_first (model, &iter);
823
valid = gtk_tree_model_iter_next (model, &next_iter);
825
gtk_tree_model_get (model, &iter,
826
THEME_ID_COLUMN, &theme_id,
827
THEME_FLAG_COLUMN, &flags,
830
if (! strcmp (theme, theme_id))
833
GtkTreePath *cursor_path;
834
gboolean cursor_same = FALSE;
836
gtk_tree_view_get_cursor (GTK_TREE_VIEW (tree_view), &cursor_path, NULL);
837
path = gtk_tree_model_get_path (model, &iter);
838
if (cursor_path && gtk_tree_path_compare (path, cursor_path) == 0)
841
gtk_tree_path_free (cursor_path);
845
gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree_view), path, NULL, FALSE);
847
gtk_tree_path_free (path);
852
if (flags & THEME_FLAG_CUSTOM)
854
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
863
if (theme_found == FALSE)
864
/* Never found the theme. */
868
gtk_list_store_prepend (GTK_LIST_STORE (model), &iter);
869
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
870
THEME_NAME_COLUMN, theme,
871
THEME_ID_COLUMN, theme,
872
THEME_FLAG_COLUMN, THEME_FLAG_CUSTOM,
874
path = gtk_tree_model_get_path (model, &iter);
875
gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree_view), path, NULL, FALSE);
876
gtk_tree_path_free (path);
881
update_color_buttons_from_string (gchar *color_scheme)
883
GdkColor color_scheme_colors[6];
884
gchar **color_scheme_strings, **color_scheme_pair, *current_string;
889
if (!color_scheme) return;
890
if (!strcmp (color_scheme, "")) return;
892
dialog = gnome_theme_manager_get_theme_dialog ();
894
/* The color scheme string consists of name:color pairs, seperated by
895
* newlines, so first we split the string up by new line */
897
color_scheme_strings = g_strsplit (color_scheme, "\n", 0);
899
/* loop through the name:color pairs, and save the colour if we recognise the name */
901
while ((current_string = color_scheme_strings[i++]))
903
color_scheme_pair = g_strsplit (current_string, ":", 0);
905
if (color_scheme_pair[0] != NULL && color_scheme_pair[1] != NULL)
907
g_strstrip (color_scheme_pair[0]);
908
g_strstrip (color_scheme_pair[1]);
910
if (!strcmp ("fg_color", color_scheme_pair[0]))
911
gdk_color_parse (color_scheme_pair[1], &color_scheme_colors[0]);
912
else if (!strcmp ("bg_color", color_scheme_pair[0]))
913
gdk_color_parse (color_scheme_pair[1], &color_scheme_colors[1]);
914
else if (!strcmp ("text_color", color_scheme_pair[0]))
915
gdk_color_parse (color_scheme_pair[1], &color_scheme_colors[2]);
916
else if (!strcmp ("base_color", color_scheme_pair[0]))
917
gdk_color_parse (color_scheme_pair[1], &color_scheme_colors[3]);
918
else if (!strcmp ("selected_fg_color", color_scheme_pair[0]))
919
gdk_color_parse (color_scheme_pair[1], &color_scheme_colors[4]);
920
else if (!strcmp ("selected_bg_color", color_scheme_pair[0]))
921
gdk_color_parse (color_scheme_pair[1], &color_scheme_colors[5]);
924
g_strfreev (color_scheme_pair);
927
g_strfreev (color_scheme_strings);
929
/* not sure whether we need to do this, but it can't hurt */
930
for (i = 0; i < 6; i++)
931
gdk_colormap_alloc_color (gdk_colormap_get_system (), &color_scheme_colors[i], FALSE, TRUE);
933
/* now set all the buttons to the correct settings */
934
widget = WID ("fg_colorbutton");
935
gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), &color_scheme_colors[0]);
936
widget = WID ("bg_colorbutton");
937
gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), &color_scheme_colors[1]);
938
widget = WID ("text_colorbutton");
939
gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), &color_scheme_colors[2]);
940
widget = WID ("base_colorbutton");
941
gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), &color_scheme_colors[3]);
942
widget = WID ("selected_fg_colorbutton");
943
gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), &color_scheme_colors[4]);
944
widget = WID ("selected_bg_colorbutton");
945
gtk_color_button_set_color (GTK_COLOR_BUTTON (widget), &color_scheme_colors[5]);
951
gnome_theme_details_update_from_gconf (void)
955
GtkWidget *tree_view;
957
GnomeWindowManager *window_manager = NULL;
958
GnomeWMSettings wm_settings;
960
gnome_theme_details_init ();
962
window_manager = gnome_wm_manager_get_current (gdk_display_get_default_screen (gdk_display_get_default ()));
964
client = gconf_client_get_default ();
965
dialog = gnome_theme_manager_get_theme_dialog ();
967
/* FIXME: What do we really do when there is no theme? Ask Havoc here. */
968
tree_view = WID ("control_theme_treeview");
969
theme = gconf_client_get_string (client, GTK_THEME_KEY, NULL);
970
update_list_something (tree_view, theme);
971
update_color_scheme_tab (theme);
974
tree_view = WID ("window_theme_treeview");
975
wm_settings.flags = GNOME_WM_SETTING_THEME;
976
if (window_manager != NULL && strcmp (gnome_window_manager_get_name (window_manager), "No name")) {
977
gnome_window_manager_get_settings (window_manager, &wm_settings);
978
update_list_something (tree_view, wm_settings.theme);
981
tree_view = WID ("icon_theme_treeview");
982
theme = gconf_client_get_string (client, ICON_THEME_KEY, NULL);
983
update_list_something (tree_view, theme);
986
/* update colour scheme tab */
987
theme = gconf_client_get_string (client, COLOR_SCHEME_KEY, NULL);
988
update_color_buttons_from_string (theme);
991
g_object_unref (client);
995
color_scheme_changed (GObject *settings,
1002
client = gconf_client_get_default ();
1003
theme = gconf_client_get_string (client, COLOR_SCHEME_KEY, NULL);
1004
if (theme == NULL || strcmp (theme, "") == 0)
1005
g_object_get (settings, "gtk-color-scheme", &theme, NULL);
1007
update_color_buttons_from_string (theme);
1009
g_object_unref (client);