about summary refs log tree commit diff stats
path: root/dwm.h
blob: 1439f59dc58fce1c02f7466cdf9cf9c390545efe (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
 * See LICENSE file for license details.
 */

#include <X11/Xlib.h>

/* CUSTOMIZE */

#define FONT				"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
#define BGCOLOR				"#0a2c2d"
#define FGCOLOR				"#ddeeee"
#define BORDERCOLOR			"#176164"
#define MODKEY				 Mod1Mask /* Mod4Mask */
/*
#define BGCOLOR				"#666699"
#define FGCOLOR				"#eeeeee"
#define BORDERCOLOR			"#9999CC"
*/
#define MASTERW				52 /* percent */
#define WM_PROTOCOL_DELWIN	1

/* tags */
enum { Tscratch, Tdev, Twww, Twork, TLast };

/* END CUSTOMIZE */

typedef union Arg Arg;
typedef struct Client Client;
typedef enum Corner Corner;
typedef struct DC DC;
typedef struct Fnt Fnt;

union Arg {
	const char **argv;
	int i;
};

/* atoms */
enum { NetSupported, NetWMName, NetLast };
enum { WMProtocols, WMDelete, WMLast };

/* cursor */
enum { CurNormal, CurResize, CurMove, CurLast };

enum Corner { TopLeft, TopRight, BotLeft, BotRight };

struct Fnt {
	int ascent;
	int descent;
	int height;
	XFontSet set;
	XFontStruct *xfont;
};

struct DC { /* draw context */
	int x, y, w, h;
	unsigned long bg;
	unsigned long fg;
	unsigned long border;
	Drawable drawable;
	Fnt font;
	GC gc;
};

struct Client {
	char name[256];
	char *tags[TLast];
	int proto;
	int x, y, w, h;
	int tx, ty, tw, th; /* title */
	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
	int grav;
	unsigned int border;
	long flags; 
	Bool isfloat;
	Bool ismax;
	Client *next;
	Client *prev;
	Window win;
	Window title;
};

extern char *tags[TLast], stext[1024];
extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
extern void (*handler[LASTEvent])(XEvent *);
extern void (*arrange)(Arg *);
extern Atom wmatom[WMLast], netatom[NetLast];
extern Bool running, issel;
extern Client *clients, *sel;
extern Cursor cursor[CurLast];
extern DC dc;
extern Display *dpy;
extern Window root, barwin;

/* client.c */
extern void ban(Client *c);
extern void focus(Client *c);
extern void focusnext(Arg *arg);
extern void focusprev(Arg *arg);
extern Client *getclient(Window w);
extern Client *getctitle(Window w);
extern void gravitate(Client *c, Bool invert);
extern void higher(Client *c);
extern void killclient(Arg *arg);
extern void lower(Client *c);
extern void manage(Window w, XWindowAttributes *wa);
extern void pop(Client *c);
extern void resize(Client *c, Bool sizehints, Corner sticky);
extern void setsize(Client *c);
extern void settitle(Client *c);
extern void togglemax(Arg *arg);
extern void unmanage(Client *c);
extern void zoom(Arg *arg);

/* draw.c */
extern void drawall();
extern void drawstatus();
extern void drawtitle(Client *c);
extern unsigned long getcolor(const char *colstr);
extern void setfont(const char *fontstr);
extern unsigned int textw(char *text);

/* event.c */
extern void grabkeys();

/* main.c */
extern int getproto(Window w);
extern void quit(Arg *arg);
extern void sendevent(Window w, Atom a, long value);
extern int xerror(Display *dsply, XErrorEvent *ee);

/* tag.c */
extern void appendtag(Arg *arg);
extern void dofloat(Arg *arg);
extern void dotile(Arg *arg);
extern Client *getnext(Client *c, unsigned int t);
extern Client *getprev(Client *c);
extern void heretag(Arg *arg);
extern void replacetag(Arg *arg);
extern void settags(Client *c);
extern void togglemode(Arg *arg);
extern void view(Arg *arg);

/* util.c */
extern void *emallocz(unsigned int size);
extern void eprint(const char *errstr, ...);
extern void spawn(Arg *arg);
quot;integer", "deref": ]} run/0: ingredient 0 is circular-buffer mem/0: location 1045 is 1034 run/0: ingredient 1 is {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} mem/0: location 1046 is 1032 mem/0: location 1032 is 0 run/0: address to copy is 1035 run/0: product 0 is 1035 mem/0: storing 1035 in location 1047 run/0: instruction write/12 run/0: {name: "dest", value: 7, type: 2-1, properties: ["dest": "address":"location", "deref": ]} <- copy/1 {name: "val", value: 2, type: 1, properties: ["val": "location"]} run/0: ingredient 0 is val mem/0: location 1042 is 34 mem/0: location 1047 is 1035 mem/0: storing 34 in location 1035 run/0: instruction write/13 run/0: {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]} <- add/2 {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is free mem/0: location 1046 is 1032 mem/0: location 1032 is 0 run/0: ingredient 1 is 1 run/0: product 0 is 1 mem/0: location 1046 is 1032 mem/0: storing 1 in location 1032 run/0: instruction write/15 run/0: {name: "len", value: 8, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]} mem/0: location 1045 is 1034 mem/0: storing 4 in location 1048 run/0: instruction write/16 run/0: {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal/16 {name: "free", value: 6, type: 2-1, properties: ["free": "address":"integer", "deref": ]}, {name: "len", value: 8, type: 1, properties: ["len": "integer"]} run/0: ingredient 0 is free mem/0: location 1046 is 1032 mem/0: location 1032 is 1 run/0: ingredient 1 is len mem/0: location 1048 is 4 run/0: product 0 is 0 mem/0: storing 0 in location 1049 run/0: instruction write/17 run/0: break-unless/12 {name: "at-end?", value: 9, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]} mem/0: location 1049 is 0 run/0: ingredient 0 is 0 run/0: ingredient 1 is run/0: jumping to instruction 19 run/0: instruction write/20 run/0: reply/33 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]} mem/0: location 1041 is 1031 run/0: result 0 is 1031 mem/0: storing 1031 in location 1 run/0: instruction run1001/2 run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]}, {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} <- read/111 {name: "1", value: 1, type: 2-10, properties: ["1": "address":"channel"]} mem/0: location 1 is 1031 run/0: instruction read/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1132 run/0: instruction read/1 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 run/0: product 0 is 1031 mem/0: storing 1031 in location 1134 run/0: instruction read/3 run/0: {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]} <- channel-empty?/112 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} mem/0: location 1134 is 1031 run/0: instruction channel-empty?/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1163 run/0: instruction channel-empty?/1 run/0: {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel"]} <- next-ingredient/30 run/0: product 0 is 1031 mem/0: storing 1031 in location 1165 run/0: instruction channel-empty?/2 run/0: {name: "full", value: 2, type: 1, properties: ["full": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]} run/0: ingredient 0 is chan mem/0: location 1165 is 1031 run/0: ingredient 1 is first-full run/0: address to copy is 1031 run/0: its type is 1 mem/0: location 1031 is 0 run/0: product 0 is 0 mem/0: storing 0 in location 1166 run/0: instruction channel-empty?/3 run/0: {name: "free", value: 3, type: 1, properties: ["free": "integer"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-free", value: 1, type: 0, properties: ["first-free": "offset"]} run/0: ingredient 0 is chan mem/0: location 1165 is 1031 run/0: ingredient 1 is first-free run/0: address to copy is 1032 run/0: its type is 1 mem/0: location 1032 is 1 run/0: product 0 is 1 mem/0: storing 1 in location 1167 run/0: instruction channel-empty?/4 run/0: {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} <- equal/13 {name: "full", value: 2, type: 1, properties: ["full": "integer"]}, {name: "free", value: 3, type: 1, properties: ["free": "integer"]} run/0: ingredient 0 is full mem/0: location 1166 is 0 run/0: ingredient 1 is free mem/0: location 1167 is 1 run/0: product 0 is 0 mem/0: storing 0 in location 1168 run/0: instruction channel-empty?/5 run/0: reply/33 {name: "result", value: 4, type: 3, properties: ["result": "boolean"]} mem/0: location 1168 is 0 run/0: result 0 is 0 mem/0: storing 0 in location 1135 run/0: instruction read/4 run/0: break-unless/12 {name: "empty", value: 2, type: 3, properties: ["empty": "boolean"]}, {name: "", value: 2, type: , properties: ["": ]} mem/0: location 1135 is 0 run/0: ingredient 0 is 0 run/0: ingredient 1 is run/0: jumping to instruction 7 run/0: instruction read/8 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer"]} <- get-address/25 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]} run/0: ingredient 0 is chan mem/0: location 1134 is 1031 run/0: ingredient 1 is first-full run/0: address to copy is 1031 run/0: product 0 is 1031 mem/0: storing 1031 in location 1137 run/0: instruction read/9 run/0: {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location"]} <- get/24 {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "deref": ]}, {name: "data", value: 2, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is chan mem/0: location 1134 is 1031 run/0: ingredient 1 is data run/0: address to copy is 1033 run/0: its type is 2 mem/0: location 1033 is 1034 run/0: product 0 is 1034 mem/0: storing 1034 in location 1138 run/0: instruction read/10 run/0: {name: "result", value: 6, type: 1, properties: ["result": "location"]} <- index/26 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]}, {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} run/0: ingredient 0 is {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]} mem/0: location 1138 is 1034 run/0: ingredient 1 is {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} mem/0: location 1137 is 1031 mem/0: location 1031 is 0 run/0: address to copy is 1035 run/0: its type is 1 mem/0: location 1035 is 34 run/0: product 0 is 34 mem/0: storing 34 in location 1139 run/0: instruction read/11 run/0: {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]} <- add/2 {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is full mem/0: location 1137 is 1031 mem/0: location 1031 is 0 run/0: ingredient 1 is 1 run/0: product 0 is 1 mem/0: location 1137 is 1031 mem/0: storing 1 in location 1031 run/0: instruction read/13 run/0: {name: "len", value: 7, type: 1, properties: ["len": "integer"]} <- length/28 {name: "circular-buffer", value: 5, type: 2-5-1, properties: ["circular-buffer": "address":"array":"location", "deref": ]} mem/0: location 1138 is 1034 mem/0: storing 4 in location 1140 run/0: instruction read/14 run/0: {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]} <- greater-or-equal/16 {name: "full", value: 4, type: 2-1, properties: ["full": "address":"integer", "deref": ]}, {name: "len", value: 7, type: 1, properties: ["len": "integer"]} run/0: ingredient 0 is full mem/0: location 1137 is 1031 mem/0: location 1031 is 1 run/0: ingredient 1 is len mem/0: location 1140 is 4 run/0: product 0 is 0 mem/0: storing 0 in location 1141 run/0: instruction read/15 run/0: break-unless/12 {name: "at-end?", value: 8, type: 3, properties: ["at-end?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]} mem/0: location 1141 is 0 run/0: ingredient 0 is 0 run/0: ingredient 1 is run/0: jumping to instruction 17 run/0: instruction read/18 run/0: reply/33 {name: "result", value: 6, type: 1, properties: ["result": "location"]}, {name: "chan", value: 1, type: 2-10, properties: ["chan": "address":"channel", "same-as-ingredient": "0"]} mem/0: location 1139 is 34 mem/0: location 1134 is 1031 run/0: result 0 is 34 mem/0: storing 34 in location 2 run/0: result 1 is 1031 mem/0: storing 1031 in location 1 run/0: instruction channel/1 run/0: memory-should-contain/45 {name: " 2 <- 34 ", value: 0, type: 0, properties: [" 2 <- 34 ": "literal-string"]} run/0: checking location 2