438 focus(c); |
437 focus(c); |
439 click = ClkClientWin; |
438 click = ClkClientWin; |
440 } |
439 } |
441 for(i = 0; i < LENGTH(buttons); i++) |
440 for(i = 0; i < LENGTH(buttons); i++) |
442 if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button |
441 if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button |
443 && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) |
442 && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) |
444 buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); |
443 buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); |
445 } |
444 } |
446 |
445 |
447 void |
446 void |
448 checkotherwm(void) { |
447 checkotherwm(void) { |
883 unsigned char *p = NULL; |
882 unsigned char *p = NULL; |
884 unsigned long n, extra; |
883 unsigned long n, extra; |
885 Atom real; |
884 Atom real; |
886 |
885 |
887 status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], |
886 status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], |
888 &real, &format, &n, &extra, (unsigned char **)&p); |
887 &real, &format, &n, &extra, (unsigned char **)&p); |
889 if(status != Success) |
888 if(status != Success) |
890 return -1; |
889 return -1; |
891 if(n != 0) |
890 if(n != 0) |
892 result = *p; |
891 result = *p; |
893 XFree(p); |
892 XFree(p); |
907 if(!name.nitems) |
906 if(!name.nitems) |
908 return False; |
907 return False; |
909 if(name.encoding == XA_STRING) |
908 if(name.encoding == XA_STRING) |
910 strncpy(text, (char *)name.value, size - 1); |
909 strncpy(text, (char *)name.value, size - 1); |
911 else { |
910 else { |
912 if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success |
911 if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { |
913 && n > 0 && *list) |
|
914 { |
|
915 strncpy(text, *list, size - 1); |
912 strncpy(text, *list, size - 1); |
916 XFreeStringList(list); |
913 XFreeStringList(list); |
917 } |
914 } |
918 } |
915 } |
919 text[size - 1] = '\0'; |
916 text[size - 1] = '\0'; |
1020 |
1017 |
1021 ev = &e->xkey; |
1018 ev = &e->xkey; |
1022 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
1019 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); |
1023 for(i = 0; i < LENGTH(keys); i++) |
1020 for(i = 0; i < LENGTH(keys); i++) |
1024 if(keysym == keys[i].keysym |
1021 if(keysym == keys[i].keysym |
1025 && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) |
1022 && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) |
1026 && keys[i].func) |
1023 && keys[i].func) |
1027 keys[i].func(&(keys[i].arg)); |
1024 keys[i].func(&(keys[i].arg)); |
1028 } |
1025 } |
1029 |
1026 |
1030 void |
1027 void |
1031 killclient(const Arg *arg) { |
1028 killclient(const Arg *arg) { |
1166 break; |
1163 break; |
1167 case MotionNotify: |
1164 case MotionNotify: |
1168 nx = ocx + (ev.xmotion.x - x); |
1165 nx = ocx + (ev.xmotion.x - x); |
1169 ny = ocy + (ev.xmotion.y - y); |
1166 ny = ocy + (ev.xmotion.y - y); |
1170 if(snap && nx >= selmon->wx && nx <= selmon->wx + selmon->ww |
1167 if(snap && nx >= selmon->wx && nx <= selmon->wx + selmon->ww |
1171 && ny >= selmon->wy && ny <= selmon->wy + selmon->wh) { |
1168 && ny >= selmon->wy && ny <= selmon->wy + selmon->wh) { |
1172 if(abs(selmon->wx - nx) < snap) |
1169 if(abs(selmon->wx - nx) < snap) |
1173 nx = selmon->wx; |
1170 nx = selmon->wx; |
1174 else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) |
1171 else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) |
1175 nx = selmon->wx + selmon->ww - WIDTH(c); |
1172 nx = selmon->wx + selmon->ww - WIDTH(c); |
1176 if(abs(selmon->wy - ny) < snap) |
1173 if(abs(selmon->wy - ny) < snap) |
1177 ny = selmon->wy; |
1174 ny = selmon->wy; |
1178 else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) |
1175 else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) |
1179 ny = selmon->wy + selmon->wh - HEIGHT(c); |
1176 ny = selmon->wy + selmon->wh - HEIGHT(c); |
1180 if(!c->isfloating && selmon->lt[selmon->sellt]->arrange |
1177 if(!c->isfloating && selmon->lt[selmon->sellt]->arrange |
1181 && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) |
1178 && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) |
1182 togglefloating(NULL); |
1179 togglefloating(NULL); |
1183 } |
1180 } |
1184 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1181 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1185 resize(c, nx, ny, c->w, c->h, True); |
1182 resize(c, nx, ny, c->w, c->h, True); |
1186 break; |
1183 break; |
1277 return; |
1274 return; |
1278 restack(selmon); |
1275 restack(selmon); |
1279 ocx = c->x; |
1276 ocx = c->x; |
1280 ocy = c->y; |
1277 ocy = c->y; |
1281 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
1278 if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
1282 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
1279 None, cursor[CurResize], CurrentTime) != GrabSuccess) |
1283 return; |
1280 return; |
1284 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1281 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1285 do { |
1282 do { |
1286 XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); |
1283 XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); |
1287 switch(ev.type) { |
1284 switch(ev.type) { |
1292 break; |
1289 break; |
1293 case MotionNotify: |
1290 case MotionNotify: |
1294 nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); |
1291 nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); |
1295 nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); |
1292 nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); |
1296 if(snap && nw >= selmon->wx && nw <= selmon->wx + selmon->ww |
1293 if(snap && nw >= selmon->wx && nw <= selmon->wx + selmon->ww |
1297 && nh >= selmon->wy && nh <= selmon->wy + selmon->wh) { |
1294 && nh >= selmon->wy && nh <= selmon->wy + selmon->wh) |
|
1295 { |
1298 if(!c->isfloating && selmon->lt[selmon->sellt]->arrange |
1296 if(!c->isfloating && selmon->lt[selmon->sellt]->arrange |
1299 && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) |
1297 && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) |
1300 togglefloating(NULL); |
1298 togglefloating(NULL); |
1301 } |
1299 } |
1302 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1300 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1303 resize(c, c->x, c->y, nw, nh, True); |
1301 resize(c, c->x, c->y, nw, nh, True); |
1304 break; |
1302 break; |
1471 XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, |
1469 XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, |
1472 PropModeReplace, (unsigned char *) netatom, NetLast); |
1470 PropModeReplace, (unsigned char *) netatom, NetLast); |
1473 /* select for events */ |
1471 /* select for events */ |
1474 wa.cursor = cursor[CurNormal]; |
1472 wa.cursor = cursor[CurNormal]; |
1475 wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask |
1473 wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask |
1476 |EnterWindowMask|LeaveWindowMask|StructureNotifyMask |
1474 |EnterWindowMask|LeaveWindowMask|StructureNotifyMask |
1477 |PropertyChangeMask; |
1475 |PropertyChangeMask; |
1478 XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); |
1476 XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); |
1479 XSelectInput(dpy, root, wa.event_mask); |
1477 XSelectInput(dpy, root, wa.event_mask); |
1480 grabkeys(); |
1478 grabkeys(); |
1481 } |
1479 } |
1482 |
1480 |