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", "Top", OB_MOUSE_ACTION_MOTION
, "Resize" },
838 { "Left", "Bottom", OB_MOUSE_ACTION_MOTION
, "Resize" },
839 { "Left", "Left", OB_MOUSE_ACTION_MOTION
, "Resize" },
840 { "Left", "Right", OB_MOUSE_ACTION_MOTION
, "Resize" },
841 { "Left", "Titlebar", OB_MOUSE_ACTION_MOTION
, "Move" },
842 { "A-Left", "Frame", OB_MOUSE_ACTION_MOTION
, "Move" },
843 { "A-Middle", "Frame", OB_MOUSE_ACTION_MOTION
, "Resize" },
844 { NULL
, NULL
, 0, NULL
}
847 for (it
= binds
; it
->button
; ++it
)
848 mouse_bind(it
->button
, it
->context
, it
->mact
,
849 actions_parse_string(it
->actname
));
852 void config_startup(ObParseInst
*i
)
854 config_focus_new
= TRUE
;
855 config_focus_follow
= FALSE
;
856 config_focus_delay
= 0;
857 config_focus_raise
= FALSE
;
858 config_focus_last
= TRUE
;
859 config_focus_under_mouse
= FALSE
;
861 parse_register(i
, "focus", parse_focus
, NULL
);
863 config_place_policy
= OB_PLACE_POLICY_SMART
;
864 config_place_center
= TRUE
;
866 parse_register(i
, "placement", parse_placement
, NULL
);
868 STRUT_PARTIAL_SET(config_margins
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
870 parse_register(i
, "margins", parse_margins
, NULL
);
874 config_animate_iconify
= TRUE
;
875 config_title_layout
= g_strdup("NLIMC");
876 config_theme_keepborder
= TRUE
;
878 config_font_activewindow
= NULL
;
879 config_font_inactivewindow
= NULL
;
880 config_font_menuitem
= NULL
;
881 config_font_menutitle
= NULL
;
883 parse_register(i
, "theme", parse_theme
, NULL
);
885 config_desktops_num
= 4;
886 config_screen_firstdesk
= 1;
887 config_desktops_names
= NULL
;
889 parse_register(i
, "desktops", parse_desktops
, NULL
);
891 config_resize_redraw
= TRUE
;
892 config_resize_four_corners
= FALSE
;
893 config_resize_popup_show
= 1; /* nonpixel increments */
894 config_resize_popup_pos
= 0; /* center of client */
896 parse_register(i
, "resize", parse_resize
, NULL
);
898 config_dock_layer
= OB_STACKING_LAYER_ABOVE
;
899 config_dock_pos
= OB_DIRECTION_NORTHEAST
;
900 config_dock_floating
= FALSE
;
901 config_dock_nostrut
= FALSE
;
904 config_dock_orient
= OB_ORIENTATION_VERT
;
905 config_dock_hide
= FALSE
;
906 config_dock_hide_delay
= 300;
907 config_dock_show_delay
= 300;
908 config_dock_app_move_button
= 2; /* middle */
909 config_dock_app_move_modifiers
= 0;
911 parse_register(i
, "dock", parse_dock
, NULL
);
913 translate_key("C-g", &config_keyboard_reset_state
,
914 &config_keyboard_reset_keycode
);
916 parse_register(i
, "keyboard", parse_keyboard
, NULL
);
918 config_mouse_threshold
= 8;
919 config_mouse_dclicktime
= 200;
920 config_mouse_screenedgetime
= 400;
922 bind_default_mouse();
924 parse_register(i
, "mouse", parse_mouse
, NULL
);
926 config_resist_win
= 10;
927 config_resist_edge
= 20;
929 parse_register(i
, "resistance", parse_resistance
, NULL
);
931 config_menu_hide_delay
= 250;
932 config_menu_middle
= FALSE
;
933 config_submenu_show_delay
= 0;
934 config_menu_client_list_icons
= TRUE
;
935 config_menu_files
= NULL
;
937 parse_register(i
, "menu", parse_menu
, NULL
);
939 config_per_app_settings
= NULL
;
941 parse_register(i
, "applications", parse_per_app_settings
, NULL
);
944 void config_shutdown()
948 g_free(config_theme
);
950 g_free(config_title_layout
);
952 RrFontClose(config_font_activewindow
);
953 RrFontClose(config_font_inactivewindow
);
954 RrFontClose(config_font_menuitem
);
955 RrFontClose(config_font_menutitle
);
957 for (it
= config_desktops_names
; it
; it
= g_slist_next(it
))
959 g_slist_free(config_desktops_names
);
961 for (it
= config_menu_files
; it
; it
= g_slist_next(it
))
963 g_slist_free(config_menu_files
);
965 for (it
= config_per_app_settings
; it
; it
= g_slist_next(it
)) {
966 ObAppSettings
*itd
= (ObAppSettings
*)it
->data
;
967 if (itd
->name
) g_pattern_spec_free(itd
->name
);
968 if (itd
->role
) g_pattern_spec_free(itd
->role
);
969 if (itd
->class) g_pattern_spec_free(itd
->class);
972 g_slist_free(config_per_app_settings
);