X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=2feb22eebd5a5f1646992a9427cfea2f3bfc89b4;hp=a3d83fb15a257e9e68011030307a2a8234f38b65;hb=22d88188505b2f08296c32ca82a81cce2b59c909;hpb=3c2d303c0e8efc9a08f2e70867794b003b886810 diff --git a/dwm.c b/dwm.c index a3d83fb..2feb22e 100644 --- a/dwm.c +++ b/dwm.c @@ -88,7 +88,7 @@ struct Client { int basew, baseh, incw, inch, maxw, maxh, minw, minh; int bw, oldbw; unsigned int tags; - Bool isfixed, isfloating, isurgent, neverfocus, oldstate; + Bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; Client *next; Client *snext; Monitor *mon; @@ -198,8 +198,9 @@ static void maprequest(XEvent *e); static void monocle(Monitor *m); static void movemouse(const Arg *arg); static Client *nexttiled(Client *c); -static Monitor *ptrtomon(int x, int y); +static void pop(Client *); static void propertynotify(XEvent *e); +static Monitor *ptrtomon(int x, int y); static void quit(const Arg *arg); static void resize(Client *c, int x, int y, int w, int h, Bool interact); static void resizeclient(Client *c, int x, int y, int w, int h); @@ -521,6 +522,48 @@ clearurgent(Client *c) { } void +clientmessage(XEvent *e) { + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + + if(!c) + return; + if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) { + if(cme->data.l[0]) { + XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); + c->isfullscreen = True; + c->oldstate = c->isfloating; + c->oldbw = c->bw; + c->bw = 0; + c->isfloating = True; + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } + else { + XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)0, 0); + c->isfullscreen = False; + c->isfloating = c->oldstate; + c->bw = c->oldbw; + c->x = c->oldx; + c->y = c->oldy; + c->w = c->oldw; + c->h = c->oldh; + resizeclient(c, c->x, c->y, c->w, c->h); + arrange(c->mon); + } + } + else if(cme->message_type == netatom[NetActiveWindow]) { + if(!ISVISIBLE(c)) { + c->mon->seltags ^= 1; + c->mon->tagset[c->mon->seltags] = c->tags; + } + pop(c); + } +} + +void configure(Client *c) { XConfigureEvent ce; @@ -1170,7 +1213,7 @@ movemouse(const Arg *arg) { return; do { XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch (ev.type) { + switch(ev.type) { case ConfigureRequest: case Expose: case MapRequest: @@ -1212,14 +1255,12 @@ nexttiled(Client *c) { return c; } -Monitor * -ptrtomon(int x, int y) { - Monitor *m; - - for(m = mons; m; m = m->next) - if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh)) - return m; - return selmon; +void +pop(Client *c) { + detach(c); + attach(c); + focus(c); + arrange(c->mon); } void @@ -1233,7 +1274,7 @@ propertynotify(XEvent *e) { else if(ev->state == PropertyDelete) return; /* ignore */ else if((c = wintoclient(ev->window))) { - switch (ev->atom) { + switch(ev->atom) { default: break; case XA_WM_TRANSIENT_FOR: if(!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && @@ -1256,49 +1297,15 @@ propertynotify(XEvent *e) { } } -void -clientmessage(XEvent *e) { - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); +Monitor * +ptrtomon(int x, int y) { + Monitor *m; - if(!c) - return; - if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) { - if(cme->data.l[0]) { - XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = True; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } - else { - XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } - } - else if(cme->message_type == netatom[NetActiveWindow]) { - if(!ISVISIBLE(c)) { - Arg a = { .ui = c->tags }; - view(&a); - } - detach(c); - attach(c); - focus(c); - arrange(c->mon); - } + for(m = mons; m; m = m->next) + if(INRECT(x, y, m->wx, m->wy, m->ww, m->wh)) + return m; + return selmon; } - void quit(const Arg *arg) { running = False; @@ -1535,8 +1542,8 @@ setup(void) { wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); @@ -1579,7 +1586,7 @@ showhide(Client *c) { return; if(ISVISIBLE(c)) { /* show clients top down */ XMoveWindow(dpy, c->win, c->x, c->y); - if(!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) + if((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) resize(c, c->x, c->y, c->w, c->h, False); showhide(c->snext); } @@ -1605,7 +1612,7 @@ spawn(const Arg *arg) { execvp(((char **)arg->v)[0], (char **)arg->v); fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); perror(" failed"); - exit(0); + exit(EXIT_SUCCESS); } } @@ -1753,11 +1760,11 @@ unmapnotify(XEvent *e) { void updatebars(void) { Monitor *m; - XSetWindowAttributes wa; - - wa.override_redirect = True; - wa.background_pixmap = ParentRelative; - wa.event_mask = ButtonPressMask|ExposureMask; + XSetWindowAttributes wa = { + .override_redirect = True, + .background_pixmap = ParentRelative, + .event_mask = ButtonPressMask|ExposureMask + }; for(m = mons; m; m = m->next) { m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), @@ -2043,10 +2050,7 @@ zoom(const Arg *arg) { if(c == nexttiled(selmon->clients)) if(!c || !(c = nexttiled(c->next))) return; - detach(c); - attach(c); - focus(c); - arrange(c->mon); + pop(c); } int @@ -2065,5 +2069,5 @@ main(int argc, char *argv[]) { run(); cleanup(); XCloseDisplay(dpy); - return 0; + return EXIT_SUCCESS; }