X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=f753bfe9a8f0a42cb7769fc19ffacf7ac863339c;hp=cce215a9c63d723067d8391b893f593fc87c862a;hb=8262d9e663a98ab74b938bb5cdf0ddfd733bc5df;hpb=2420071f4c595438f3be9b476fcc23142624c50c diff --git a/dwm.c b/dwm.c index cce215a..f753bfe 100644 --- a/dwm.c +++ b/dwm.c @@ -58,7 +58,8 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ enum { NetSupported, NetWMName, NetWMState, - NetWMFullscreen, NetActiveWindow, NetLast }; /* EWMH atoms */ + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ @@ -237,6 +238,7 @@ static void updatebars(void); static void updatenumlockmask(void); static void updatesizehints(Client *c); static void updatestatus(void); +static void updatewindowtype(Client *c); static void updatetitle(Client *c); static void updatewmhints(Client *c); static void view(const Arg *arg); @@ -1028,7 +1030,7 @@ grabkeys(void) { void incnmaster(const Arg *arg) { - selmon->nmaster = MAX(selmon->nmaster + arg->i, 1); + selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); arrange(selmon); } @@ -1152,6 +1154,7 @@ manage(Window w, XWindowAttributes *wa) { XConfigureWindow(dpy, w, CWBorderWidth, &wc); XSetWindowBorder(dpy, w, dc.norm[ColBorder]); configure(c); /* propagates border_width, if size doesn't change */ + updatewindowtype(c); updatesizehints(c); updatewmhints(c); XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); @@ -1308,6 +1311,8 @@ propertynotify(XEvent *e) { if(c == c->mon->sel) drawbar(c->mon); } + if(ev->atom == netatom[NetWMWindowType]) + updatewindowtype(c); } } @@ -1562,6 +1567,8 @@ setup(void) { netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); /* init cursors */ cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); @@ -1606,7 +1613,7 @@ showhide(Client *c) { } else { /* hide clients bottom up */ showhide(c->snext); - XMoveWindow(dpy, c->win, c->w * -2, c->y); + XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); } } @@ -1666,8 +1673,10 @@ tile(Monitor *m) { if(n == 0) return; - mw = (n > m->nmaster) ? m->ww * m->mfact : m->ww; - + if(n > m->nmaster) + mw = m->nmaster ? m->ww * m->mfact : 0; + else + mw = m->ww; for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) if(i < m->nmaster) { h = (m->wh - my) / (MIN(n, m->nmaster) - i); @@ -1965,6 +1974,25 @@ updatestatus(void) { } void +updatewindowtype(Client *c) +{ + Atom wtype, real; + int format; + unsigned long n, extra; + unsigned char *p = NULL; + + if(XGetWindowProperty(dpy, c->win, netatom[NetWMWindowType], 0L, + sizeof(Atom), False, XA_ATOM, &real, &format, + &n, &extra, (unsigned char **)&p) == Success && p) { + wtype = *(Atom *)p; + XFree(p); + + if(wtype == netatom[NetWMWindowTypeDialog]) + c->isfloating = True; + } +} + +void updatewmhints(Client *c) { XWMHints *wmh;