1 /* © 2004-2006 Anselm R. Garbe <garbeam at gmail dot com>
2  * See LICENSE file for license details.
3  */
4 
5 #define IXP_P9_STRUCTS
6 #define IXP_NO_P9_
7 #include <regexp9.h>
8 #include <stdint.h>
9 #include <ixp.h>
10 #include <util.h>
11 #include <utf.h>
12 #include <fmt.h>
13 #include "x11.h"
14 
15 #define FONT		"-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*"
16 #define FOCUSCOLORS	"#ffffff #335577 #447799"
17 #define NORMCOLORS	"#222222 #eeeeee #666666"
18 
19 enum Align {
20 	NORTH = 0x01,
21 	EAST  = 0x02,
22 	SOUTH = 0x04,
23 	WEST  = 0x08,
24 	NEAST = NORTH | EAST,
25 	NWEST = NORTH | WEST,
26 	SEAST = SOUTH | EAST,
27 	SWEST = SOUTH | WEST,
28 	CENTER = NEAST | SWEST,
29 };
30 
31 typedef struct CTuple CTuple;
32 typedef enum Align Align;
33 
34 struct CTuple {
35 	ulong bg;
36 	ulong fg;
37 	ulong border;
38 	char colstr[24]; /* #RRGGBB #RRGGBB #RRGGBB */
39 };
40 
41 enum {
42 	Coldefault, Colstack, Colmax,
43 };
44 
45 enum {
46 	Off,
47 	On,
48 	Toggle,
49 };
50 
51 enum {
52 	CurNormal,
53 	CurNECorner, CurNWCorner, CurSECorner, CurSWCorner,
54 	CurDHArrow, CurMove, CurInput, CurSizing, CurIcon,
55 	CurNone,
56 	CurLast,
57 };
58 
59 enum {
60 	NCOL = 16,
61 	WM_PROTOCOL_DELWIN = 1,
62 };
63 
64 /* Data Structures */
65 typedef struct View View;
66 typedef struct Area Area;
67 typedef struct Frame Frame;
68 typedef struct Client Client;
69 typedef struct Divide Divide;
70 typedef struct Key Key;
71 typedef struct Bar Bar;
72 typedef struct Rule Rule;
73 typedef struct Ruleset Ruleset;
74 typedef struct WMScreen WMScreen;
75 typedef struct Map Map;
76 typedef struct MapEnt MapEnt;
77 
78 struct Map {
79 	MapEnt **bucket;
80 	uint nhash;
81 };
82 
83 struct MapEnt {
84 	ulong hash;
85 	char *key;
86 	void *val;
87 	MapEnt *next;
88 };
89 
90 struct View {
91 	View *next;
92 	char name[256];
93 	ushort id;
94 	Area *area;
95 	Area *sel;
96 	Area *revert;
97 };
98 
99 struct Area {
100 	Area *next, *prev;
101 	Frame *frame;
102 	Frame *stack;
103 	Frame *sel;
104 	View *view;
105 	Bool floating;
106 	ushort id;
107 	int mode;
108 	Rectangle r;
109 };
110 
111 struct Frame {
112 	Frame *cnext;
113 	Frame *anext, *aprev;
114 	Frame *snext, *sprev;
115 	View *view;
116 	Area *area;
117 	ushort id;
118 	Rectangle r;
119 	Rectangle crect;
120 	Rectangle revert;
121 	Client *client;
122 	Bool collapsed;
123 	Rectangle grabbox;
124 	Rectangle titlebar;
125 	float ratio;
126 };
127 
128 struct Client {
129 	Client *next;
130 	Area *revert;
131 	Frame *frame;
132 	Frame *sel;
133 	char name[256];
134 	char tags[256];
135 	char props[512];
136 	uint border;
137 	int proto;
138 	Bool floating;
139 	Bool fixedsize;
140 	Bool fullscreen;
141 	Bool urgent;
142 	Bool borderless;
143 	Bool titleless;
144 	Bool noinput;
145 	int unmapped;
146 	Window w;
147 	XWindow trans;
148 	Window *framewin;
149 	Cursor cursor;
150 	Rectangle r;
151 	XSizeHints size;
152 	GC gc;
153 };
154 
155 struct Divide {
156 	Divide *next;
157 	Window *w;
158 	Bool mapped;
159 	int x;
160 };
161 
162 struct Key {
163 	Key *next;
164 	Key *lnext;
165 	Key *tnext;
166 	ushort id;
167 	char name[128];
168 	ulong mod;
169 	KeyCode key;
170 };
171 
172 struct Bar {
173 	Bar *next;
174 	Bar *smaller;
175 	char buf[280];
176 	char text[256];
177 	char name[256];
178 	ushort id;
179 	Rectangle r;
180 	CTuple col;
181 };
182 
183 struct Rule {
184 	Rule *next;
185 	Reprog *regex;
186 	char value[256];
187 };
188 
189 struct Ruleset {
190 	Rule		*rule;
191 	char		*string;
192 	uint		size;
193 };
194 
195 /* global variables */
196 struct Global {
197 	CTuple focuscolor;
198 	CTuple normcolor;
199 	Font *font;
200 	uint	 border;
201 	uint	 snap;
202 	char *keys;
203 	uint	 keyssz;
204 	Ruleset	tagrules;
205 	Ruleset	colrules;
206 	char grabmod[5];
207 	ulong mod;
208 	int colmode;
209 };
210 
211 extern struct Global def;
212 
213 enum {
214 	BarLeft, BarRight
215 };
216 
217 struct WMScreen {
218 	Bar *bar[2];
219 	View *sel;
220 	Client *focus;
221 	Client *hasgrab;
222 	Window *barwin;
223 	Image *ibuf;
224 
225 	Rectangle r;
226 	Rectangle brect;
227 };
228 
229 extern WMScreen *screens, *screen;
230 
231 extern Client *client;
232 extern View *view;
233 extern Key *key;
234 extern Divide *divs;
235 extern Client c_magic;
236 extern Client c_root;
237 
238 extern Handlers framehandler;
239 
240 extern char buffer[8092];
241 
242 /* IXP */
243 extern IxpServer srv;
244 extern Ixp9Srv p9srv;
245 
246 /* X11 */
247 extern uint num_screens;
248 extern uint valid_mask;
249 extern uint num_lock_mask;
250 extern Bool sel_screen;
251 
252 extern Image xor;
253 
254 extern Cursor cursor[CurLast];
255 extern void (*handler[LASTEvent]) (XEvent *);
256 
257 /* Misc */
258 extern Image *broken;
259 extern Bool starting;
260 extern Bool verbose;
261 extern char *user;
262 extern char *execstr;
263 
264 #define Debug if(verbose)
265 #define Dprint(...) do{ Debug fprint(2, __VA_ARGS__); }while(0)
266 
267