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.
24 #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
;
43 gboolean config_theme_keepborder
;
45 gchar
*config_title_layout
;
47 gboolean config_animate_iconify
;
49 RrFont
*config_font_activewindow
;
50 RrFont
*config_font_inactivewindow
;
51 RrFont
*config_font_menuitem
;
52 RrFont
*config_font_menutitle
;
53 RrFont
*config_font_osd
;
55 gint config_desktops_num
;
56 GSList
*config_desktops_names
;
57 guint config_screen_firstdesk
;
59 gboolean config_resize_redraw
;
60 gboolean config_resize_four_corners
;
61 gint config_resize_popup_show
;
62 gint config_resize_popup_pos
;
64 ObStackingLayer config_dock_layer
;
65 gboolean config_dock_floating
;
66 gboolean config_dock_nostrut
;
67 ObDirection config_dock_pos
;
70 ObOrientation config_dock_orient
;
71 gboolean config_dock_hide
;
72 guint config_dock_hide_delay
;
73 guint config_dock_show_delay
;
74 guint config_dock_app_move_button
;
75 guint config_dock_app_move_modifiers
;
77 guint config_keyboard_reset_keycode
;
78 guint config_keyboard_reset_state
;
80 gint config_mouse_threshold
;
81 gint config_mouse_dclicktime
;
83 guint config_menu_hide_delay
;
84 gboolean config_menu_middle
;
85 guint config_submenu_show_delay
;
86 gboolean config_menu_client_list_icons
;
88 GSList
*config_menu_files
;
90 gint config_resist_win
;
91 gint config_resist_edge
;
93 GSList
*config_per_app_settings
;
95 ObAppSettings
* config_create_app_settings()
97 ObAppSettings
*settings
= g_new0(ObAppSettings
, 1);
100 settings
->monitor
= -1;
101 settings
->focus
= -1;
102 settings
->desktop
= 0;
103 settings
->layer
= -2;
104 settings
->iconic
= -1;
105 settings
->skip_pager
= -1;
106 settings
->skip_taskbar
= -1;
107 settings
->fullscreen
= -1;
108 settings
->max_horz
= -1;
109 settings
->max_vert
= -1;
113 #define copy_if(setting, default) \
114 if (src->setting != default) dst->setting = src->setting
115 void config_app_settings_copy_non_defaults(const ObAppSettings
*src
,
118 g_assert(src
!= NULL
);
119 g_assert(dst
!= NULL
);
127 copy_if(skip_pager
, -1);
128 copy_if(skip_taskbar
, -1);
129 copy_if(fullscreen
, -1);
130 copy_if(max_horz
, -1);
131 copy_if(max_vert
, -1);
133 if (src
->pos_given
) {
134 dst
->pos_given
= TRUE
;
135 dst
->center_x
= src
->center_x
;
136 dst
->center_y
= src
->center_y
;
137 dst
->opposite_x
= src
->opposite_x
;
138 dst
->opposite_y
= src
->opposite_y
;
139 dst
->position
.x
= src
->position
.x
;
140 dst
->position
.y
= src
->position
.y
;
141 dst
->monitor
= src
->monitor
;
147 <application name="aterm">
150 <application name="Rhythmbox">
157 .. there is a lot more settings available
162 /* Manages settings for individual applications.
163 Some notes: monitor is the screen number in a multi monitor
164 (Xinerama) setup (starting from 0) or mouse, meaning the
165 monitor the pointer is on. Default: mouse.
166 Layer can be three values, above (Always on top), below
167 (Always on bottom) and everything else (normal behaviour).
168 Positions can be an integer value or center, which will
169 center the window in the specified axis. Position is within
170 the monitor, so <position><x>center</x></position><monitor>2</monitor>
171 will center the window on the second monitor.
173 static void parse_per_app_settings(ObParseInst
*i
, xmlDocPtr doc
,
174 xmlNodePtr node
, gpointer d
)
176 xmlNodePtr app
= parse_find_node("application", node
->children
);
177 gchar
*name
= NULL
, *class = NULL
, *role
= NULL
;
178 gboolean name_set
, class_set
;
179 gboolean x_pos_given
;
182 name_set
= class_set
= x_pos_given
= FALSE
;
184 class_set
= parse_attr_string("class", app
, &class);
185 name_set
= parse_attr_string("name", app
, &name
);
186 if (class_set
|| name_set
) {
188 ObAppSettings
*settings
= config_create_app_settings();;
191 settings
->name
= g_pattern_spec_new(name
);
194 settings
->class = g_pattern_spec_new(class);
196 if (parse_attr_string("role", app
, &role
))
197 settings
->role
= g_pattern_spec_new(role
);
199 if ((n
= parse_find_node("decor", app
->children
)))
200 if (!parse_contains("default", doc
, n
))
201 settings
->decor
= parse_bool(doc
, n
);
203 if ((n
= parse_find_node("shade", app
->children
)))
204 if (!parse_contains("default", doc
, n
))
205 settings
->shade
= parse_bool(doc
, n
);
207 if ((n
= parse_find_node("position", app
->children
))) {
208 if ((c
= parse_find_node("x", n
->children
)))
209 if (!parse_contains("default", doc
, c
)) {
210 gchar
*s
= parse_string(doc
, c
);
211 if (!strcmp(s
, "center")) {
212 settings
->center_x
= TRUE
;
216 settings
->opposite_x
= TRUE
;
217 if (s
[0] == '-' || s
[0] == '+')
218 settings
->position
.x
= atoi(s
+1);
220 settings
->position
.x
= atoi(s
);
226 if (x_pos_given
&& (c
= parse_find_node("y", n
->children
)))
227 if (!parse_contains("default", doc
, c
)) {
228 gchar
*s
= parse_string(doc
, c
);
229 if (!strcmp(s
, "center")) {
230 settings
->center_y
= TRUE
;
231 settings
->pos_given
= TRUE
;
234 settings
->opposite_y
= TRUE
;
235 if (s
[0] == '-' || s
[0] == '+')
236 settings
->position
.y
= atoi(s
+1);
238 settings
->position
.y
= atoi(s
);
239 settings
->pos_given
= TRUE
;
244 if (settings
->pos_given
&&
245 (c
= parse_find_node("monitor", n
->children
)))
246 if (!parse_contains("default", doc
, c
)) {
247 gchar
*s
= parse_string(doc
, c
);
248 if (!strcmp(s
, "mouse"))
249 settings
->monitor
= 0;
251 settings
->monitor
= parse_int(doc
, c
) + 1;
256 if ((n
= parse_find_node("focus", app
->children
)))
257 if (!parse_contains("default", doc
, n
))
258 settings
->focus
= parse_bool(doc
, n
);
260 if ((n
= parse_find_node("desktop", app
->children
))) {
261 if (!parse_contains("default", doc
, n
)) {
262 gchar
*s
= parse_string(doc
, n
);
263 if (!strcmp(s
, "all"))
264 settings
->desktop
= DESKTOP_ALL
;
266 gint i
= parse_int(doc
, n
);
268 settings
->desktop
= i
;
274 if ((n
= parse_find_node("layer", app
->children
)))
275 if (!parse_contains("default", doc
, n
)) {
276 gchar
*s
= parse_string(doc
, n
);
277 if (!strcmp(s
, "above"))
279 else if (!strcmp(s
, "below"))
280 settings
->layer
= -1;
286 if ((n
= parse_find_node("iconic", app
->children
)))
287 if (!parse_contains("default", doc
, n
))
288 settings
->iconic
= parse_bool(doc
, n
);
290 if ((n
= parse_find_node("skip_pager", app
->children
)))
291 if (!parse_contains("default", doc
, n
))
292 settings
->skip_pager
= parse_bool(doc
, n
);
294 if ((n
= parse_find_node("skip_taskbar", app
->children
)))
295 if (!parse_contains("default", doc
, n
))
296 settings
->skip_taskbar
= parse_bool(doc
, n
);
298 if ((n
= parse_find_node("fullscreen", app
->children
)))
299 if (!parse_contains("default", doc
, n
))
300 settings
->fullscreen
= parse_bool(doc
, n
);
302 if ((n
= parse_find_node("maximized", app
->children
)))
303 if (!parse_contains("default", doc
, n
)) {
304 gchar
*s
= parse_string(doc
, n
);
305 if (!strcmp(s
, "horizontal")) {
306 settings
->max_horz
= TRUE
;
307 settings
->max_vert
= FALSE
;
308 } else if (!strcmp(s
, "vertical")) {
309 settings
->max_horz
= FALSE
;
310 settings
->max_vert
= TRUE
;
312 settings
->max_horz
= settings
->max_vert
=
317 config_per_app_settings
= g_slist_append(config_per_app_settings
,
318 (gpointer
) settings
);
321 app
= parse_find_node("application", app
->next
);
332 <action name="ChangeDesktop">
339 static void parse_key(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
344 gboolean is_chroot
= FALSE
;
346 if (!parse_attr_string("key", node
, &key
))
349 parse_attr_bool("chroot", node
, &is_chroot
);
351 keylist
= g_list_append(keylist
, key
);
353 if ((n
= parse_find_node("keybind", node
->children
))) {
355 parse_key(i
, doc
, n
, keylist
);
356 n
= parse_find_node("keybind", n
->next
);
359 else if ((n
= parse_find_node("action", node
->children
))) {
361 ObActionsDefinition
*action
;
363 action
= actions_parse(i
, doc
, n
);
365 keyboard_bind(keylist
, action
);
366 n
= parse_find_node("action", n
->next
);
371 keyboard_chroot(keylist
);
374 keylist
= g_list_delete_link(keylist
, g_list_last(keylist
));
377 static void parse_keyboard(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
383 keyboard_unbind_all();
385 if ((n
= parse_find_node("chainQuitKey", node
->children
))) {
386 key
= parse_string(doc
, n
);
387 translate_key(key
, &config_keyboard_reset_state
,
388 &config_keyboard_reset_keycode
);
392 if ((n
= parse_find_node("keybind", node
->children
)))
394 parse_key(i
, doc
, n
, NULL
);
395 n
= parse_find_node("keybind", n
->next
);
401 <context name="Titlebar">
402 <mousebind button="Left" action="Press">
403 <action name="Raise"></action>
409 static void parse_mouse(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
412 xmlNodePtr n
, nbut
, nact
;
421 node
= node
->children
;
423 if ((n
= parse_find_node("dragThreshold", node
)))
424 config_mouse_threshold
= parse_int(doc
, n
);
425 if ((n
= parse_find_node("doubleClickTime", node
)))
426 config_mouse_dclicktime
= parse_int(doc
, n
);
428 n
= parse_find_node("context", node
);
430 if (!parse_attr_string("name", n
, &contextstr
))
432 nbut
= parse_find_node("mousebind", n
->children
);
434 if (!parse_attr_string("button", nbut
, &buttonstr
))
436 if (parse_attr_contains("press", nbut
, "action")) {
437 uact
= OB_USER_ACTION_MOUSE_PRESS
;
438 mact
= OB_MOUSE_ACTION_PRESS
;
439 } else if (parse_attr_contains("release", nbut
, "action")) {
440 uact
= OB_USER_ACTION_MOUSE_RELEASE
;
441 mact
= OB_MOUSE_ACTION_RELEASE
;
442 } else if (parse_attr_contains("click", nbut
, "action")) {
443 uact
= OB_USER_ACTION_MOUSE_CLICK
;
444 mact
= OB_MOUSE_ACTION_CLICK
;
445 } else if (parse_attr_contains("doubleclick", nbut
,"action")) {
446 uact
= OB_USER_ACTION_MOUSE_DOUBLE_CLICK
;
447 mact
= OB_MOUSE_ACTION_DOUBLE_CLICK
;
448 } else if (parse_attr_contains("drag", nbut
, "action")) {
449 uact
= OB_USER_ACTION_MOUSE_MOTION
;
450 mact
= OB_MOUSE_ACTION_MOTION
;
453 nact
= parse_find_node("action", nbut
->children
);
455 if ((action
= action_parse(i
, doc
, nact
, uact
)))
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_theme(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
509 node
= node
->children
;
511 if ((n
= parse_find_node("name", node
))) {
514 g_free(config_theme
);
515 c
= parse_string(doc
, n
);
516 config_theme
= parse_expand_tilde(c
);
519 if ((n
= parse_find_node("titleLayout", node
))) {
522 g_free(config_title_layout
);
523 config_title_layout
= parse_string(doc
, n
);
525 /* replace duplicates with spaces */
526 for (c
= config_title_layout
; *c
!= '\0'; ++c
)
527 for (d
= c
+1; *d
!= '\0'; ++d
)
528 if (*c
== *d
) *d
= ' ';
530 if ((n
= parse_find_node("keepBorder", node
)))
531 config_theme_keepborder
= parse_bool(doc
, n
);
532 if ((n
= parse_find_node("animateIconify", node
)))
533 config_animate_iconify
= parse_bool(doc
, n
);
535 n
= parse_find_node("font", node
);
539 gchar
*name
= g_strdup(RrDefaultFontFamily
);
540 gint size
= RrDefaultFontSize
;
541 RrFontWeight weight
= RrDefaultFontWeight
;
542 RrFontSlant slant
= RrDefaultFontSlant
;
544 if (parse_attr_contains("ActiveWindow", n
, "place"))
545 font
= &config_font_activewindow
;
546 else if (parse_attr_contains("InactiveWindow", n
, "place"))
547 font
= &config_font_inactivewindow
;
548 else if (parse_attr_contains("MenuHeader", n
, "place"))
549 font
= &config_font_menutitle
;
550 else if (parse_attr_contains("MenuItem", n
, "place"))
551 font
= &config_font_menuitem
;
552 else if (parse_attr_contains("OnScreenDisplay", n
, "place"))
553 font
= &config_font_osd
;
557 if ((fnode
= parse_find_node("name", n
->children
))) {
559 name
= parse_string(doc
, fnode
);
561 if ((fnode
= parse_find_node("size", n
->children
))) {
562 int s
= parse_int(doc
, fnode
);
565 if ((fnode
= parse_find_node("weight", n
->children
))) {
566 gchar
*w
= parse_string(doc
, fnode
);
567 if (!g_ascii_strcasecmp(w
, "Bold"))
568 weight
= RR_FONTWEIGHT_BOLD
;
571 if ((fnode
= parse_find_node("slant", n
->children
))) {
572 gchar
*s
= parse_string(doc
, fnode
);
573 if (!g_ascii_strcasecmp(s
, "Italic"))
574 slant
= RR_FONTSLANT_ITALIC
;
575 if (!g_ascii_strcasecmp(s
, "Oblique"))
576 slant
= RR_FONTSLANT_OBLIQUE
;
580 *font
= RrFontOpen(ob_rr_inst
, name
, size
, weight
, slant
);
583 n
= parse_find_node("font", n
->next
);
587 static void parse_desktops(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
592 node
= node
->children
;
594 if ((n
= parse_find_node("number", node
))) {
595 gint d
= parse_int(doc
, n
);
597 config_desktops_num
= d
;
599 if ((n
= parse_find_node("firstdesk", node
))) {
600 gint d
= parse_int(doc
, n
);
602 config_screen_firstdesk
= (unsigned) d
;
604 if ((n
= parse_find_node("names", node
))) {
608 for (it
= config_desktops_names
; it
; it
= it
->next
)
610 g_slist_free(config_desktops_names
);
611 config_desktops_names
= NULL
;
613 nname
= parse_find_node("name", n
->children
);
615 config_desktops_names
= g_slist_append(config_desktops_names
,
616 parse_string(doc
, nname
));
617 nname
= parse_find_node("name", nname
->next
);
622 static void parse_resize(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
627 node
= node
->children
;
629 if ((n
= parse_find_node("drawContents", node
)))
630 config_resize_redraw
= parse_bool(doc
, n
);
631 if ((n
= parse_find_node("popupShow", node
))) {
632 config_resize_popup_show
= parse_int(doc
, n
);
633 if (parse_contains("Always", doc
, n
))
634 config_resize_popup_show
= 2;
635 else if (parse_contains("Never", doc
, n
))
636 config_resize_popup_show
= 0;
637 else if (parse_contains("Nonpixel", doc
, n
))
638 config_resize_popup_show
= 1;
640 if ((n
= parse_find_node("popupPosition", node
))) {
641 config_resize_popup_pos
= parse_int(doc
, n
);
642 if (parse_contains("Top", doc
, n
))
643 config_resize_popup_pos
= 1;
644 else if (parse_contains("Center", doc
, n
))
645 config_resize_popup_pos
= 0;
649 static void parse_dock(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
654 node
= node
->children
;
656 if ((n
= parse_find_node("position", node
))) {
657 if (parse_contains("TopLeft", doc
, n
))
658 config_dock_floating
= FALSE
,
659 config_dock_pos
= OB_DIRECTION_NORTHWEST
;
660 else if (parse_contains("Top", doc
, n
))
661 config_dock_floating
= FALSE
,
662 config_dock_pos
= OB_DIRECTION_NORTH
;
663 else if (parse_contains("TopRight", doc
, n
))
664 config_dock_floating
= FALSE
,
665 config_dock_pos
= OB_DIRECTION_NORTHEAST
;
666 else if (parse_contains("Right", doc
, n
))
667 config_dock_floating
= FALSE
,
668 config_dock_pos
= OB_DIRECTION_EAST
;
669 else if (parse_contains("BottomRight", doc
, n
))
670 config_dock_floating
= FALSE
,
671 config_dock_pos
= OB_DIRECTION_SOUTHEAST
;
672 else if (parse_contains("Bottom", doc
, n
))
673 config_dock_floating
= FALSE
,
674 config_dock_pos
= OB_DIRECTION_SOUTH
;
675 else if (parse_contains("BottomLeft", doc
, n
))
676 config_dock_floating
= FALSE
,
677 config_dock_pos
= OB_DIRECTION_SOUTHWEST
;
678 else if (parse_contains("Left", doc
, n
))
679 config_dock_floating
= FALSE
,
680 config_dock_pos
= OB_DIRECTION_WEST
;
681 else if (parse_contains("Floating", doc
, n
))
682 config_dock_floating
= TRUE
;
684 if (config_dock_floating
) {
685 if ((n
= parse_find_node("floatingX", node
)))
686 config_dock_x
= parse_int(doc
, n
);
687 if ((n
= parse_find_node("floatingY", node
)))
688 config_dock_y
= parse_int(doc
, n
);
690 if ((n
= parse_find_node("noStrut", node
)))
691 config_dock_nostrut
= parse_bool(doc
, n
);
693 if ((n
= parse_find_node("stacking", node
))) {
694 if (parse_contains("above", doc
, n
))
695 config_dock_layer
= OB_STACKING_LAYER_ABOVE
;
696 else if (parse_contains("normal", doc
, n
))
697 config_dock_layer
= OB_STACKING_LAYER_NORMAL
;
698 else if (parse_contains("below", doc
, n
))
699 config_dock_layer
= OB_STACKING_LAYER_BELOW
;
701 if ((n
= parse_find_node("direction", node
))) {
702 if (parse_contains("horizontal", doc
, n
))
703 config_dock_orient
= OB_ORIENTATION_HORZ
;
704 else if (parse_contains("vertical", doc
, n
))
705 config_dock_orient
= OB_ORIENTATION_VERT
;
707 if ((n
= parse_find_node("autoHide", node
)))
708 config_dock_hide
= parse_bool(doc
, n
);
709 if ((n
= parse_find_node("hideDelay", node
)))
710 config_dock_hide_delay
= parse_int(doc
, n
) * 1000;
711 if ((n
= parse_find_node("showDelay", node
)))
712 config_dock_show_delay
= parse_int(doc
, n
) * 1000;
713 if ((n
= parse_find_node("moveButton", node
))) {
714 gchar
*str
= parse_string(doc
, n
);
716 if (translate_button(str
, &s
, &b
)) {
717 config_dock_app_move_button
= b
;
718 config_dock_app_move_modifiers
= s
;
720 g_message(_("Invalid button '%s' specified in config file"), str
);
726 static void parse_menu(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
730 for (node
= node
->children
; node
; node
= node
->next
) {
731 if (!xmlStrcasecmp(node
->name
, (const xmlChar
*) "file")) {
734 c
= parse_string(doc
, node
);
735 config_menu_files
= g_slist_append(config_menu_files
,
736 parse_expand_tilde(c
));
739 if ((n
= parse_find_node("hideDelay", node
)))
740 config_menu_hide_delay
= parse_int(doc
, n
);
741 if ((n
= parse_find_node("middle", node
)))
742 config_menu_middle
= parse_bool(doc
, n
);
743 if ((n
= parse_find_node("submenuShowDelay", node
)))
744 config_submenu_show_delay
= parse_int(doc
, n
);
745 if ((n
= parse_find_node("applicationIcons", node
)))
746 config_menu_client_list_icons
= parse_bool(doc
, n
);
750 static void parse_resistance(ObParseInst
*i
, xmlDocPtr doc
, xmlNodePtr node
,
755 node
= node
->children
;
756 if ((n
= parse_find_node("strength", node
)))
757 config_resist_win
= parse_int(doc
, n
);
758 if ((n
= parse_find_node("screen_edge_strength", node
)))
759 config_resist_edge
= parse_int(doc
, n
);
765 const gchar
*actname
;
768 static void bind_default_keyboard()
771 ObDefKeyBind binds
[] = {
772 { "A-Tab", "NextWindow" },
773 { "S-A-Tab", "PreviousWindow" },
778 for (it
= binds
; it
->key
; ++it
) {
779 GList
*l
= g_list_append(NULL
, g_strdup(it
->key
));
780 keyboard_bind(l
, action_from_string(it
->actname
,
781 OB_USER_ACTION_KEYBOARD_KEY
));
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
, "ToggleMaximizeFull" },
830 { "Left", "Iconify", OB_MOUSE_ACTION_CLICK
, "Iconify" },
831 { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK
, "ToggleOmnipresent" },
832 { "Left", "Shade", OB_MOUSE_ACTION_CLICK
, "ToggleShade" },
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
) {
846 case OB_MOUSE_ACTION_PRESS
:
847 uact
= OB_USER_ACTION_MOUSE_PRESS
; break;
848 case OB_MOUSE_ACTION_RELEASE
:
849 uact
= OB_USER_ACTION_MOUSE_RELEASE
; break;
850 case OB_MOUSE_ACTION_CLICK
:
851 uact
= OB_USER_ACTION_MOUSE_CLICK
; break;
852 case OB_MOUSE_ACTION_DOUBLE_CLICK
:
853 uact
= OB_USER_ACTION_MOUSE_DOUBLE_CLICK
; break;
854 case OB_MOUSE_ACTION_MOTION
:
855 uact
= OB_USER_ACTION_MOUSE_MOTION
; break;
857 g_assert_not_reached();
859 mouse_bind(it
->button
, it
->context
, it
->mact
,
860 action_from_string(it
->actname
, uact
));
864 void config_startup(ObParseInst
*i
)
866 config_focus_new
= TRUE
;
867 config_focus_follow
= FALSE
;
868 config_focus_delay
= 0;
869 config_focus_raise
= FALSE
;
870 config_focus_last
= TRUE
;
871 config_focus_under_mouse
= FALSE
;
873 parse_register(i
, "focus", parse_focus
, NULL
);
875 config_place_policy
= OB_PLACE_POLICY_SMART
;
876 config_place_center
= TRUE
;
878 parse_register(i
, "placement", parse_placement
, NULL
);
882 config_animate_iconify
= TRUE
;
883 config_title_layout
= g_strdup("NLIMC");
884 config_theme_keepborder
= TRUE
;
886 config_font_activewindow
= NULL
;
887 config_font_inactivewindow
= NULL
;
888 config_font_menuitem
= NULL
;
889 config_font_menutitle
= NULL
;
891 parse_register(i
, "theme", parse_theme
, NULL
);
893 config_desktops_num
= 4;
894 config_screen_firstdesk
= 1;
895 config_desktops_names
= NULL
;
897 parse_register(i
, "desktops", parse_desktops
, NULL
);
899 config_resize_redraw
= TRUE
;
900 config_resize_four_corners
= FALSE
;
901 config_resize_popup_show
= 1; /* nonpixel increments */
902 config_resize_popup_pos
= 0; /* center of client */
904 parse_register(i
, "resize", parse_resize
, NULL
);
906 config_dock_layer
= OB_STACKING_LAYER_ABOVE
;
907 config_dock_pos
= OB_DIRECTION_NORTHEAST
;
908 config_dock_floating
= FALSE
;
909 config_dock_nostrut
= FALSE
;
912 config_dock_orient
= OB_ORIENTATION_VERT
;
913 config_dock_hide
= FALSE
;
914 config_dock_hide_delay
= 300;
915 config_dock_show_delay
= 300;
916 config_dock_app_move_button
= 2; /* middle */
917 config_dock_app_move_modifiers
= 0;
919 parse_register(i
, "dock", parse_dock
, NULL
);
921 translate_key("C-g", &config_keyboard_reset_state
,
922 &config_keyboard_reset_keycode
);
924 bind_default_keyboard();
926 parse_register(i
, "keyboard", parse_keyboard
, NULL
);
928 config_mouse_threshold
= 8;
929 config_mouse_dclicktime
= 200;
931 bind_default_mouse();
933 parse_register(i
, "mouse", parse_mouse
, NULL
);
935 config_resist_win
= 10;
936 config_resist_edge
= 20;
938 parse_register(i
, "resistance", parse_resistance
, NULL
);
940 config_menu_hide_delay
= 250;
941 config_menu_middle
= FALSE
;
942 config_submenu_show_delay
= 0;
943 config_menu_client_list_icons
= TRUE
;
944 config_menu_files
= NULL
;
946 parse_register(i
, "menu", parse_menu
, NULL
);
948 config_per_app_settings
= NULL
;
950 parse_register(i
, "applications", parse_per_app_settings
, NULL
);
953 void config_shutdown()
957 g_free(config_theme
);
959 g_free(config_title_layout
);
961 RrFontClose(config_font_activewindow
);
962 RrFontClose(config_font_inactivewindow
);
963 RrFontClose(config_font_menuitem
);
964 RrFontClose(config_font_menutitle
);
966 for (it
= config_desktops_names
; it
; it
= g_slist_next(it
))
968 g_slist_free(config_desktops_names
);
970 for (it
= config_menu_files
; it
; it
= g_slist_next(it
))
972 g_slist_free(config_menu_files
);
974 for (it
= config_per_app_settings
; it
; it
= g_slist_next(it
)) {
975 ObAppSettings
*itd
= (ObAppSettings
*)it
->data
;
976 if (itd
->name
) g_pattern_spec_free(itd
->name
);
977 if (itd
->role
) g_pattern_spec_free(itd
->role
);
978 if (itd
->class) g_pattern_spec_free(itd
->class);
981 g_slist_free(config_per_app_settings
);