13 |
13 |
14 #include "wm.h" |
14 #include "wm.h" |
15 |
15 |
16 /* X structs */ |
16 /* X structs */ |
17 Display *dpy; |
17 Display *dpy; |
18 Window root; |
18 Window root, barwin; |
19 XRectangle rect; |
19 Atom wm_atom[WMLast], net_atom[NetLast]; |
20 Pixmap pmap; |
|
21 Atom wm_atom[WMLast]; |
|
22 Atom net_atom[NetLast]; |
|
23 Cursor cursor[CurLast]; |
20 Cursor cursor[CurLast]; |
24 |
21 XRectangle rect, barrect; |
|
22 Bool running = True; |
|
23 |
|
24 char *bartext, *shell; |
25 int screen, sel_screen; |
25 int screen, sel_screen; |
26 unsigned int kmask, numlock_mask; |
26 unsigned int lock_mask, numlock_mask; |
27 |
27 |
28 /* draw structs */ |
28 /* draw structs */ |
29 Brush brush = {0}; |
29 Brush brush = {0}; |
30 |
30 |
31 enum { WM_PROTOCOL_DELWIN = 1 }; |
31 enum { WM_PROTOCOL_DELWIN = 1 }; |
216 XFlush(dpy); |
217 XFlush(dpy); |
217 |
218 |
218 if(other_wm_running) |
219 if(other_wm_running) |
219 error("gridwm: another window manager is already running\n"); |
220 error("gridwm: another window manager is already running\n"); |
220 |
221 |
|
222 if(!(shell = getenv("SHELL"))) |
|
223 shell = "/bin/sh"; |
|
224 |
221 rect.x = rect.y = 0; |
225 rect.x = rect.y = 0; |
222 rect.width = DisplayWidth(dpy, screen); |
226 rect.width = DisplayWidth(dpy, screen); |
223 rect.height = DisplayHeight(dpy, screen); |
227 rect.height = DisplayHeight(dpy, screen); |
224 sel_screen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); |
228 sel_screen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); |
225 |
229 |
242 cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); |
246 cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); |
243 cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); |
247 cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); |
244 |
248 |
245 init_lock_keys(); |
249 init_lock_keys(); |
246 |
250 |
247 pmap = XCreatePixmap(dpy, root, rect.width, rect.height, |
251 brush.drawable = XCreatePixmap(dpy, root, rect.width, rect.height, |
248 DefaultDepth(dpy, screen)); |
252 DefaultDepth(dpy, screen)); |
|
253 brush.gc = XCreateGC(dpy, root, 0, 0); |
|
254 |
|
255 /* style */ |
|
256 loadcolors(dpy, screen, &brush, BGCOLOR, FGCOLOR, BORDERCOLOR); |
|
257 loadfont(dpy, &brush.font, FONT); |
|
258 |
|
259 wa.override_redirect = 1; |
|
260 wa.background_pixmap = ParentRelative; |
|
261 wa.event_mask = ExposureMask; |
|
262 |
|
263 barrect = rect; |
|
264 barrect.height = labelheight(&brush.font); |
|
265 barrect.y = rect.height - barrect.height; |
|
266 barwin = XCreateWindow(dpy, root, barrect.x, barrect.y, |
|
267 barrect.width, barrect.height, 0, DefaultDepth(dpy, screen), |
|
268 CopyFromParent, DefaultVisual(dpy, screen), |
|
269 CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); |
|
270 bartext = 0; |
|
271 XDefineCursor(dpy, barwin, cursor[CurNormal]); |
|
272 XMapRaised(dpy, barwin); |
|
273 draw_bar(); |
249 |
274 |
250 wa.event_mask = SubstructureRedirectMask | EnterWindowMask | LeaveWindowMask; |
275 wa.event_mask = SubstructureRedirectMask | EnterWindowMask | LeaveWindowMask; |
251 wa.cursor = cursor[CurNormal]; |
276 wa.cursor = cursor[CurNormal]; |
252 XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); |
277 XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); |
253 |
278 |
254 /* style */ |
|
255 loadcolors(dpy, screen, &brush, BGCOLOR, FGCOLOR, BORDERCOLOR); |
|
256 loadfont(dpy, &brush.font, FONT); |
|
257 |
|
258 scan_wins(); |
279 scan_wins(); |
|
280 |
|
281 while(running) { |
|
282 XNextEvent(dpy, &ev); |
|
283 if(handler[ev.type]) |
|
284 (handler[ev.type]) (&ev); /* call handler */ |
|
285 } |
259 |
286 |
260 cleanup(); |
287 cleanup(); |
261 XCloseDisplay(dpy); |
288 XCloseDisplay(dpy); |
262 |
289 |
263 return 0; |
290 return 0; |