]> icculus.org git repositories - dana/openbox.git/blob - openbox/config.c
kill non-opaque move/resize
[dana/openbox.git] / openbox / config.c
1 #include "config.h"
2 #include "parser/parse.h"
3
4 gboolean config_focus_new;
5 gboolean config_focus_follow;
6 gboolean config_focus_last;
7 gboolean config_focus_last_on_desktop;
8 gboolean config_focus_popup;
9
10 char *config_theme;
11
12 gchar *config_title_layout;
13
14 int     config_desktops_num;
15 GSList *config_desktops_names;
16
17 gboolean config_redraw_resize;
18
19 ObStackingLayer config_dock_layer;
20 gboolean        config_dock_floating;
21 ObDirection     config_dock_pos;
22 gint            config_dock_x;
23 gint            config_dock_y;
24 ObOrientation   config_dock_orient;
25 gboolean        config_dock_hide;
26 guint           config_dock_hide_timeout;
27
28 static void parse_focus(xmlDocPtr doc, xmlNodePtr node, void *d)
29 {
30     xmlNodePtr n;
31
32     node = node->xmlChildrenNode;
33     
34     if ((n = parse_find_node("focusNew", node)))
35         config_focus_new = parse_bool(doc, n);
36     if ((n = parse_find_node("followMouse", node)))
37         config_focus_follow = parse_bool(doc, n);
38     if ((n = parse_find_node("focusLast", node)))
39         config_focus_last = parse_bool(doc, n);
40     if ((n = parse_find_node("focusLastOnDesktop", node)))
41         config_focus_last_on_desktop = parse_bool(doc, n);
42     if ((n = parse_find_node("cyclingDialog", node)))
43         config_focus_popup = parse_bool(doc, n);
44 }
45
46 static void parse_theme(xmlDocPtr doc, xmlNodePtr node, void *d)
47 {
48     xmlNodePtr n;
49
50     node = node->xmlChildrenNode;
51
52     if ((n = parse_find_node("theme", node))) {
53         g_free(config_theme);
54         config_theme = parse_string(doc, n);
55     }
56     if ((n = parse_find_node("titlelayout", node))) {
57         g_free(config_title_layout);
58         config_title_layout = parse_string(doc, n);
59     }
60 }
61
62 static void parse_desktops(xmlDocPtr doc, xmlNodePtr node, void *d)
63 {
64     xmlNodePtr n;
65
66     node = node->xmlChildrenNode;
67     
68     if ((n = parse_find_node("number", node)))
69         config_desktops_num = parse_int(doc, n);
70     if ((n = parse_find_node("names", node))) {
71         GSList *it;
72         xmlNodePtr nname;
73
74         for (it = config_desktops_names; it; it = it->next)
75             g_free(it->data);
76         g_slist_free(config_desktops_names);
77         config_desktops_names = NULL;
78
79         nname = parse_find_node("name", n->xmlChildrenNode);
80         while (nname) {
81             config_desktops_names = g_slist_append(config_desktops_names,
82                                                    parse_string(doc, nname));
83             nname = parse_find_node("name", nname->next);
84         }
85     }
86 }
87
88 static void parse_resize(xmlDocPtr doc, xmlNodePtr node, void *d)
89 {
90     xmlNodePtr n;
91
92     node = node->xmlChildrenNode;
93     
94     if ((n = parse_find_node("drawContents", node)))
95         config_redraw_resize = parse_bool(doc, n);
96 }
97
98 static void parse_dock(xmlDocPtr doc, xmlNodePtr node, void *d)
99 {
100     xmlNodePtr n;
101
102     node = node->xmlChildrenNode;
103
104     if ((n = parse_find_node("position", node))) {
105         if (parse_contains("TopLeft", doc, n))
106             config_dock_floating = FALSE,
107             config_dock_pos = OB_DIRECTION_NORTHWEST;
108         else if (parse_contains("Top", doc, n))
109             config_dock_floating = FALSE,
110             config_dock_pos = OB_DIRECTION_NORTH;
111         else if (parse_contains("TopRight", doc, n))
112             config_dock_floating = FALSE,
113             config_dock_pos = OB_DIRECTION_NORTHEAST;
114         else if (parse_contains("Right", doc, n))
115             config_dock_floating = FALSE,
116             config_dock_pos = OB_DIRECTION_EAST;
117         else if (parse_contains("BottomRight", doc, n))
118             config_dock_floating = FALSE,
119             config_dock_pos = OB_DIRECTION_SOUTHEAST;
120         else if (parse_contains("Bottom", doc, n))
121             config_dock_floating = FALSE,
122             config_dock_pos = OB_DIRECTION_SOUTH;
123         else if (parse_contains("BottomLeft", doc, n))
124             config_dock_floating = FALSE,
125             config_dock_pos = OB_DIRECTION_SOUTHWEST;
126         else if (parse_contains("Left", doc, n))
127             config_dock_floating = FALSE,
128             config_dock_pos = OB_DIRECTION_WEST;
129         else if (parse_contains("Floating", doc, n))
130             config_dock_floating = TRUE;
131     }
132     if (config_dock_floating) {
133         if ((n = parse_find_node("floatingX", node)))
134             config_dock_x = parse_int(doc, n);
135         if ((n = parse_find_node("floatingY", node)))
136             config_dock_y = parse_int(doc, n);
137     }
138     if ((n = parse_find_node("stacking", node))) {
139         if (parse_contains("top", doc, n))
140             config_dock_layer = OB_STACKING_LAYER_TOP;
141         else if (parse_contains("normal", doc, n))
142             config_dock_layer = OB_STACKING_LAYER_NORMAL;
143         else if (parse_contains("bottom", doc, n))
144             config_dock_layer = OB_STACKING_LAYER_BELOW;
145     }
146     if ((n = parse_find_node("direction", node))) {
147         if (parse_contains("horizontal", doc, n))
148             config_dock_orient = OB_ORIENTATION_HORZ;
149         else if (parse_contains("vertical", doc, n))
150             config_dock_orient = OB_ORIENTATION_VERT;
151     }
152     if ((n = parse_find_node("autoHide", node)))
153         config_dock_hide = parse_bool(doc, n);
154     if ((n = parse_find_node("hideTimeout", node)))
155         config_dock_hide_timeout = parse_int(doc, n);
156 }
157
158 void config_startup()
159 {
160     config_focus_new = TRUE;
161     config_focus_follow = FALSE;
162     config_focus_last = TRUE;
163     config_focus_last_on_desktop = TRUE;
164     config_focus_popup = TRUE;
165
166     parse_register("focus", parse_focus, NULL);
167
168     config_theme = NULL;
169
170     config_title_layout = g_strdup("NLIMC");
171
172     parse_register("theme", parse_theme, NULL);
173
174     config_desktops_num = 4;
175     config_desktops_names = NULL;
176
177     parse_register("desktops", parse_desktops, NULL);
178
179     config_redraw_resize = TRUE;
180
181     parse_register("resize", parse_resize, NULL);
182
183     config_dock_layer = OB_STACKING_LAYER_TOP;
184     config_dock_pos = OB_DIRECTION_NORTHEAST;
185     config_dock_floating = FALSE;
186     config_dock_x = 0;
187     config_dock_y = 0;
188     config_dock_orient = OB_ORIENTATION_VERT;
189     config_dock_hide = FALSE;
190     config_dock_hide_timeout = 3000;
191
192     parse_register("dock", parse_dock, NULL);
193 }
194
195 void config_shutdown()
196 {
197     GSList *it;
198
199     g_free(config_theme);
200
201     for (it = config_desktops_names; it; it = it->next)
202         g_free(it->data);
203     g_slist_free(config_desktops_names);
204 }