4
* Copyright (c) 2008 Stephan Arts <stephan@xfce.org>
5
* Copyright (c) 2008 Brian Tarricone <bjt23@cornell.edu>
6
* Copyright (c) 2008 Jérôme Guelfucci <jerome.guelfucci@gmail.com>
7
* Copyright (c) 2011 Jannis Pohlmann <jannis@xfce.org>
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
43
#include <gdk-pixbuf/gdk-pixbuf.h>
46
#include <libxfce4util/libxfce4util.h>
47
#include <xfconf/xfconf.h>
48
#include <libxfce4ui/libxfce4ui.h>
54
#include "xfdesktop-common.h"
55
#include "xfdesktop-settings-ui.h"
56
#include "xfdesktop-settings-appearance-frame-ui.h"
58
#define PREVIEW_HEIGHT 48
60
#define SHOW_DESKTOP_MENU_PROP "/desktop-menu/show"
61
#define DESKTOP_MENU_SHOW_ICONS_PROP "/desktop-menu/show-icons"
63
#define WINLIST_SHOW_WINDOWS_MENU_PROP "/windowlist-menu/show"
64
#define WINLIST_SHOW_APP_ICONS_PROP "/windowlist-menu/show-icons"
65
#define WINLIST_SHOW_STICKY_WIN_ONCE_PROP "/windowlist-menu/show-sticky-once"
66
#define WINLIST_SHOW_WS_NAMES_PROP "/windowlist-menu/show-workspace-names"
67
#define WINLIST_SHOW_WS_SUBMENUS_PROP "/windowlist-menu/show-submenus"
69
#define DESKTOP_ICONS_STYLE_PROP "/desktop-icons/style"
70
#define DESKTOP_ICONS_ICON_SIZE_PROP "/desktop-icons/icon-size"
71
#define DESKTOP_ICONS_FONT_SIZE_PROP "/desktop-icons/font-size"
72
#define DESKTOP_ICONS_CUSTOM_FONT_SIZE_PROP "/desktop-icons/use-custom-font-size"
73
#define DESKTOP_ICONS_SHOW_THUMBNAILS_PROP "/desktop-icons/show-thumbnails"
74
#define DESKTOP_ICONS_SHOW_HOME "/desktop-icons/file-icons/show-home"
75
#define DESKTOP_ICONS_SHOW_TRASH "/desktop-icons/file-icons/show-trash"
76
#define DESKTOP_ICONS_SHOW_FILESYSTEM "/desktop-icons/file-icons/show-filesystem"
77
#define DESKTOP_ICONS_SHOW_REMOVABLE "/desktop-icons/file-icons/show-removable"
79
#define PER_SCREEN_PROP_FORMAT "/backdrop/screen%d/monitor%d"
83
XfconfChannel *channel;
87
image_selector_loaded:1,
90
GtkWidget *frame_image_list;
91
GtkWidget *image_treeview;
94
GtkWidget *btn_newlist;
95
GtkWidget *image_style_combo;
97
GtkWidget *radio_singleimage;
98
GtkWidget *radio_imagelist;
99
GtkWidget *radio_none;
101
GtkWidget *color_style_combo;
102
GtkWidget *color1_btn;
103
GtkWidget *color2_btn;
105
GtkWidget *brightness_slider;
106
GtkWidget *saturation_slider;
135
TARGET_TEXT_URI_LIST = 0,
139
/* assumes gdk lock is held on function enter, and should be held
140
* on function exit */
142
xfdesktop_settings_do_single_preview(GtkTreeModel *model,
145
gchar *name = NULL, *new_name = NULL, *filename = NULL;
146
GdkPixbuf *pix, *pix_scaled = NULL;
148
gtk_tree_model_get(model, iter,
150
COL_FILENAME, &filename,
155
pix = gdk_pixbuf_new_from_file(filename, NULL);
161
width = gdk_pixbuf_get_width(pix);
162
height = gdk_pixbuf_get_height(pix);
163
/* no need to escape markup; it's already done for us */
164
new_name = g_strdup_printf(_("%s\n<i>Size: %dx%d</i>"),
165
name, width, height);
167
aspect = (gdouble)width / height;
168
width = PREVIEW_HEIGHT * aspect;
169
height = PREVIEW_HEIGHT;
170
pix_scaled = gdk_pixbuf_scale_simple(pix, width, height,
171
GDK_INTERP_BILINEAR);
173
g_object_unref(G_OBJECT(pix));
180
gtk_list_store_set(GTK_LIST_STORE(model), iter,
187
gtk_list_store_set(GTK_LIST_STORE(model), iter,
190
g_object_unref(G_OBJECT(pix_scaled));
195
xfdesktop_settings_create_some_previews(gpointer data)
197
PreviewData *pdata = data;
201
for(l = pdata->iters; l; l = l->next)
202
xfdesktop_settings_do_single_preview(pdata->model, l->data);
205
g_object_unref(G_OBJECT(pdata->model));
206
g_slist_foreach(pdata->iters, (GFunc)gtk_tree_iter_free, NULL);
207
g_slist_free(pdata->iters);
214
xfdesktop_settings_create_all_previews(gpointer data)
216
GtkTreeModel *model = data;
217
GtkTreeView *tree_view;
221
if(gtk_tree_model_get_iter_first(model, &iter)) {
223
xfdesktop_settings_do_single_preview(model, &iter);
224
} while(gtk_tree_model_iter_next(model, &iter));
227
/* if possible, scroll to the selected image */
228
tree_view = g_object_get_data(G_OBJECT(model), "xfdesktop-tree-view");
230
GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view);
232
if(gtk_tree_selection_get_mode(selection) != GTK_SELECTION_MULTIPLE
233
&& gtk_tree_selection_get_selected(selection, NULL, &iter))
235
GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
236
gtk_tree_view_scroll_to_cell(tree_view, path, NULL, TRUE, 0.0, 0.0);
239
g_object_set_data(G_OBJECT(model), "xfdesktop-tree-view", NULL);
243
g_object_unref(G_OBJECT(model));
249
cb_special_icon_toggled(GtkCellRendererToggle *render, gchar *path, gpointer user_data)
251
XfconfChannel *channel = g_object_get_data(G_OBJECT(user_data),
253
GtkTreePath *tree_path = gtk_tree_path_new_from_string(path);
254
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data));
257
gchar *icon_property = NULL;
259
gtk_tree_model_get_iter(model, &iter, tree_path);
260
gtk_tree_model_get(model, &iter, COL_ICON_ENABLED, &show_icon,
261
COL_ICON_PROPERTY, &icon_property, -1);
263
show_icon = !show_icon;
265
xfconf_channel_set_bool(channel, icon_property, show_icon);
267
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
268
COL_ICON_ENABLED, show_icon, -1);
270
gtk_tree_path_free(tree_path);
271
g_free(icon_property);
275
setup_special_icon_list(GtkBuilder *gxml,
276
XfconfChannel *channel)
280
GtkTreeViewColumn *col;
281
GtkCellRenderer *render;
286
const gchar *icon_fallback;
287
const gchar *xfconf_property;
290
{ N_("Home"), "user-home", "gnome-fs-desktop",
291
DESKTOP_ICONS_SHOW_HOME, TRUE },
292
{ N_("Filesystem"), "drive-harddisk", "gnome-dev-harddisk",
293
DESKTOP_ICONS_SHOW_FILESYSTEM, TRUE },
294
{ N_("Trash"), "user-trash", "gnome-fs-trash-empty",
295
DESKTOP_ICONS_SHOW_TRASH, TRUE },
296
{ N_("Removable Devices"), "drive-removable-media", "gnome-dev-removable",
297
DESKTOP_ICONS_SHOW_REMOVABLE, TRUE },
298
{ NULL, NULL, NULL, NULL, FALSE },
301
GtkIconTheme *itheme = gtk_icon_theme_get_default();
303
gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &w, NULL);
305
ls = gtk_list_store_new(N_ICON_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING,
306
G_TYPE_BOOLEAN, G_TYPE_STRING);
307
for(i = 0; icons[i].name; ++i) {
308
GdkPixbuf *pix = NULL;
310
if(gtk_icon_theme_has_icon(itheme, icons[i].icon))
311
pix = gtk_icon_theme_load_icon(itheme, icons[i].icon, w, 0, NULL);
313
pix = gtk_icon_theme_load_icon(itheme, icons[i].icon_fallback, w, 0, NULL);
315
gtk_list_store_append(ls, &iter);
316
gtk_list_store_set(ls, &iter,
317
COL_ICON_NAME, _(icons[i].name),
319
COL_ICON_PROPERTY, icons[i].xfconf_property,
321
xfconf_channel_get_bool(channel,
322
icons[i].xfconf_property,
326
g_object_unref(G_OBJECT(pix));
329
treeview = GTK_WIDGET(gtk_builder_get_object(gxml, "treeview_default_icons"));
330
g_object_set_data(G_OBJECT(treeview), "xfconf-channel", channel);
331
col = gtk_tree_view_column_new();
332
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col);
334
render = gtk_cell_renderer_toggle_new();
335
gtk_tree_view_column_pack_start(col, render, FALSE);
336
gtk_tree_view_column_add_attribute(col, render, "active", COL_ICON_ENABLED);
338
g_signal_connect(G_OBJECT(render), "toggled",
339
G_CALLBACK(cb_special_icon_toggled), treeview);
341
render = gtk_cell_renderer_pixbuf_new();
342
gtk_tree_view_column_pack_start(col, render, FALSE);
343
gtk_tree_view_column_add_attribute(col, render, "pixbuf", COL_ICON_PIX);
345
render = gtk_cell_renderer_text_new();
346
gtk_tree_view_column_pack_start(col, render, TRUE);
347
gtk_tree_view_column_add_attribute(col, render, "text", COL_ICON_NAME);
349
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(ls));
350
g_object_unref(G_OBJECT(ls));
354
image_list_sort(GtkTreeModel *model,
359
gchar *key_a = NULL, *key_b = NULL;
362
gtk_tree_model_get(model, a, COL_COLLATE_KEY, &key_a, -1);
363
gtk_tree_model_get(model, b, COL_COLLATE_KEY, &key_b, -1);
365
if(G_UNLIKELY(!key_a && !key_b))
367
else if(G_UNLIKELY(!key_a))
369
else if(G_UNLIKELY(!key_b))
372
ret = strcmp(key_a, key_b);
381
xfdesktop_settings_image_treeview_add(GtkTreeModel *model,
384
gboolean added = FALSE;
386
gchar *name = NULL, *name_utf8 = NULL, *name_markup = NULL;
387
gchar *lower = NULL, *key = NULL;
389
if(!xfdesktop_image_file_is_valid(path))
392
name = g_path_get_basename(path);
394
name_utf8 = g_filename_to_utf8(name, strlen(name),
397
name_markup = g_markup_printf_escaped("<b>%s</b>",
400
lower = g_utf8_strdown(name_utf8, -1);
401
key = g_utf8_collate_key(lower, -1);
403
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
404
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
405
COL_NAME, name_markup,
407
COL_COLLATE_KEY, key,
421
return gtk_tree_iter_copy(&iter);
427
xfdesktop_image_list_add_dir(GtkListStore *ls,
429
const char *cur_image_file)
432
gboolean needs_slash = TRUE;
434
GtkTreeIter *iter, *iter_ret = NULL;
437
dir = g_dir_open(path, 0, 0);
441
if(path[strlen(path)-1] == '/')
444
while((file = g_dir_read_name(dir))) {
445
g_snprintf(buf, sizeof(buf), needs_slash ? "%s/%s" : "%s%s",
448
iter = xfdesktop_settings_image_treeview_add(GTK_TREE_MODEL(ls), buf);
450
if(cur_image_file && !iter_ret && !strcmp(buf, cur_image_file))
453
gtk_tree_iter_free(iter);
463
xfdesktop_settings_ensure_backdrop_list(gchar *filename,
468
g_return_val_if_fail(filename && *filename, FALSE);
470
if(xfdesktop_backdrop_list_is_valid(filename))
473
fp = fopen(filename, "w");
475
gchar *shortfile = g_path_get_basename(filename);
476
gchar *primary = g_strdup_printf(_("Cannot create backdrop list \"%s\""),
479
xfce_message_dialog(parent,
480
_("Backdrop List Error"),
481
GTK_STOCK_DIALOG_ERROR,
482
primary, strerror(errno),
483
GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
491
fprintf(fp, "%s\n", LIST_TEXT);
498
xfdesktop_settings_dialog_create_load_list(AppearancePanel *panel)
500
gchar *list_file = NULL;
501
GtkWindow *parent = GTK_WINDOW(gtk_widget_get_toplevel(panel->image_treeview));
505
chooser = gtk_file_chooser_dialog_new(_("Create/Load Backdrop List"),
506
parent, GTK_FILE_CHOOSER_ACTION_SAVE,
507
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
508
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
510
path = xfce_resource_save_location(XFCE_RESOURCE_CONFIG,
511
"xfce4/desktop/", TRUE);
513
gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(chooser),
519
if(GTK_RESPONSE_ACCEPT != gtk_dialog_run(GTK_DIALOG(chooser))) {
520
gtk_widget_destroy(chooser);
524
list_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
525
if(g_file_test(list_file, G_FILE_TEST_EXISTS)
526
&& !xfdesktop_backdrop_list_is_valid(list_file))
528
gchar *shortfile = g_path_get_basename(list_file);
529
gchar *primary = g_strdup_printf(_("File \"%s\" is not a valid backdrop list file. Do you wish to overwrite it?"),
533
resp = xfce_message_dialog(GTK_WINDOW(chooser),
534
_("Invalid List File"),
535
GTK_STOCK_DIALOG_ERROR,
537
_("Overwriting the file will cause its contents to be lost."),
538
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
539
XFCE_BUTTON_TYPE_MIXED, GTK_STOCK_SAVE, _("Replace"), GTK_RESPONSE_ACCEPT,
544
if(GTK_RESPONSE_ACCEPT == resp)
554
gtk_widget_destroy(chooser);
555
while(gtk_events_pending())
556
gtk_main_iteration();
558
if(!xfdesktop_settings_ensure_backdrop_list(list_file, parent)) {
567
cb_image_selection_changed(GtkTreeSelection *sel,
570
AppearancePanel *panel = user_data;
571
GtkTreeModel *model = NULL;
573
gchar *filename = NULL;
578
if(panel->image_list_loaded)
581
if(!gtk_tree_selection_get_selected(sel, &model, &iter))
584
gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1);
586
DBG("got %s, applying to screen %d monitor %d", filename, panel->screen, panel->monitor);
588
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/image-path",
589
panel->screen, panel->monitor);
590
xfconf_channel_set_string(panel->channel, buf, filename);
591
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/last-single-image",
592
panel->screen, panel->monitor);
593
xfconf_channel_set_string(panel->channel, buf, filename);
597
xfdesktop_settings_dialog_populate_image_list(AppearancePanel *panel)
599
gchar prop_image[1024], prop_last[1024], *image_file;
601
GtkTreeIter *image_file_iter = NULL;
602
gboolean do_sort = TRUE;
603
GtkTreeSelection *sel;
605
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(panel->image_treeview));
606
ls = gtk_list_store_new(N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING,
607
G_TYPE_STRING, G_TYPE_STRING);
609
g_snprintf(prop_image, sizeof(prop_image),
610
PER_SCREEN_PROP_FORMAT "/image-path",
611
panel->screen, panel->monitor);
612
image_file = xfconf_channel_get_string(panel->channel, prop_image, NULL);
614
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist))) {
617
g_snprintf(prop_last, sizeof(prop_last),
618
PER_SCREEN_PROP_FORMAT "/last-image-list",
619
panel->screen, panel->monitor);
621
if(!image_file || !xfdesktop_backdrop_list_is_valid(image_file)) {
623
image_file = xfconf_channel_get_string(panel->channel, prop_last,
625
if(!image_file || !xfdesktop_backdrop_list_is_valid(image_file)) {
627
image_file = xfce_resource_save_location(XFCE_RESOURCE_CONFIG,
628
DEFAULT_BACKDROP_LIST,
630
if(!xfdesktop_settings_ensure_backdrop_list(image_file,
631
GTK_WINDOW(gtk_widget_get_toplevel(panel->image_treeview))))
633
/* FIXME: go back to single image mode or something */
642
images = xfdesktop_backdrop_list_load(image_file, NULL, NULL);
646
xfconf_channel_set_string(panel->channel, prop_image, image_file);
647
xfconf_channel_set_string(panel->channel, prop_last, image_file);
649
for(i = 0; images[i]; ++i) {
650
GtkTreeIter *iter = xfdesktop_settings_image_treeview_add(GTK_TREE_MODEL(ls), images[i]);
652
gtk_tree_iter_free(iter);
656
panel->image_list_loaded = TRUE;
657
panel->image_selector_loaded = FALSE;
658
gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
660
} else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel->radio_singleimage))) {
662
gchar **backdrop_dirs;
665
g_snprintf(prop_last, sizeof(prop_last),
666
PER_SCREEN_PROP_FORMAT "/last-image",
667
panel->screen, panel->monitor);
669
if(!image_file || !xfdesktop_image_file_is_valid(image_file)) {
671
image_file = xfconf_channel_get_string(panel->channel, prop_last,
673
if(!image_file || !xfdesktop_image_file_is_valid(image_file)) {
675
image_file = g_strdup(DEFAULT_BACKDROP);
679
xfconf_channel_set_string(panel->channel, prop_image, image_file);
680
xfconf_channel_set_string(panel->channel, prop_last, image_file);
682
backdrop_dirs = xfce_resource_lookup_all(XFCE_RESOURCE_DATA,
684
for(i = 0; backdrop_dirs[i]; ++i) {
685
tmp = xfdesktop_image_list_add_dir(ls, backdrop_dirs[i],
688
image_file_iter = tmp;
692
image_file_iter = xfdesktop_settings_image_treeview_add(GTK_TREE_MODEL(ls), image_file);
694
panel->image_list_loaded = FALSE;
695
panel->image_selector_loaded = TRUE;
696
gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
698
g_warning("xfdesktop_settings_populate_image_list() called when image style set to 'none'");
703
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), COL_NAME,
704
image_list_sort, NULL, NULL);
705
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), COL_NAME,
709
gtk_tree_view_set_model(GTK_TREE_VIEW(panel->image_treeview),
711
if(image_file_iter) {
712
gtk_tree_selection_select_iter(sel, image_file_iter);
713
gtk_tree_iter_free(image_file_iter);
715
/* remember the tree view to scroll to the selected image in the
716
* thread that creates all the previews */
717
g_object_set_data_full(G_OBJECT(ls), "xfdesktop-tree-view",
718
g_object_ref(panel->image_treeview),
722
/* generate previews of each image -- the new thread will own
723
* the reference on the list store, so let's not unref it here */
724
if(!g_thread_create(xfdesktop_settings_create_all_previews, ls, FALSE, NULL)) {
725
g_critical("Failed to spawn thread; backdrop previews will be unavailable.");
726
g_object_unref(G_OBJECT(ls));
735
newlist_button_clicked(GtkWidget *button,
738
AppearancePanel *panel = user_data;
739
gchar *list_file, propname[1024];
741
list_file = xfdesktop_settings_dialog_create_load_list(panel);
745
g_snprintf(propname, sizeof(propname), PER_SCREEN_PROP_FORMAT "/image-path",
746
panel->screen, panel->monitor);
747
xfconf_channel_set_string(panel->channel, propname, list_file);
750
xfdesktop_settings_dialog_populate_image_list(panel);
754
cb_xfdesktop_chk_custom_font_size_toggled(GtkCheckButton *button,
757
GtkWidget *spin_button = GTK_WIDGET(user_data);
758
gtk_widget_set_sensitive(spin_button,
759
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
763
xfdesktop_spin_icon_size_timer(GtkSpinButton *button)
765
XfconfChannel *channel = g_object_get_data(G_OBJECT(button), "xfconf-chanel");
767
g_return_val_if_fail(XFCONF_IS_CHANNEL(channel), FALSE);
769
xfconf_channel_set_uint(channel,
770
DESKTOP_ICONS_ICON_SIZE_PROP,
771
gtk_spin_button_get_value(button));
777
cb_xfdesktop_spin_icon_size_changed(GtkSpinButton *button,
782
g_object_set_data(G_OBJECT(button), "xfconf-chanel", user_data);
784
timer_id = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(button), "timer-id"));
786
g_source_remove(timer_id);
790
timer_id = g_timeout_add(2000,
791
(GSourceFunc)xfdesktop_spin_icon_size_timer,
794
g_object_set_data(G_OBJECT(button), "timer-id", GUINT_TO_POINTER(timer_id));
798
xfdesktop_settings_save_backdrop_list(AppearancePanel *panel,
803
gchar **images = NULL, *list_file;
805
gchar propname[1024];
806
GError *error = NULL;
808
n_images = gtk_tree_model_iter_n_children(model, NULL);
809
images = g_new(gchar *, n_images + 1);
810
images[n_images] = NULL;
812
if(gtk_tree_model_get_iter_first(model, &iter)) {
816
gtk_tree_model_get(model, &iter,
817
COL_FILENAME, &(images[i++]),
819
} while(gtk_tree_model_iter_next(model, &iter));
822
g_snprintf(propname, sizeof(propname),
823
PER_SCREEN_PROP_FORMAT "/last-image-list",
824
panel->screen, panel->monitor);
825
list_file = xfconf_channel_get_string(panel->channel, propname, NULL);
827
list_file = xfce_resource_save_location(XFCE_RESOURCE_CONFIG,
828
DEFAULT_BACKDROP_LIST, TRUE);
829
g_warning("Didn't find prop %s when saving backdrop list; using default %s",
830
propname, list_file);
833
if(!xfdesktop_backdrop_list_save(list_file, images, &error)) {
834
gchar *primary = g_strdup_printf(_("Failed to write backdrop list to \"%s\""),
837
xfce_message_dialog(GTK_WINDOW(gtk_widget_get_toplevel(panel->frame_image_list)),
838
_("Backdrop List Error"), GTK_STOCK_DIALOG_ERROR,
839
primary, error->message,
840
GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
854
add_file_button_clicked(GtkWidget *button,
857
AppearancePanel *panel = user_data;
859
GtkFileFilter *filter;
861
chooser = gtk_file_chooser_dialog_new(_("Add Image File(s)"),
862
GTK_WINDOW(gtk_widget_get_toplevel(button)),
863
GTK_FILE_CHOOSER_ACTION_OPEN,
864
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
865
GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
867
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser), TRUE);
869
filter = gtk_file_filter_new();
870
gtk_file_filter_set_name(filter, _("Image files"));
871
gtk_file_filter_add_pixbuf_formats(filter);
872
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
874
filter = gtk_file_filter_new();
875
gtk_file_filter_set_name(filter, _("All files"));
876
gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME,
877
(GtkFileFilterFunc)gtk_true, NULL, NULL);
878
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
881
exo_gtk_file_chooser_add_thumbnail_preview(GTK_FILE_CHOOSER(chooser));
884
if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) {
885
GSList *filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser));
886
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(panel->image_treeview));
888
PreviewData *pdata = g_new0(PreviewData, 1);
889
pdata->model = g_object_ref(G_OBJECT(model));
891
for(l = filenames; l; l = l->next) {
892
GtkTreeIter *iter = xfdesktop_settings_image_treeview_add(model, l->data);
894
pdata->iters = g_slist_prepend(pdata->iters, iter);
896
/* auto-select the first one added */
898
GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(panel->image_treeview));
899
gtk_tree_selection_select_iter(sel, iter);
903
g_slist_free(filenames);
906
|| !g_thread_create(xfdesktop_settings_create_some_previews,
910
g_critical("Unable to create thread for single image preview.");
911
g_object_unref(G_OBJECT(pdata->model));
912
g_slist_foreach(pdata->iters, (GFunc)gtk_tree_iter_free, NULL);
913
g_slist_free(pdata->iters);
917
if(panel->image_list_loaded) {
918
xfdesktop_settings_save_backdrop_list(panel, model);
920
/* if we just added the first image, instruct xfdesktop
922
if(gtk_tree_model_iter_n_children(model, NULL) == 1)
923
g_spawn_command_line_async("xfdesktop --reload", NULL);
927
gtk_widget_destroy(chooser);
931
remove_file_button_clicked(GtkWidget *button,
934
AppearancePanel *panel = user_data;
935
GtkTreeSelection *sel;
936
GtkTreeModel *model = NULL;
939
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(panel->image_treeview));
940
rows = gtk_tree_selection_get_selected_rows(sel, &model);
942
GSList *rrefs = NULL, *m;
945
for(l = rows; l; l = l->next) {
946
rrefs = g_slist_prepend(rrefs, gtk_tree_row_reference_new(model,
948
gtk_tree_path_free(l->data);
952
for(m = rrefs; m; m = m->next) {
953
GtkTreePath *path = gtk_tree_row_reference_get_path(m->data);
955
if(gtk_tree_model_get_iter(model, &iter, path))
956
gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
958
gtk_tree_path_free(path);
959
gtk_tree_row_reference_free(m->data);
963
xfdesktop_settings_save_backdrop_list(panel, model);
968
cb_xfdesktop_combo_color_changed(GtkComboBox *combo,
977
AppearancePanel *panel = user_data;
979
if(gtk_combo_box_get_active(combo) == COLORS_SOLID) {
980
gtk_widget_set_sensitive(panel->color1_btn, TRUE);
981
gtk_widget_set_sensitive(panel->color2_btn, FALSE);
982
} else if(gtk_combo_box_get_active(combo) == COLORS_NONE) {
983
gtk_widget_set_sensitive(panel->color1_btn, FALSE);
984
gtk_widget_set_sensitive(panel->color2_btn, FALSE);
986
gtk_widget_set_sensitive(panel->color1_btn, TRUE);
987
gtk_widget_set_sensitive(panel->color2_btn, TRUE);
992
cb_image_type_radio_clicked(GtkWidget *w,
995
AppearancePanel *panel = user_data;
996
gchar prop_image_show[1024], prop_image_path[1024];
998
if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
1001
g_snprintf(prop_image_show, sizeof(prop_image_show),
1002
PER_SCREEN_PROP_FORMAT "/image-show", panel->screen,
1004
g_snprintf(prop_image_path, sizeof(prop_image_path),
1005
PER_SCREEN_PROP_FORMAT "/image-path", panel->screen,
1008
if(w == panel->radio_singleimage) {
1009
DBG("widget is singleimage");
1010
if(!panel->image_selector_loaded) {
1011
DBG("about to populate image list with avail backdrops");
1012
if(!xfdesktop_settings_dialog_populate_image_list(panel)) {
1013
DBG("show_image=%s", panel->show_image?"true":"false");
1014
if(panel->show_image) {
1015
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist),
1018
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
1025
gtk_widget_set_sensitive(panel->btn_minus, FALSE);
1026
gtk_widget_set_sensitive(panel->btn_newlist, FALSE);
1027
gtk_widget_set_sensitive(panel->frame_image_list, TRUE);
1028
DBG("show_image=%s", panel->show_image?"true":"false");
1029
if(!panel->show_image) {
1030
panel->show_image = TRUE;
1031
xfconf_channel_set_bool(panel->channel, prop_image_show, TRUE);
1033
} else if(w == panel->radio_imagelist) {
1034
DBG("widget is imagelist");
1035
if(!panel->image_list_loaded) {
1036
DBG("about to populate image list with backdrop list file");
1037
if(!xfdesktop_settings_dialog_populate_image_list(panel)) {
1038
DBG("show_image=%s", panel->show_image?"true":"false");
1039
if(panel->show_image) {
1040
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_singleimage),
1043
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
1050
gtk_widget_set_sensitive(panel->btn_minus, TRUE);
1051
gtk_widget_set_sensitive(panel->btn_newlist, TRUE);
1052
gtk_widget_set_sensitive(panel->frame_image_list, TRUE);
1053
DBG("show_image=%s", panel->show_image?"true":"false");
1054
if(!panel->show_image) {
1055
panel->show_image = TRUE;
1056
xfconf_channel_set_bool(panel->channel, prop_image_show, TRUE);
1058
} else if(w == panel->radio_none) {
1059
DBG("widget is none");
1060
gtk_widget_set_sensitive(panel->frame_image_list, FALSE);
1061
DBG("show_image=%s", panel->show_image?"true":"false");
1062
if(panel->show_image) {
1063
panel->show_image = FALSE;
1064
xfconf_channel_set_bool(panel->channel, prop_image_show, FALSE);
1070
cb_show_image_changed(XfconfChannel *channel,
1071
const gchar *property,
1072
const GValue *value,
1075
AppearancePanel *panel = user_data;
1077
TRACE("entering, value=%s, panel->show_image=%s",
1078
g_value_get_boolean(value)?"true":"false",
1079
panel->show_image?"true":"false");
1080
if(g_value_get_boolean(value) == panel->show_image)
1083
if(g_value_get_boolean(value)) {
1084
gchar propname[1024], *filename;
1086
g_snprintf(propname, sizeof(propname),
1087
PER_SCREEN_PROP_FORMAT "/image-path",
1088
panel->screen, panel->monitor);
1089
filename = xfconf_channel_get_string(channel, propname, NULL);
1090
if(filename && xfdesktop_backdrop_list_is_valid(filename)) {
1091
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist),
1094
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_singleimage),
1099
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
1105
suboptions_set_sensitive(GtkToggleButton *btn,
1108
GtkWidget *box = user_data;
1109
gtk_widget_set_sensitive(box, gtk_toggle_button_get_active(btn));
1113
image_treeview_drag_data_received(GtkWidget *widget,
1114
GdkDragContext *context,
1117
GtkSelectionData *selection_data,
1122
AppearancePanel *panel = user_data;
1123
gboolean file_added;
1125
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
1126
PreviewData *pdata = g_new0(PreviewData, 1);
1128
pdata->model = g_object_ref(G_OBJECT(model));
1130
if(TARGET_TEXT_URI_LIST != info
1131
|| selection_data->format != 8
1132
|| selection_data->length <= 0)
1134
gtk_drag_finish(context, FALSE, FALSE, time_);
1138
p = (gchar *)selection_data->data;
1143
while(g_ascii_isspace(*p))
1147
while(*q && *q != '\n' && *q != '\r')
1152
while(g_ascii_isspace(*q))
1155
if(!strncmp(p, "file://", 7)) {
1156
/* we only handle file uris */
1157
gchar oldq, *filename;
1163
filename = g_filename_from_uri(p, NULL, NULL);
1165
GtkTreeIter *iter = NULL;
1167
if(g_file_test(filename, G_FILE_TEST_IS_DIR)) {
1168
GDir *dir = g_dir_open(filename, 0, 0);
1172
gchar buf[PATH_MAX];
1173
gboolean needs_slash = TRUE;
1175
if(filename[strlen(filename)-1] == '/')
1176
needs_slash = FALSE;
1178
while((name = g_dir_read_name(dir))) {
1179
g_snprintf(buf, sizeof(buf),
1180
needs_slash ? "%s/%s" : "%s%s",
1182
iter = xfdesktop_settings_image_treeview_add(model, buf);
1184
pdata->iters = g_slist_prepend(pdata->iters, iter);
1188
} else if(g_file_test(filename, G_FILE_TEST_EXISTS)) {
1189
iter = xfdesktop_settings_image_treeview_add(model, filename);
1191
pdata->iters = g_slist_prepend(pdata->iters, iter);
1202
p = strchr(p, '\n');
1207
file_added = !!pdata->iters;
1210
|| !g_thread_create(xfdesktop_settings_create_some_previews,
1211
pdata, FALSE, NULL))
1214
g_critical("Unable to create thread for single image preview.");
1215
g_object_unref(G_OBJECT(pdata->model));
1216
g_slist_foreach(pdata->iters, (GFunc)gtk_tree_iter_free, NULL);
1217
g_slist_free(pdata->iters);
1221
gtk_drag_finish(context, file_added, FALSE, time_);
1223
if(file_added && panel->image_list_loaded)
1224
xfdesktop_settings_save_backdrop_list(panel, model);
1228
xfdesktop_settings_setup_image_treeview(AppearancePanel *panel)
1230
static GtkTargetEntry drag_targets[] = {
1231
{ "text/uri-list", 0, TARGET_TEXT_URI_LIST },
1233
GtkCellRenderer *render;
1234
GtkTreeViewColumn *col;
1236
render = gtk_cell_renderer_pixbuf_new();
1237
col = gtk_tree_view_column_new_with_attributes("thumbnail", render,
1238
"pixbuf", COL_PIX, NULL);
1239
gtk_tree_view_append_column(GTK_TREE_VIEW(panel->image_treeview),
1241
render = gtk_cell_renderer_text_new();
1242
col = gtk_tree_view_column_new_with_attributes("name", render,
1243
"markup", COL_NAME, NULL);
1244
gtk_tree_view_append_column(GTK_TREE_VIEW(panel->image_treeview),
1247
g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(panel->image_treeview))),
1249
G_CALLBACK(cb_image_selection_changed), panel);
1251
gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(panel->image_treeview),
1253
GDK_ACTION_DEFAULT | GDK_ACTION_COPY);
1255
g_signal_connect(G_OBJECT(panel->image_treeview), "drag-data-received",
1256
G_CALLBACK(image_treeview_drag_data_received), panel);
1260
xfdesktop_settings_dialog_new(GtkBuilder *main_gxml,
1261
XfconfChannel *channel)
1263
gint i, j, nmonitors, nscreens;
1264
GtkWidget *dialog, *appearance_container, *chk_custom_font_size,
1265
*spin_font_size, *color_style_widget, *w, *box,
1266
*spin_icon_size, *chk_show_thumbnails;
1268
dialog = GTK_WIDGET(gtk_builder_get_object(main_gxml, "prefs_dialog"));
1269
appearance_container = GTK_WIDGET(gtk_builder_get_object(main_gxml,
1270
"notebook_screens"));
1272
spin_icon_size = GTK_WIDGET(gtk_builder_get_object(main_gxml, "spin_icon_size"));
1274
g_signal_connect(G_OBJECT(spin_icon_size), "value-changed",
1275
G_CALLBACK(cb_xfdesktop_spin_icon_size_changed),
1278
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_icon_size),
1279
xfconf_channel_get_uint(channel,
1280
DESKTOP_ICONS_ICON_SIZE_PROP,
1281
DEFAULT_ICON_SIZE));
1283
chk_custom_font_size = GTK_WIDGET(gtk_builder_get_object(main_gxml,
1284
"chk_custom_font_size"));
1285
spin_font_size = GTK_WIDGET(gtk_builder_get_object(main_gxml, "spin_font_size"));
1287
g_signal_connect(G_OBJECT(chk_custom_font_size), "toggled",
1288
G_CALLBACK(cb_xfdesktop_chk_custom_font_size_toggled),
1291
chk_show_thumbnails = GTK_WIDGET(gtk_builder_get_object(main_gxml,
1292
"chk_show_thumbnails"));
1294
nscreens = gdk_display_get_n_screens(gdk_display_get_default());
1296
for(i = 0; i < nscreens; ++i) {
1297
GdkDisplay *gdpy = gdk_display_get_default();
1298
GdkScreen *screen = gdk_display_get_screen(gdpy, i);
1299
nmonitors = gdk_screen_get_n_monitors(screen);
1301
if(nscreens > 1 || nmonitors > 1) {
1302
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(appearance_container), TRUE);
1303
gtk_container_set_border_width(GTK_CONTAINER(appearance_container), 12);
1306
for(j = 0; j < nmonitors; ++j) {
1308
GtkBuilder *appearance_gxml;
1309
AppearancePanel *panel = g_new0(AppearancePanel, 1);
1310
GtkWidget *appearance_settings, *appearance_label;
1311
GError *error = NULL;
1313
panel->channel = channel;
1317
if(nscreens > 1 && nmonitors > 1) {
1318
gchar *monitor_name = gdk_screen_get_monitor_plug_name(screen,
1321
g_snprintf(buf, sizeof(buf),
1322
_("Screen %d, Monitor %d (%s)"), i+1, j+1,
1324
g_free(monitor_name);
1326
g_snprintf(buf, sizeof(buf), _("Screen %d, Monitor %d"),
1328
} else if(nscreens > 1)
1329
g_snprintf(buf, sizeof(buf), _("Screen %d"), i+1);
1331
gchar *monitor_name = gdk_screen_get_monitor_plug_name(screen,
1334
g_snprintf(buf, sizeof(buf), _("Monitor %d (%s)"),
1336
g_free(monitor_name);
1338
g_snprintf(buf, sizeof(buf), _("Monitor %d"), j+1);
1341
appearance_gxml = gtk_builder_new();
1342
if(!gtk_builder_add_from_string(appearance_gxml,
1343
xfdesktop_settings_appearance_frame_ui,
1344
xfdesktop_settings_appearance_frame_ui_length,
1347
g_printerr("Failed to parse appearance settings UI description: %s\n",
1349
g_error_free(error);
1353
appearance_settings = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1354
"alignment_settings"));
1356
appearance_label = gtk_label_new_with_mnemonic(buf);
1357
gtk_widget_show(appearance_label);
1359
gtk_notebook_append_page(GTK_NOTEBOOK(appearance_container),
1360
appearance_settings, appearance_label);
1362
/* Connect xfconf bindings */
1363
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/brightness",
1365
panel->brightness_slider = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1366
"slider_brightness"));
1367
xfconf_g_property_bind(channel, buf, G_TYPE_INT,
1368
G_OBJECT(gtk_range_get_adjustment(GTK_RANGE(panel->brightness_slider))),
1371
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/saturation",
1373
panel->saturation_slider = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1374
"slider_saturation"));
1375
xfconf_g_property_bind(channel, buf, G_TYPE_DOUBLE,
1376
G_OBJECT(gtk_range_get_adjustment(GTK_RANGE(panel->saturation_slider))),
1379
w = GTK_WIDGET(gtk_builder_get_object(appearance_gxml, "combo_style"));
1380
gtk_combo_box_set_active(GTK_COMBO_BOX(w), 0);
1381
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/image-style",
1383
xfconf_g_property_bind(channel, buf, G_TYPE_INT,
1384
G_OBJECT(w), "active");
1386
color_style_widget = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1388
gtk_combo_box_set_active(GTK_COMBO_BOX(color_style_widget), 0);
1389
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/color-style",
1391
xfconf_g_property_bind(channel, buf, G_TYPE_INT,
1392
G_OBJECT(color_style_widget), "active");
1393
g_signal_connect(G_OBJECT(color_style_widget), "changed",
1394
G_CALLBACK(cb_xfdesktop_combo_color_changed),
1397
panel->color1_btn = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1399
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/color1",
1401
xfconf_g_property_bind_gdkcolor(channel, buf,
1402
G_OBJECT(panel->color1_btn),
1405
panel->color2_btn = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1407
g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/color2",
1409
xfconf_g_property_bind_gdkcolor(channel, buf,
1410
G_OBJECT(panel->color2_btn),
1413
cb_xfdesktop_combo_color_changed(GTK_COMBO_BOX(color_style_widget),
1416
panel->frame_image_list = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1417
"frame_image_list"));
1419
panel->image_treeview = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1420
"treeview_imagelist"));
1421
xfdesktop_settings_setup_image_treeview(panel);
1423
panel->btn_plus = GTK_WIDGET(gtk_builder_get_object(appearance_gxml, "btn_plus"));
1424
g_signal_connect(G_OBJECT(panel->btn_plus), "clicked",
1425
G_CALLBACK(add_file_button_clicked), panel);
1427
panel->btn_minus = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1429
g_signal_connect(G_OBJECT(panel->btn_minus), "clicked",
1430
G_CALLBACK(remove_file_button_clicked), panel);
1432
panel->btn_newlist = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1434
g_signal_connect(G_OBJECT(panel->btn_newlist), "clicked",
1435
G_CALLBACK(newlist_button_clicked), panel);
1437
panel->radio_singleimage = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1438
"radio_singleimage"));
1439
g_signal_connect(G_OBJECT(panel->radio_singleimage), "toggled",
1440
G_CALLBACK(cb_image_type_radio_clicked), panel);
1441
panel->radio_imagelist = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1442
"radio_imagelist"));
1443
g_signal_connect(G_OBJECT(panel->radio_imagelist), "toggled",
1444
G_CALLBACK(cb_image_type_radio_clicked), panel);
1445
panel->radio_none = GTK_WIDGET(gtk_builder_get_object(appearance_gxml,
1447
g_signal_connect(G_OBJECT(panel->radio_none), "toggled",
1448
G_CALLBACK(cb_image_type_radio_clicked), panel);
1449
g_snprintf(buf, sizeof(buf),
1450
"property-changed::" PER_SCREEN_PROP_FORMAT "/image-show",
1452
g_signal_connect(G_OBJECT(channel), buf,
1453
G_CALLBACK(cb_show_image_changed), panel);
1455
if(!xfconf_channel_get_bool(channel, buf+18, TRUE)) {
1456
panel->show_image = FALSE;
1457
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
1460
gchar *image_path = NULL;
1462
panel->show_image = TRUE;
1464
g_snprintf(buf, sizeof(buf),
1465
PER_SCREEN_PROP_FORMAT "/image-path", i, j);
1466
image_path = xfconf_channel_get_string(channel, buf, NULL);
1467
if(image_path && xfdesktop_backdrop_list_is_valid(image_path)) {
1468
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist),
1471
xfdesktop_settings_dialog_populate_image_list(panel);
1476
g_object_unref(G_OBJECT(appearance_gxml));
1480
w = GTK_WIDGET(gtk_builder_get_object(main_gxml, "chk_show_desktop_menu"));
1481
xfconf_g_property_bind(channel, SHOW_DESKTOP_MENU_PROP, G_TYPE_BOOLEAN,
1482
G_OBJECT(w), "active");
1483
box = GTK_WIDGET(gtk_builder_get_object(main_gxml, "box_menu_subopts"));
1484
g_signal_connect(G_OBJECT(w), "toggled",
1485
G_CALLBACK(suboptions_set_sensitive), box);
1486
suboptions_set_sensitive(GTK_TOGGLE_BUTTON(w), box);
1488
xfconf_g_property_bind(channel, DESKTOP_MENU_SHOW_ICONS_PROP,
1490
G_OBJECT(GTK_WIDGET(gtk_builder_get_object(main_gxml,
1491
"chk_menu_show_app_icons"))),
1494
w = GTK_WIDGET(gtk_builder_get_object(main_gxml, "chk_show_winlist_menu"));
1495
xfconf_g_property_bind(channel, WINLIST_SHOW_WINDOWS_MENU_PROP,
1496
G_TYPE_BOOLEAN, G_OBJECT(w), "active");
1497
box = GTK_WIDGET(gtk_builder_get_object(main_gxml, "box_winlist_subopts"));
1498
g_signal_connect(G_OBJECT(w), "toggled",
1499
G_CALLBACK(suboptions_set_sensitive), box);
1500
suboptions_set_sensitive(GTK_TOGGLE_BUTTON(w), box);
1502
xfconf_g_property_bind(channel, WINLIST_SHOW_APP_ICONS_PROP, G_TYPE_BOOLEAN,
1503
gtk_builder_get_object(main_gxml, "chk_winlist_show_app_icons"),
1506
xfconf_g_property_bind(channel, WINLIST_SHOW_STICKY_WIN_ONCE_PROP,
1508
gtk_builder_get_object(main_gxml, "chk_show_winlist_sticky_once"),
1511
w = GTK_WIDGET(gtk_builder_get_object(main_gxml, "chk_show_winlist_ws_names"));
1512
xfconf_g_property_bind(channel, WINLIST_SHOW_WS_NAMES_PROP, G_TYPE_BOOLEAN,
1513
G_OBJECT(w), "active");
1514
box = GTK_WIDGET(gtk_builder_get_object(main_gxml, "box_winlist_names_subopts"));
1515
g_signal_connect(G_OBJECT(w), "toggled",
1516
G_CALLBACK(suboptions_set_sensitive), box);
1517
suboptions_set_sensitive(GTK_TOGGLE_BUTTON(w), box);
1519
xfconf_g_property_bind(channel, WINLIST_SHOW_WS_SUBMENUS_PROP,
1521
gtk_builder_get_object(main_gxml, "chk_show_winlist_ws_submenus"),
1524
w = GTK_WIDGET(gtk_builder_get_object(main_gxml, "combo_icons"));
1525
#ifdef ENABLE_FILE_ICONS
1526
gtk_combo_box_set_active(GTK_COMBO_BOX(w), 2);
1528
gtk_combo_box_set_active(GTK_COMBO_BOX(w), 1);
1530
xfconf_g_property_bind(channel, DESKTOP_ICONS_STYLE_PROP, G_TYPE_INT,
1531
G_OBJECT(w), "active");
1532
xfconf_g_property_bind(channel, DESKTOP_ICONS_FONT_SIZE_PROP, G_TYPE_DOUBLE,
1533
G_OBJECT(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin_font_size))),
1535
xfconf_g_property_bind(channel, DESKTOP_ICONS_CUSTOM_FONT_SIZE_PROP,
1536
G_TYPE_BOOLEAN, G_OBJECT(chk_custom_font_size),
1538
xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_THUMBNAILS_PROP,
1539
G_TYPE_BOOLEAN, G_OBJECT(chk_show_thumbnails),
1542
setup_special_icon_list(main_gxml, channel);
1547
static GdkNativeWindow opt_socket_id = 0;
1548
static gboolean opt_version = FALSE;
1549
static GOptionEntry option_entries[] = {
1550
{ "socket-id", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &opt_socket_id, N_("Settings manager socket"), N_("SOCKET ID") },
1551
{ "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_version, N_("Version information"), NULL },
1556
main(int argc, char **argv)
1558
XfconfChannel *channel;
1561
GError *error = NULL;
1563
g_thread_init(NULL);
1566
xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
1568
if(!gtk_init_with_args(&argc, &argv, "", option_entries, PACKAGE, &error)) {
1569
if(G_LIKELY(error)) {
1570
g_printerr("%s: %s.\n", G_LOG_DOMAIN, error->message);
1571
g_printerr(_("Type '%s --help' for usage."), G_LOG_DOMAIN);
1573
g_error_free(error);
1575
g_error("Unable to open display.");
1577
return EXIT_FAILURE;
1580
if(G_UNLIKELY(opt_version)) {
1581
g_print("%s %s (Xfce %s)\n\n", G_LOG_DOMAIN, VERSION, xfce_version_string());
1582
g_print("%s\n", "Copyright (c) 2004-2008");
1583
g_print("\t%s\n\n", _("The Xfce development team. All rights reserved."));
1584
g_print(_("Please report bugs to <%s>."), PACKAGE_BUGREPORT);
1587
return EXIT_SUCCESS;
1590
if(!xfconf_init(&error)) {
1591
xfce_message_dialog(NULL, _("Desktop Settings"),
1592
GTK_STOCK_DIALOG_ERROR,
1593
_("Unable to contact settings server"),
1595
GTK_STOCK_QUIT, GTK_RESPONSE_ACCEPT,
1597
g_error_free(error);
1602
gxml = gtk_builder_new();
1603
if(!gtk_builder_add_from_string(gxml, xfdesktop_settings_ui,
1604
xfdesktop_settings_ui_length,
1607
g_printerr("Failed to parse UI description: %s\n", error->message);
1608
g_error_free(error);
1612
channel = xfconf_channel_new(XFDESKTOP_CHANNEL);
1614
gdk_threads_enter();
1616
dialog = xfdesktop_settings_dialog_new(gxml, channel);
1617
if(opt_socket_id == 0) {
1618
g_object_unref(G_OBJECT(gxml));
1620
while(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_HELP)
1621
g_spawn_command_line_async("xfhelp4 xfdesktop.html", NULL);
1623
GtkWidget *plug, *plug_child;
1625
plug = gtk_plug_new(opt_socket_id);
1626
gtk_widget_show(plug);
1627
g_signal_connect(G_OBJECT(plug), "delete-event",
1628
G_CALLBACK(gtk_main_quit), NULL);
1630
gdk_notify_startup_complete();
1632
plug_child = GTK_WIDGET(gtk_builder_get_object(gxml, "alignment1"));
1633
gtk_widget_reparent(plug_child, plug);
1634
gtk_widget_show(plug_child);
1636
g_object_unref(G_OBJECT(gxml));
1641
gdk_threads_leave();
1643
g_object_unref(G_OBJECT(channel));