1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 config.c for the Openbox window manager
4 Copyright (c) 2004 Mikael Magnusson
5 Copyright (c) 2003 Ben 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.
24 #include "translate.h"
26 #include "parser/parse.h"
29 gboolean config_focus_new
;
30 gboolean config_focus_follow
;
31 guint config_focus_delay
;
32 gboolean config_focus_raise
;
33 gboolean config_focus_last
;
35 ObPlacePolicy config_place_policy
;
38 gboolean config_theme_keepborder
;
39 gboolean config_theme_hidedisabled
;
41 gchar
*config_title_layout
;
43 gint config_desktops_num
;
44 GSList
*config_desktops_names
;
45 gint config_screen_firstdesk
;
47 gboolean config_resize_redraw
;
48 gboolean config_resize_four_corners
;
49 gint config_resize_popup_show
;
50 gint config_resize_popup_pos
;
52 ObStackingLayer config_dock_layer
;
53 gboolean config_dock_floating
;
54 gboolean config_dock_nostrut
;
55 ObDirection config_dock_pos
;
58 ObOrientation config_dock_orient
;
59 gboolean config_dock_hide
;
60 guint config_dock_hide_delay
;
61 guint config_dock_show_delay
;
62 guint config_dock_app_move_button
;
63 guint config_dock_app_move_modifiers
;
65 guint config_keyboard_reset_keycode
;
66 guint config_keyboard_reset_state
;
68 gint config_mouse_threshold
;
69 gint config_mouse_dclicktime
;
71 gboolean config_menu_warppointer
;
72 gboolean config_menu_xorstyle
;
73 guint config_menu_hide_delay
;
74 guint config_submenu_show_delay
;
75 gboolean config_menu_client_list_icons
;
77 GSList
*config_menu_files
;
79 gint config_resist_win
;
80 gint config_resist_edge
;
82 gboolean config_resist_layers_below
;
84 GSList
*config_per_app_settings
;
88 <application name="aterm">
91 <application name="Rhythmbox">
102 /* Manages settings for individual applications.
103 Some notes: head is the screen number in a multi monitor
104 (Xinerama) setup (starting from 0) or mouse, meaning the
105 head the pointer is on. Default: mouse.
106 If decor is false and shade is true, the decor will be
107 set to true (otherwise we will have an invisible window).
108 Layer can be three values, above (Always on top), below
109 (Always on bottom) and everything else (normal behaviour).
110 Positions can be an integer value or center, which will
111 center the window in the specified axis. Position is relative
112 from head, so <position><x>center</x></position><head>1</head>
113 will center the window on the second head.
115 static void parse_per_app_settings(ObParseInst
*i
, xmlDocPtr doc
,
116 xmlNodePtr node
, gpointer d
)
118 xmlNodePtr app
= parse_find_node("application", node
->children
);
122 gboolean x_pos_given
= FALSE
;
123 if (parse_attr_string("name", app
, &name
)) {
125 ObAppSettings
*settings
= g_new0(ObAppSettings
, 1);
126 settings
->name
= name
;
127 if (!parse_attr_string("role", app
, &settings
->role
))
128 settings
->role
= NULL
;
130 settings
->decor
= TRUE
;
131 if ((n
= parse_find_node("decor", app
->children
)))
132 settings
->decor
= parse_bool(doc
, n
);
134 if ((n
= parse_find_node("shade", app
->children
)))
135 settings
->shade
= parse_bool(doc
, n
);
137 settings
->position
.x
= settings
->position
.y
= 0;
138 settings
->pos_given
= FALSE
;
139 if ((n
= parse_find_node("position", app
->children
))) {
140 if ((c
= parse_find_node("x", n
->children
))) {
141 if (!strcmp(parse_string(doc
, c
), "center")) {
142 settings
->center_x
= TRUE
;
145 settings
->position
.x
= parse_int(doc
, c
);
150 if (x_pos_given
&& (c
= parse_find_node("y", n
->children
))) {
151 if (!strcmp(parse_string(doc
, c
), "center")) {
152 settings
->center_y
= TRUE
;
153 settings
->pos_given
= TRUE
;
155 settings
->position
.y
= parse_int(doc
, c
);
156 settings
->pos_given
= TRUE
;
161 if ((n
= parse_find_node("focus", app
->children
)))
162 settings
->focus
= parse_bool(doc
, n
);
164 if ((n
= parse_find_node("desktop", app
->children
)))
165 settings
->desktop
= parse_int(doc
, n
);
167 settings
->desktop
= -1;
169 if ((n
= parse_find_node("head", app
->children
))) {
170 if (!strcmp(parse_string(doc
, n
), "mouse"))
173 settings
->head
= parse_int(doc
, n
);
176 if ((n
= parse_find_node("layer", app
->children
))) {
177 if (!strcmp(parse_string(doc
, n
), "above"))
179 else if (!strcmp(parse_string(doc
, n
), "below"))
180 settings
->layer
= -1;
185 config_per_app_settings
= g_slist_append(config_per_app_settings
,
186 (gpointer
) settings
);
189 app
= parse_find_node("application", app
->next
);
196 <action name="ChangeDesktop">
203 static void parse_key(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
211 if ((n
= parse_find_node("chainQuitKey", node
))) {
212 key
= parse_string(doc
, n
);
213 translate_key(key
, &config_keyboard_reset_state
,
214 &config_keyboard_reset_keycode
);
218 n
= parse_find_node("keybind", node
);
220 if (parse_attr_string("key", n
, &key
)) {
221 keylist
= g_list_append(keylist
, key
);
223 parse_key(i
, doc
, n
->children
, keylist
);
225 it
= g_list_last(keylist
);
227 keylist
= g_list_delete_link(keylist
, it
);
229 n
= parse_find_node("keybind", n
->next
);
232 nact
= parse_find_node("action", node
);
234 if ((action
= action_parse(i
, doc
, nact
,
235 OB_USER_ACTION_KEYBOARD_KEY
)))
236 keyboard_bind(keylist
, action
);
237 nact
= parse_find_node("action", nact
->next
);
242 static void parse_keyboard(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
245 keyboard_unbind_all();
247 parse_key(i
, doc
, node
->children
, NULL
);
252 <context name="Titlebar">
253 <mousebind button="Left" action="Press">
254 <action name="Raise"></action>
260 static void parse_mouse(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
263 xmlNodePtr n
, nbut
, nact
;
272 node
= node
->children
;
274 if ((n
= parse_find_node("dragThreshold", node
)))
275 config_mouse_threshold
= parse_int(doc
, n
);
276 if ((n
= parse_find_node("doubleClickTime", node
)))
277 config_mouse_dclicktime
= parse_int(doc
, n
);
279 n
= parse_find_node("context", node
);
281 if (!parse_attr_string("name", n
, &contextstr
))
283 nbut
= parse_find_node("mousebind", n
->children
);
285 if (!parse_attr_string("button", nbut
, &buttonstr
))
287 if (parse_attr_contains("press", nbut
, "action")) {
288 uact
= OB_USER_ACTION_MOUSE_PRESS
;
289 mact
= OB_MOUSE_ACTION_PRESS
;
290 } else if (parse_attr_contains("release", nbut
, "action")) {
291 uact
= OB_USER_ACTION_MOUSE_RELEASE
;
292 mact
= OB_MOUSE_ACTION_RELEASE
;
293 } else if (parse_attr_contains("click", nbut
, "action")) {
294 uact
= OB_USER_ACTION_MOUSE_CLICK
;
295 mact
= OB_MOUSE_ACTION_CLICK
;
296 } else if (parse_attr_contains("doubleclick", nbut
,"action")) {
297 uact
= OB_USER_ACTION_MOUSE_DOUBLE_CLICK
;
298 mact
= OB_MOUSE_ACTION_DOUBLE_CLICK
;
299 } else if (parse_attr_contains("drag", nbut
, "action")) {
300 uact
= OB_USER_ACTION_MOUSE_MOTION
;
301 mact
= OB_MOUSE_ACTION_MOTION
;
304 nact
= parse_find_node("action", nbut
->children
);
306 if ((action
= action_parse(i
, doc
, nact
, uact
)))
307 mouse_bind(buttonstr
, contextstr
, mact
, action
);
308 nact
= parse_find_node("action", nact
->next
);
312 nbut
= parse_find_node("mousebind", nbut
->next
);
316 n
= parse_find_node("context", n
->next
);
320 static void parse_focus(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
325 node
= node
->children
;
327 if ((n
= parse_find_node("focusNew", node
)))
328 config_focus_new
= parse_bool(doc
, n
);
329 if ((n
= parse_find_node("followMouse", node
)))
330 config_focus_follow
= parse_bool(doc
, n
);
331 if ((n
= parse_find_node("focusDelay", node
)))
332 config_focus_delay
= parse_int(doc
, n
) * 1000;
333 if ((n
= parse_find_node("raiseOnFocus", node
)))
334 config_focus_raise
= parse_bool(doc
, n
);
335 if ((n
= parse_find_node("focusLast", node
)))
336 config_focus_last
= parse_bool(doc
, n
);
339 static void parse_placement(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
344 node
= node
->children
;
346 if ((n
= parse_find_node("policy", node
)))
347 if (parse_contains("UnderMouse", doc
, n
))
348 config_place_policy
= OB_PLACE_POLICY_MOUSE
;
351 static void parse_theme(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
356 node
= node
->children
;
358 if ((n
= parse_find_node("name", node
))) {
361 g_free(config_theme
);
362 c
= parse_string(doc
, n
);
363 config_theme
= parse_expand_tilde(c
);
366 if ((n
= parse_find_node("titleLayout", node
))) {
367 g_free(config_title_layout
);
368 config_title_layout
= parse_string(doc
, n
);
370 if ((n
= parse_find_node("keepBorder", node
)))
371 config_theme_keepborder
= parse_bool(doc
, n
);
372 if ((n
= parse_find_node("hideDisabled", node
)))
373 config_theme_hidedisabled
= parse_bool(doc
, n
);
376 static void parse_desktops(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
381 node
= node
->children
;
383 if ((n
= parse_find_node("number", node
))) {
384 gint d
= parse_int(doc
, n
);
386 config_desktops_num
= d
;
388 if ((n
= parse_find_node("firstdesk", node
))) {
389 gint d
= parse_int(doc
, n
);
391 config_screen_firstdesk
= d
;
393 if ((n
= parse_find_node("names", node
))) {
397 for (it
= config_desktops_names
; it
; it
= it
->next
)
399 g_slist_free(config_desktops_names
);
400 config_desktops_names
= NULL
;
402 nname
= parse_find_node("name", n
->children
);
404 config_desktops_names
= g_slist_append(config_desktops_names
,
405 parse_string(doc
, nname
));
406 nname
= parse_find_node("name", nname
->next
);
411 static void parse_resize(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
416 node
= node
->children
;
418 if ((n
= parse_find_node("drawContents", node
)))
419 config_resize_redraw
= parse_bool(doc
, n
);
420 if ((n
= parse_find_node("fourCorner", node
)))
421 config_resize_four_corners
= parse_bool(doc
, n
);
422 if ((n
= parse_find_node("popupShow", node
))) {
423 config_resize_popup_show
= parse_int(doc
, n
);
424 if (parse_contains("Always", doc
, n
))
425 config_resize_popup_show
= 2;
426 else if (parse_contains("Never", doc
, n
))
427 config_resize_popup_show
= 0;
428 else if (parse_contains("Nonpixel", doc
, n
))
429 config_resize_popup_show
= 1;
431 if ((n
= parse_find_node("popupPosition", node
))) {
432 config_resize_popup_pos
= parse_int(doc
, n
);
433 if (parse_contains("Top", doc
, n
))
434 config_resize_popup_pos
= 1;
435 else if (parse_contains("Center", doc
, n
))
436 config_resize_popup_pos
= 0;
440 static void parse_dock(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
445 node
= node
->children
;
447 if ((n
= parse_find_node("position", node
))) {
448 if (parse_contains("TopLeft", doc
, n
))
449 config_dock_floating
= FALSE
,
450 config_dock_pos
= OB_DIRECTION_NORTHWEST
;
451 else if (parse_contains("Top", doc
, n
))
452 config_dock_floating
= FALSE
,
453 config_dock_pos
= OB_DIRECTION_NORTH
;
454 else if (parse_contains("TopRight", doc
, n
))
455 config_dock_floating
= FALSE
,
456 config_dock_pos
= OB_DIRECTION_NORTHEAST
;
457 else if (parse_contains("Right", doc
, n
))
458 config_dock_floating
= FALSE
,
459 config_dock_pos
= OB_DIRECTION_EAST
;
460 else if (parse_contains("BottomRight", doc
, n
))
461 config_dock_floating
= FALSE
,
462 config_dock_pos
= OB_DIRECTION_SOUTHEAST
;
463 else if (parse_contains("Bottom", doc
, n
))
464 config_dock_floating
= FALSE
,
465 config_dock_pos
= OB_DIRECTION_SOUTH
;
466 else if (parse_contains("BottomLeft", doc
, n
))
467 config_dock_floating
= FALSE
,
468 config_dock_pos
= OB_DIRECTION_SOUTHWEST
;
469 else if (parse_contains("Left", doc
, n
))
470 config_dock_floating
= FALSE
,
471 config_dock_pos
= OB_DIRECTION_WEST
;
472 else if (parse_contains("Floating", doc
, n
))
473 config_dock_floating
= TRUE
;
475 if (config_dock_floating
) {
476 if ((n
= parse_find_node("floatingX", node
)))
477 config_dock_x
= parse_int(doc
, n
);
478 if ((n
= parse_find_node("floatingY", node
)))
479 config_dock_y
= parse_int(doc
, n
);
481 if ((n
= parse_find_node("noStrut", node
)))
482 config_dock_nostrut
= parse_bool(doc
, n
);
484 if ((n
= parse_find_node("stacking", node
))) {
485 if (parse_contains("top", doc
, n
))
486 config_dock_layer
= OB_STACKING_LAYER_ABOVE
;
487 else if (parse_contains("normal", doc
, n
))
488 config_dock_layer
= OB_STACKING_LAYER_NORMAL
;
489 else if (parse_contains("bottom", doc
, n
))
490 config_dock_layer
= OB_STACKING_LAYER_BELOW
;
492 if ((n
= parse_find_node("direction", node
))) {
493 if (parse_contains("horizontal", doc
, n
))
494 config_dock_orient
= OB_ORIENTATION_HORZ
;
495 else if (parse_contains("vertical", doc
, n
))
496 config_dock_orient
= OB_ORIENTATION_VERT
;
498 if ((n
= parse_find_node("autoHide", node
)))
499 config_dock_hide
= parse_bool(doc
, n
);
500 if ((n
= parse_find_node("hideDelay", node
)))
501 config_dock_hide_delay
= parse_int(doc
, n
) * 1000;
502 if ((n
= parse_find_node("showDelay", node
)))
503 config_dock_show_delay
= parse_int(doc
, n
) * 1000;
504 if ((n
= parse_find_node("moveButton", node
))) {
505 gchar
*str
= parse_string(doc
, n
);
507 if (translate_button(str
, &s
, &b
)) {
508 config_dock_app_move_button
= b
;
509 config_dock_app_move_modifiers
= s
;
511 g_warning("invalid button '%s'", str
);
517 static void parse_menu(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
521 for (node
= node
->children
; node
; node
= node
->next
) {
522 if (!xmlStrcasecmp(node
->name
, (const xmlChar
*) "file")) {
525 c
= parse_string(doc
, node
);
526 config_menu_files
= g_slist_append(config_menu_files
,
527 parse_expand_tilde(c
));
530 if ((n
= parse_find_node("warpPointer", node
)))
531 config_menu_warppointer
= parse_bool(doc
, n
);
532 if ((n
= parse_find_node("xorStyle", node
)))
533 config_menu_xorstyle
= parse_bool(doc
, n
);
534 if ((n
= parse_find_node("hideDelay", node
)))
535 config_menu_hide_delay
= parse_int(doc
, n
);
536 if ((n
= parse_find_node("submenuShowDelay", node
)))
537 config_submenu_show_delay
= parse_int(doc
, n
);
538 if ((n
= parse_find_node("desktopMenuIcons", node
)))
539 config_menu_client_list_icons
= parse_bool(doc
, n
);
543 static void parse_resistance(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
548 node
= node
->children
;
549 if ((n
= parse_find_node("strength", node
)))
550 config_resist_win
= parse_int(doc
, n
);
551 if ((n
= parse_find_node("screen_edge_strength", node
)))
552 config_resist_edge
= parse_int(doc
, n
);
553 if ((n
= parse_find_node("edges_hit_layers_below", node
)))
554 config_resist_layers_below
= parse_bool(doc
, n
);
560 const gchar
*actname
;
563 static void bind_default_keyboard()
566 ObDefKeyBind binds
[] = {
567 { "A-Tab", "NextWindow" },
568 { "S-A-Tab", "PreviousWindow" },
573 for (it
= binds
; it
->key
; ++it
) {
574 GList
*l
= g_list_append(NULL
, g_strdup(it
->key
));
575 keyboard_bind(l
, action_from_string(it
->actname
,
576 OB_USER_ACTION_KEYBOARD_KEY
));
583 const gchar
*context
;
584 const ObMouseAction mact
;
585 const gchar
*actname
;
588 static void bind_default_mouse()
591 ObDefMouseBind binds
[] = {
592 { "Left", "Client", OB_MOUSE_ACTION_PRESS
, "Focus" },
593 { "Middle", "Client", OB_MOUSE_ACTION_PRESS
, "Focus" },
594 { "Right", "Client", OB_MOUSE_ACTION_PRESS
, "Focus" },
595 { "Left", "Desktop", OB_MOUSE_ACTION_PRESS
, "Focus" },
596 { "Middle", "Desktop", OB_MOUSE_ACTION_PRESS
, "Focus" },
597 { "Right", "Desktop", OB_MOUSE_ACTION_PRESS
, "Focus" },
598 { "Left", "Titlebar", OB_MOUSE_ACTION_PRESS
, "Focus" },
599 { "Left", "Handle", OB_MOUSE_ACTION_PRESS
, "Focus" },
600 { "Left", "BLCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
601 { "Left", "BRCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
602 { "Left", "TLCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
603 { "Left", "TRCorner", OB_MOUSE_ACTION_PRESS
, "Focus" },
604 { "Left", "Close", OB_MOUSE_ACTION_PRESS
, "Focus" },
605 { "Left", "Maximize", OB_MOUSE_ACTION_PRESS
, "Focus" },
606 { "Left", "Iconify", OB_MOUSE_ACTION_PRESS
, "Focus" },
607 { "Left", "Icon", OB_MOUSE_ACTION_PRESS
, "Focus" },
608 { "Left", "AllDesktops", OB_MOUSE_ACTION_PRESS
, "Focus" },
609 { "Left", "Shade", OB_MOUSE_ACTION_PRESS
, "Focus" },
610 { "Left", "Client", OB_MOUSE_ACTION_CLICK
, "Raise" },
611 { "Left", "Titlebar", OB_MOUSE_ACTION_CLICK
, "Raise" },
612 { "Middle", "Titlebar", OB_MOUSE_ACTION_CLICK
, "Lower" },
613 { "Left", "Handle", OB_MOUSE_ACTION_CLICK
, "Raise" },
614 { "Left", "BLCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
615 { "Left", "BRCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
616 { "Left", "TLCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
617 { "Left", "TRCorner", OB_MOUSE_ACTION_CLICK
, "Raise" },
618 { "Left", "Close", OB_MOUSE_ACTION_CLICK
, "Raise" },
619 { "Left", "Maximize", OB_MOUSE_ACTION_CLICK
, "Raise" },
620 { "Left", "Iconify", OB_MOUSE_ACTION_CLICK
, "Raise" },
621 { "Left", "Icon", OB_MOUSE_ACTION_CLICK
, "Raise" },
622 { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK
, "Raise" },
623 { "Left", "Shade", OB_MOUSE_ACTION_CLICK
, "Raise" },
624 { "Left", "Close", OB_MOUSE_ACTION_CLICK
, "Close" },
625 { "Left", "Maximize", OB_MOUSE_ACTION_CLICK
, "ToggleMaximizeFull" },
626 { "Left", "Iconify", OB_MOUSE_ACTION_CLICK
, "Iconify" },
627 { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK
, "ToggleOmnipresent" },
628 { "Left", "Shade", OB_MOUSE_ACTION_CLICK
, "ToggleShade" },
629 { "Left", "TLCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
630 { "Left", "TRCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
631 { "Left", "BLCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
632 { "Left", "BRCorner", OB_MOUSE_ACTION_MOTION
, "Resize" },
633 { "Left", "Titlebar", OB_MOUSE_ACTION_MOTION
, "Move" },
634 { "A-Left", "Frame", OB_MOUSE_ACTION_MOTION
, "Move" },
635 { "A-Middle", "Frame", OB_MOUSE_ACTION_MOTION
, "Resize" },
636 { NULL
, NULL
, 0, NULL
}
639 for (it
= binds
; it
->button
; ++it
) {
642 case OB_MOUSE_ACTION_PRESS
:
643 uact
= OB_USER_ACTION_MOUSE_PRESS
; break;
644 case OB_MOUSE_ACTION_RELEASE
:
645 uact
= OB_USER_ACTION_MOUSE_RELEASE
; break;
646 case OB_MOUSE_ACTION_CLICK
:
647 uact
= OB_USER_ACTION_MOUSE_CLICK
; break;
648 case OB_MOUSE_ACTION_DOUBLE_CLICK
:
649 uact
= OB_USER_ACTION_MOUSE_DOUBLE_CLICK
; break;
650 case OB_MOUSE_ACTION_MOTION
:
651 uact
= OB_USER_ACTION_MOUSE_MOTION
; break;
652 case OB_NUM_MOUSE_ACTIONS
:
653 g_assert_not_reached();
655 mouse_bind(it
->button
, it
->context
, it
->mact
,
656 action_from_string(it
->actname
, uact
));
660 void config_startup(ObParseInst
*i
)
662 config_focus_new
= TRUE
;
663 config_focus_follow
= FALSE
;
664 config_focus_delay
= 0;
665 config_focus_raise
= FALSE
;
666 config_focus_last
= FALSE
;
668 parse_register(i
, "focus", parse_focus
, NULL
);
670 config_place_policy
= OB_PLACE_POLICY_SMART
;
672 parse_register(i
, "placement", parse_placement
, NULL
);
676 config_title_layout
= g_strdup("NLIMC");
677 config_theme_keepborder
= TRUE
;
678 config_theme_hidedisabled
= FALSE
;
680 parse_register(i
, "theme", parse_theme
, NULL
);
682 config_desktops_num
= 4;
683 config_screen_firstdesk
= 1;
684 config_desktops_names
= NULL
;
686 parse_register(i
, "desktops", parse_desktops
, NULL
);
688 config_resize_redraw
= TRUE
;
689 config_resize_four_corners
= FALSE
;
690 config_resize_popup_show
= 1; /* nonpixel increments */
691 config_resize_popup_pos
= 0; /* center of client */
693 parse_register(i
, "resize", parse_resize
, NULL
);
695 config_dock_layer
= OB_STACKING_LAYER_ABOVE
;
696 config_dock_pos
= OB_DIRECTION_NORTHEAST
;
697 config_dock_floating
= FALSE
;
698 config_dock_nostrut
= FALSE
;
701 config_dock_orient
= OB_ORIENTATION_VERT
;
702 config_dock_hide
= FALSE
;
703 config_dock_hide_delay
= 300;
704 config_dock_show_delay
= 300;
705 config_dock_app_move_button
= 2; /* middle */
706 config_dock_app_move_modifiers
= 0;
708 parse_register(i
, "dock", parse_dock
, NULL
);
710 translate_key("C-g", &config_keyboard_reset_state
,
711 &config_keyboard_reset_keycode
);
713 bind_default_keyboard();
715 parse_register(i
, "keyboard", parse_keyboard
, NULL
);
717 config_mouse_threshold
= 3;
718 config_mouse_dclicktime
= 200;
720 bind_default_mouse();
722 parse_register(i
, "mouse", parse_mouse
, NULL
);
724 config_resist_win
= 10;
725 config_resist_edge
= 20;
726 config_resist_layers_below
= FALSE
;
728 parse_register(i
, "resistance", parse_resistance
, NULL
);
730 config_menu_warppointer
= TRUE
;
731 config_menu_xorstyle
= TRUE
;
732 config_menu_hide_delay
= 250;
733 config_submenu_show_delay
= 0;
734 config_menu_client_list_icons
= TRUE
;
735 config_menu_files
= NULL
;
737 parse_register(i
, "menu", parse_menu
, NULL
);
739 config_per_app_settings
= NULL
;
741 parse_register(i
, "applications", parse_per_app_settings
, NULL
);
744 void config_shutdown()
748 g_free(config_theme
);
750 g_free(config_title_layout
);
752 for (it
= config_desktops_names
; it
; it
= g_slist_next(it
))
754 g_slist_free(config_desktops_names
);
756 for (it
= config_menu_files
; it
; it
= g_slist_next(it
))
758 g_slist_free(config_menu_files
);
760 for (it
= config_per_app_settings
; it
; it
= g_slist_next(it
)) {
761 ObAppSettings
*itd
= (ObAppSettings
*)it
->data
;
766 g_slist_free(config_per_app_settings
);