~alexlauni/ubuntu/lucid/gnome-control-center/fix-533888

« back to all changes in this revision

Viewing changes to capplets/theme-switcher/gnome-theme-details.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2007-06-13 12:30:08 UTC
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20070613123008-nmcon6qb309hkjek
Tags: upstream-2.19.3
ImportĀ upstreamĀ versionĀ 2.19.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include <config.h>
2
 
 
3
 
#include <string.h>
4
 
#include <gtk/gtk.h>
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>
10
 
 
11
 
#include <libwindow-settings/gnome-wm-manager.h>
12
 
 
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"
19
 
 
20
 
#define MAX_ELEMENTS_BEFORE_SCROLLING 12
21
 
 
22
 
static gboolean theme_details_initted = FALSE;
23
 
static gboolean setting_model = FALSE;
24
 
 
25
 
enum {
26
 
        THEME_GTK,
27
 
        THEME_WINDOW,
28
 
        THEME_ICON
29
 
};
30
 
        
31
 
 
32
 
/* Function Prototypes */
33
 
static void cb_dialog_response              (GtkDialog        *dialog,
34
 
                                             gint              response_id);
35
 
static void setup_tree_view                 (GtkTreeView      *tree_view,
36
 
                                             GCallback         changed_callback,
37
 
                                             GladeXML         *dialog);
38
 
static void gtk_theme_selection_changed     (GtkTreeSelection *selection,
39
 
                                             gpointer          data);
40
 
static void window_theme_selection_changed  (GtkTreeSelection *selection,
41
 
                                             gpointer          data);
42
 
static void icon_theme_selection_changed    (GtkTreeSelection *selection,
43
 
                                             gpointer          data);
44
 
static void update_gconf_key_from_selection (GtkTreeSelection *selection,
45
 
                                             const gchar      *gconf_key);
46
 
static void load_theme_names                (GtkTreeView        *tree_view,
47
 
                                             GList              *theme_list,
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,
52
 
                                             GParamSpec        *pspec,
53
 
                                             gpointer           data);
54
 
 
55
 
void revert_color_scheme_key (GtkWidget *checkbutton, gpointer *data);
56
 
 
57
 
static char *
58
 
path_to_theme_id (const char *path)
59
 
{
60
 
  char *dirname;
61
 
  char *result;
62
 
 
63
 
  dirname = g_path_get_dirname(path);
64
 
  result = g_path_get_basename(dirname);
65
 
  g_free(dirname);
66
 
 
67
 
  return result;
68
 
}
69
 
 
70
 
static void
71
 
cb_dialog_response (GtkDialog *dialog, gint response_id)
72
 
{
73
 
  if (response_id == GTK_RESPONSE_HELP)
74
 
    capplet_help (GTK_WINDOW (dialog), "user-guide.xml", "goscustdesk-12");
75
 
  else
76
 
    gtk_widget_hide (GTK_WIDGET (dialog));
77
 
}
78
 
 
79
 
static gint
80
 
details_tree_sort_func (GtkTreeModel *model,
81
 
                        GtkTreeIter  *a,
82
 
                        GtkTreeIter  *b,
83
 
                        gpointer      user_data)
84
 
{
85
 
  gchar *a_name = NULL;
86
 
  gchar *b_name = NULL;
87
 
  guint a_flag = FALSE;
88
 
  guint b_flag = FALSE;
89
 
  gint retval;
90
 
 
91
 
  gtk_tree_model_get (model, a,
92
 
                      THEME_NAME_COLUMN, &a_name,
93
 
                      THEME_FLAG_COLUMN, &a_flag,
94
 
                      -1);
95
 
  gtk_tree_model_get (model, b,
96
 
                      THEME_NAME_COLUMN, &b_name,
97
 
                      THEME_FLAG_COLUMN, &b_flag,
98
 
                      -1);
99
 
 
100
 
  retval = gnome_theme_manager_sort_func (a_name, b_name, a_flag, b_flag);
101
 
 
102
 
  g_free (a_name);
103
 
  g_free (b_name);
104
 
 
105
 
  return retval;
106
 
}
107
 
 
108
 
static void
109
 
setup_tree_view (GtkTreeView *tree_view,
110
 
                 GCallback    changed_callback,
111
 
                 GladeXML    *dialog)
112
 
{
113
 
  GtkTreeModel *model;
114
 
  GtkTreeSelection *selection;
115
 
  GtkCellRenderer *renderer;
116
 
 
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);
121
 
 
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);
125
 
 
126
 
  renderer = gtk_cell_renderer_text_new ();
127
 
  gtk_tree_view_insert_column_with_attributes (tree_view,
128
 
                                               -1, NULL,
129
 
                                               renderer,
130
 
                                               "text", THEME_NAME_COLUMN,
131
 
                                               NULL);
132
 
  g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
133
 
}
134
 
 
135
 
static void
136
 
gtk_theme_update_remove_button (GtkTreeSelection *selection, 
137
 
                                GtkWidget *remove_button,
138
 
                                gint theme_type)
139
 
{
140
 
  gchar *theme_selected;
141
 
  GtkTreeModel *model;
142
 
  GtkTreeIter iter;
143
 
  GList *theme_list=NULL, *list;
144
 
  gchar *theme_base=NULL;
145
 
  GnomeVFSResult vfs_result;
146
 
  GnomeVFSFileInfo *vfs_info;
147
 
 
148
 
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
149
 
     gtk_tree_model_get (model, &iter,
150
 
                          THEME_NAME_COLUMN, &theme_selected,
151
 
                          -1);
152
 
  else
153
 
    theme_selected = NULL;
154
 
 
155
 
  if (theme_selected != NULL) 
156
 
  {
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);
160
 
                                break;
161
 
                case THEME_ICON: theme_list = gnome_theme_icon_info_find_all();
162
 
                                 break;
163
 
                case THEME_WINDOW: theme_base = g_strdup("/metacity-1/");
164
 
                                    theme_list = gnome_theme_info_find_by_type (GNOME_THEME_METACITY);
165
 
                                    break;
166
 
                default: theme_list = NULL;
167
 
                         break;
168
 
    }
169
 
  }
170
 
                
171
 
  vfs_info = gnome_vfs_file_info_new ();
172
 
 
173
 
  for (list = theme_list; list; list = list->next)
174
 
  {
175
 
    GnomeThemeInfo *info = list->data;
176
 
        gchar *theme_dir = NULL;
177
 
 
178
 
    if (!strcmp(info->name, theme_selected))
179
 
    {
180
 
        if (theme_type == THEME_ICON) 
181
 
                theme_dir = g_strdup(info->path);
182
 
        else 
183
 
                theme_dir = g_strdup_printf("%s/%s", info->path, theme_base);
184
 
                        
185
 
        vfs_result = gnome_vfs_get_file_info (theme_dir,
186
 
                                              vfs_info,
187
 
                                              GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS);
188
 
        g_free (theme_dir);
189
 
 
190
 
        if (vfs_result == GNOME_VFS_OK) 
191
 
        {
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); 
195
 
                else 
196
 
                        gtk_widget_set_sensitive(remove_button, TRUE); 
197
 
        } else {
198
 
                gtk_widget_set_sensitive(remove_button, FALSE);
199
 
        }
200
 
 
201
 
      }
202
 
    }
203
 
    gnome_vfs_file_info_unref(vfs_info);
204
 
    g_free (theme_base);
205
 
    g_free (theme_selected);
206
 
}
207
 
 
208
 
static void
209
 
update_color_scheme_tab (const gchar *theme)
210
 
{
211
 
        GSList *symbolic_colors = NULL;
212
 
        GSList *engines = NULL;
213
 
        gboolean fg, bg, base, text, fg_s, bg_s, enable_colors, enable_revert;
214
 
        gchar *filename;
215
 
        gchar *theme_name = NULL;
216
 
        gchar *color_scheme= NULL;
217
 
        GtkSettings *settings;
218
 
        GladeXML *dialog;
219
 
        GConfClient *client;
220
 
 
221
 
        dialog = gnome_theme_manager_get_theme_dialog ();
222
 
 
223
 
        if (theme == NULL) {
224
 
                settings = gtk_settings_get_default ();
225
 
                g_object_get (G_OBJECT (settings), "gtk-theme-name", &theme_name, NULL);
226
 
                theme = theme_name;
227
 
        }
228
 
        filename = gtkrc_find_named (theme);
229
 
 
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);
237
 
 
238
 
        enable_colors = enable_revert = (fg && bg && base && text && fg_s && bg_s);
239
 
 
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);
246
 
 
247
 
        gtk_widget_set_sensitive (WID ("color_scheme_table"), enable_colors);
248
 
        gtk_widget_set_sensitive (WID ("color_scheme_revert_button"), enable_revert);
249
 
 
250
 
        if (enable_colors)
251
 
                gtk_widget_hide (WID ("color_scheme_message_hbox"));
252
 
        else
253
 
                gtk_widget_show (WID ("color_scheme_message_hbox"));
254
 
 
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);
259
 
        g_free (filename);
260
 
        g_free (theme_name);
261
 
}
262
 
 
263
 
static void
264
 
gtk_theme_selection_changed (GtkTreeSelection *selection,
265
 
                             gpointer          data)
266
 
{
267
 
  GladeXML *dialog;
268
 
  GtkTreeModel *model;
269
 
  GtkTreeIter iter;
270
 
 
271
 
  dialog = gnome_theme_manager_get_theme_dialog ();
272
 
 
273
 
  update_gconf_key_from_selection (selection, GTK_THEME_KEY);
274
 
  gtk_theme_update_remove_button(selection, WID("control_remove_button"), THEME_GTK);
275
 
 
276
 
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
277
 
    {
278
 
      gchar *theme;
279
 
 
280
 
      gtk_tree_model_get (model, &iter,
281
 
                          THEME_ID_COLUMN, &theme,
282
 
                          -1);
283
 
      update_color_scheme_tab (theme);
284
 
      g_free (theme);
285
 
    }
286
 
}
287
 
 
288
 
static void
289
 
window_theme_selection_changed (GtkTreeSelection *selection,
290
 
                                gpointer          data)
291
 
{
292
 
  GnomeWindowManager *window_manager = NULL;
293
 
  GnomeWMSettings wm_settings;
294
 
  GtkTreeIter iter;
295
 
  gchar *window_theme_name;
296
 
  GtkTreeModel *model;
297
 
 
298
 
  if (setting_model)
299
 
    return;
300
 
 
301
 
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
302
 
    {
303
 
      gtk_tree_model_get (model, &iter,
304
 
                          THEME_ID_COLUMN, &window_theme_name,
305
 
                          -1);
306
 
    }
307
 
  else
308
 
    {
309
 
      return;
310
 
    }
311
 
 
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);
317
 
  }
318
 
  g_free (window_theme_name);
319
 
}
320
 
 
321
 
static void
322
 
icon_theme_selection_changed (GtkTreeSelection *selection,
323
 
                             gpointer          data)
324
 
{
325
 
  GladeXML *dialog;
326
 
                
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);
330
 
}
331
 
 
332
 
static void
333
 
load_theme_names (GtkTreeView *tree_view,
334
 
                  GList       *theme_list,
335
 
                  const gchar *default_theme)
336
 
{
337
 
  GList *list;
338
 
  GtkTreeModel *model;
339
 
  GtkWidget *swindow;
340
 
  gint i = 0;
341
 
 
342
 
  swindow = GTK_WIDGET (tree_view)->parent;
343
 
  model = gtk_tree_view_get_model (tree_view);
344
 
  g_assert (model);
345
 
 
346
 
  setting_model = TRUE;
347
 
  gtk_list_store_clear (GTK_LIST_STORE (model));
348
 
 
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);
352
 
 
353
 
  for (list = theme_list; list; list = list->next->next)
354
 
    {
355
 
      const char *name = list->data;
356
 
      const char *id = list->next->data;
357
 
      GtkTreeIter iter;
358
 
      gboolean is_default;
359
 
 
360
 
      gtk_list_store_prepend (GTK_LIST_STORE (model), &iter);
361
 
 
362
 
      if (default_theme && strcmp (default_theme, name) == 0)
363
 
        is_default = TRUE;
364
 
      else
365
 
        is_default = FALSE;
366
 
 
367
 
      gtk_list_store_set (GTK_LIST_STORE (model), &iter,
368
 
                          THEME_NAME_COLUMN, name,
369
 
                          THEME_ID_COLUMN, id,
370
 
                          THEME_FLAG_COLUMN, is_default,
371
 
                          -1);
372
 
 
373
 
      if (i == MAX_ELEMENTS_BEFORE_SCROLLING)
374
 
        {
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);
380
 
        }
381
 
      i++;
382
 
    }
383
 
  setting_model = FALSE;
384
 
}
385
 
 
386
 
/* Shared by icons and gtk+ */
387
 
static void
388
 
update_gconf_key_from_selection (GtkTreeSelection *selection,
389
 
                                 const gchar      *gconf_key)
390
 
{
391
 
  GtkTreeModel *model;
392
 
  gchar *new_key;
393
 
  GConfClient *client;
394
 
  GtkTreeIter iter;
395
 
 
396
 
  if (setting_model)
397
 
    return;
398
 
 
399
 
  client = gconf_client_get_default ();
400
 
 
401
 
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
402
 
    {
403
 
      gtk_tree_model_get (model, &iter,
404
 
                          THEME_ID_COLUMN, &new_key,
405
 
                          -1);
406
 
    }
407
 
  else
408
 
    /* This shouldn't happen */
409
 
    {
410
 
      new_key = NULL;
411
 
    }
412
 
 
413
 
  if (new_key != NULL)
414
 
    {
415
 
      gchar *old_key;
416
 
 
417
 
      old_key = gconf_client_get_string (client, gconf_key, NULL);
418
 
      if (old_key && strcmp (old_key, new_key))
419
 
        {
420
 
          gconf_client_set_string (client, gconf_key, new_key, NULL);
421
 
        }
422
 
      g_free (old_key);
423
 
    }
424
 
  else
425
 
    {
426
 
      gconf_client_unset (client, gconf_key, NULL);
427
 
    }
428
 
  g_free (new_key);
429
 
  g_object_unref (client);
430
 
}
431
 
 
432
 
static void
433
 
remove_theme(GtkWidget *button, gpointer data)
434
 
{
435
 
  GladeXML *dialog;
436
 
  GtkWidget *confirm_dialog, *info_dialog;
437
 
  GList *theme_list, *string_list, *list;
438
 
  GtkTreeSelection *selection;
439
 
  GtkTreeModel *model;
440
 
  GtkTreeIter iter;
441
 
  gchar *theme_dir, *theme_selected, *treeview;
442
 
  gint response, theme_type;
443
 
  GList *uri_list;
444
 
  GnomeVFSResult result;
445
 
  
446
 
  confirm_dialog = gtk_message_dialog_new (NULL,
447
 
                                           GTK_DIALOG_MODAL,
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)
454
 
        return;
455
 
 
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");
461
 
                        break;
462
 
        case THEME_ICON: theme_list = gnome_theme_icon_info_find_all();
463
 
                         treeview=g_strdup("icon_theme_treeview");
464
 
                         theme_dir = NULL;
465
 
                         break;
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");
469
 
                           break;
470
 
        default: theme_list = NULL;
471
 
                 theme_dir = NULL;
472
 
                 treeview = NULL;
473
 
                 break;
474
 
  }
475
 
 
476
 
 
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))
481
 
          {
482
 
                gtk_tree_model_get (model, &iter,
483
 
                                      THEME_NAME_COLUMN, &theme_selected,
484
 
                                      -1);
485
 
          } else {
486
 
                theme_selected = NULL;
487
 
          }
488
 
 
489
 
        if (theme_selected!=NULL)
490
 
        {
491
 
                string_list = NULL;
492
 
 
493
 
                for (list = theme_list; list; list = list->next)
494
 
                {
495
 
                        GnomeThemeInfo *info = list->data;
496
 
                        if (!strcmp(info->name, theme_selected))
497
 
                        {
498
 
 
499
 
                                if (theme_type == THEME_ICON)
500
 
                                        theme_dir = g_strdup(g_path_get_dirname(info->path));
501
 
                                else
502
 
                                        theme_dir = g_strdup_printf("%s/%s", info->path, theme_dir);
503
 
        
504
 
                                uri_list = g_list_prepend(NULL, gnome_vfs_uri_new (theme_dir));
505
 
 
506
 
                                result = gnome_vfs_xfer_delete_list (uri_list, GNOME_VFS_XFER_ERROR_MODE_ABORT,
507
 
                                                                     GNOME_VFS_XFER_RECURSIVE,
508
 
                                                                     NULL, NULL);
509
 
                                if (result == GNOME_VFS_OK) 
510
 
                                {
511
 
                                        info_dialog = gtk_message_dialog_new (NULL,
512
 
                                                                GTK_DIALOG_MODAL,
513
 
                                                                GTK_MESSAGE_INFO,
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));
518
 
 
519
 
                                } else {
520
 
                                        info_dialog = gtk_message_dialog_new (NULL,
521
 
                                                                GTK_DIALOG_MODAL,
522
 
                                                                GTK_MESSAGE_ERROR,
523
 
                                                                GTK_BUTTONS_OK,
524
 
                                                                _("Theme can not be deleted"));
525
 
                                        gtk_dialog_run (GTK_DIALOG (info_dialog));
526
 
                                }
527
 
                                gtk_widget_destroy (info_dialog);
528
 
                                gnome_vfs_uri_list_free (uri_list);
529
 
                        }
530
 
                }
531
 
        }
532
 
  }
533
 
}
534
 
 
535
 
static void
536
 
gtk_color_scheme_changed (GtkWidget *colorbutton, GladeXML *dialog)
537
 
{
538
 
  GConfClient *client = NULL;
539
 
  gchar *new_scheme;
540
 
  GdkColor colors[6];
541
 
  gchar *bg, *fg, *text, *base, *selected_fg, *selected_bg;
542
 
  GtkWidget *widget;
543
 
 
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]);
556
 
 
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);
563
 
 
564
 
  new_scheme = g_strconcat (fg, bg, text, base, selected_fg, selected_bg, NULL);
565
 
 
566
 
  client = gconf_client_get_default ();
567
 
 
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
570
 
   */
571
 
  gconf_client_set_string (client, COLOR_SCHEME_KEY, new_scheme, NULL);
572
 
 
573
 
  g_object_unref (G_OBJECT (client));
574
 
  free_all (fg, bg, text, base, selected_fg, selected_bg, new_scheme, NULL);
575
 
}
576
 
 
577
 
void
578
 
revert_color_scheme_key (GtkWidget *checkbutton, gpointer *data)
579
 
{
580
 
  GConfClient *client = NULL;
581
 
  GladeXML *dialog;
582
 
 
583
 
  dialog = gnome_theme_manager_get_theme_dialog ();
584
 
 
585
 
  client = gconf_client_get_default ();
586
 
  gconf_client_set_string (client, COLOR_SCHEME_KEY, "", NULL);
587
 
  g_object_unref (G_OBJECT (client));
588
 
}
589
 
 
590
 
void
591
 
gnome_theme_details_init (void)
592
 
{
593
 
  GtkWidget *parent, *widget;
594
 
  GladeXML *dialog;
595
 
  gchar *theme;
596
 
 
597
 
  if (theme_details_initted)
598
 
    return;
599
 
  theme_details_initted = TRUE;
600
 
 
601
 
  dialog = gnome_theme_manager_get_theme_dialog ();
602
 
  parent = WID ("theme_details_dialog");
603
 
 
604
 
  setup_tree_view (GTK_TREE_VIEW (WID ("control_theme_treeview")),
605
 
                   (GCallback) gtk_theme_selection_changed,
606
 
                   dialog);
607
 
  setup_tree_view (GTK_TREE_VIEW (WID ("window_theme_treeview")),
608
 
                   (GCallback) window_theme_selection_changed,
609
 
                   dialog);
610
 
  setup_tree_view (GTK_TREE_VIEW (WID ("icon_theme_treeview")),
611
 
                   (GCallback) icon_theme_selection_changed,
612
 
                   dialog);
613
 
 
614
 
  /* gtk themes */
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);
619
 
 
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);
625
 
 
626
 
  /* icon themes */
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);
631
 
 
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);
645
 
 
646
 
  widget = WID ("color_scheme_revert_button");
647
 
  g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (revert_color_scheme_key), parent);
648
 
 
649
 
  g_object_get (G_OBJECT (gtk_settings_get_default()), "gtk-color-scheme", &theme, NULL);
650
 
  update_color_buttons_from_string (theme);
651
 
 
652
 
  g_signal_connect (gtk_settings_get_default(), "notify::gtk-color-scheme", 
653
 
                    G_CALLBACK (color_scheme_changed),  NULL);
654
 
 
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);
658
 
 
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);
665
 
 
666
 
  capplet_set_icon (parent, "gnome-settings-theme");
667
 
 
668
 
  gnome_theme_details_reread_themes_from_disk ();
669
 
}
670
 
 
671
 
void
672
 
gnome_theme_details_show (void)
673
 
{
674
 
  GladeXML *dialog;
675
 
  GtkWidget *parent;
676
 
 
677
 
  gnome_theme_details_init ();
678
 
 
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));
683
 
}
684
 
 
685
 
static void
686
 
warn_about_no_themes (void)
687
 
{
688
 
  static GtkWidget *dialog;
689
 
 
690
 
  if (dialog == NULL)
691
 
    {
692
 
      dialog = gtk_message_dialog_new (NULL,
693
 
                                       GTK_DIALOG_MODAL,
694
 
                                       GTK_MESSAGE_ERROR,
695
 
                                       GTK_BUTTONS_OK,
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);
699
 
      exit (0);
700
 
    }
701
 
}
702
 
 
703
 
void
704
 
gnome_theme_details_reread_themes_from_disk (void)
705
 
{
706
 
  GladeXML *dialog;
707
 
  GList *theme_list;
708
 
  GList *string_list;
709
 
  GList *list;
710
 
  GnomeWindowManager *window_manager;
711
 
 
712
 
  gboolean have_gtk_theme;
713
 
  gboolean have_window_theme;
714
 
  gboolean have_icon_theme;
715
 
 
716
 
  
717
 
  gnome_theme_details_init ();
718
 
 
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 ()));
721
 
 
722
 
  /* First, we update the GTK+ themes page */
723
 
  theme_list = gnome_theme_info_find_by_type (GNOME_THEME_GTK_2);
724
 
  string_list = NULL;
725
 
  for (list = theme_list; list; list = list->next)
726
 
    {
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);
731
 
    }
732
 
 
733
 
  if (string_list == NULL)
734
 
    {
735
 
      have_gtk_theme = FALSE;
736
 
      gtk_widget_hide (WID ("control_theme_hbox"));
737
 
    }
738
 
  else
739
 
    {
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);
744
 
    }
745
 
  g_list_free (theme_list);
746
 
 
747
 
  /* Next, we do the window managers */
748
 
  theme_list = window_manager ? gnome_window_manager_get_theme_list (window_manager) : NULL;
749
 
  string_list = NULL;
750
 
  for (list = theme_list; list; list = list->next)
751
 
    {
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);
755
 
    }  
756
 
  if (string_list == NULL)
757
 
    {
758
 
      have_window_theme = FALSE;
759
 
      gtk_widget_hide (WID ("window_theme_hbox"));
760
 
    }
761
 
  else
762
 
    {
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);
767
 
    }
768
 
  g_list_free (theme_list);
769
 
 
770
 
  /* Third, we do the icon theme */
771
 
  theme_list = gnome_theme_icon_info_find_all ();
772
 
  string_list = NULL;
773
 
 
774
 
  for (list = theme_list; list; list = list->next)
775
 
    {
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);
779
 
    }
780
 
 
781
 
  if (string_list == NULL)
782
 
    {
783
 
      have_icon_theme = FALSE;
784
 
      gtk_widget_hide (WID ("icon_theme_hbox"));
785
 
    }
786
 
  else
787
 
    {
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);
792
 
    }
793
 
  g_list_free (theme_list);
794
 
 
795
 
  if (! have_gtk_theme && ! have_window_theme && ! have_icon_theme)
796
 
    warn_about_no_themes ();
797
 
 
798
 
  gnome_theme_details_update_from_gconf ();
799
 
 
800
 
}
801
 
 
802
 
static void
803
 
update_list_something (GtkWidget *tree_view, const gchar *theme)
804
 
{
805
 
  GtkTreeModel *model;
806
 
  GtkTreeIter iter;
807
 
  GtkTreeIter next_iter;
808
 
  gboolean valid;
809
 
  gboolean theme_found;
810
 
 
811
 
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
812
 
  g_assert (model);
813
 
 
814
 
  valid = gtk_tree_model_get_iter_first (model, &iter);
815
 
  theme_found = FALSE;
816
 
 
817
 
  while (valid)
818
 
    {
819
 
      gchar *theme_id;
820
 
      guint flags = 0;
821
 
 
822
 
      next_iter = iter;
823
 
      valid = gtk_tree_model_iter_next (model, &next_iter);
824
 
 
825
 
      gtk_tree_model_get (model, &iter,
826
 
                          THEME_ID_COLUMN, &theme_id,
827
 
                          THEME_FLAG_COLUMN, &flags,
828
 
                          -1);
829
 
 
830
 
      if (! strcmp (theme, theme_id))
831
 
        {
832
 
          GtkTreePath *path;
833
 
          GtkTreePath *cursor_path;
834
 
          gboolean cursor_same = FALSE;
835
 
 
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)
839
 
            cursor_same = TRUE;
840
 
 
841
 
          gtk_tree_path_free (cursor_path);
842
 
 
843
 
          if (!cursor_same)
844
 
            {
845
 
              gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree_view), path, NULL, FALSE);
846
 
            }
847
 
          gtk_tree_path_free (path);
848
 
          theme_found = TRUE;
849
 
        }
850
 
      else
851
 
        {
852
 
          if (flags & THEME_FLAG_CUSTOM)
853
 
            {
854
 
              gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
855
 
            }
856
 
        }
857
 
      g_free (theme_id);
858
 
      iter = next_iter;
859
 
      if (theme_found)
860
 
        break;
861
 
    }
862
 
 
863
 
  if (theme_found == FALSE)
864
 
    /* Never found the theme. */
865
 
    {
866
 
      GtkTreePath *path;
867
 
 
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,
873
 
                          -1);
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);
877
 
    }
878
 
}
879
 
 
880
 
static void
881
 
update_color_buttons_from_string (gchar *color_scheme)
882
 
{
883
 
  GdkColor color_scheme_colors[6];
884
 
  gchar **color_scheme_strings, **color_scheme_pair, *current_string;
885
 
  gint i;
886
 
  GtkWidget *widget;
887
 
  GladeXML *dialog;
888
 
 
889
 
  if (!color_scheme) return;
890
 
  if (!strcmp (color_scheme, "")) return;
891
 
 
892
 
  dialog = gnome_theme_manager_get_theme_dialog ();
893
 
 
894
 
  /* The color scheme string consists of name:color pairs, seperated by
895
 
   * newlines, so first we split the string up by new line */
896
 
 
897
 
  color_scheme_strings = g_strsplit (color_scheme, "\n", 0);
898
 
 
899
 
  /* loop through the name:color pairs, and save the colour if we recognise the name */
900
 
  i = 0;
901
 
  while ((current_string = color_scheme_strings[i++]))
902
 
  {
903
 
    color_scheme_pair = g_strsplit (current_string, ":", 0);
904
 
 
905
 
    if (color_scheme_pair[0] != NULL && color_scheme_pair[1] != NULL)
906
 
    {
907
 
      g_strstrip (color_scheme_pair[0]);
908
 
      g_strstrip (color_scheme_pair[1]);
909
 
 
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]);
922
 
    }
923
 
 
924
 
    g_strfreev (color_scheme_pair);
925
 
  }
926
 
 
927
 
  g_strfreev (color_scheme_strings);
928
 
 
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);
932
 
 
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]);
946
 
 
947
 
 
948
 
}
949
 
 
950
 
void
951
 
gnome_theme_details_update_from_gconf (void)
952
 
{
953
 
  GConfClient *client;
954
 
  GladeXML *dialog;
955
 
  GtkWidget *tree_view;
956
 
  gchar *theme = NULL;
957
 
  GnomeWindowManager *window_manager = NULL;
958
 
  GnomeWMSettings wm_settings;
959
 
 
960
 
  gnome_theme_details_init ();
961
 
 
962
 
  window_manager = gnome_wm_manager_get_current (gdk_display_get_default_screen (gdk_display_get_default ()));
963
 
 
964
 
  client = gconf_client_get_default ();
965
 
  dialog = gnome_theme_manager_get_theme_dialog ();
966
 
 
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);
972
 
  g_free (theme);
973
 
 
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);
979
 
  }
980
 
 
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);
984
 
  g_free (theme);
985
 
 
986
 
  /* update colour scheme tab */
987
 
  theme = gconf_client_get_string (client, COLOR_SCHEME_KEY, NULL);
988
 
  update_color_buttons_from_string (theme);
989
 
  g_free (theme);
990
 
 
991
 
  g_object_unref (client);
992
 
}
993
 
 
994
 
static void
995
 
color_scheme_changed (GObject    *settings,
996
 
                      GParamSpec *pspec,
997
 
                      gpointer    data)
998
 
{
999
 
  GConfClient *client;
1000
 
  gchar *theme;
1001
 
 
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);
1006
 
 
1007
 
  update_color_buttons_from_string (theme);
1008
 
  g_free (theme);
1009
 
  g_object_unref (client);
1010
 
}