780 void |
780 void |
781 grabbuttons(Client *c, Bool focused) { |
781 grabbuttons(Client *c, Bool focused) { |
782 int i, j; |
782 int i, j; |
783 unsigned int buttons[] = { Button1, Button2, Button3 }; |
783 unsigned int buttons[] = { Button1, Button2, Button3 }; |
784 unsigned int modifiers[] = { MODKEY, MODKEY|LockMask, MODKEY|numlockmask, |
784 unsigned int modifiers[] = { MODKEY, MODKEY|LockMask, MODKEY|numlockmask, |
785 MODKEY|numlockmask|LockMask} ; |
785 MODKEY|numlockmask|LockMask} ; |
786 |
786 |
787 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
787 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
788 if(focused) |
788 if(focused) |
789 for(i = 0; i < LENGTH(buttons); i++) |
789 for(i = 0; i < LENGTH(buttons); i++) |
790 for(j = 0; j < LENGTH(modifiers); j++) |
790 for(j = 0; j < LENGTH(modifiers); j++) |
791 XGrabButton(dpy, buttons[i], modifiers[j], c->win, False, |
791 XGrabButton(dpy, buttons[i], modifiers[j], c->win, False, |
792 BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
792 BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
793 else |
793 else |
794 XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, |
794 XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, |
795 BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
795 BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); |
796 } |
796 } |
797 |
797 |
798 void |
798 void |
799 grabkeys(void) { |
799 grabkeys(void) { |
800 unsigned int i, j; |
800 unsigned int i, j; |
801 KeyCode code; |
801 KeyCode code; |
802 XModifierKeymap *modmap; |
802 XModifierKeymap *modmap; |
803 |
803 |
804 /* init modifier map */ |
804 /* init modifier map */ |
1039 void |
1039 void |
1040 monocle(void) { |
1040 monocle(void) { |
1041 Client *c; |
1041 Client *c; |
1042 |
1042 |
1043 for(c = clients; c; c = c->next) |
1043 for(c = clients; c; c = c->next) |
1044 if((lt->isfloating || !c->isfloating) && isvisible(c, NULL)) |
1044 if((lt->isfloating || !c->isfloating) && isvisible(c, NULL)) |
1045 resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, RESIZEHINTS); |
1045 resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, RESIZEHINTS); |
1046 } |
1046 } |
1047 |
1047 |
1048 void |
1048 void |
1049 movemouse(Client *c) { |
1049 movemouse(Client *c) { |
1053 XEvent ev; |
1053 XEvent ev; |
1054 |
1054 |
1055 ocx = nx = c->x; |
1055 ocx = nx = c->x; |
1056 ocy = ny = c->y; |
1056 ocy = ny = c->y; |
1057 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
1057 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
1058 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
1058 None, cursor[CurMove], CurrentTime) != GrabSuccess) |
1059 return; |
1059 return; |
1060 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
1060 XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); |
1061 for(;;) { |
1061 for(;;) { |
1062 XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); |
1062 XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); |
1063 switch (ev.type) { |
1063 switch (ev.type) { |
1219 XEvent ev; |
1219 XEvent ev; |
1220 |
1220 |
1221 ocx = c->x; |
1221 ocx = c->x; |
1222 ocy = c->y; |
1222 ocy = c->y; |
1223 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
1223 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
1224 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
1224 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
1225 return; |
1225 return; |
1226 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1226 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1227 for(;;) { |
1227 for(;;) { |
1228 XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask , &ev); |
1228 XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask , &ev); |
1229 switch(ev.type) { |
1229 switch(ev.type) { |
1349 |
1349 |
1350 wins = NULL; |
1350 wins = NULL; |
1351 if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { |
1351 if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { |
1352 for(i = 0; i < num; i++) { |
1352 for(i = 0; i < num; i++) { |
1353 if(!XGetWindowAttributes(dpy, wins[i], &wa) |
1353 if(!XGetWindowAttributes(dpy, wins[i], &wa) |
1354 || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) |
1354 || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) |
1355 continue; |
1355 continue; |
1356 if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState) |
1356 if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState) |
1357 manage(wins[i], &wa); |
1357 manage(wins[i], &wa); |
1358 } |
1358 } |
1359 for(i = 0; i < num; i++) { /* now the transients */ |
1359 for(i = 0; i < num; i++) { /* now the transients */ |
1360 if(!XGetWindowAttributes(dpy, wins[i], &wa)) |
1360 if(!XGetWindowAttributes(dpy, wins[i], &wa)) |
1361 continue; |
1361 continue; |
1362 if(XGetTransientForHint(dpy, wins[i], &d1) |
1362 if(XGetTransientForHint(dpy, wins[i], &d1) |
1363 && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) |
1363 && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) |
1364 manage(wins[i], &wa); |
1364 manage(wins[i], &wa); |
1365 } |
1365 } |
1366 } |
1366 } |
1367 if(wins) |
1367 if(wins) |
1368 XFree(wins); |
1368 XFree(wins); |
1477 wa.override_redirect = 1; |
1477 wa.override_redirect = 1; |
1478 wa.background_pixmap = ParentRelative; |
1478 wa.background_pixmap = ParentRelative; |
1479 wa.event_mask = ButtonPressMask|ExposureMask; |
1479 wa.event_mask = ButtonPressMask|ExposureMask; |
1480 |
1480 |
1481 barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen), |
1481 barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen), |
1482 CopyFromParent, DefaultVisual(dpy, screen), |
1482 CopyFromParent, DefaultVisual(dpy, screen), |
1483 CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); |
1483 CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); |
1484 XDefineCursor(dpy, barwin, cursor[CurNormal]); |
1484 XDefineCursor(dpy, barwin, cursor[CurNormal]); |
1485 XMapRaised(dpy, barwin); |
1485 XMapRaised(dpy, barwin); |
1486 strcpy(stext, "dwm-"VERSION); |
1486 strcpy(stext, "dwm-"VERSION); |
1487 drawbar(); |
1487 drawbar(); |
1488 |
1488 |
1702 unmanage(c); |
1702 unmanage(c); |
1703 } |
1703 } |
1704 |
1704 |
1705 void |
1705 void |
1706 updatebar(void) { |
1706 updatebar(void) { |
1707 |
|
1708 if(dc.drawable != 0) |
1707 if(dc.drawable != 0) |
1709 XFreePixmap(dpy, dc.drawable); |
1708 XFreePixmap(dpy, dc.drawable); |
1710 dc.drawable = XCreatePixmap(dpy, root, bw, bh, DefaultDepth(dpy, screen)); |
1709 dc.drawable = XCreatePixmap(dpy, root, bw, bh, DefaultDepth(dpy, screen)); |
1711 XMoveResizeWindow(dpy, barwin, bx, by, bw, bh); |
1710 XMoveResizeWindow(dpy, barwin, bx, by, bw, bh); |
1712 } |
1711 } |
1837 || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) |
1836 || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) |
1838 || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) |
1837 || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) |
1839 || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) |
1838 || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) |
1840 return 0; |
1839 return 0; |
1841 fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", |
1840 fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", |
1842 ee->request_code, ee->error_code); |
1841 ee->request_code, ee->error_code); |
1843 return xerrorxlib(dpy, ee); /* may call exit */ |
1842 return xerrorxlib(dpy, ee); /* may call exit */ |
1844 } |
1843 } |
1845 |
1844 |
1846 int |
1845 int |
1847 xerrordummy(Display *dpy, XErrorEvent *ee) { |
1846 xerrordummy(Display *dpy, XErrorEvent *ee) { |