Fix Alt+Tab to fixed windows
[evilwm.git] / evilwm.h
blob694f39ea6d6109d5ec21c0673056d6ee3f7adaa2
1 /* evilwm - Minimalist Window Manager for X
2 * Copyright (C) 1999-2009 Ciaran Anscomb <evilwm@6809.org.uk>
3 * see README for license and other details. */
5 #include <X11/X.h>
6 #include <X11/Xatom.h>
7 #include <X11/Xlib.h>
8 #include <X11/Xmd.h>
9 #include <X11/Xutil.h>
10 #include <X11/keysym.h>
11 #ifdef SHAPE
12 #include <X11/extensions/shape.h>
13 #endif
14 #ifdef RANDR
15 #include <X11/extensions/Xrandr.h>
16 #endif
18 #ifndef __GNUC__
19 # define __attribute__(x)
20 #endif
22 #include "keymap.h"
23 #include "list.h"
25 /* Required for interpreting MWM hints: */
26 #define _XA_MWM_HINTS "_MOTIF_WM_HINTS"
27 #define PROP_MWM_HINTS_ELEMENTS 3
28 #define MWM_HINTS_DECORATIONS (1L << 1)
29 #define MWM_DECOR_ALL (1L << 0)
30 #define MWM_DECOR_BORDER (1L << 1)
31 typedef struct {
32 unsigned long flags;
33 unsigned long functions;
34 unsigned long decorations;
35 } PropMwmHints;
37 /* sanity on options */
38 #if defined(INFOBANNER_MOVERESIZE) && !defined(INFOBANNER)
39 # define INFOBANNER
40 #endif
42 /* default settings */
44 #define DEF_FONT "variable"
45 #define DEF_FG "goldenrod"
46 #define DEF_BG "grey50"
47 #define DEF_BW 1
48 #define DEF_FC "blue"
49 #define SPACE 3
50 #ifdef DEBIAN
51 #define DEF_TERM "x-terminal-emulator"
52 #else
53 #define DEF_TERM "xterm"
54 #endif
56 /* readability stuff */
58 #define VDESK_NONE (0xfffffffe)
59 #define VDESK_FIXED (0xffffffff)
60 #define VDESK_MAX (7)
61 #define KEY_TO_VDESK(key) ((key) - XK_1)
62 #define valid_vdesk(v) ((v) == VDESK_FIXED || (v) <= VDESK_MAX)
64 #define RAISE 1
65 #define NO_RAISE 0 /* for unhide() */
67 /* EWMH hints use these definitions, so for simplicity my functions
68 * will too: */
69 #define NET_WM_STATE_REMOVE 0 /* remove/unset property */
70 #define NET_WM_STATE_ADD 1 /* add/set property */
71 #define NET_WM_STATE_TOGGLE 2 /* toggle property */
73 #define MAXIMISE_HORZ (1<<0)
74 #define MAXIMISE_VERT (1<<1)
76 /* some coding shorthand */
78 #define ChildMask (SubstructureRedirectMask|SubstructureNotifyMask)
79 #define ButtonMask (ButtonPressMask|ButtonReleaseMask)
80 #define MouseMask (ButtonMask|PointerMotionMask)
82 #define grab_pointer(w, mask, curs) \
83 (XGrabPointer(dpy, w, False, mask, GrabModeAsync, GrabModeAsync, \
84 None, curs, CurrentTime) == GrabSuccess)
85 #define grab_button(w, mask, button) do { \
86 XGrabButton(dpy, button, (mask), w, False, ButtonMask, \
87 GrabModeAsync, GrabModeSync, None, None); \
88 XGrabButton(dpy, button, LockMask|(mask), w, False, ButtonMask,\
89 GrabModeAsync, GrabModeSync, None, None); \
90 XGrabButton(dpy, button, numlockmask|(mask), w, False, \
91 ButtonMask, GrabModeAsync, GrabModeSync, \
92 None, None); \
93 XGrabButton(dpy, button, numlockmask|LockMask|(mask), w, False,\
94 ButtonMask, GrabModeAsync, GrabModeSync, \
95 None, None); \
96 } while (0)
97 #define setmouse(w, x, y) XWarpPointer(dpy, None, w, 0, 0, 0, 0, x, y)
98 #define get_mouse_position(xp,yp,root) do { \
99 Window dw; \
100 int di; \
101 unsigned int dui; \
102 XQueryPointer(dpy, root, &dw, &dw, xp, yp, &di, &di, &dui); \
103 } while (0)
104 #define gravitate(c,g) gravitate_client(c, 1, g)
105 #define ungravitate(c) gravitate_client(c, -1, c->win_gravity)
107 #define is_fixed(c) (c->vdesk == VDESK_FIXED)
108 #define add_fixed(c) c->vdesk = VDESK_FIXED
109 #define remove_fixed(c) c->vdesk = c->screen->vdesk
111 #define discard_enter_events() do { \
112 XEvent dummy; \
113 XSync(dpy, False); \
114 while (XCheckMaskEvent(dpy, EnterWindowMask, &dummy)); \
115 } while (0)
117 /* screen structure */
119 typedef struct ScreenInfo ScreenInfo;
120 struct ScreenInfo {
121 int screen;
122 Window root;
123 Window supporting; /* Dummy window for EWMH */
124 GC invert_gc;
125 XColor fg, bg;
126 #ifdef VWM
127 unsigned int vdesk;
128 XColor fc;
129 #endif
130 char *display;
131 int docks_visible;
134 /* client structure */
136 typedef struct Client Client;
137 struct Client {
138 Window window;
139 Window parent;
140 ScreenInfo *screen;
141 Colormap cmap;
142 int ignore_unmap;
144 int x, y, width, height;
145 int border;
146 int oldx, oldy, oldw, oldh; /* used when maximising */
148 int min_width, min_height;
149 int max_width, max_height;
150 int width_inc, height_inc;
151 int base_width, base_height;
152 int win_gravity_hint;
153 int win_gravity;
154 int old_border;
155 #ifdef VWM
156 unsigned long vdesk;
157 #endif
158 int is_dock;
159 int remove; /* set when client needs to be removed */
162 typedef struct Application Application;
163 struct Application {
164 char *res_name;
165 char *res_class;
166 int geometry_mask;
167 int x, y;
168 unsigned int width, height;
169 int is_dock;
170 #ifdef VWM
171 unsigned long vdesk;
172 #endif
175 /* Declarations for global variables in main.c */
177 /* Commonly used X information */
178 extern Display *dpy;
179 extern XFontStruct *font;
180 extern Cursor move_curs;
181 extern Cursor resize_curs;
182 extern int num_screens;
183 extern ScreenInfo *screens;
184 #ifdef SHAPE
185 extern int have_shape, shape_event;
186 #endif
187 #ifdef RANDR
188 extern int have_randr, randr_event_base;
189 #endif
191 /* Standard X protocol atoms */
192 extern Atom xa_wm_state;
193 extern Atom xa_wm_protos;
194 extern Atom xa_wm_delete;
195 extern Atom xa_wm_cmapwins;
197 /* Motif atoms */
198 extern Atom mwm_hints;
200 /* evilwm atoms */
201 extern Atom xa_evilwm_unmaximised_horz;
202 extern Atom xa_evilwm_unmaximised_vert;
204 /* EWMH: Root Window Properties (and Related Messages) */
205 #ifdef VWM
206 extern Atom xa_net_current_desktop;
207 #endif
208 extern Atom xa_net_active_window;
210 /* EWMH: Other Root Window Messages */
211 extern Atom xa_net_close_window;
212 extern Atom xa_net_moveresize_window;
213 extern Atom xa_net_restack_window;
214 extern Atom xa_net_request_frame_extents;
216 /* EWMH: Application Window Properties */
217 #ifdef VWM
218 extern Atom xa_net_wm_desktop;
219 #endif
220 extern Atom xa_net_wm_window_type;
221 extern Atom xa_net_wm_window_type_dock;
222 extern Atom xa_net_wm_state;
223 extern Atom xa_net_wm_state_maximized_vert;
224 extern Atom xa_net_wm_state_maximized_horz;
225 extern Atom xa_net_wm_state_fullscreen;
226 extern Atom xa_net_frame_extents;
228 /* Things that affect user interaction */
229 extern unsigned int numlockmask;
230 extern unsigned int grabmask1;
231 extern unsigned int grabmask2;
232 extern unsigned int altmask;
233 extern const char *opt_term[3];
234 extern int opt_bw;
235 extern int opt_snap;
236 #ifdef SOLIDDRAG
237 extern int no_solid_drag;
238 #else
239 # define no_solid_drag (1)
240 #endif
241 extern struct list *applications;
243 /* Client tracking information */
244 extern struct list *clients_tab_order;
245 extern struct list *clients_mapping_order;
246 extern struct list *clients_stacking_order;
247 extern Client *current;
248 extern volatile Window initialising;
250 /* Event loop will run until this flag is set */
251 extern int wm_exit;
253 /* client.c */
255 Client *find_client(Window w);
256 void gravitate_client(Client *c, int sign, int gravity);
257 void select_client(Client *c);
258 #ifdef VWM
259 void client_to_vdesk(Client *c, unsigned int vdesk);
260 #endif
261 void remove_client(Client *c);
262 void send_config(Client *c);
263 void send_wm_delete(Client *c, int kill_client);
264 void set_wm_state(Client *c, int state);
265 void set_shape(Client *c);
267 /* events.c */
269 void event_main_loop(void);
271 /* misc.c */
273 extern int need_client_tidy;
274 extern int ignore_xerror;
275 int handle_xerror(Display *dsply, XErrorEvent *e);
276 void spawn(const char *const cmd[]);
277 void handle_signal(int signo);
279 /* new.c */
281 void make_new_client(Window w, ScreenInfo *s);
282 long get_wm_normal_hints(Client *c);
283 void get_window_type(Client *c);
285 /* screen.c */
287 void drag(Client *c);
288 void moveresize(Client *c);
289 void maximise_client(Client *c, int action, int hv);
290 void show_info(Client *c, unsigned int keycode);
291 void sweep(Client *c);
292 void unhide(Client *c, int raise_win);
293 void next(void);
294 void hide(Client *c);
295 #ifdef VWM
296 void switch_vdesk(ScreenInfo *s, unsigned int v);
297 #endif
298 void set_docks_visible(ScreenInfo *s, int is_visible);
299 ScreenInfo *find_screen(Window root);
300 ScreenInfo *find_current_screen(void);
301 void grab_keys_for_screen(ScreenInfo *s);
303 /* ewmh.c */
305 void ewmh_init(void);
306 void ewmh_init_screen(ScreenInfo *s);
307 void ewmh_deinit_screen(ScreenInfo *s);
308 void ewmh_init_client(Client *c);
309 void ewmh_deinit_client(Client *c);
310 void ewmh_withdraw_client(Client *c);
311 void ewmh_select_client(Client *c);
312 void ewmh_raise_client(Client *c);
313 void ewmh_lower_client(Client *c);
314 void ewmh_set_net_client_list(ScreenInfo *s);
315 void ewmh_set_net_client_list_stacking(ScreenInfo *s);
316 #ifdef VWM
317 void ewmh_set_net_current_desktop(ScreenInfo *s);
318 #endif
319 void ewmh_set_net_active_window(Client *c);
320 #ifdef VWM
321 void ewmh_set_net_wm_desktop(Client *c);
322 #endif
323 void ewmh_set_net_wm_state(Client *c);
324 void ewmh_set_net_frame_extents(Window w);