aewl

view dwm.h @ 541:08d3d329270a

using MASTER 600 again, it is definately better, and using urxvtc for the moment (it doesn't flickers on refreshes, but this is not because of Marc Lehmann, it is because of the original rxvt code)
author arg@mig29
date Thu, 26 Oct 2006 12:13:41 +0200
parents a5567a0d3011
children fd1061442711
line source
1 /* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
2 * See LICENSE file for license details.
3 *
4 * dynamic window manager is designed like any other X client as well. It is
5 * driven through handling X events. In contrast to other X clients, a window
6 * manager selects for SubstructureRedirectMask on the root window, to receive
7 * events about window (dis-)appearance. Only one X connection at a time is
8 * allowed to select for this event mask.
9 *
10 * Calls to fetch an X event from the event queue are blocking. Due reading
11 * status text from standard input, a select()-driven main loop has been
12 * implemented which selects for reads on the X connection and STDIN_FILENO to
13 * handle all data smoothly. The event handlers of dwm are organized in an
14 * array which is accessed whenever a new event has been fetched. This allows
15 * event dispatching in O(1) time.
16 *
17 * Each child of the root window is called a client, except windows which have
18 * set the override_redirect flag. Clients are organized in a global
19 * doubly-linked client list, the focus history is remembered through a global
20 * stack list. Each client contains an array of Bools of the same size as the
21 * global tags array to indicate the tags of a client. For each client dwm
22 * creates a small title window, which is resized whenever the (_NET_)WM_NAME
23 * properties are updated or the client is moved/resized.
24 *
25 * Keys and tagging rules are organized as arrays and defined in the config.h
26 * file. These arrays are kept static in event.o and tag.o respectively,
27 * because no other part of dwm needs access to them. The current mode is
28 * represented by the arrange() function pointer, which wether points to
29 * dofloat() or dotile().
30 *
31 * To understand everything else, start reading main.c:main().
32 */
34 #include "config.h"
35 #include <X11/Xlib.h>
37 /* mask shorthands, used in event.c and client.c */
38 #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask)
39 /* other stuff used in different places */
40 #define BORDERPX 1
41 #define PROTODELWIN 1
43 enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
44 enum { WMProtocols, WMDelete, WMLast }; /* default atoms */
45 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
46 enum { ColFG, ColBG, ColLast }; /* color */
48 typedef enum {
49 TopLeft, TopRight, BotLeft, BotRight
50 } Corner; /* window corners */
52 typedef union {
53 const char *cmd;
54 int i;
55 } Arg; /* argument type */
57 typedef struct {
58 int ascent;
59 int descent;
60 int height;
61 XFontSet set;
62 XFontStruct *xfont;
63 } Fnt;
65 typedef struct {
66 int x, y, w, h;
67 unsigned long norm[ColLast];
68 unsigned long sel[ColLast];
69 unsigned long status[ColLast];
70 Drawable drawable;
71 Fnt font;
72 GC gc;
73 } DC; /* draw context */
75 typedef struct Client Client;
76 struct Client {
77 char name[256];
78 int proto;
79 int x, y, w, h;
80 int rx, ry, rw, rh; /* revert geometry */
81 int tx, ty, tw, th; /* title window geometry */
82 int basew, baseh, incw, inch, maxw, maxh, minw, minh;
83 int grav;
84 long flags;
85 unsigned int border, weight;
86 Bool isfloat, ismax;
87 Bool *tags;
88 Client *next;
89 Client *prev;
90 Client *snext;
91 Window win;
92 Window twin;
93 };
95 extern const char *tags[]; /* all tags */
96 extern char stext[1024]; /* status text */
97 extern int bx, by, bw, bh, bmw; /* bar geometry, bar mode label width */
98 extern int screen, sx, sy, sw, sh; /* screen geometry */
99 extern unsigned int master, ntags, numlockmask; /* master percent, number of tags, dynamic lock mask */
100 extern void (*handler[LASTEvent])(XEvent *); /* event handler */
101 extern void (*arrange)(void); /* arrange function, indicates mode */
102 extern Atom wmatom[WMLast], netatom[NetLast];
103 extern Bool running, issel, *seltag; /* seltag is array of Bool */
104 extern Client *clients, *sel, *stack; /* global client list and stack */
105 extern Cursor cursor[CurLast];
106 extern DC dc; /* global draw context */
107 extern Display *dpy;
108 extern Window root, barwin;
110 /* client.c */
111 extern void ban(Client *c); /* ban c from screen */
112 extern void configure(Client *c); /* send synthetic configure event */
113 extern void focus(Client *c); /* focus c, c may be NULL */
114 extern Client *getclient(Window w); /* return client of w */
115 extern Client *getctitle(Window w); /* return client of title window */
116 extern void gravitate(Client *c, Bool invert); /* gravitate c */
117 extern void killclient(Arg *arg); /* kill c nicely */
118 extern void manage(Window w, XWindowAttributes *wa); /* manage new client */
119 extern void resize(Client *c, Bool sizehints, Corner sticky); /* resize c*/
120 extern void resizetitle(Client *c); /* resizes c->twin correctly */
121 extern void updatesize(Client *c); /* update the size structs of c */
122 extern void updatetitle(Client *c); /* update the name of c */
123 extern void unmanage(Client *c); /* destroy c */
125 /* draw.c */
126 extern void drawall(void); /* draw all visible client titles and the bar */
127 extern void drawstatus(void); /* draw the bar */
128 extern void drawtitle(Client *c); /* draw title of c */
129 extern unsigned long getcolor(const char *colstr); /* return color of colstr */
130 extern void setfont(const char *fontstr); /* set the font for DC */
131 extern unsigned int textw(const char *text); /* return the width of text in px*/
133 /* event.c */
134 extern void grabkeys(void); /* grab all keys defined in config.h */
135 extern void procevent(void); /* process pending X events */
137 /* main.c */
138 extern int getproto(Window w); /* return protocol mask of WMProtocols property of w */
139 extern void quit(Arg *arg); /* quit dwm nicely */
140 extern void sendevent(Window w, Atom a, long value); /* send synthetic event to w */
141 extern int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */
143 /* tag.c */
144 extern void initrregs(void); /* initialize regexps of rules defined in config.h */
145 extern Client *getnext(Client *c); /* returns next visible client */
146 extern Client *getprev(Client *c); /* returns previous visible client */
147 extern void settags(Client *c, Client *trans); /* sets tags of c */
148 extern void tag(Arg *arg); /* tags c with arg's index */
149 extern void toggletag(Arg *arg); /* toggles c tags with arg's index */
151 /* util.c */
152 extern void *emallocz(unsigned int size); /* allocates zero-initialized memory, exits on error */
153 extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */
154 extern void *erealloc(void *ptr, unsigned int size); /* reallocates memory, exits on error */
155 extern void spawn(Arg *arg); /* forks a new subprocess with to arg's cmd */
157 /* view.c */
158 extern void detach(Client *c); /* detaches c from global client list */
159 extern void dofloat(void); /* arranges all windows floating */
160 extern void dotile(void); /* arranges all windows tiled */
161 extern void focusnext(Arg *arg); /* focuses next visible client, arg is ignored */
162 extern void focusprev(Arg *arg); /* focuses previous visible client, arg is ignored */
163 extern Bool isvisible(Client *c); /* returns True if client is visible */
164 extern void resizecol(Arg *arg); /* resizes the master percent with arg's index value */
165 extern void restack(void); /* restores z layers of all clients */
166 extern void togglemode(Arg *arg); /* toggles global arrange function (dotile/dofloat) */
167 extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */
168 extern void view(Arg *arg); /* views the tag with arg's index */
169 extern void viewall(Arg *arg); /* views all tags, arg is ignored */
170 extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */