|
@ -522,7 +522,7 @@ clientmessage(XEvent *e) |
|
|
if (cme->data.l[1] == netatom[NetWMFullscreen] |
|
|
if (cme->data.l[1] == netatom[NetWMFullscreen] |
|
|
|| cme->data.l[2] == netatom[NetWMFullscreen]) |
|
|
|| cme->data.l[2] == netatom[NetWMFullscreen]) |
|
|
setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ |
|
|
setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ |
|
|
|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); |
|
|
|
|
|
|
|
|
|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); |
|
|
} else if (cme->message_type == netatom[NetActiveWindow]) { |
|
|
} else if (cme->message_type == netatom[NetActiveWindow]) { |
|
|
if (c != selmon->sel && !c->isurgent) |
|
|
if (c != selmon->sel && !c->isurgent) |
|
|
seturgent(c, 1); |
|
|
seturgent(c, 1); |
|
@ -721,8 +721,8 @@ drawbar(Monitor *m) |
|
|
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); |
|
|
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); |
|
|
if (occ & 1 << i) |
|
|
if (occ & 1 << i) |
|
|
drw_rect(drw, x + boxs, boxs, boxw, boxw, |
|
|
drw_rect(drw, x + boxs, boxs, boxw, boxw, |
|
|
m == selmon && selmon->sel && selmon->sel->tags & 1 << i, |
|
|
|
|
|
urg & 1 << i); |
|
|
|
|
|
|
|
|
m == selmon && selmon->sel && selmon->sel->tags & 1 << i, |
|
|
|
|
|
urg & 1 << i); |
|
|
x += w; |
|
|
x += w; |
|
|
} |
|
|
} |
|
|
w = blw = TEXTW(m->ltsymbol); |
|
|
w = blw = TEXTW(m->ltsymbol); |
|
@ -865,7 +865,7 @@ getatomprop(Client *c, Atom prop) |
|
|
Atom da, atom = None; |
|
|
Atom da, atom = None; |
|
|
|
|
|
|
|
|
if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, |
|
|
if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, |
|
|
&da, &di, &dl, &dl, &p) == Success && p) { |
|
|
|
|
|
|
|
|
&da, &di, &dl, &dl, &p) == Success && p) { |
|
|
atom = *(Atom *)p; |
|
|
atom = *(Atom *)p; |
|
|
XFree(p); |
|
|
XFree(p); |
|
|
} |
|
|
} |
|
@ -892,7 +892,7 @@ getstate(Window w) |
|
|
Atom real; |
|
|
Atom real; |
|
|
|
|
|
|
|
|
if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], |
|
|
if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], |
|
|
&real, &format, &n, &extra, (unsigned char **)&p) != Success) |
|
|
|
|
|
|
|
|
&real, &format, &n, &extra, (unsigned char **)&p) != Success) |
|
|
return -1; |
|
|
return -1; |
|
|
if (n != 0) |
|
|
if (n != 0) |
|
|
result = *p; |
|
|
result = *p; |
|
@ -936,14 +936,14 @@ grabbuttons(Client *c, int focused) |
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
|
|
if (!focused) |
|
|
if (!focused) |
|
|
XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, |
|
|
XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, |
|
|
BUTTONMASK, GrabModeSync, GrabModeSync, None, None); |
|
|
|
|
|
|
|
|
BUTTONMASK, GrabModeSync, GrabModeSync, None, None); |
|
|
for (i = 0; i < LENGTH(buttons); i++) |
|
|
for (i = 0; i < LENGTH(buttons); i++) |
|
|
if (buttons[i].click == ClkClientWin) |
|
|
if (buttons[i].click == ClkClientWin) |
|
|
for (j = 0; j < LENGTH(modifiers); j++) |
|
|
for (j = 0; j < LENGTH(modifiers); j++) |
|
|
XGrabButton(dpy, buttons[i].button, |
|
|
XGrabButton(dpy, buttons[i].button, |
|
|
buttons[i].mask | modifiers[j], |
|
|
|
|
|
c->win, False, BUTTONMASK, |
|
|
|
|
|
GrabModeAsync, GrabModeSync, None, None); |
|
|
|
|
|
|
|
|
buttons[i].mask | modifiers[j], |
|
|
|
|
|
c->win, False, BUTTONMASK, |
|
|
|
|
|
GrabModeAsync, GrabModeSync, None, None); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -961,7 +961,7 @@ grabkeys(void) |
|
|
if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) |
|
|
if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) |
|
|
for (j = 0; j < LENGTH(modifiers); j++) |
|
|
for (j = 0; j < LENGTH(modifiers); j++) |
|
|
XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, |
|
|
XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, |
|
|
True, GrabModeAsync, GrabModeAsync); |
|
|
|
|
|
|
|
|
True, GrabModeAsync, GrabModeAsync); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1048,7 +1048,7 @@ manage(Window w, XWindowAttributes *wa) |
|
|
c->x = MAX(c->x, c->mon->mx); |
|
|
c->x = MAX(c->x, c->mon->mx); |
|
|
/* only fix client y-offset, if the client center might cover the bar */ |
|
|
/* only fix client y-offset, if the client center might cover the bar */ |
|
|
c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) |
|
|
c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) |
|
|
&& (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); |
|
|
|
|
|
|
|
|
&& (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); |
|
|
c->bw = borderpx; |
|
|
c->bw = borderpx; |
|
|
|
|
|
|
|
|
wc.border_width = c->bw; |
|
|
wc.border_width = c->bw; |
|
@ -1067,7 +1067,7 @@ manage(Window w, XWindowAttributes *wa) |
|
|
attach(c); |
|
|
attach(c); |
|
|
attachstack(c); |
|
|
attachstack(c); |
|
|
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, |
|
|
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, |
|
|
(unsigned char *) &(c->win), 1); |
|
|
|
|
|
|
|
|
(unsigned char *) &(c->win), 1); |
|
|
XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ |
|
|
XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ |
|
|
setclientstate(c, NormalState); |
|
|
setclientstate(c, NormalState); |
|
|
if (c->mon == selmon) |
|
|
if (c->mon == selmon) |
|
@ -1151,7 +1151,7 @@ movemouse(const Arg *arg) |
|
|
ocx = c->x; |
|
|
ocx = c->x; |
|
|
ocy = c->y; |
|
|
ocy = c->y; |
|
|
if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
|
if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
|
None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) |
|
|
|
|
|
|
|
|
None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) |
|
|
return; |
|
|
return; |
|
|
if (!getrootptr(&x, &y)) |
|
|
if (!getrootptr(&x, &y)) |
|
|
return; |
|
|
return; |
|
@ -1226,7 +1226,7 @@ propertynotify(XEvent *e) |
|
|
default: break; |
|
|
default: break; |
|
|
case XA_WM_TRANSIENT_FOR: |
|
|
case XA_WM_TRANSIENT_FOR: |
|
|
if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && |
|
|
if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && |
|
|
(c->isfloating = (wintoclient(trans)) != NULL)) |
|
|
|
|
|
|
|
|
(c->isfloating = (wintoclient(trans)) != NULL)) |
|
|
arrange(c->mon); |
|
|
arrange(c->mon); |
|
|
break; |
|
|
break; |
|
|
case XA_WM_NORMAL_HINTS: |
|
|
case XA_WM_NORMAL_HINTS: |
|
@ -1306,7 +1306,7 @@ resizemouse(const Arg *arg) |
|
|
ocx = c->x; |
|
|
ocx = c->x; |
|
|
ocy = c->y; |
|
|
ocy = c->y; |
|
|
if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
|
if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
|
None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) |
|
|
|
|
|
|
|
|
None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) |
|
|
return; |
|
|
return; |
|
|
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
|
|
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
|
|
do { |
|
|
do { |
|
@ -1431,7 +1431,7 @@ setclientstate(Client *c, long state) |
|
|
long data[] = { state, None }; |
|
|
long data[] = { state, None }; |
|
|
|
|
|
|
|
|
XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, |
|
|
XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, |
|
|
PropModeReplace, (unsigned char *)data, 2); |
|
|
|
|
|
|
|
|
PropModeReplace, (unsigned char *)data, 2); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int |
|
|
int |
|
@ -1465,8 +1465,8 @@ setfocus(Client *c) |
|
|
if (!c->neverfocus) { |
|
|
if (!c->neverfocus) { |
|
|
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
|
|
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
|
|
XChangeProperty(dpy, root, netatom[NetActiveWindow], |
|
|
XChangeProperty(dpy, root, netatom[NetActiveWindow], |
|
|
XA_WINDOW, 32, PropModeReplace, |
|
|
|
|
|
(unsigned char *) &(c->win), 1); |
|
|
|
|
|
|
|
|
XA_WINDOW, 32, PropModeReplace, |
|
|
|
|
|
(unsigned char *) &(c->win), 1); |
|
|
} |
|
|
} |
|
|
sendevent(c, wmatom[WMTakeFocus]); |
|
|
sendevent(c, wmatom[WMTakeFocus]); |
|
|
} |
|
|
} |
|
@ -1476,7 +1476,7 @@ setfullscreen(Client *c, int fullscreen) |
|
|
{ |
|
|
{ |
|
|
if (fullscreen && !c->isfullscreen) { |
|
|
if (fullscreen && !c->isfullscreen) { |
|
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, |
|
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, |
|
|
PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); |
|
|
|
|
|
|
|
|
PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); |
|
|
c->isfullscreen = 1; |
|
|
c->isfullscreen = 1; |
|
|
c->oldstate = c->isfloating; |
|
|
c->oldstate = c->isfloating; |
|
|
c->oldbw = c->bw; |
|
|
c->oldbw = c->bw; |
|
@ -1486,7 +1486,7 @@ setfullscreen(Client *c, int fullscreen) |
|
|
XRaiseWindow(dpy, c->win); |
|
|
XRaiseWindow(dpy, c->win); |
|
|
} else if (!fullscreen && c->isfullscreen){ |
|
|
} else if (!fullscreen && c->isfullscreen){ |
|
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, |
|
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, |
|
|
PropModeReplace, (unsigned char*)0, 0); |
|
|
|
|
|
|
|
|
PropModeReplace, (unsigned char*)0, 0); |
|
|
c->isfullscreen = 0; |
|
|
c->isfullscreen = 0; |
|
|
c->isfloating = c->oldstate; |
|
|
c->isfloating = c->oldstate; |
|
|
c->bw = c->oldbw; |
|
|
c->bw = c->oldbw; |
|
@ -1578,20 +1578,20 @@ setup(void) |
|
|
/* supporting window for NetWMCheck */ |
|
|
/* supporting window for NetWMCheck */ |
|
|
wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); |
|
|
wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); |
|
|
XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, |
|
|
XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, |
|
|
PropModeReplace, (unsigned char *) &wmcheckwin, 1); |
|
|
|
|
|
|
|
|
PropModeReplace, (unsigned char *) &wmcheckwin, 1); |
|
|
XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, |
|
|
XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, |
|
|
PropModeReplace, (unsigned char *) "dwm", 4); |
|
|
|
|
|
|
|
|
PropModeReplace, (unsigned char *) "dwm", 4); |
|
|
XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, |
|
|
XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, |
|
|
PropModeReplace, (unsigned char *) &wmcheckwin, 1); |
|
|
|
|
|
|
|
|
PropModeReplace, (unsigned char *) &wmcheckwin, 1); |
|
|
/* EWMH support per view */ |
|
|
/* EWMH support per view */ |
|
|
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, |
|
|
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, |
|
|
PropModeReplace, (unsigned char *) netatom, NetLast); |
|
|
|
|
|
|
|
|
PropModeReplace, (unsigned char *) netatom, NetLast); |
|
|
XDeleteProperty(dpy, root, netatom[NetClientList]); |
|
|
XDeleteProperty(dpy, root, netatom[NetClientList]); |
|
|
/* select events */ |
|
|
/* select events */ |
|
|
wa.cursor = cursor[CurNormal]->cursor; |
|
|
wa.cursor = cursor[CurNormal]->cursor; |
|
|
wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask |
|
|
wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask |
|
|
|ButtonPressMask|PointerMotionMask|EnterWindowMask |
|
|
|
|
|
|LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; |
|
|
|
|
|
|
|
|
|ButtonPressMask|PointerMotionMask|EnterWindowMask |
|
|
|
|
|
|LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; |
|
|
XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); |
|
|
XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); |
|
|
XSelectInput(dpy, root, wa.event_mask); |
|
|
XSelectInput(dpy, root, wa.event_mask); |
|
|
grabkeys(); |
|
|
grabkeys(); |
|
@ -1717,7 +1717,7 @@ togglefloating(const Arg *arg) |
|
|
selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; |
|
|
selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; |
|
|
if (selmon->sel->isfloating) |
|
|
if (selmon->sel->isfloating) |
|
|
resize(selmon->sel, selmon->sel->x, selmon->sel->y, |
|
|
resize(selmon->sel, selmon->sel->x, selmon->sel->y, |
|
|
selmon->sel->w, selmon->sel->h, 0); |
|
|
|
|
|
|
|
|
selmon->sel->w, selmon->sel->h, 0); |
|
|
arrange(selmon); |
|
|
arrange(selmon); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1813,8 +1813,8 @@ updatebars(void) |
|
|
if (m->barwin) |
|
|
if (m->barwin) |
|
|
continue; |
|
|
continue; |
|
|
m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), |
|
|
m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), |
|
|
CopyFromParent, DefaultVisual(dpy, screen), |
|
|
|
|
|
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); |
|
|
|
|
|
|
|
|
CopyFromParent, DefaultVisual(dpy, screen), |
|
|
|
|
|
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); |
|
|
XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); |
|
|
XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); |
|
|
XMapRaised(dpy, m->barwin); |
|
|
XMapRaised(dpy, m->barwin); |
|
|
} |
|
|
} |
|
@ -1843,8 +1843,8 @@ updateclientlist() |
|
|
for (m = mons; m; m = m->next) |
|
|
for (m = mons; m; m = m->next) |
|
|
for (c = m->clients; c; c = c->next) |
|
|
for (c = m->clients; c; c = c->next) |
|
|
XChangeProperty(dpy, root, netatom[NetClientList], |
|
|
XChangeProperty(dpy, root, netatom[NetClientList], |
|
|
XA_WINDOW, 32, PropModeAppend, |
|
|
|
|
|
(unsigned char *) &(c->win), 1); |
|
|
|
|
|
|
|
|
XA_WINDOW, 32, PropModeAppend, |
|
|
|
|
|
(unsigned char *) &(c->win), 1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int |
|
|
int |
|
@ -1936,7 +1936,7 @@ updatenumlockmask(void) |
|
|
for (i = 0; i < 8; i++) |
|
|
for (i = 0; i < 8; i++) |
|
|
for (j = 0; j < modmap->max_keypermod; j++) |
|
|
for (j = 0; j < modmap->max_keypermod; j++) |
|
|
if (modmap->modifiermap[i * modmap->max_keypermod + j] |
|
|
if (modmap->modifiermap[i * modmap->max_keypermod + j] |
|
|
== XKeysymToKeycode(dpy, XK_Num_Lock)) |
|
|
|
|
|
|
|
|
== XKeysymToKeycode(dpy, XK_Num_Lock)) |
|
|
numlockmask = (1 << i); |
|
|
numlockmask = (1 << i); |
|
|
XFreeModifiermap(modmap); |
|
|
XFreeModifiermap(modmap); |
|
|
} |
|
|
} |
|
@ -1982,7 +1982,7 @@ updatesizehints(Client *c) |
|
|
} else |
|
|
} else |
|
|
c->maxa = c->mina = 0.0; |
|
|
c->maxa = c->mina = 0.0; |
|
|
c->isfixed = (c->maxw && c->minw && c->maxh && c->minh |
|
|
c->isfixed = (c->maxw && c->minw && c->maxh && c->minh |
|
|
&& c->maxw == c->minw && c->maxh == c->minh); |
|
|
|
|
|
|
|
|
&& c->maxw == c->minw && c->maxh == c->minh); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
@ -2092,7 +2092,7 @@ xerror(Display *dpy, XErrorEvent *ee) |
|
|
|| (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) |
|
|
|| (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) |
|
|
return 0; |
|
|
return 0; |
|
|
fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", |
|
|
fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", |
|
|
ee->request_code, ee->error_code); |
|
|
|
|
|
|
|
|
ee->request_code, ee->error_code); |
|
|
return xerrorxlib(dpy, ee); /* may call exit */ |
|
|
return xerrorxlib(dpy, ee); /* may call exit */ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|