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.
24 #include "openbox/render.h"
30 static gboolean mapping;
32 static GtkListStore *desktop_store;
33 static int num_desktops;
34 static GList *desktop_names;
35 static GtkListStore *theme_store;
37 static void on_desktop_names_cell_edited(GtkCellRendererText *cell,
38 const gchar *path_string,
39 const gchar *new_text,
42 static void on_theme_names_selection_changed(GtkTreeSelection *sel,
46 void setup_behavior_tab()
48 GtkWidget *winresist, *edgeresist;
49 GtkWidget *winresist_l, *edgeresist_l;
50 GtkSizeGroup *group1, *group2;
52 winresist = glade_xml_get_widget(glade, "resist_window");
53 edgeresist = glade_xml_get_widget(glade, "resist_edge");
54 group1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
56 gtk_size_group_add_widget(group1, winresist);
57 gtk_size_group_add_widget(group1, edgeresist);
59 winresist_l = glade_xml_get_widget(glade, "resist_window_label");
60 edgeresist_l = glade_xml_get_widget(glade, "resist_edge_label");
61 group2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
63 gtk_size_group_add_widget(group2, winresist_l);
64 gtk_size_group_add_widget(group2, edgeresist_l);
69 GtkWidget *posi, *dir;
70 GtkWidget *posi_l, *dir_l;
71 GtkSizeGroup *group1, *group2;
73 posi = glade_xml_get_widget(glade, "dock_position");
74 dir = glade_xml_get_widget(glade, "dock_direction");
75 group1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
77 gtk_size_group_add_widget(group1, posi);
78 gtk_size_group_add_widget(group1, dir);
80 posi_l = glade_xml_get_widget(glade, "dock_position_label");
81 dir_l = glade_xml_get_widget(glade, "dock_direction_label");
82 group2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
84 gtk_size_group_add_widget(group2, posi_l);
85 gtk_size_group_add_widget(group2, dir_l);
90 gboolean on_main_window_delete_event(GtkWidget *w, GdkEvent *e, gpointer d)
96 void on_close_clicked()
101 void on_about_clicked()
103 gtk_widget_show(glade_xml_get_widget(glade, "about_window"));
106 void on_about_close_clicked()
110 about = glade_xml_get_widget(glade, "about_window");
112 gtk_widget_hide(about);
115 void on_about_window_delete_event()
119 about = glade_xml_get_widget(glade, "about_window");
121 gtk_widget_hide(about);
124 void setup_focus_mouse(GtkWidget *w)
130 b = tree_get_bool("focus/followMouse", FALSE);
131 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b);
134 GtkWidget *delay = glade_xml_get_widget(glade, "focus_delay");
135 GtkWidget *delay_l = glade_xml_get_widget(glade, "focus_delay_label");
136 GtkWidget *delay_u = glade_xml_get_widget(glade,
137 "focus_delay_label_units");
138 GtkWidget *raise = glade_xml_get_widget(glade, "focus_raise");
139 GtkWidget *last = glade_xml_get_widget(glade, "focus_last");
140 gtk_widget_set_sensitive(delay, b);
141 gtk_widget_set_sensitive(delay_l, b);
142 gtk_widget_set_sensitive(delay_u, b);
143 gtk_widget_set_sensitive(raise, b);
144 gtk_widget_set_sensitive(last, b);
150 void setup_focus_delay(GtkWidget *w)
153 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
154 tree_get_int("focus/focusDelay", 0));
158 void setup_focus_raise(GtkWidget *w)
161 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
162 tree_get_bool("focus/raiseOnFocus", FALSE));
166 void setup_focus_last(GtkWidget *w)
169 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
170 tree_get_bool("focus/focusLast", FALSE));
174 void setup_focus_new(GtkWidget *w)
177 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
178 tree_get_bool("focus/focusNew", TRUE));
182 void setup_place_mouse(GtkWidget *w)
187 s = tree_get_string("placement/policy", "Smart");
188 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
189 !g_ascii_strcasecmp(s, "UnderMouse"));
194 void setup_resist_window(GtkWidget *w)
197 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
198 tree_get_int("resistance/strength", 10));
202 void setup_resist_edge(GtkWidget *w)
205 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
206 tree_get_int("resistance/screen_edge_strength",
211 void setup_resize_contents(GtkWidget *w)
214 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
215 tree_get_bool("resize/drawContents", TRUE));
219 void setup_dock_position(GtkWidget *w)
226 s = tree_get_string("dock/position", "TopLeft");
229 if (!strcasecmp(s, "Top"))
230 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 1);
231 else if (!strcasecmp(s, "TopRight"))
232 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 2);
233 else if (!strcasecmp(s, "Left"))
234 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 3);
235 else if (!strcasecmp(s, "Right"))
236 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 4);
237 else if (!strcasecmp(s, "BottomLeft"))
238 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 5);
239 else if (!strcasecmp(s, "Bottom"))
240 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 6);
241 else if (!strcasecmp(s, "BottomRight"))
242 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 7);
243 else if (!strcasecmp(s, "Floating")) {
244 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 8);
247 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 0);
252 s = glade_xml_get_widget(glade, "dock_float_x");
253 gtk_widget_set_sensitive(s, f);
254 s = glade_xml_get_widget(glade, "dock_float_y");
255 gtk_widget_set_sensitive(s, f);
256 s = glade_xml_get_widget(glade, "dock_float_label");
257 gtk_widget_set_sensitive(s, f);
258 s = glade_xml_get_widget(glade, "dock_float_label_x");
259 gtk_widget_set_sensitive(s, f);
265 void setup_dock_float_x(GtkWidget *w)
269 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
270 tree_get_int("dock/floatingX", 0));
275 void setup_dock_float_y(GtkWidget *w)
279 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
280 tree_get_int("dock/floatingY", 0));
285 void setup_dock_stacking(GtkWidget *top, GtkWidget *normal, GtkWidget *bottom)
291 s = tree_get_string("dock/stacking", "Top");
293 if(!strcasecmp(s, "Normal"))
294 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(normal), TRUE);
295 else if(!strcasecmp(s, "Bottom"))
296 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bottom), TRUE);
298 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(top), TRUE);
304 void setup_dock_direction(GtkWidget *w)
310 s = tree_get_string("dock/direction", "Vertical");
312 if (!strcasecmp(s, "Horizontal"))
313 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 1);
315 gtk_option_menu_set_history(GTK_OPTION_MENU(w), 0);
321 void setup_dock_hide(GtkWidget *w)
327 b = tree_get_bool("dock/autoHide", FALSE);
328 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b);
331 GtkWidget *delay = glade_xml_get_widget(glade, "dock_hide_delay");
332 GtkWidget *delay_l = glade_xml_get_widget(glade, "dock_hide_label");
333 GtkWidget *delay_u = glade_xml_get_widget(glade,
334 "dock_hide_label_units");
335 gtk_widget_set_sensitive(delay, b);
336 gtk_widget_set_sensitive(delay_l, b);
337 gtk_widget_set_sensitive(delay_u, b);
343 void setup_dock_hide_delay(GtkWidget *w)
347 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
348 tree_get_int("dock/hideDelay", 300));
353 static void add_theme_dir(const gchar *dirname)
358 if ((dir = g_dir_open(dirname, 0, NULL))) {
359 while ((n = g_dir_read_name(dir))) {
362 full = g_build_filename(dirname, n, "openbox-3",
364 if (!g_file_test(full,
365 G_FILE_TEST_IS_REGULAR |
366 G_FILE_TEST_IS_SYMLINK))
372 themes = g_list_append(themes, g_strdup(n));
379 static void reset_theme_names(GtkWidget *w)
386 name = tree_get_string("theme/name", "TheBear");
388 for (it = themes; it; it = g_list_next(it))
393 p = g_build_filename(g_get_home_dir(), ".themes", NULL);
399 for (it = parse_xdg_data_dir_paths(); it; it = g_slist_next(it)) {
400 p = g_build_filename(it->data, "themes", NULL);
406 add_theme_dir(THEMEDIR);
408 themes = g_list_sort(themes, (GCompareFunc) strcasecmp);
410 gtk_list_store_clear(theme_store);
412 /* return to regular scheduled programming */
414 for (it = themes; it; it = next) {
417 next = g_list_next(it);
419 /* remove duplicates */
420 if (next && !strcmp(it->data, next->data)) {
422 themes = g_list_delete_link(themes, it);
426 gtk_list_store_append(theme_store, &iter);
427 gtk_list_store_set(theme_store, &iter,
432 if(!strcmp(name, it->data)) {
434 path = gtk_tree_path_new_from_indices(i, -1);
435 gtk_tree_view_set_cursor(GTK_TREE_VIEW(w), path, NULL, FALSE);
436 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(w), path, NULL,
447 void setup_theme_names(GtkWidget *w)
449 GtkCellRenderer *render;
450 GtkTreeViewColumn *column;
451 GtkTreeSelection *select;
456 theme_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
457 gtk_tree_view_set_model(GTK_TREE_VIEW(w), GTK_TREE_MODEL(theme_store));
458 g_object_unref (theme_store);
460 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(w)),
461 GTK_SELECTION_SINGLE);
463 render = gtk_cell_renderer_text_new();
464 column = gtk_tree_view_column_new_with_attributes
465 ("Name", render, "text", 0, NULL);
466 gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
468 /* setup the selection handler */
469 select = gtk_tree_view_get_selection(GTK_TREE_VIEW (w));
470 gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
471 g_signal_connect (G_OBJECT(select), "changed",
472 G_CALLBACK(on_theme_names_selection_changed),
475 reset_theme_names(w);
480 void setup_title_layout(GtkWidget *w)
486 layout = tree_get_string("theme/titleLayout", "NLIMC");
487 gtk_entry_set_text(GTK_ENTRY(w), layout);
493 void setup_desktop_num(GtkWidget *w)
497 num_desktops = tree_get_int("desktops/number", 4);
498 gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), num_desktops);
503 void setup_window_border(GtkWidget *w)
509 border = tree_get_bool("theme/keepBorder", TRUE);
510 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), border);
515 static void setup_font(GtkWidget *w, const gchar *place)
517 gchar *fontstring, *node;
518 gchar *name, **names;
525 node = g_strdup_printf("theme/font:place=%s/name", place);
526 name = tree_get_string(node, "Sans");
529 node = g_strdup_printf("theme/font:place=%s/size", place);
530 size = tree_get_string(node, "8");
533 node = g_strdup_printf("theme/font:place=%s/weight", place);
534 weight = tree_get_string(node, "");
537 node = g_strdup_printf("theme/font:place=%s/slant", place);
538 slant = tree_get_string(node, "");
541 /* get only the first font in the string */
542 names = g_strsplit(name, ",", 0);
544 name = g_strdup(names[0]);
547 /* don't use "normal" in the gtk string */
548 if (!g_ascii_strcasecmp(weight, "normal")) {
549 g_free(weight); weight = g_strdup("");
551 if (!g_ascii_strcasecmp(slant, "normal")) {
552 g_free(slant); slant = g_strdup("");
555 fontstring = g_strdup_printf("%s %s %s %s", name, weight, slant, size);
556 gtk_font_button_set_font_name(GTK_FONT_BUTTON(w), fontstring);
566 void setup_font_active(GtkWidget *w)
568 setup_font(w, "ActiveWindow");
571 void setup_font_inactive(GtkWidget *w)
573 setup_font(w, "InactiveWindow");
576 void setup_font_menu_header(GtkWidget *w)
578 setup_font(w, "MenuHeader");
581 void setup_font_menu_item(GtkWidget *w)
583 setup_font(w, "MenuItem");
586 void setup_font_display(GtkWidget *w)
588 setup_font(w, "OnScreenDisplay");
592 static void reset_desktop_names()
599 gtk_list_store_clear(desktop_store);
601 for (lit = desktop_names; lit; lit = g_list_next(lit))
603 g_list_free(desktop_names);
604 desktop_names = NULL;
607 n = tree_get_node("desktops/names", NULL)->children;
611 if (!xmlStrcmp(n->name, (const xmlChar*)"name")) {
612 name = parse_string(doc, n);
614 desktop_names = g_list_append(desktop_names, name);
616 gtk_list_store_append(desktop_store, &it);
617 gtk_list_store_set(desktop_store, &it,
618 0, (name[0] ? name : _("(Unnamed desktop)")),
627 while (i < num_desktops) {
628 gchar *name = g_strdup("");
630 desktop_names = g_list_append(desktop_names, name);
632 gtk_list_store_append(desktop_store, &it);
633 gtk_list_store_set(desktop_store, &it,
634 0, _("(Unnamed desktop)"),
641 void setup_desktop_names(GtkWidget *w)
643 GtkCellRenderer *render;
644 GtkTreeViewColumn *column;
648 desktop_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
649 gtk_tree_view_set_model(GTK_TREE_VIEW(w), GTK_TREE_MODEL(desktop_store));
650 g_object_unref (desktop_store);
652 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(w)),
653 GTK_SELECTION_SINGLE);
655 render = gtk_cell_renderer_text_new();
656 g_signal_connect(render, "edited",
657 G_CALLBACK (on_desktop_names_cell_edited),
660 column = gtk_tree_view_column_new_with_attributes
661 ("Name", render, "text", 0, "editable", 1, NULL);
662 gtk_tree_view_append_column(GTK_TREE_VIEW(w), column);
664 reset_desktop_names();
670 /***********************************************************************/
672 void on_window_border_toggled(GtkToggleButton *w, gpointer data)
678 b = gtk_toggle_button_get_active(w);
679 tree_set_bool("theme/keepBorder", b);
682 static void on_font_set(GtkFontButton *w, const gchar *place)
686 const gchar *size = NULL;
687 const gchar *bold = NULL;
688 const gchar *italic = NULL;
692 font = g_strdup(gtk_font_button_get_font_name(w));
693 while ((c = strrchr(font, ' '))) {
694 if (!bold && !italic && !size && atoi(c+1))
696 else if (!bold && !italic && !g_ascii_strcasecmp(c+1, "italic"))
698 else if (!bold && !g_ascii_strcasecmp(c+1, "bold"))
704 if (!bold) bold = "Normal";
705 if (!italic) italic = "Normal";
707 node = g_strdup_printf("theme/font:place=%s/name", place);
708 tree_set_string(node, font);
711 node = g_strdup_printf("theme/font:place=%s/size", place);
712 tree_set_string(node, size);
715 node = g_strdup_printf("theme/font:place=%s/weight", place);
716 tree_set_string(node, bold);
719 node = g_strdup_printf("theme/font:place=%s/slant", place);
720 tree_set_string(node, italic);
726 void on_font_active_font_set(GtkFontButton *w, gpointer data)
728 on_font_set(w, "ActiveWindow");
731 void on_font_inactive_font_set(GtkFontButton *w, gpointer data)
733 on_font_set(w, "InactiveWindow");
736 void on_font_menu_header_font_set(GtkFontButton *w, gpointer data)
738 on_font_set(w, "MenuHeader");
741 void on_font_menu_item_font_set(GtkFontButton *w, gpointer data)
743 on_font_set(w, "MenuItem");
746 void on_font_display_font_set(GtkFontButton *w, gpointer data)
748 on_font_set(w, "OnScreenDisplay");
751 void on_focus_mouse_toggled(GtkToggleButton *w, gpointer data)
757 b = gtk_toggle_button_get_active(w);
758 tree_set_bool("focus/followMouse", b);
761 GtkWidget *delay = glade_xml_get_widget(glade, "focus_delay");
762 GtkWidget *delay_l = glade_xml_get_widget(glade, "focus_delay_label");
763 GtkWidget *delay_u = glade_xml_get_widget(glade,
764 "focus_delay_label_units");
765 GtkWidget *raise = glade_xml_get_widget(glade, "focus_raise");
766 GtkWidget *last = glade_xml_get_widget(glade, "focus_last");
767 gtk_widget_set_sensitive(delay, b);
768 gtk_widget_set_sensitive(delay_l, b);
769 gtk_widget_set_sensitive(delay_u, b);
770 gtk_widget_set_sensitive(raise, b);
771 gtk_widget_set_sensitive(last, b);
775 void on_focus_delay_value_changed(GtkSpinButton *w, gpointer data)
779 tree_set_int("focus/focusDelay",
780 gtk_spin_button_get_value_as_int(w));
783 void on_focus_raise_toggled(GtkToggleButton *w, gpointer data)
787 tree_set_bool("focus/raiseOnFocus", gtk_toggle_button_get_active(w));
790 void on_focus_last_toggled(GtkToggleButton *w, gpointer data)
794 tree_set_bool("focus/focusLast", gtk_toggle_button_get_active(w));
797 void on_focus_new_toggled(GtkToggleButton *w, gpointer data)
801 tree_set_bool("focus/focusNew", gtk_toggle_button_get_active(w));
804 void on_place_mouse_toggled(GtkToggleButton *w, gpointer data)
808 tree_set_string("placement/policy",
809 (gtk_toggle_button_get_active(w) ?
810 "UnderMouse" : "Smart"));
813 void on_resist_window_value_changed(GtkSpinButton *w, gpointer data)
817 tree_set_int("resistance/strength", gtk_spin_button_get_value_as_int(w));
820 void on_resist_edge_value_changed(GtkSpinButton *w, gpointer data)
824 tree_set_int("resistance/screen_edge_strength",
825 gtk_spin_button_get_value_as_int(w));
828 void on_resize_contents_toggled(GtkToggleButton *w, gpointer data)
832 tree_set_bool("resize/drawContents", gtk_toggle_button_get_active(w));
835 void on_dock_top_left_activate(GtkMenuItem *w, gpointer data)
839 tree_set_string("dock/position", "TopLeft");
843 s = glade_xml_get_widget(glade, "dock_float_x");
844 gtk_widget_set_sensitive(s, FALSE);
845 s = glade_xml_get_widget(glade, "dock_float_y");
846 gtk_widget_set_sensitive(s, FALSE);
847 s = glade_xml_get_widget(glade, "dock_float_label");
848 gtk_widget_set_sensitive(s, FALSE);
849 s = glade_xml_get_widget(glade, "dock_float_label_x");
850 gtk_widget_set_sensitive(s, FALSE);
854 void on_dock_top_activate(GtkMenuItem *w, gpointer data)
858 tree_set_string("dock/position", "Top");
862 s = glade_xml_get_widget(glade, "dock_float_x");
863 gtk_widget_set_sensitive(s, FALSE);
864 s = glade_xml_get_widget(glade, "dock_float_y");
865 gtk_widget_set_sensitive(s, FALSE);
866 s = glade_xml_get_widget(glade, "dock_float_label");
867 gtk_widget_set_sensitive(s, FALSE);
868 s = glade_xml_get_widget(glade, "dock_float_label_x");
869 gtk_widget_set_sensitive(s, FALSE);
873 void on_dock_top_right_activate(GtkMenuItem *w, gpointer data)
877 tree_set_string("dock/position", "TopRight");
881 s = glade_xml_get_widget(glade, "dock_float_x");
882 gtk_widget_set_sensitive(s, FALSE);
883 s = glade_xml_get_widget(glade, "dock_float_y");
884 gtk_widget_set_sensitive(s, FALSE);
885 s = glade_xml_get_widget(glade, "dock_float_label");
886 gtk_widget_set_sensitive(s, FALSE);
887 s = glade_xml_get_widget(glade, "dock_float_label_x");
888 gtk_widget_set_sensitive(s, FALSE);
892 void on_dock_left_activate(GtkMenuItem *w, gpointer data)
896 tree_set_string("dock/position", "Left");
900 s = glade_xml_get_widget(glade, "dock_float_x");
901 gtk_widget_set_sensitive(s, FALSE);
902 s = glade_xml_get_widget(glade, "dock_float_y");
903 gtk_widget_set_sensitive(s, FALSE);
904 s = glade_xml_get_widget(glade, "dock_float_label");
905 gtk_widget_set_sensitive(s, FALSE);
906 s = glade_xml_get_widget(glade, "dock_float_label_x");
907 gtk_widget_set_sensitive(s, FALSE);
911 void on_dock_right_activate(GtkMenuItem *w, gpointer data)
915 tree_set_string("dock/position", "Right");
919 s = glade_xml_get_widget(glade, "dock_float_x");
920 gtk_widget_set_sensitive(s, FALSE);
921 s = glade_xml_get_widget(glade, "dock_float_y");
922 gtk_widget_set_sensitive(s, FALSE);
923 s = glade_xml_get_widget(glade, "dock_float_label");
924 gtk_widget_set_sensitive(s, FALSE);
925 s = glade_xml_get_widget(glade, "dock_float_label_x");
926 gtk_widget_set_sensitive(s, FALSE);
931 void on_dock_bottom_left_activate(GtkMenuItem *w, gpointer data)
935 tree_set_string("dock/position", "BottomLeft");
939 s = glade_xml_get_widget(glade, "dock_float_x");
940 gtk_widget_set_sensitive(s, FALSE);
941 s = glade_xml_get_widget(glade, "dock_float_y");
942 gtk_widget_set_sensitive(s, FALSE);
943 s = glade_xml_get_widget(glade, "dock_float_label");
944 gtk_widget_set_sensitive(s, FALSE);
945 s = glade_xml_get_widget(glade, "dock_float_label_x");
946 gtk_widget_set_sensitive(s, FALSE);
950 void on_dock_bottom_activate(GtkMenuItem *w, gpointer data)
954 tree_set_string("dock/position", "Bottom");
958 s = glade_xml_get_widget(glade, "dock_float_x");
959 gtk_widget_set_sensitive(s, FALSE);
960 s = glade_xml_get_widget(glade, "dock_float_y");
961 gtk_widget_set_sensitive(s, FALSE);
962 s = glade_xml_get_widget(glade, "dock_float_label");
963 gtk_widget_set_sensitive(s, FALSE);
964 s = glade_xml_get_widget(glade, "dock_float_label_x");
965 gtk_widget_set_sensitive(s, FALSE);
969 void on_dock_bottom_right_activate(GtkMenuItem *w, gpointer data)
973 tree_set_string("dock/position", "BottomRight");
977 s = glade_xml_get_widget(glade, "dock_float_x");
978 gtk_widget_set_sensitive(s, FALSE);
979 s = glade_xml_get_widget(glade, "dock_float_y");
980 gtk_widget_set_sensitive(s, FALSE);
981 s = glade_xml_get_widget(glade, "dock_float_label");
982 gtk_widget_set_sensitive(s, FALSE);
983 s = glade_xml_get_widget(glade, "dock_float_label_x");
984 gtk_widget_set_sensitive(s, FALSE);
988 void on_dock_floating_activate(GtkMenuItem *w, gpointer data)
992 tree_set_string("dock/position", "Floating");
996 s = glade_xml_get_widget(glade, "dock_float_x");
997 gtk_widget_set_sensitive(s, TRUE);
998 s = glade_xml_get_widget(glade, "dock_float_y");
999 gtk_widget_set_sensitive(s, TRUE);
1000 s = glade_xml_get_widget(glade, "dock_float_label");
1001 gtk_widget_set_sensitive(s, TRUE);
1002 s = glade_xml_get_widget(glade, "dock_float_label_x");
1003 gtk_widget_set_sensitive(s, TRUE);
1007 void on_dock_float_x_value_changed(GtkSpinButton *w, gpointer data)
1009 if (mapping) return;
1011 tree_set_int("dock/floatingX", gtk_spin_button_get_value_as_int(w));
1014 void on_dock_float_y_value_changed(GtkSpinButton *w, gpointer data)
1016 if (mapping) return;
1018 tree_set_int("dock/floatingY", gtk_spin_button_get_value_as_int(w));
1021 void on_dock_stacking_top_toggled(GtkToggleButton *w, gpointer data)
1023 if (mapping) return;
1025 if(gtk_toggle_button_get_active(w))
1026 tree_set_string("dock/stacking", "Top");
1029 void on_dock_stacking_normal_toggled(GtkToggleButton *w, gpointer data)
1031 if (mapping) return;
1033 if(gtk_toggle_button_get_active(w))
1034 tree_set_string("dock/stacking", "Normal");
1037 void on_dock_stacking_bottom_toggled(GtkToggleButton *w, gpointer data)
1039 if (mapping) return;
1041 if(gtk_toggle_button_get_active(w))
1042 tree_set_string("dock/stacking", "Bottom");
1045 void on_dock_horizontal_activate(GtkMenuItem *w, gpointer data)
1047 if (mapping) return;
1049 tree_set_string("dock/direction", "Horizontal");
1052 void on_dock_vertical_activate(GtkMenuItem *w, gpointer data)
1054 if (mapping) return;
1056 tree_set_string("dock/direction", "Vertical");
1059 void on_dock_hide_toggled(GtkToggleButton *w, gpointer data)
1061 if (mapping) return;
1063 tree_set_bool("dock/autoHide", gtk_toggle_button_get_active(w));
1065 GtkWidget *delay = glade_xml_get_widget(glade, "dock_hide_delay");
1066 GtkWidget *delay_l = glade_xml_get_widget(glade, "dock_hide_label");
1067 GtkWidget *delay_u = glade_xml_get_widget(glade,
1068 "dock_hide_label_units");
1069 gtk_widget_set_sensitive(delay, gtk_toggle_button_get_active(w));
1070 gtk_widget_set_sensitive(delay_l, gtk_toggle_button_get_active(w));
1071 gtk_widget_set_sensitive(delay_u, gtk_toggle_button_get_active(w));
1075 void on_dock_hide_delay_value_changed(GtkSpinButton *w, gpointer data)
1077 if (mapping) return;
1079 tree_set_int("dock/hideDelay",
1080 gtk_spin_button_get_value_as_int(w));
1083 void on_theme_name_changed(GtkOptionMenu *w, gpointer data)
1087 if (mapping) return;
1089 name = g_list_nth_data(themes, gtk_option_menu_get_history(w));
1092 tree_set_string("theme/name", name);
1095 void on_theme_names_selection_changed(GtkTreeSelection *sel, gpointer data)
1098 GtkTreeModel *model;
1101 if (mapping) return;
1103 if(gtk_tree_selection_get_selected(sel, &model, &iter)) {
1104 gtk_tree_model_get(model, &iter, 0, &name, -1);
1108 tree_set_string("theme/name", name);
1111 void on_title_layout_changed(GtkEntry *w, gpointer data)
1115 gboolean n, d, s, l, i, m, c;
1117 if (mapping) return;
1119 layout = g_strdup(gtk_entry_get_text(w));
1121 n = d = s = l = i = m = c = FALSE;
1123 for (it = layout; *it; ++it) {
1161 /* drop the letter */
1162 for (it2 = it; *it2; ++it2)
1170 gtk_entry_set_text(w, layout);
1171 tree_set_string("theme/titleLayout", layout);
1175 static void set_desktop_names()
1180 gint num = 0, last = -1;
1182 n = tree_get_node("desktops/names", NULL);
1183 while ((c = n->children)) {
1188 for (lit = desktop_names; lit; lit = g_list_next(lit)) {
1189 if (((gchar*)lit->data)[0]) /* not empty */
1195 for (lit = desktop_names; lit && num <= last; lit = g_list_next(lit)) {
1196 xmlNewTextChild(n, NULL, "name", lit->data);
1201 /* make openbox re-set the property */
1202 XDeleteProperty(GDK_DISPLAY(), GDK_ROOT_WINDOW(),
1203 XInternAtom(GDK_DISPLAY(), "_NET_DESKTOP_NAMES", FALSE));
1206 static void set_desktop_number()
1210 tree_set_int("desktops/number", num_desktops);
1212 ce.xclient.type = ClientMessage;
1213 ce.xclient.message_type = XInternAtom(GDK_DISPLAY(),
1214 "_NET_NUMBER_OF_DESKTOPS",
1216 ce.xclient.display = GDK_DISPLAY();
1217 ce.xclient.window = GDK_ROOT_WINDOW();
1218 ce.xclient.format = 32;
1219 ce.xclient.data.l[0] = num_desktops;
1220 ce.xclient.data.l[1] = 0;
1221 ce.xclient.data.l[2] = 0;
1222 ce.xclient.data.l[3] = 0;
1223 ce.xclient.data.l[4] = 0;
1224 XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), FALSE,
1225 SubstructureNotifyMask | SubstructureRedirectMask,
1229 void on_desktop_num_value_changed(GtkSpinButton *w, gpointer data)
1231 if (mapping) return;
1233 num_desktops = gtk_spin_button_get_value(w);
1235 set_desktop_number();
1237 reset_desktop_names();
1240 static void on_desktop_names_cell_edited(GtkCellRendererText *cell,
1241 const gchar *path_string,
1242 const gchar *new_text,
1251 if (mapping) return;
1253 path = gtk_tree_path_new_from_string (path_string);
1254 gtk_tree_model_get_iter(GTK_TREE_MODEL(desktop_store), &it, path);
1256 gtk_tree_model_get(GTK_TREE_MODEL(desktop_store), &it, 0, &old_text, -1);
1259 i = gtk_tree_path_get_indices(path)[0];
1260 lit = g_list_nth(desktop_names, i);
1263 lit->data = g_strdup(new_text);
1264 if (new_text[0]) /* not empty */
1265 gtk_list_store_set(desktop_store, &it, 0, lit->data, -1);
1267 gtk_list_store_set(desktop_store, &it, 0, _("(Unnamed desktop)"), -1);
1269 set_desktop_names();
1272 void on_install_theme_clicked(GtkButton *w, gpointer data)
1277 GtkFileFilter *filter;
1279 d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
1280 GTK_WINDOW(mainwin),
1281 GTK_FILE_CHOOSER_ACTION_OPEN,
1282 GTK_STOCK_OK, GTK_RESPONSE_OK,
1283 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
1286 gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), FALSE);
1287 filter = gtk_file_filter_new();
1288 gtk_file_filter_set_name(filter, _("Openbox theme archives"));
1289 gtk_file_filter_add_pattern(filter, "*.obt");
1290 //gtk_file_filter_add_pattern(filter, "*.tgz");
1291 //gtk_file_filter_add_pattern(filter, "*.tar.gz");
1292 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(d), filter);
1294 r = gtk_dialog_run(GTK_DIALOG(d));
1295 if (r == GTK_RESPONSE_OK)
1296 path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
1297 gtk_widget_destroy(d);
1300 handlers_install_theme(path);
1305 void on_theme_archive_clicked(GtkButton *w, gpointer data)
1311 d = gtk_file_chooser_dialog_new(_("Choose an Openbox theme"),
1312 GTK_WINDOW(mainwin),
1313 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1314 GTK_STOCK_OK, GTK_RESPONSE_OK,
1315 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
1318 gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(d), FALSE);
1319 r = gtk_dialog_run(GTK_DIALOG(d));
1320 if (r == GTK_RESPONSE_OK)
1321 path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
1322 gtk_widget_destroy(d);
1325 theme_archive(path);
1330 void handlers_install_theme(gchar *path)
1334 if ((name = theme_install(path))) {
1340 w = glade_xml_get_widget(glade, "theme_names");
1342 reset_theme_names(w);
1345 /* go to the newly installed theme */
1346 for (it = themes, i = 0; it; it = g_list_next(it), ++i)
1347 if (!strcmp(it->data, name)) break;
1349 path = gtk_tree_path_new_from_indices(i, -1);
1350 gtk_tree_view_set_cursor(GTK_TREE_VIEW(w), path, NULL, FALSE);
1351 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(w), path, NULL,