diff options
| -rw-r--r-- | dwm.c | 38 | 
1 files changed, 37 insertions, 1 deletions
| @@ -64,7 +64,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | |||
| 64 | enum { SchemeNorm, SchemeSel }; /* color schemes */ | 64 | enum { SchemeNorm, SchemeSel }; /* color schemes */ | 
| 65 | enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | 65 | enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | 
| 66 | NetWMFullscreen, NetActiveWindow, NetWMWindowType, | 66 | NetWMFullscreen, NetActiveWindow, NetWMWindowType, | 
| 67 | NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ | 67 | NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetLast }; /* EWMH atoms */ | 
| 68 | enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ | 68 | enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ | 
| 69 | enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, | 69 | enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, | 
| 70 | ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ | 70 | ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ | 
| @@ -209,6 +209,7 @@ static void scan(void); | |||
| 209 | static int sendevent(Client *c, Atom proto); | 209 | static int sendevent(Client *c, Atom proto); | 
| 210 | static void sendmon(Client *c, Monitor *m); | 210 | static void sendmon(Client *c, Monitor *m); | 
| 211 | static void setclientstate(Client *c, long state); | 211 | static void setclientstate(Client *c, long state); | 
| 212 | static void setclienttagprop(Client *c); | ||
| 212 | static void setfocus(Client *c); | 213 | static void setfocus(Client *c); | 
| 213 | static void setfullscreen(Client *c, int fullscreen); | 214 | static void setfullscreen(Client *c, int fullscreen); | 
| 214 | static void setlayout(const Arg *arg); | 215 | static void setlayout(const Arg *arg); | 
| @@ -1205,6 +1206,26 @@ manage(Window w, XWindowAttributes *wa) | |||
| 1205 | updatewindowtype(c); | 1206 | updatewindowtype(c); | 
| 1206 | updatesizehints(c); | 1207 | updatesizehints(c); | 
| 1207 | updatewmhints(c); | 1208 | updatewmhints(c); | 
| 1209 | { | ||
| 1210 | int format; | ||
| 1211 | unsigned long *data, n, extra; | ||
| 1212 | Monitor *m; | ||
| 1213 | Atom atom; | ||
| 1214 | if (XGetWindowProperty(dpy, c->win, netatom[NetClientInfo], 0L, 2L, False, XA_CARDINAL, | ||
| 1215 | &atom, &format, &n, &extra, (unsigned char **)&data) == Success && n == 2) { | ||
| 1216 | c->tags = *data; | ||
| 1217 | for (m = mons; m; m = m->next) { | ||
| 1218 | if (m->num == *(data+1)) { | ||
| 1219 | c->mon = m; | ||
| 1220 | break; | ||
| 1221 | } | ||
| 1222 | } | ||
| 1223 | } | ||
| 1224 | if (n > 0) | ||
| 1225 | XFree(data); | ||
| 1226 | } | ||
| 1227 | setclienttagprop(c); | ||
| 1228 | |||
| 1208 | XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); | 1229 | XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); | 
| 1209 | grabbuttons(c, 0); | 1230 | grabbuttons(c, 0); | 
| 1210 | if (!c->isfloating) | 1231 | if (!c->isfloating) | 
| @@ -1570,6 +1591,7 @@ sendmon(Client *c, Monitor *m) | |||
| 1570 | c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ | 1591 | c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ | 
| 1571 | attach(c); | 1592 | attach(c); | 
| 1572 | attachstack(c); | 1593 | attachstack(c); | 
| 1594 | setclienttagprop(c); | ||
| 1573 | focus(NULL); | 1595 | focus(NULL); | 
| 1574 | arrange(NULL); | 1596 | arrange(NULL); | 
| 1575 | } | 1597 | } | 
| @@ -1713,6 +1735,7 @@ setup(void) | |||
| 1713 | netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); | 1735 | netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); | 
| 1714 | netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); | 1736 | netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); | 
| 1715 | netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); | 1737 | netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); | 
| 1738 | netatom[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", False); | ||
| 1716 | /* init cursors */ | 1739 | /* init cursors */ | 
| 1717 | cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); | 1740 | cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); | 
| 1718 | cursor[CurResize] = drw_cur_create(drw, XC_sizing); | 1741 | cursor[CurResize] = drw_cur_create(drw, XC_sizing); | 
| @@ -1736,6 +1759,7 @@ setup(void) | |||
| 1736 | XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, | 1759 | XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, | 
| 1737 | PropModeReplace, (unsigned char *) netatom, NetLast); | 1760 | PropModeReplace, (unsigned char *) netatom, NetLast); | 
| 1738 | XDeleteProperty(dpy, root, netatom[NetClientList]); | 1761 | XDeleteProperty(dpy, root, netatom[NetClientList]); | 
| 1762 | XDeleteProperty(dpy, root, netatom[NetClientInfo]); | ||
| 1739 | /* select events */ | 1763 | /* select events */ | 
| 1740 | wa.cursor = cursor[CurNormal]->cursor; | 1764 | wa.cursor = cursor[CurNormal]->cursor; | 
| 1741 | wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask | 1765 | wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask | 
| @@ -1816,10 +1840,21 @@ spawn(const Arg *arg) | |||
| 1816 | } | 1840 | } | 
| 1817 | 1841 | ||
| 1818 | void | 1842 | void | 
| 1843 | setclienttagprop(Client *c) | ||
| 1844 | { | ||
| 1845 | long data[] = { (long) c->tags, (long) c->mon->num }; | ||
| 1846 | XChangeProperty(dpy, c->win, netatom[NetClientInfo], XA_CARDINAL, 32, | ||
| 1847 | PropModeReplace, (unsigned char *) data, 2); | ||
| 1848 | } | ||
| 1849 | |||
| 1850 | void | ||
| 1819 | tag(const Arg *arg) | 1851 | tag(const Arg *arg) | 
| 1820 | { | 1852 | { | 
| 1853 | Client *c; | ||
| 1821 | if (selmon->sel && arg->ui & TAGMASK) { | 1854 | if (selmon->sel && arg->ui & TAGMASK) { | 
| 1855 | c = selmon->sel; | ||
| 1822 | selmon->sel->tags = arg->ui & TAGMASK; | 1856 | selmon->sel->tags = arg->ui & TAGMASK; | 
| 1857 | setclienttagprop(c); | ||
| 1823 | focus(NULL); | 1858 | focus(NULL); | 
| 1824 | arrange(selmon); | 1859 | arrange(selmon); | 
| 1825 | } | 1860 | } | 
| @@ -1866,6 +1901,7 @@ toggletag(const Arg *arg) | |||
| 1866 | newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); | 1901 | newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); | 
| 1867 | if (newtags) { | 1902 | if (newtags) { | 
| 1868 | selmon->sel->tags = newtags; | 1903 | selmon->sel->tags = newtags; | 
| 1904 | setclienttagprop(selmon->sel); | ||
| 1869 | focus(NULL); | 1905 | focus(NULL); | 
| 1870 | arrange(selmon); | 1906 | arrange(selmon); | 
| 1871 | } | 1907 | } | 
