1 /* Copyright (c) 2012, Bastien Dejean
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * 1. Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include <xcb/xcb_icccm.h>
30 #include <xcb/randr.h>
31 #include <xcb/xcb_event.h>
34 #define MISSING_VALUE "N/A"
35 #define MAX_WM_STATES 4
61 WM_FLAG_MODAL = 1 << 0,
62 WM_FLAG_STICKY = 1 << 1,
63 WM_FLAG_MAXIMIZED_VERT = 1 << 2,
64 WM_FLAG_MAXIMIZED_HORZ = 1 << 3,
65 WM_FLAG_SHADED = 1 << 4,
66 WM_FLAG_SKIP_TASKBAR = 1 << 5,
67 WM_FLAG_SKIP_PAGER = 1 << 6,
68 WM_FLAG_HIDDEN = 1 << 7,
69 WM_FLAG_FULLSCREEN = 1 << 8,
70 WM_FLAG_ABOVE = 1 << 9,
71 WM_FLAG_BELOW = 1 << 10,
72 WM_FLAG_DEMANDS_ATTENTION = 1 << 11,
115 HANDLE_LEFT = 1 << 0,
117 HANDLE_RIGHT = 1 << 2,
118 HANDLE_BOTTOM = 1 << 3,
119 HANDLE_TOP_LEFT = HANDLE_TOP | HANDLE_LEFT,
120 HANDLE_TOP_RIGHT = HANDLE_TOP | HANDLE_RIGHT,
121 HANDLE_BOTTOM_RIGHT = HANDLE_BOTTOM | HANDLE_RIGHT,
122 HANDLE_BOTTOM_LEFT = HANDLE_BOTTOM | HANDLE_LEFT
159 STATE_TRANSITION_ENTER = 1 << 0,
160 STATE_TRANSITION_EXIT = 1 << 1,
161 } state_transition_t;
164 option_bool_t automatic;
165 option_bool_t focused;
166 option_bool_t active;
169 option_bool_t window;
171 option_bool_t pseudo_tiled;
172 option_bool_t floating;
173 option_bool_t fullscreen;
174 option_bool_t hidden;
175 option_bool_t sticky;
176 option_bool_t private;
177 option_bool_t locked;
178 option_bool_t marked;
179 option_bool_t urgent;
180 option_bool_t same_class;
181 option_bool_t descendant_of;
182 option_bool_t ancestor_of;
184 option_bool_t normal;
189 option_bool_t occupied;
190 option_bool_t focused;
191 option_bool_t active;
192 option_bool_t urgent;
197 option_bool_t occupied;
198 option_bool_t focused;
201 typedef struct icccm_props_t icccm_props_t;
202 struct icccm_props_t {
209 char class_name[3 * SMALEN / 2];
210 char instance_name[3 * SMALEN / 2];
211 unsigned int border_width;
214 client_state_t state;
215 client_state_t last_state;
217 stack_layer_t last_layer;
218 xcb_rectangle_t floating_rectangle;
219 xcb_rectangle_t tiled_rectangle;
220 xcb_size_hints_t size_hints;
221 icccm_props_t icccm_props;
225 typedef struct presel_t presel_t;
228 direction_t split_dir;
229 xcb_window_t feedback;
232 typedef struct constraints_t constraints_t;
233 struct constraints_t {
238 typedef struct node_t node_t;
241 split_type_t split_type;
244 xcb_rectangle_t rectangle;
245 constraints_t constraints;
253 node_t *second_child;
258 typedef struct padding_t padding_t;
266 typedef struct desktop_t desktop_t;
277 unsigned int border_width;
280 typedef struct monitor_t monitor_t;
284 xcb_randr_output_t randr_id;
288 unsigned int sticky_count;
290 unsigned int border_width;
291 xcb_rectangle_t rectangle;
293 desktop_t *desk_head;
294 desktop_t *desk_tail;
305 typedef struct history_t history_t;
313 typedef struct stacking_list_t stacking_list_t;
314 struct stacking_list_t {
316 stacking_list_t *prev;
317 stacking_list_t *next;
320 typedef struct event_queue_t event_queue_t;
321 struct event_queue_t {
322 xcb_generic_event_t event;
327 typedef struct subscriber_list_t subscriber_list_t;
328 struct subscriber_list_t {
333 subscriber_list_t *prev;
334 subscriber_list_t *next;
337 typedef struct rule_t rule_t;
339 char class_name[MAXLEN];
340 char instance_name[MAXLEN];
348 char class_name[3 * SMALEN / 2];
349 char instance_name[3 * SMALEN / 2];
350 char monitor_desc[MAXLEN];
351 char desktop_desc[MAXLEN];
352 char node_desc[MAXLEN];
353 char split_dir[SMALEN];
355 stack_layer_t *layer;
356 client_state_t *state;
367 xcb_rectangle_t *rect;
368 } rule_consequence_t;
370 typedef struct pending_rule_t pending_rule_t;
371 struct pending_rule_t {
374 rule_consequence_t *csq;
375 event_queue_t *event_head;
376 event_queue_t *event_tail;
377 pending_rule_t *prev;
378 pending_rule_t *next;