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. */
10 #include <X11/keysym.h>
12 #include <X11/extensions/shape.h>
15 #include <X11/extensions/Xrandr.h>
19 # define __attribute__(x)
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)
33 unsigned long functions
;
34 unsigned long decorations
;
37 /* sanity on options */
38 #if defined(INFOBANNER_MOVERESIZE) && !defined(INFOBANNER)
42 /* default settings */
44 #define DEF_FONT "variable"
45 #define DEF_FG "goldenrod"
46 #define DEF_BG "grey50"
51 #define DEF_TERM "x-terminal-emulator"
53 #define DEF_TERM "xterm"
56 /* readability stuff */
58 #define VDESK_NONE (0xfffffffe)
59 #define VDESK_FIXED (0xffffffff)
61 #define KEY_TO_VDESK(key) ((key) - XK_1)
62 #define valid_vdesk(v) ((v) == VDESK_FIXED || (v) <= VDESK_MAX)
65 #define NO_RAISE 0 /* for unhide() */
67 /* EWMH hints use these definitions, so for simplicity my functions
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, \
93 XGrabButton(dpy, button, numlockmask|LockMask|(mask), w, False,\
94 ButtonMask, GrabModeAsync, GrabModeSync, \
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 { \
102 XQueryPointer(dpy, root, &dw, &dw, xp, yp, &di, &di, &dui); \
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 { \
114 while (XCheckMaskEvent(dpy, EnterWindowMask, &dummy)); \
117 /* screen structure */
119 typedef struct ScreenInfo ScreenInfo
;
123 Window supporting
; /* Dummy window for EWMH */
134 /* client structure */
136 typedef struct Client Client
;
144 int x
, y
, width
, height
;
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
;
159 int remove
; /* set when client needs to be removed */
162 typedef struct Application Application
;
168 unsigned int width
, height
;
175 /* Declarations for global variables in main.c */
177 /* Commonly used X information */
179 extern XFontStruct
*font
;
180 extern Cursor move_curs
;
181 extern Cursor resize_curs
;
182 extern int num_screens
;
183 extern ScreenInfo
*screens
;
185 extern int have_shape
, shape_event
;
188 extern int have_randr
, randr_event_base
;
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
;
198 extern Atom mwm_hints
;
201 extern Atom xa_evilwm_unmaximised_horz
;
202 extern Atom xa_evilwm_unmaximised_vert
;
204 /* EWMH: Root Window Properties (and Related Messages) */
206 extern Atom xa_net_current_desktop
;
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 */
218 extern Atom xa_net_wm_desktop
;
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];
237 extern int no_solid_drag
;
239 # define no_solid_drag (1)
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 */
255 Client
*find_client(Window w
);
256 void gravitate_client(Client
*c
, int sign
, int gravity
);
257 void select_client(Client
*c
);
259 void client_to_vdesk(Client
*c
, unsigned int vdesk
);
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
);
269 void event_main_loop(void);
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
);
281 void make_new_client(Window w
, ScreenInfo
*s
);
282 long get_wm_normal_hints(Client
*c
);
283 void get_window_type(Client
*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
);
294 void hide(Client
*c
);
296 void switch_vdesk(ScreenInfo
*s
, unsigned int v
);
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
);
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
);
317 void ewmh_set_net_current_desktop(ScreenInfo
*s
);
319 void ewmh_set_net_active_window(Client
*c
);
321 void ewmh_set_net_wm_desktop(Client
*c
);
323 void ewmh_set_net_wm_state(Client
*c
);
324 void ewmh_set_net_frame_extents(Window w
);