1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 config.c for the Openbox window manager
4 Copyright (c) 2006 Mikael Magnusson
5 Copyright (c) 2003-2007 Dana Jansens
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 "translate.h"
28 #include "parser/parse.h"
32 gboolean config_focus_new
;
33 gboolean config_focus_follow
;
34 guint config_focus_delay
;
35 gboolean config_focus_raise
;
36 gboolean config_focus_last
;
37 gboolean config_focus_under_mouse
;
39 ObPlacePolicy config_place_policy
;
40 gboolean config_place_center
;
42 StrutPartial config_margins
;
45 gboolean config_theme_keepborder
;
47 gchar
*config_title_layout
;
49 gboolean config_animate_iconify
;
51 RrFont
*config_font_activewindow
;
52 RrFont
*config_font_inactivewindow
;
53 RrFont
*config_font_menuitem
;
54 RrFont
*config_font_menutitle
;
55 RrFont
*config_font_osd
;
57 gint config_desktops_num
;
58 GSList
*config_desktops_names
;
59 guint config_screen_firstdesk
;
61 gboolean config_resize_redraw
;
62 gboolean config_resize_four_corners
;
63 gint config_resize_popup_show
;
64 gint config_resize_popup_pos
;
66 ObStackingLayer config_dock_layer
;
67 gboolean config_dock_floating
;
68 gboolean config_dock_nostrut
;
69 ObDirection config_dock_pos
;
72 ObOrientation config_dock_orient
;
73 gboolean config_dock_hide
;
74 guint config_dock_hide_delay
;
75 guint config_dock_show_delay
;
76 guint config_dock_app_move_button
;
77 guint config_dock_app_move_modifiers
;
79 guint config_keyboard_reset_keycode
;
80 guint config_keyboard_reset_state
;
82 gint config_mouse_threshold
;
83 gint config_mouse_dclicktime
;
84 gint config_mouse_screenedgetime
;
86 guint config_menu_hide_delay
;
87 gboolean config_menu_middle
;
88 guint config_submenu_show_delay
;
89 gboolean config_menu_client_list_icons
;
91 GSList
*config_menu_files
;
93 gint config_resist_win
;
94 gint config_resist_edge
;
96 GSList
*config_per_app_settings
;
98 ObAppSettings
* config_create_app_settings()
100 ObAppSettings
*settings
= g_new0(ObAppSettings
, 1);
101 settings
->decor
= -1;
102 settings
->shade
= -1;
103 settings
->monitor
= -1;
104 settings
->focus
= -1;
105 settings
->desktop
= 0;
106 settings
->layer
= -2;
107 settings
->iconic
= -1;
108 settings
->skip_pager
= -1;
109 settings
->skip_taskbar
= -1;
110 settings
->fullscreen
= -1;
111 settings
->max_horz
= -1;
112 settings
->max_vert
= -1;
116 #define copy_if(setting, default) \
117 if (src->setting != default) dst->setting = src->setting
118 void config_app_settings_copy_non_defaults(const ObAppSettings
*src
,
121 g_assert(src
!= NULL
);
122 g_assert(dst
!= NULL
);
130 copy_if(skip_pager
, -1);
131 copy_if(skip_taskbar
, -1);
132 copy_if(fullscreen
, -1);
133 copy_if(max_horz
, -1);
134 copy_if(max_vert
, -1);
136 if (src
->pos_given
) {
137 dst
->pos_given
= TRUE
;
138 dst
->center_x
= src
->center_x
;
139 dst
->center_y
= src
->center_y
;
140 dst
->opposite_x
= src
->opposite_x
;
141 dst
->opposite_y
= src
->opposite_y
;
142 dst
->position
.x
= src
->position
.x
;
143 dst
->position
.y
= src
->position
.y
;
144 dst
->monitor
= src
->monitor
;
150 <application name="aterm">
153 <application name="Rhythmbox">
160 .. there is a lot more settings available
165 /* Manages settings for individual applications.
166 Some notes: monitor is the screen number in a multi monitor
167 (Xinerama) setup (starting from 0) or mouse, meaning the
168 monitor the pointer is on. Default: mouse.
169 Layer can be three values, above (Always on top), below
170 (Always on bottom) and everything else (normal behaviour).
171 Positions can be an integer value or center, which will
172 center the window in the specified axis. Position is within
173 the monitor, so <position><x>center</x></position><monitor>2</monitor>
174 will center the window on the second monitor.
176 static void parse_per_app_settings(ObParseInst
*i
, xmlDocPtr doc
,
177 xmlNodePtr node
, gpointer d
)
179 xmlNodePtr app
= parse_find_node("application", node
->children
);
180 gchar
*name
= NULL
, *class = NULL
, *role
= NULL
;
181 gboolean name_set
, class_set
;
182 gboolean x_pos_given
;
185 name_set
= class_set
= x_pos_given
= FALSE
;
187 class_set
= parse_attr_string("class", app
, &class);
188 name_set
= parse_attr_string("name", app
, &name
);
189 if (class_set
|| name_set
) {
191 ObAppSettings
*settings
= config_create_app_settings();;
194 settings
->name
= g_pattern_spec_new(name
);
197 settings
->class = g_pattern_spec_new(class);
199 if (parse_attr_string("role", app
, &role
))
200 settings
->role
= g_pattern_spec_new(role
);
202 if ((n
= parse_find_node("decor", app
->children
)))
203 if (!parse_contains("default", doc
, n
))
204 settings
->decor
= parse_bool(doc
, n
);
206 if ((n
= parse_find_node("shade", app
->children
)))
207 if (!parse_contains("default", doc
, n
))
208 settings
->shade
= parse_bool(doc
, n
);
210 if ((n
= parse_find_node("position", app
->children
))) {
211 if ((c
= parse_find_node("x", n
->children
)))
212 if (!parse_contains("default", doc
, c
)) {
213 gchar
*s
= parse_string(doc
, c
);
214 if (!strcmp(s
, "center")) {
215 settings
->center_x
= TRUE
;
219 settings
->opposite_x
= TRUE
;
220 if (s
[0] == '-' || s
[0] == '+')
221 settings
->position
.x
= atoi(s
+1);
223 settings
->position
.x
= atoi(s
);
229 if (x_pos_given
&& (c
= parse_find_node("y", n
->children
)))
230 if (!parse_contains("default", doc
, c
)) {
231 gchar
*s
= parse_string(doc
, c
);
232 if (!strcmp(s
, "center")) {
233 settings
->center_y
= TRUE
;
234 settings
->pos_given
= TRUE
;
237 settings
->opposite_y
= TRUE
;
238 if (s
[0] == '-' || s
[0] == '+')
239 settings
->position
.y
= atoi(s
+1);
241 settings
->position
.y
= atoi(s
);
242 settings
->pos_given
= TRUE
;
247 if (settings
->pos_given
&&
248 (c
= parse_find_node("monitor", n
->children
)))
249 if (!parse_contains("default", doc
, c
)) {
250 gchar
*s
= parse_string(doc
, c
);
251 if (!strcmp(s
, "mouse"))
252 settings
->monitor
= 0;
254 settings
->monitor
= parse_int(doc
, c
) + 1;
259 if ((n
= parse_find_node("focus", app
->children
)))
260 if (!parse_contains("default", doc
, n
))
261 settings
->focus
= parse_bool(doc
, n
);
263 if ((n
= parse_find_node("desktop", app
->children
))) {
264 if (!parse_contains("default", doc
, n
)) {
265 gchar
*s
= parse_string(doc
, n
);
266 if (!strcmp(s
, "all"))
267 settings
->desktop
= DESKTOP_ALL
;
269 gint i
= parse_int(doc
, n
);
271 settings
->desktop
= i
;
277 if ((n
= parse_find_node("layer", app
->children
)))
278 if (!parse_contains("default", doc
, n
)) {
279 gchar
*s
= parse_string(doc
, n
);
280 if (!strcmp(s
, "above"))
282 else if (!strcmp(s
, "below"))
283 settings
->layer
= -1;
289 if ((n
= parse_find_node("iconic", app
->children
)))
290 if (!parse_contains("default", doc
, n
))
291 settings
->iconic
= parse_bool(doc
, n
);
293 if ((n
= parse_find_node("skip_pager", app
->children
)))
294 if (!parse_contains("default", doc
, n
))
295 settings
->skip_pager
= parse_bool(doc
, n
);
297 if ((n
= parse_find_node("skip_taskbar", app
->children
)))
298 if (!parse_contains("default", doc
, n
))
299 settings
->skip_taskbar
= parse_bool(doc
, n
);
301 if ((n
= parse_find_node("fullscreen", app
->children
)))
302 if (!parse_contains("default", doc
, n
))
303 settings
->fullscreen
= parse_bool(doc
, n
);
305 if ((n
= parse_find_node("maximized", app
->children
)))
306 if (!parse_contains("default", doc
, n
)) {
307 gchar
*s
= parse_string(doc
, n
);
308 if (!strcmp(s
, "horizontal")) {
309 settings
->max_horz
= TRUE
;
310 settings
->max_vert
= FALSE
;
311 } else if (!strcmp(s
, "vertical")) {
312 settings
->max_horz
= FALSE
;
313 settings
->max_vert
= TRUE
;
315 settings
->max_horz
= settings
->max_vert
=
320 config_per_app_settings
= g_slist_append(config_per_app_settings
,
321 (gpointer
) settings
);
324 app
= parse_find_node("application", app
->next
);
335 <action name="ChangeDesktop">
342 static void parse_key(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
347 gboolean is_chroot
= FALSE
;
349 if (!parse_attr_string("key", node
, &key
))
352 parse_attr_bool("chroot", node
, &is_chroot
);
354 keylist
= g_list_append(keylist
, key
);
356 if ((n
= parse_find_node("keybind", node
->children
))) {
358 parse_key(i
, doc
, n
, keylist
);
359 n
= parse_find_node("keybind", n
->next
);
362 else if ((n
= parse_find_node("action", node
->children
))) {
364 ObActionsAct
*action
;
366 action
= actions_parse(i
, doc
, n
);
368 keyboard_bind(keylist
, action
);
369 n
= parse_find_node("action", n
->next
);
374 keyboard_chroot(keylist
);
377 keylist
= g_list_delete_link(keylist
, g_list_last(keylist
));
380 static void parse_keyboard(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
386 keyboard_unbind_all();
388 if ((n
= parse_find_node("chainQuitKey", node
->children
))) {
389 key
= parse_string(doc
, n
);
390 translate_key(key
, &config_keyboard_reset_state
,
391 &config_keyboard_reset_keycode
);
395 if ((n
= parse_find_node("keybind", node
->children
)))
397 parse_key(i
, doc
, n
, NULL
);
398 n
= parse_find_node("keybind", n
->next
);
404 <context name="Titlebar">
405 <mousebind button="Left" action="Press">
406 <action name="Raise"></action>
412 static void parse_mouse(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
415 xmlNodePtr n
, nbut
, nact
;
422 node
= node
->children
;
424 if ((n
= parse_find_node("dragThreshold", node
)))
425 config_mouse_threshold
= parse_int(doc
, n
);
426 if ((n
= parse_find_node("doubleClickTime", node
)))
427 config_mouse_dclicktime
= parse_int(doc
, n
);
428 if ((n
= parse_find_node("screenEdgeWarpTime", node
)))
429 config_mouse_screenedgetime
= parse_int(doc
, n
);
431 n
= parse_find_node("context", node
);
433 if (!parse_attr_string("name", n
, &contextstr
))
435 nbut
= parse_find_node("mousebind", n
->children
);
437 if (!parse_attr_string("button", nbut
, &buttonstr
))
439 if (parse_attr_contains("press", nbut
, "action")) {
440 mact
= OB_MOUSE_ACTION_PRESS
;
441 } else if (parse_attr_contains("release", nbut
, "action")) {
442 mact
= OB_MOUSE_ACTION_RELEASE
;
443 } else if (parse_attr_contains("click", nbut
, "action")) {
444 mact
= OB_MOUSE_ACTION_CLICK
;
445 } else if (parse_attr_contains("doubleclick", nbut
,"action")) {
446 mact
= OB_MOUSE_ACTION_DOUBLE_CLICK
;
447 } else if (parse_attr_contains("drag", nbut
, "action")) {
448 mact
= OB_MOUSE_ACTION_MOTION
;
451 nact
= parse_find_node("action", nbut
->children
);
453 ObActionsAct
*action
;
455 if ((action
= actions_parse(i
, doc
, nact
)))
456 mouse_bind(buttonstr
, contextstr
, mact
, action
);
457 nact
= parse_find_node("action", nact
->next
);
461 nbut
= parse_find_node("mousebind", nbut
->next
);
465 n
= parse_find_node("context", n
->next
);
469 static void parse_focus(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
474 node
= node
->children
;
476 if ((n
= parse_find_node("focusNew", node
)))
477 config_focus_new
= parse_bool(doc
, n
);
478 if ((n
= parse_find_node("followMouse", node
)))
479 config_focus_follow
= parse_bool(doc
, n
);
480 if ((n
= parse_find_node("focusDelay", node
)))
481 config_focus_delay
= parse_int(doc
, n
) * 1000;
482 if ((n
= parse_find_node("raiseOnFocus", node
)))
483 config_focus_raise
= parse_bool(doc
, n
);
484 if ((n
= parse_find_node("focusLast", node
)))
485 config_focus_last
= parse_bool(doc
, n
);
486 if ((n
= parse_find_node("underMouse", node
)))
487 config_focus_under_mouse
= parse_bool(doc
, n
);
490 static void parse_placement(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
495 node
= node
->children
;
497 if ((n
= parse_find_node("policy", node
)))
498 if (parse_contains("UnderMouse", doc
, n
))
499 config_place_policy
= OB_PLACE_POLICY_MOUSE
;
500 if ((n
= parse_find_node("center", node
)))
501 config_place_center
= parse_bool(doc
, n
);
504 static void parse_margins(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
509 node
= node
->children
;
511 if ((n
= parse_find_node("top", node
)))
512 config_margins
.top
= MAX(0, parse_int(doc
, n
));
513 if ((n
= parse_find_node("left", node
)))
514 config_margins
.left
= MAX(0, parse_int(doc
, n
));
515 if ((n
= parse_find_node("right", node
)))
516 config_margins
.right
= MAX(0, parse_int(doc
, n
));
517 if ((n
= parse_find_node("bottom", node
)))
518 config_margins
.bottom
= MAX(0, parse_int(doc
, n
));
521 static void parse_theme(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
526 node
= node
->children
;
528 if ((n
= parse_find_node("name", node
))) {
531 g_free(config_theme
);
532 c
= parse_string(doc
, n
);
533 config_theme
= parse_expand_tilde(c
);
536 if ((n
= parse_find_node("titleLayout", node
))) {
539 g_free(config_title_layout
);
540 config_title_layout
= parse_string(doc
, n
);
542 /* replace duplicates with spaces */
543 for (c
= config_title_layout
; *c
!= '\0'; ++c
)
544 for (d
= c
+1; *d
!= '\0'; ++d
)
545 if (*c
== *d
) *d
= ' ';
547 if ((n
= parse_find_node("keepBorder", node
)))
548 config_theme_keepborder
= parse_bool(doc
, n
);
549 if ((n
= parse_find_node("animateIconify", node
)))
550 config_animate_iconify
= parse_bool(doc
, n
);
552 n
= parse_find_node("font", node
);
556 gchar
*name
= g_strdup(RrDefaultFontFamily
);
557 gint size
= RrDefaultFontSize
;
558 RrFontWeight weight
= RrDefaultFontWeight
;
559 RrFontSlant slant
= RrDefaultFontSlant
;
561 if (parse_attr_contains("ActiveWindow", n
, "place"))
562 font
= &config_font_activewindow
;
563 else if (parse_attr_contains("InactiveWindow", n
, "place"))
564 font
= &config_font_inactivewindow
;
565 else if (parse_attr_contains("MenuHeader", n
, "place"))
566 font
= &config_font_menutitle
;
567 else if (parse_attr_contains("MenuItem", n
, "place"))
568 font
= &config_font_menuitem
;
569 else if (parse_attr_contains("OnScreenDisplay", n
, "place"))
570 font
= &config_font_osd
;
574 if ((fnode
= parse_find_node("name", n
->children
))) {
576 name
= parse_string(doc
, fnode
);
578 if ((fnode
= parse_find_node("size", n
->children
))) {
579 int s
= parse_int(doc
, fnode
);
582 if ((fnode
= parse_find_node("weight", n
->children
))) {
583 gchar
*w
= parse_string(doc
, fnode
);
584 if (!g_ascii_strcasecmp(w
, "Bold"))
585 weight
= RR_FONTWEIGHT_BOLD
;
588 if ((fnode
= parse_find_node("slant", n
->children
))) {
589 gchar
*s
= parse_string(doc
, fnode
);
590 if (!g_ascii_strcasecmp(s
, "Italic"))
591 slant
= RR_FONTSLANT_ITALIC
;
592 if (!g_ascii_strcasecmp(s
, "Oblique"))
593 slant
= RR_FONTSLANT_OBLIQUE
;
597 *font
= RrFontOpen(ob_rr_inst
, name
, size
, weight
, slant
);
600 n
= parse_find_node("font", n
->next
);
604 static void parse_desktops(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
609 node
= node
->children
;
611 if ((n
= parse_find_node("number", node
))) {
612 gint d
= parse_int(doc
, n
);
614 config_desktops_num
= d
;
616 if ((n
= parse_find_node("firstdesk", node
))) {
617 gint d
= parse_int(doc
, n
);
619 config_screen_firstdesk
= (unsigned) d
;
621 if ((n
= parse_find_node("names", node
))) {
625 for (it
= config_desktops_names
; it
; it
= it
->next
)
627 g_slist_free(config_desktops_names
);
628 config_desktops_names
= NULL
;
630 nname
= parse_find_node("name", n
->children
);
632 config_desktops_names
= g_slist_append(config_desktops_names
,
633 parse_string(doc
, nname
));
634 nname
= parse_find_node("name", nname
->next
);
639 static void parse_resize(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
644 node
= node
->children
;
646 if ((n
= parse_find_node("drawContents", node
)))
647 config_resize_redraw
= parse_bool(doc
, n
);
648 if ((n
= parse_find_node("popupShow", node
))) {
649 config_resize_popup_show
= parse_int(doc
, n
);
650 if (parse_contains("Always", doc
, n
))
651 config_resize_popup_show
= 2;
652 else if (parse_contains("Never", doc
, n
))
653 config_resize_popup_show
= 0;
654 else if (parse_contains("Nonpixel", doc
, n
))
655 config_resize_popup_show
= 1;
657 if ((n
= parse_find_node("popupPosition", node
))) {
658 config_resize_popup_pos
= parse_int(doc
, n
);
659 if (parse_contains("Top", doc
, n
))
660 config_resize_popup_pos
= 1;
661 else if (parse_contains("Center", doc
, n
))
662 config_resize_popup_pos
= 0;
666 static void parse_dock(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
671 node
= node
->children
;
673 if ((n
= parse_find_node("position", node
))) {
674 if (parse_contains("TopLeft", doc
, n
))
675 config_dock_floating
= FALSE
,
676 config_dock_pos
= OB_DIRECTION_NORTHWEST
;
677 else if (parse_contains("Top", doc
, n
))
678 config_dock_floating
= FALSE
,
679 config_dock_pos
= OB_DIRECTION_NORTH
;
680 else if (parse_contains("TopRight", doc
, n
))
681 config_dock_floating
= FALSE
,
682 config_dock_pos
= OB_DIRECTION_NORTHEAST
;
683 else if (parse_contains("Right", doc
, n
))
684 config_dock_floating
= FALSE
,
685 config_dock_pos
= OB_DIRECTION_EAST
;
686 else if (parse_contains("BottomRight", doc
, n
))
687 config_dock_floating
= FALSE
,
688 config_dock_pos
= OB_DIRECTION_SOUTHEAST
;
689 else if (parse_contains("Bottom", doc
, n
))
690 config_dock_floating
= FALSE
,
691 config_dock_pos
= OB_DIRECTION_SOUTH
;
692 else if (parse_contains("BottomLeft", doc
, n
))
693 config_dock_floating
= FALSE
,
694 config_dock_pos
= OB_DIRECTION_SOUTHWEST
;
695 else if (parse_contains("Left", doc
, n
))
696 config_dock_floating
= FALSE
,
697 config_dock_pos
= OB_DIRECTION_WEST
;
698 else if (parse_contains("Floating", doc
, n
))
699 config_dock_floating
= TRUE
;
701 if (config_dock_floating
) {
702 if ((n
= parse_find_node("floatingX", node
)))
703 config_dock_x
= parse_int(doc
, n
);
704 if ((n
= parse_find_node("floatingY", node
)))
705 config_dock_y
= parse_int(doc
, n
);
707 if ((n
= parse_find_node("noStrut", node
)))
708 config_dock_nostrut
= parse_bool(doc
, n
);
710 if ((n
= parse_find_node("stacking", node
))) {
711 if (parse_contains("above", doc
, n
))
712 config_dock_layer
= OB_STACKING_LAYER_ABOVE
;
713 else if (parse_contains("normal", doc
, n
))
714 config_dock_layer
= OB_STACKING_LAYER_NORMAL
;
715 else if (parse_contains("below", doc
, n
))
716 config_dock_layer
= OB_STACKING_LAYER_BELOW
;
718 if ((n
= parse_find_node("direction", node
))) {
719 if (parse_contains("horizontal", doc
, n
))
720 config_dock_orient
= OB_ORIENTATION_HORZ
;
721 else if (parse_contains("vertical", doc
, n
))
722 config_dock_orient
= OB_ORIENTATION_VERT
;
724 if ((n
= parse_find_node("autoHide", node
)))
725 config_dock_hide
= parse_bool(doc
, n
);
726 if ((n
= parse_find_node("hideDelay", node
)))
727 config_dock_hide_delay
= parse_int(doc
, n
) * 1000;
728 if ((n
= parse_find_node("showDelay", node
)))
729 config_dock_show_delay
= parse_int(doc
, n
) * 1000;
730 if ((n
= parse_find_node("moveButton", node
))) {
731 gchar
*str
= parse_string(doc
, n
);
733 if (translate_button(str
, &s
, &b
)) {
734 config_dock_app_move_button
= b
;
735 config_dock_app_move_modifiers
= s
;
737 g_message(_("Invalid button '%s' specified in config file"), str
);
743 static void parse_menu(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
747 for (node
= node
->children
; node
; node
= node
->next
) {
748 if (!xmlStrcasecmp(node
->name
, (const xmlChar
*) "file")) {
751 c
= parse_string(doc
, node
);
752 config_menu_files
= g_slist_append(config_menu_files
,
753 parse_expand_tilde(c
));
756 if ((n
= parse_find_node("hideDelay", node
)))
757 config_menu_hide_delay
= parse_int(doc
, n
);
758 if ((n
= parse_find_node("middle", node
)))
759 config_menu_middle
= parse_bool(doc
, n
);
760 if ((n
= parse_find_node("submenuShowDelay", node
)))
761 config_submenu_show_delay
= parse_int(doc
, n
);
762 if ((n
= parse_find_node("applicationIcons", node
)))
763 config_menu_client_list_icons
= parse_bool(doc
, n
);
767 static void parse_resistance(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
772 node
= node
->children
;
773 if ((n
= parse_find_node("strength", node
)))
774 config_resist_win
= parse_int(doc
, n
);
775 if ((n
= parse_find_node("screen_edge_strength", node
)))
776 config_resist_edge
= parse_int(doc
, n
);
782 const gchar
*actname
;
788 const gchar
*context
;
789 const ObMouseAction mact
;
790 const gchar
*actname
;
793 static void bind_default_mouse()
796 ObDefMouseBind binds
[] = {
797 { "Left", "Client", OB_MOUSE_ACTION_PRESS
, "Focus" },
798 { "Middle", "Client", OB_MOUSE_ACTION_PRESS
, "Focus" },
799 { "Right", "Client", OB_MOUSE_ACTION_PRESS
, "Focus" },
800 { "Left", "Desktop", OB_MOUSE_ACTION_PRESS
, "Focus" },
801 { "Middle", "Desktop", OB_MOUSE_ACTION_PRESS
, "Focus" },
802 { "Right", "Desktop", OB_MOUSE_ACTION_PRESS
, "Focus" },
803 { "Left", "Titlebar", OB_MOUSE_ACTION_PRESS
, "Focus" },
804 { "Left", "Bottom", OB_MOUSE_ACTION_PRESS
, "Focus" },
805 { "Left", "BLCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
806 { "Left", "BRCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
807 { "Left", "TLCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
808 { "Left", "TRCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
809 { "Left", "Close", OB_MOUSE_ACTION_PRESS
, "Focus" },
810 { "Left", "Maximize", OB_MOUSE_ACTION_PRESS
, "Focus" },
811 { "Left", "Iconify", OB_MOUSE_ACTION_PRESS
, "Focus" },
812 { "Left", "Icon", OB_MOUSE_ACTION_PRESS
, "Focus" },
813 { "Left", "AllDesktops", OB_MOUSE_ACTION_PRESS
, "Focus" },
814 { "Left", "Shade", OB_MOUSE_ACTION_PRESS
, "Focus" },
815 { "Left", "Client", OB_MOUSE_ACTION_CLICK
, "Raise" },
816 { "Left", "Titlebar", OB_MOUSE_ACTION_CLICK
, "Raise" },
817 { "Middle", "Titlebar", OB_MOUSE_ACTION_CLICK
, "Lower" },
818 { "Left", "BLCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
819 { "Left", "BRCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
820 { "Left", "TLCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
821 { "Left", "TRCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
822 { "Left", "Close", OB_MOUSE_ACTION_CLICK
, "Raise" },
823 { "Left", "Maximize", OB_MOUSE_ACTION_CLICK
, "Raise" },
824 { "Left", "Iconify", OB_MOUSE_ACTION_CLICK
, "Raise" },
825 { "Left", "Icon", OB_MOUSE_ACTION_CLICK
, "Raise" },
826 { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK
, "Raise" },
827 { "Left", "Shade", OB_MOUSE_ACTION_CLICK
, "Raise" },
828 { "Left", "Close", OB_MOUSE_ACTION_CLICK
, "Close" },
829 { "Left", "Maximize", OB_MOUSE_ACTION_CLICK
, "Maximize" },
830 { "Left", "Iconify", OB_MOUSE_ACTION_CLICK
, "Iconify" },
831 { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK
, "Omnipresent" },
832 { "Left", "Shade", OB_MOUSE_ACTION_CLICK
, "Shade" },
833 { "Left", "TLCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
834 { "Left", "TRCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
835 { "Left", "BLCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
836 { "Left", "BRCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
837 { "Left", "Titlebar", OB_MOUSE_ACTION_MOTION
, "Move" },
838 { "A-Left", "Frame", OB_MOUSE_ACTION_MOTION
, "Move" },
839 { "A-Middle", "Frame", OB_MOUSE_ACTION_MOTION
, "Resize" },
840 { NULL
, NULL
, 0, NULL
}
843 for (it
= binds
; it
->button
; ++it
)
844 mouse_bind(it
->button
, it
->context
, it
->mact
,
845 actions_parse_string(it
->actname
));
848 void config_startup(ObParseInst
*i
)
850 config_focus_new
= TRUE
;
851 config_focus_follow
= FALSE
;
852 config_focus_delay
= 0;
853 config_focus_raise
= FALSE
;
854 config_focus_last
= TRUE
;
855 config_focus_under_mouse
= FALSE
;
857 parse_register(i
, "focus", parse_focus
, NULL
);
859 config_place_policy
= OB_PLACE_POLICY_SMART
;
860 config_place_center
= TRUE
;
862 parse_register(i
, "placement", parse_placement
, NULL
);
864 STRUT_PARTIAL_SET(config_margins
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
866 parse_register(i
, "margins", parse_margins
, NULL
);
870 config_animate_iconify
= TRUE
;
871 config_title_layout
= g_strdup("NLIMC");
872 config_theme_keepborder
= TRUE
;
874 config_font_activewindow
= NULL
;
875 config_font_inactivewindow
= NULL
;
876 config_font_menuitem
= NULL
;
877 config_font_menutitle
= NULL
;
879 parse_register(i
, "theme", parse_theme
, NULL
);
881 config_desktops_num
= 4;
882 config_screen_firstdesk
= 1;
883 config_desktops_names
= NULL
;
885 parse_register(i
, "desktops", parse_desktops
, NULL
);
887 config_resize_redraw
= TRUE
;
888 config_resize_four_corners
= FALSE
;
889 config_resize_popup_show
= 1; /* nonpixel increments */
890 config_resize_popup_pos
= 0; /* center of client */
892 parse_register(i
, "resize", parse_resize
, NULL
);
894 config_dock_layer
= OB_STACKING_LAYER_ABOVE
;
895 config_dock_pos
= OB_DIRECTION_NORTHEAST
;
896 config_dock_floating
= FALSE
;
897 config_dock_nostrut
= FALSE
;
900 config_dock_orient
= OB_ORIENTATION_VERT
;
901 config_dock_hide
= FALSE
;
902 config_dock_hide_delay
= 300;
903 config_dock_show_delay
= 300;
904 config_dock_app_move_button
= 2; /* middle */
905 config_dock_app_move_modifiers
= 0;
907 parse_register(i
, "dock", parse_dock
, NULL
);
909 translate_key("C-g", &config_keyboard_reset_state
,
910 &config_keyboard_reset_keycode
);
912 parse_register(i
, "keyboard", parse_keyboard
, NULL
);
914 config_mouse_threshold
= 8;
915 config_mouse_dclicktime
= 200;
916 config_mouse_screenedgetime
= 400;
918 bind_default_mouse();
920 parse_register(i
, "mouse", parse_mouse
, NULL
);
922 config_resist_win
= 10;
923 config_resist_edge
= 20;
925 parse_register(i
, "resistance", parse_resistance
, NULL
);
927 config_menu_hide_delay
= 250;
928 config_menu_middle
= FALSE
;
929 config_submenu_show_delay
= 0;
930 config_menu_client_list_icons
= TRUE
;
931 config_menu_files
= NULL
;
933 parse_register(i
, "menu", parse_menu
, NULL
);
935 config_per_app_settings
= NULL
;
937 parse_register(i
, "applications", parse_per_app_settings
, NULL
);
940 void config_shutdown()
944 g_free(config_theme
);
946 g_free(config_title_layout
);
948 RrFontClose(config_font_activewindow
);
949 RrFontClose(config_font_inactivewindow
);
950 RrFontClose(config_font_menuitem
);
951 RrFontClose(config_font_menutitle
);
953 for (it
= config_desktops_names
; it
; it
= g_slist_next(it
))
955 g_slist_free(config_desktops_names
);
957 for (it
= config_menu_files
; it
; it
= g_slist_next(it
))
959 g_slist_free(config_menu_files
);
961 for (it
= config_per_app_settings
; it
; it
= g_slist_next(it
)) {
962 ObAppSettings
*itd
= (ObAppSettings
*)it
->data
;
963 if (itd
->name
) g_pattern_spec_free(itd
->name
);
964 if (itd
->role
) g_pattern_spec_free(itd
->role
);
965 if (itd
->class) g_pattern_spec_free(itd
->class);
968 g_slist_free(config_per_app_settings
);