1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 handlers.h for ObConf, the configuration tool for Openbox
4 Copyright (c) 2003-2007 Dana Jansens
5 Copyright (c) 2003 Tim Riley
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 See the COPYING file for a copy of the GNU General Public License.
25 #include "openbox/render.h"
31 static gboolean mapping;
33 static GtkListStore *desktop_store;
34 static int num_desktops;
35 static GList *desktop_names;
36 static GtkListStore *theme_store;
38 static void on_desktop_names_cell_edited(GtkCellRendererText *cell,
39 const gchar *path_string,
40 const gchar *new_text,
43 static void on_theme_names_selection_changed(GtkTreeSelection *sel,
47 void setup_behavior_tab()
49 GtkWidget *winresist, *edgeresist;
50 GtkWidget *winresist_l, *edgeresist_l;
51 GtkSizeGroup *group1, *group2;
53 winresist = glade_xml_get_widget(glade, "resist_window");
54 edgeresist = glade_xml_get_widget(glade, "resist_edge");
55 group1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
57 gtk_size_group_add_widget(group1, winresist);
58 gtk_size_group_add_widget(group1, edgeresist);
60 winresist_l = glade_xml_get_widget(glade, "resist_window_label");
61 edgeresist_l = glade_xml_get_widget(glade, "resist_edge_label");
62 group2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
64 gtk_size_group_add_widget(group2, winresist_l);
65 gtk_size_group_add_widget(group2, edgeresist_l);
70 GtkWidget *posi, *dir;
71 GtkWidget *posi_l, *dir_l;
72 GtkSizeGroup *group1, *group2;
74 posi = glade_xml_get_widget(glade, "dock_position");
75 dir = glade_xml_get_widget(glade, "dock_direction");
76 group1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
78 gtk_size_group_add_widget(group1, posi);
79 gtk_size_group_add_widget(group1, dir);
81 posi_l = glade_xml_get_widget(glade, "dock_position_label");
82 dir_l = glade_xml_get_widget(glade, "dock_direction_label");
83 group2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
85 gtk_size_group_add_widget(group2, posi_l);
86 gtk_size_group_add_widget(group2, dir_l);
91 gboolean on_main_window_delete_event(GtkWidget *w, GdkEvent *e, gpointer d)
97 void on_close_clicked()
102 void on_about_clicked()
104 gtk_widget_show(glade_xml_get_widget(glade, "about_window"));
107 void on_about_close_clicked()
111 about = glade_xml_get_widget(glade, "about_window");
113 gtk_widget_hide(about);
116 void on_about_window_delete_event()
120 about = glade_xml_get_widget(glade, "about_window");
122 gtk_widget_hide(about);
125 void setup_focus_mouse(GtkWidget *w)
131 b = tree_get_bool("focus/followMouse", FALSE);
132 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b);
135 GtkWidget *delay = glade_xml_get_widget(glade, "focus_delay");
136 GtkWidget *delay_l = glade_xml_get_widget(glade, "focus_delay_label");
137 GtkWidget *delay_u = glade_xml_get_widget(glade,
138 "focus_delay_label_units");
139 GtkWidget *raise = glade_xml_get_widget(glade, "focus_raise");
140 GtkWidget *last = glade_xml_get_widget(glade, "focus_last");
141 gtk_widget_set_sensitive(delay, b);
142 gtk_widget_set_sensitive(delay_l, b);
143 gtk_widget_set_sensitive(delay_u, b);
144 gtk_widget_set_sensitive(raise, b);
145 gtk_widget_set_sensitive(last, b);
151 void setup_focus_delay(GtkWidget *w)
154 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
155 tree_get_int("focus/focusDelay", 0));
159 void setup_focus_raise(GtkWidget *w)
162 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
163 tree_get_bool("focus/raiseOnFocus", FALSE));
167 void setup_focus_last(GtkWidget *w)
170 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
171 tree_get_bool("focus/focusLast", FALSE));
175 void setup_focus_new(GtkWidget *w)
178 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
179 tree_get_bool("focus/focusNew", TRUE));
183 void setup_place_mouse(GtkWidget *w)
188 s = tree_get_string("placement/policy", "Smart");
189 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
190 !g_ascii_strcasecmp(s, "UnderMouse"));
195 void setup_resist_window(GtkWidget *w)
198 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
199 tree_get_int("resistance/strength", 10));
203 void setup_resist_edge(GtkWidget *w)
206 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
207 tree_get_int("resistance/screen_edge_strength",
212 void setup_resize_contents(GtkWidget *w)
215 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
216 tree_get_bool("resize/drawContents", TRUE));
220 void setup_dock_position(GtkWidget *w)
227 s = tree_get_string("dock/position", "TopLeft");
230 if (!strcasecmp(s, "Top"))
231 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 1);
232 else if (!strcasecmp(s, "TopRight"))
233 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 2);
234 else if (!strcasecmp(s, "Left"))
235 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 3);
236 else if (!strcasecmp(s, "Right"))
237 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 4);
238 else if (!strcasecmp(s, "BottomLeft"))
239 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 5);
240 else if (!strcasecmp(s, "Bottom"))
241 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 6);
242 else if (!strcasecmp(s, "BottomRight"))
243 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 7);
244 else if (!strcasecmp(s, "Floating")) {
245 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 8);
248 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 0);
253 s = glade_xml_get_widget(glade, "dock_float_x");
254 gtk_widget_set_sensitive(s, f);
255 s = glade_xml_get_widget(glade, "dock_float_y");
256 gtk_widget_set_sensitive(s, f);
257 s = glade_xml_get_widget(glade, "dock_float_label");
258 gtk_widget_set_sensitive(s, f);
259 s = glade_xml_get_widget(glade, "dock_float_label_x");
260 gtk_widget_set_sensitive(s, f);
266 void setup_dock_float_x(GtkWidget *w)
270 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
271 tree_get_int("dock/floatingX", 0));
276 void setup_dock_float_y(GtkWidget *w)
280 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
281 tree_get_int("dock/floatingY", 0));
286 void setup_dock_stacking(GtkWidget *top, GtkWidget *normal, GtkWidget *bottom)
292 s = tree_get_string("dock/stacking", "Top");
294 if(!strcasecmp(s, "Normal"))
295 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(normal), TRUE);
296 else if(!strcasecmp(s, "Bottom"))
297 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bottom), TRUE);
299 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(top), TRUE);
305 void setup_dock_direction(GtkWidget *w)
311 s = tree_get_string("dock/direction", "Vertical");
313 if (!strcasecmp(s, "Horizontal"))
314 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 1);
316 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 0);
322 void setup_dock_hide(GtkWidget *w)
328 b = tree_get_bool("dock/autoHide", FALSE);
329 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b);
332 GtkWidget *delay = glade_xml_get_widget(glade, "dock_hide_delay");
333 GtkWidget *delay_l = glade_xml_get_widget(glade, "dock_hide_label");
334 GtkWidget *delay_u = glade_xml_get_widget(glade,
335 "dock_hide_label_units");
336 gtk_widget_set_sensitive(delay, b);
337 gtk_widget_set_sensitive(delay_l, b);
338 gtk_widget_set_sensitive(delay_u, b);
344 void setup_dock_hide_delay(GtkWidget *w)
348 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
349 tree_get_int("dock/hideDelay", 300));
354 static void add_theme_dir(const gchar *dirname)
359 if ((dir = g_dir_open(dirname, 0, NULL))) {
360 while ((n = g_dir_read_name(dir))) {
363 full = g_build_filename(dirname, n, "openbox-3",
365 if (!g_file_test(full,
366 G_FILE_TEST_IS_REGULAR |
367 G_FILE_TEST_IS_SYMLINK))
373 themes = g_list_append(themes, g_strdup(n));
380 static void reset_theme_names(GtkWidget *w)
387 name = tree_get_string("theme/name", "TheBear");
389 for (it = themes; it; it = g_list_next(it))
394 p = g_build_filename(g_get_home_dir(), ".themes", NULL);
400 for (it = parse_xdg_data_dir_paths(); it; it = g_slist_next(it)) {
401 p = g_build_filename(it->data, "themes", NULL);
407 add_theme_dir(THEMEDIR);
409 themes = g_list_sort(themes, (GCompareFunc) strcasecmp);
411 gtk_list_store_clear(theme_store);
413 /* return to regular scheduled programming */
415 for (it = themes; it; it = next) {
418 next = g_list_next(it);
420 /* remove duplicates */
421 if (next && !strcmp(it->data, next->data)) {
423 themes = g_list_delete_link(themes, it);
427 gtk_list_store_append(theme_store, &iter);
428 gtk_list_store_set(theme_store, &iter,
433 if(!strcmp(name, it->data)) {
435 path = gtk_tree_path_new_from_indices(i, -1);
436 gtk_tree_view_set_cursor(GTK_TREE_VIEW(w), path, NULL, FALSE);
437 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(w), path, NULL,
448 void setup_theme_names(GtkWidget *w)
450 GtkCellRenderer *render;
451 GtkTreeViewColumn *column;
452 GtkTreeSelection *select;
457 theme_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
458 gtk_tree_view_set_model(GTK_TREE_VIEW(w), GTK_TREE_MODEL(theme_store));
459 g_object_unref (theme_store);
461 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(w)),
462 GTK_SELECTION_SINGLE);
464 render = gtk_cell_renderer_text_new();
465 column = gtk_tree_view_column_new_with_attributes
466 ("Name", render, "text", 0, NULL);
467 gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
469 /* setup the selection handler */
470 select = gtk_tree_view_get_selection(GTK_TREE_VIEW (w));
471 gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
472 g_signal_connect (G_OBJECT(select), "changed",
473 G_CALLBACK(on_theme_names_selection_changed),
476 reset_theme_names(w);
481 void setup_title_layout(GtkWidget *w)
487 layout = tree_get_string("theme/titleLayout", "NLIMC");
488 gtk_entry_set_text(GTK_ENTRY(w), layout);
494 void setup_desktop_num(GtkWidget *w)
498 num_desktops = tree_get_int("desktops/number", 4);
499 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), num_desktops);
504 void setup_window_border(GtkWidget *w)
510 border = tree_get_bool("theme/keepBorder", TRUE);
511 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), border);
516 static void setup_font(GtkWidget *w, const gchar *place)
518 gchar *fontstring, *node;
519 gchar *name, **names;
526 node = g_strdup_printf("theme/font:place=%s/name", place);
527 name = tree_get_string(node, "Sans");
530 node = g_strdup_printf("theme/font:place=%s/size", place);
531 size = tree_get_string(node, "8");
534 node = g_strdup_printf("theme/font:place=%s/weight", place);
535 weight = tree_get_string(node, "");
538 node = g_strdup_printf("theme/font:place=%s/slant", place);
539 slant = tree_get_string(node, "");
542 /* get only the first font in the string */
543 names = g_strsplit(name, ",", 0);
545 name = g_strdup(names[0]);
548 /* don't use "normal" in the gtk string */
549 if (!g_ascii_strcasecmp(weight, "normal")) {
550 g_free(weight); weight = g_strdup("");
552 if (!g_ascii_strcasecmp(slant, "normal")) {
553 g_free(slant); slant = g_strdup("");
556 fontstring = g_strdup_printf("%s %s %s %s", name, weight, slant, size);
557 gtk_font_button_set_font_name(GTK_FONT_BUTTON(w), fontstring);
567 void setup_font_active(GtkWidget *w)
569 setup_font(w, "ActiveWindow");
572 void setup_font_inactive(GtkWidget *w)
574 setup_font(w, "InactiveWindow");
577 void setup_font_menu_header(GtkWidget *w)
579 setup_font(w, "MenuHeader");
582 void setup_font_menu_item(GtkWidget *w)
584 setup_font(w, "MenuItem");
587 void setup_font_display(GtkWidget *w)
589 setup_font(w, "OnScreenDisplay");
593 static void reset_desktop_names()
600 gtk_list_store_clear(desktop_store);
602 for (lit = desktop_names; lit; lit = g_list_next(lit))
604 g_list_free(desktop_names);
605 desktop_names = NULL;
608 n = tree_get_node("desktops/names", NULL)->children;
612 if (!xmlStrcmp(n->name, (const xmlChar*)"name")) {
613 name = parse_string(doc, n);
615 desktop_names = g_list_append(desktop_names, name);
617 gtk_list_store_append(desktop_store, &it);
618 gtk_list_store_set(desktop_store, &it,
619 0, (name[0] ? name : _("(Unnamed desktop)")),
628 while (i < num_desktops) {
629 gchar *name = g_strdup("");
631 desktop_names = g_list_append(desktop_names, name);
633 gtk_list_store_append(desktop_store, &it);
634 gtk_list_store_set(desktop_store, &it,
635 0, _("(Unnamed desktop)"),
642 void setup_desktop_names(GtkWidget *w)
644 GtkCellRenderer *render;
645 GtkTreeViewColumn *column;
649 desktop_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
650 gtk_tree_view_set_model(GTK_TREE_VIEW(w), GTK_TREE_MODEL(desktop_store));
651 g_object_unref (desktop_store);
653 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(w)),
654 GTK_SELECTION_SINGLE);
656 render = gtk_cell_renderer_text_new();
657 g_signal_connect(render, "edited",
658 G_CALLBACK (on_desktop_names_cell_edited),
661 column = gtk_tree_view_column_new_with_attributes
662 ("Name", render, "text", 0, "editable", 1, NULL);
663 gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
665 reset_desktop_names();
671 /***********************************************************************/
673 void on_window_border_toggled(GtkToggleButton *w, gpointer data)
679 b = gtk_toggle_button_get_active(w);
680 tree_set_bool("theme/keepBorder", b);
683 static void on_font_set(GtkFontButton *w, const gchar *place)
687 const gchar *size = NULL;
688 const gchar *bold = NULL;
689 const gchar *italic = NULL;
693 font = g_strdup(gtk_font_button_get_font_name(w));
694 while ((c = strrchr(font, ' '))) {
695 if (!bold && !italic && !size && atoi(c+1))
697 else if (!bold && !italic && !g_ascii_strcasecmp(c+1, "italic"))
699 else if (!bold && !g_ascii_strcasecmp(c+1, "bold"))
705 if (!bold) bold = "Normal";
706 if (!italic) italic = "Normal";
708 node = g_strdup_printf("theme/font:place=%s/name", place);
709 tree_set_string(node, font);
712 node = g_strdup_printf("theme/font:place=%s/size", place);
713 tree_set_string(node, size);
716 node = g_strdup_printf("theme/font:place=%s/weight", place);
717 tree_set_string(node, bold);
720 node = g_strdup_printf("theme/font:place=%s/slant", place);
721 tree_set_string(node, italic);
727 void on_font_active_font_set(GtkFontButton *w, gpointer data)
729 on_font_set(w, "ActiveWindow");
732 void on_font_inactive_font_set(GtkFontButton *w, gpointer data)
734 on_font_set(w, "InactiveWindow");
737 void on_font_menu_header_font_set(GtkFontButton *w, gpointer data)
739 on_font_set(w, "MenuHeader");
742 void on_font_menu_item_font_set(GtkFontButton *w, gpointer data)
744 on_font_set(w, "MenuItem");
747 void on_font_display_font_set(GtkFontButton *w, gpointer data)
749 on_font_set(w, "OnScreenDisplay");
752 void on_focus_mouse_toggled(GtkToggleButton *w, gpointer data)
758 b = gtk_toggle_button_get_active(w);
759 tree_set_bool("focus/followMouse", b);
762 GtkWidget *delay = glade_xml_get_widget(glade, "focus_delay");
763 GtkWidget *delay_l = glade_xml_get_widget(glade, "focus_delay_label");
764 GtkWidget *delay_u = glade_xml_get_widget(glade,
765 "focus_delay_label_units");
766 GtkWidget *raise = glade_xml_get_widget(glade, "focus_raise");
767 GtkWidget *last = glade_xml_get_widget(glade, "focus_last");
768 gtk_widget_set_sensitive(delay, b);
769 gtk_widget_set_sensitive(delay_l, b);
770 gtk_widget_set_sensitive(delay_u, b);
771 gtk_widget_set_sensitive(raise, b);
772 gtk_widget_set_sensitive(last, b);
776 void on_focus_delay_value_changed(GtkSpinButton *w, gpointer data)
780 tree_set_int("focus/focusDelay",
781 gtk_spin_button_get_value_as_int(w));
784 void on_focus_raise_toggled(GtkToggleButton *w, gpointer data)
788 tree_set_bool("focus/raiseOnFocus", gtk_toggle_button_get_active(w));
791 void on_focus_last_toggled(GtkToggleButton *w, gpointer data)
795 tree_set_bool("focus/focusLast", gtk_toggle_button_get_active(w));
798 void on_focus_new_toggled(GtkToggleButton *w, gpointer data)
802 tree_set_bool("focus/focusNew", gtk_toggle_button_get_active(w));
805 void on_place_mouse_toggled(GtkToggleButton *w, gpointer data)
809 tree_set_string("placement/policy",
810 (gtk_toggle_button_get_active(w) ?
811 "UnderMouse" : "Smart"));
814 void on_resist_window_value_changed(GtkSpinButton *w, gpointer data)
818 tree_set_int("resistance/strength", gtk_spin_button_get_value_as_int(w));
821 void on_resist_edge_value_changed(GtkSpinButton *w, gpointer data)
825 tree_set_int("resistance/screen_edge_strength",
826 gtk_spin_button_get_value_as_int(w));
829 void on_resize_contents_toggled(GtkToggleButton *w, gpointer data)
833 tree_set_bool("resize/drawContents", gtk_toggle_button_get_active(w));
836 void on_dock_top_left_activate(GtkMenuItem *w, gpointer data)
840 tree_set_string("dock/position", "TopLeft");
844 s = glade_xml_get_widget(glade, "dock_float_x");
845 gtk_widget_set_sensitive(s, FALSE);
846 s = glade_xml_get_widget(glade, "dock_float_y");
847 gtk_widget_set_sensitive(s, FALSE);
848 s = glade_xml_get_widget(glade, "dock_float_label");
849 gtk_widget_set_sensitive(s, FALSE);
850 s = glade_xml_get_widget(glade, "dock_float_label_x");
851 gtk_widget_set_sensitive(s, FALSE);
855 void on_dock_top_activate(GtkMenuItem *w, gpointer data)
859 tree_set_string("dock/position", "Top");
863 s = glade_xml_get_widget(glade, "dock_float_x");
864 gtk_widget_set_sensitive(s, FALSE);
865 s = glade_xml_get_widget(glade, "dock_float_y");
866 gtk_widget_set_sensitive(s, FALSE);
867 s = glade_xml_get_widget(glade, "dock_float_label");
868 gtk_widget_set_sensitive(s, FALSE);
869 s = glade_xml_get_widget(glade, "dock_float_label_x");
870 gtk_widget_set_sensitive(s, FALSE);
874 void on_dock_top_right_activate(GtkMenuItem *w, gpointer data)
878 tree_set_string("dock/position", "TopRight");
882 s = glade_xml_get_widget(glade, "dock_float_x");
883 gtk_widget_set_sensitive(s, FALSE);
884 s = glade_xml_get_widget(glade, "dock_float_y");
885 gtk_widget_set_sensitive(s, FALSE);
886 s = glade_xml_get_widget(glade, "dock_float_label");
887 gtk_widget_set_sensitive(s, FALSE);
888 s = glade_xml_get_widget(glade, "dock_float_label_x");
889 gtk_widget_set_sensitive(s, FALSE);
893 void on_dock_left_activate(GtkMenuItem *w, gpointer data)
897 tree_set_string("dock/position", "Left");
901 s = glade_xml_get_widget(glade, "dock_float_x");
902 gtk_widget_set_sensitive(s, FALSE);
903 s = glade_xml_get_widget(glade, "dock_float_y");
904 gtk_widget_set_sensitive(s, FALSE);
905 s = glade_xml_get_widget(glade, "dock_float_label");
906 gtk_widget_set_sensitive(s, FALSE);
907 s = glade_xml_get_widget(glade, "dock_float_label_x");
908 gtk_widget_set_sensitive(s, FALSE);
912 void on_dock_right_activate(GtkMenuItem *w, gpointer data)
916 tree_set_string("dock/position", "Right");
920 s = glade_xml_get_widget(glade, "dock_float_x");
921 gtk_widget_set_sensitive(s, FALSE);
922 s = glade_xml_get_widget(glade, "dock_float_y");
923 gtk_widget_set_sensitive(s, FALSE);
924 s = glade_xml_get_widget(glade, "dock_float_label");
925 gtk_widget_set_sensitive(s, FALSE);
926 s = glade_xml_get_widget(glade, "dock_float_label_x");
927 gtk_widget_set_sensitive(s, FALSE);
932 void on_dock_bottom_left_activate(GtkMenuItem *w, gpointer data)
936 tree_set_string("dock/position", "BottomLeft");
940 s = glade_xml_get_widget(glade, "dock_float_x");
941 gtk_widget_set_sensitive(s, FALSE);
942 s = glade_xml_get_widget(glade, "dock_float_y");
943 gtk_widget_set_sensitive(s, FALSE);
944 s = glade_xml_get_widget(glade, "dock_float_label");
945 gtk_widget_set_sensitive(s, FALSE);
946 s = glade_xml_get_widget(glade, "dock_float_label_x");
947 gtk_widget_set_sensitive(s, FALSE);
951 void on_dock_bottom_activate(GtkMenuItem *w, gpointer data)
955 tree_set_string("dock/position", "Bottom");
959 s = glade_xml_get_widget(glade, "dock_float_x");
960 gtk_widget_set_sensitive(s, FALSE);
961 s = glade_xml_get_widget(glade, "dock_float_y");
962 gtk_widget_set_sensitive(s, FALSE);
963 s = glade_xml_get_widget(glade, "dock_float_label");
964 gtk_widget_set_sensitive(s, FALSE);
965 s = glade_xml_get_widget(glade, "dock_float_label_x");
966 gtk_widget_set_sensitive(s, FALSE);
970 void on_dock_bottom_right_activate(GtkMenuItem *w, gpointer data)
974 tree_set_string("dock/position", "BottomRight");
978 s = glade_xml_get_widget(glade, "dock_float_x");
979 gtk_widget_set_sensitive(s, FALSE);
980 s = glade_xml_get_widget(glade, "dock_float_y");
981 gtk_widget_set_sensitive(s, FALSE);
982 s = glade_xml_get_widget(glade, "dock_float_label");
983 gtk_widget_set_sensitive(s, FALSE);
984 s = glade_xml_get_widget(glade, "dock_float_label_x");
985 gtk_widget_set_sensitive(s, FALSE);
989 void on_dock_floating_activate(GtkMenuItem *w, gpointer data)
993 tree_set_string("dock/position", "Floating");
997 s = glade_xml_get_widget(glade, "dock_float_x");
998 gtk_widget_set_sensitive(s, TRUE);
999 s = glade_xml_get_widget(glade, "dock_float_y");
1000 gtk_widget_set_sensitive(s, TRUE);
1001 s = glade_xml_get_widget(glade, "dock_float_label");
1002 gtk_widget_set_sensitive(s, TRUE);
1003 s = glade_xml_get_widget(glade, "dock_float_label_x");
1004 gtk_widget_set_sensitive(s, TRUE);
1008 void on_dock_float_x_value_changed(GtkSpinButton *w, gpointer data)
1010 if (mapping) return;
1012 tree_set_int("dock/floatingX", gtk_spin_button_get_value_as_int(w));
1015 void on_dock_float_y_value_changed(GtkSpinButton *w, gpointer data)
1017 if (mapping) return;
1019 tree_set_int("dock/floatingY", gtk_spin_button_get_value_as_int(w));
1022 void on_dock_stacking_top_toggled(GtkToggleButton *w, gpointer data)
1024 if (mapping) return;
1026 if(gtk_toggle_button_get_active(w))
1027 tree_set_string("dock/stacking", "Top");
1030 void on_dock_stacking_normal_toggled(GtkToggleButton *w, gpointer data)
1032 if (mapping) return;
1034 if(gtk_toggle_button_get_active(w))
1035 tree_set_string("dock/stacking", "Normal");
1038 void on_dock_stacking_bottom_toggled(GtkToggleButton *w, gpointer data)
1040 if (mapping) return;
1042 if(gtk_toggle_button_get_active(w))
1043 tree_set_string("dock/stacking", "Bottom");
1046 void on_dock_horizontal_activate(GtkMenuItem *w, gpointer data)
1048 if (mapping) return;
1050 tree_set_string("dock/direction", "Horizontal");
1053 void on_dock_vertical_activate(GtkMenuItem *w, gpointer data)
1055 if (mapping) return;
1057 tree_set_string("dock/direction", "Vertical");
1060 void on_dock_hide_toggled(GtkToggleButton *w, gpointer data)
1062 if (mapping) return;
1064 tree_set_bool("dock/autoHide", gtk_toggle_button_get_active(w));
1066 GtkWidget *delay = glade_xml_get_widget(glade, "dock_hide_delay");
1067 GtkWidget *delay_l = glade_xml_get_widget(glade, "dock_hide_label");
1068 GtkWidget *delay_u = glade_xml_get_widget(glade,
1069 "dock_hide_label_units");
1070 gtk_widget_set_sensitive(delay, gtk_toggle_button_get_active(w));
1071 gtk_widget_set_sensitive(delay_l, gtk_toggle_button_get_active(w));
1072 gtk_widget_set_sensitive(delay_u, gtk_toggle_button_get_active(w));
1076 void on_dock_hide_delay_value_changed(GtkSpinButton *w, gpointer data)
1078 if (mapping) return;
1080 tree_set_int("dock/hideDelay",
1081 gtk_spin_button_get_value_as_int(w));
1084 void on_theme_name_changed(GtkOptionMenu *w, gpointer data)
1088 if (mapping) return;
1090 name = g_list_nth_data(themes, gtk_option_menu_get_history(w));
1093 tree_set_string("theme/name", name);
1096 void on_theme_names_selection_changed(GtkTreeSelection *sel, gpointer data)
1099 GtkTreeModel *model;
1102 if (mapping) return;
1104 if(gtk_tree_selection_get_selected(sel, &model, &iter)) {
1105 gtk_tree_model_get(model, &iter, 0, &name, -1);
1109 tree_set_string("theme/name", name);
1112 void on_title_layout_changed(GtkEntry *w, gpointer data)
1116 gboolean n, d, s, l, i, m, c;
1118 if (mapping) return;
1120 layout = g_strdup(gtk_entry_get_text(w));
1122 n = d = s = l = i = m = c = FALSE;
1124 for (it = layout; *it; ++it) {
1162 /* drop the letter */
1163 for (it2 = it; *it2; ++it2)
1171 gtk_entry_set_text(w, layout);
1172 tree_set_string("theme/titleLayout", layout);
1176 static void set_desktop_names()
1181 gint num = 0, last = -1;
1183 n = tree_get_node("desktops/names", NULL);
1184 while ((c = n->children)) {
1189 for (lit = desktop_names; lit; lit = g_list_next(lit)) {
1190 if (((gchar*)lit->data)[0]) /* not empty */
1196 for (lit = desktop_names; lit && num <= last; lit = g_list_next(lit)) {
1197 xmlNewTextChild(n, NULL, "name", lit->data);
1202 /* make openbox re-set the property */
1203 XDeleteProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
1204 XInternAtom(GDK_DISPLAY(), "_NET_DESKTOP_NAMES", FALSE));
1207 static void set_desktop_number()
1211 tree_set_int("desktops/number", num_desktops);
1213 ce.xclient.type = ClientMessage;
1214 ce.xclient.message_type = XInternAtom(GDK_DISPLAY(),
1215 "_NET_NUMBER_OF_DESKTOPS",
1217 ce.xclient.display = GDK_DISPLAY();
1218 ce.xclient.window = GDK_ROOT_WINDOW();
1219 ce.xclient.format = 32;
1220 ce.xclient.data.l[0] = num_desktops;
1221 ce.xclient.data.l[1] = 0;
1222 ce.xclient.data.l[2] = 0;
1223 ce.xclient.data.l[3] = 0;
1224 ce.xclient.data.l[4] = 0;
1225 XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), FALSE,
1226 SubstructureNotifyMask | SubstructureRedirectMask,
1230 void on_desktop_num_value_changed(GtkSpinButton *w, gpointer data)
1232 if (mapping) return;
1234 num_desktops = gtk_spin_button_get_value(w);
1236 set_desktop_number();
1238 reset_desktop_names();
1241 static void on_desktop_names_cell_edited(GtkCellRendererText *cell,
1242 const gchar *path_string,
1243 const gchar *new_text,
1252 if (mapping) return;
1254 path = gtk_tree_path_new_from_string (path_string);
1255 gtk_tree_model_get_iter(GTK_TREE_MODEL(desktop_store), &it, path);
1257 gtk_tree_model_get(GTK_TREE_MODEL(desktop_store), &it, 0, &old_text, -1);
1260 i = gtk_tree_path_get_indices(path)[0];
1261 lit = g_list_nth(desktop_names, i);
1264 lit->data = g_strdup(new_text);
1265 if (new_text[0]) /* not empty */
1266 gtk_list_store_set(desktop_store, &it, 0, lit->data, -1);
1268 gtk_list_store_set(desktop_store, &it, 0, _("(Unnamed desktop)"), -1);
1270 set_desktop_names();
1273 void on_install_theme_clicked(GtkButton *w, gpointer data)
1278 GtkFileFilter *filter;
1280 d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
1281 GTK_WINDOW(mainwin),
1282 GTK_FILE_CHOOSER_ACTION_OPEN,
1283 GTK_STOCK_OK, GTK_RESPONSE_OK,
1284 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
1287 gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), FALSE);
1288 filter = gtk_file_filter_new();
1289 gtk_file_filter_set_name(filter, _("Openbox theme archives"));
1290 gtk_file_filter_add_pattern(filter, "*.obt");
1291 //gtk_file_filter_add_pattern(filter, "*.tgz");
1292 //gtk_file_filter_add_pattern(filter, "*.tar.gz");
1293 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(d), filter);
1295 r = gtk_dialog_run(GTK_DIALOG(d));
1296 if (r == GTK_RESPONSE_OK)
1297 path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
1298 gtk_widget_destroy(d);
1301 handlers_install_theme(path);
1306 void on_theme_archive_clicked(GtkButton *w, gpointer data)
1312 d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
1313 GTK_WINDOW(mainwin),
1314 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1315 GTK_STOCK_OK, GTK_RESPONSE_OK,
1316 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
1319 gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), TRUE);
1320 r = gtk_dialog_run(GTK_DIALOG(d));
1321 if (r == GTK_RESPONSE_OK)
1322 path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
1323 gtk_widget_destroy(d);
1326 theme_archive(path);
1331 void handlers_install_theme(gchar *path)
1335 if ((name = theme_install(path))) {
1341 w = glade_xml_get_widget(glade, "theme_names");
1343 reset_theme_names(w);
1346 /* go to the newly installed theme */
1347 for (it = themes, i = 0; it; it = g_list_next(it), ++i)
1348 if (!strcmp(it->data, name)) break;
1350 path = gtk_tree_path_new_from_indices(i, -1);
1351 gtk_tree_view_set_cursor(GTK_TREE_VIEW(w), path, NULL, FALSE);
1352 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(w), path, NULL,