#include <unistd.h>
#include <sys/select.h>
#include <X11/cursorfont.h>
+#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/Xproto.h>
/* static */
static int (*xerrorxlib)(Display *, XErrorEvent *);
-static Bool otherwm;
+static Bool otherwm, readin;
static void
cleanup()
{
+ close(STDIN_FILENO);
while(sel) {
resize(sel, True, TopLeft);
unmanage(sel);
}
+ if(dc.font.set)
+ XFreeFontSet(dpy, dc.font.set);
+ else
+ XFreeFont(dpy, dc.font.xfont);
+ XUngrabKey(dpy, AnyKey, AnyModifier, root);
+ XDestroyWindow(dpy, barwin);
+ XFreePixmap(dpy, dc.drawable);
+ XFreeGC(dpy, dc.gc);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
+ XSync(dpy, False);
}
static void
Window *wins, d1, d2;
XWindowAttributes wa;
+ wins = NULL;
if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
for(i = 0; i < num; i++) {
if(!XGetWindowAttributes(dpy, wins[i], &wa))
char stext[1024];
Bool *seltag;
int screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
-unsigned int ntags;
+unsigned int ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast];
Bool running = True;
Bool issel = True;
void
quit(Arg *arg)
{
- running = False;
+ readin = running = False;
}
/*
int
main(int argc, char *argv[])
{
- int i, xfd;
+ int i, j, xfd;
unsigned int mask;
fd_set rd;
- Bool readin = True;
Window w;
- XEvent ev;
+ XModifierKeymap *modmap;
XSetWindowAttributes wa;
if(argc == 2 && !strncmp("-v", argv[1], 3)) {
if(otherwm)
eprint("dwm: another window manager is already running\n");
+ XSync(dpy, False);
XSetErrorHandler(NULL);
xerrorxlib = XSetErrorHandler(xerror);
XSync(dpy, False);
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
+ modmap = XGetModifierMapping(dpy);
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < modmap->max_keypermod; j++) {
+ if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock))
+ numlockmask = (1 << i);
+ }
+ }
+ XFree(modmap);
+
+ wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | LeaveWindowMask;
+ wa.cursor = cursor[CurNormal];
+ XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
+
grabkeys();
initrregs();
sh = DisplayHeight(dpy, screen);
mw = (sw * MASTERW) / 100;
- wa.override_redirect = 1;
- wa.background_pixmap = ParentRelative;
- wa.event_mask = ButtonPressMask | ExposureMask;
-
bx = by = 0;
bw = sw;
dc.h = bh = dc.font.height + 4;
+ wa.override_redirect = 1;
+ wa.background_pixmap = ParentRelative;
+ wa.event_mask = ButtonPressMask | ExposureMask;
barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
- wa.event_mask = SubstructureRedirectMask | EnterWindowMask | LeaveWindowMask;
- wa.cursor = cursor[CurNormal];
- XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
-
scan();
/* main event loop, also reads status text from stdin */
XSync(dpy, False);
+ procevent();
+ readin = True;
while(running) {
FD_ZERO(&rd);
if(readin)
strcpy(stext, "broken pipe");
drawstatus();
}
- if(FD_ISSET(xfd, &rd)) {
- while(XPending(dpy)) {
- XNextEvent(dpy, &ev);
- if(handler[ev.type])
- (handler[ev.type])(&ev); /* call handler */
- }
- }
}
+ procevent();
}
cleanup();
XCloseDisplay(dpy);