diff options
| author | Luke Smith <luke@lukesmith.xyz> | 2022-11-02 12:53:16 -0400 | 
|---|---|---|
| committer | Luke Smith <luke@lukesmith.xyz> | 2022-11-02 12:53:16 -0400 | 
| commit | 4ecf33f469cb494be10d6c757753a5104f975627 (patch) | |
| tree | 4da4538daddf87d9ec0bf1bb0a0c0b07a85c519a /dwm.c | |
| parent | eec78faa7c84f771b477f502f69cdbde116da985 (diff) | |
preserveonrestart
Diffstat (limited to 'dwm.c')
| -rw-r--r-- | dwm.c | 38 | 
1 files changed, 37 insertions, 1 deletions
| @@ -90,7 +90,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */  enum { SchemeNorm, SchemeSel }; /* color schemes */  enum { NetSupported, NetWMName, NetWMState, NetWMCheck,         NetWMFullscreen, NetActiveWindow, NetWMWindowType, -       NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ +       NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetLast }; /* EWMH atoms */  enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */  enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,         ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ @@ -251,6 +251,7 @@ static void scan(void);  static int sendevent(Client *c, Atom proto);  static void sendmon(Client *c, Monitor *m);  static void setclientstate(Client *c, long state); +static void setclienttagprop(Client *c);  static void setfocus(Client *c);  static void setfullscreen(Client *c, int fullscreen);  static void setlayout(const Arg *arg); @@ -1283,6 +1284,26 @@ manage(Window w, XWindowAttributes *wa)  	updatewindowtype(c);  	updatesizehints(c);  	updatewmhints(c); +	{ +		int format; +		unsigned long *data, n, extra; +		Monitor *m; +		Atom atom; +		if (XGetWindowProperty(dpy, c->win, netatom[NetClientInfo], 0L, 2L, False, XA_CARDINAL, +				&atom, &format, &n, &extra, (unsigned char **)&data) == Success && n == 2) { +			c->tags = *data; +			for (m = mons; m; m = m->next) { +				if (m->num == *(data+1)) { +					c->mon = m; +					break; +				} +			} +		} +		if (n > 0) +			XFree(data); +	} +	setclienttagprop(c); +  	c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2;  	c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2;  	XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); @@ -1681,6 +1702,7 @@ sendmon(Client *c, Monitor *m)  	c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */  	attach(c);  	attachstack(c); +	setclienttagprop(c);  	focus(NULL);  	arrange(NULL);  } @@ -1857,6 +1879,7 @@ setup(void)  	netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);  	netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);  	netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); +	netatom[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", False);  	/* init cursors */  	cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);  	cursor[CurResize] = drw_cur_create(drw, XC_sizing); @@ -1880,6 +1903,7 @@ setup(void)  	XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,  		PropModeReplace, (unsigned char *) netatom, NetLast);  	XDeleteProperty(dpy, root, netatom[NetClientList]); +	XDeleteProperty(dpy, root, netatom[NetClientInfo]);  	/* select events */  	wa.cursor = cursor[CurNormal]->cursor;  	wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask @@ -1983,10 +2007,21 @@ spawn(const Arg *arg)  }  void +setclienttagprop(Client *c) +{ +	long data[] = { (long) c->tags, (long) c->mon->num }; +	XChangeProperty(dpy, c->win, netatom[NetClientInfo], XA_CARDINAL, 32, +			PropModeReplace, (unsigned char *) data, 2); +} + +void  tag(const Arg *arg)  { +	Client *c;  	if (selmon->sel && arg->ui & TAGMASK) { +		c = selmon->sel;  		selmon->sel->tags = arg->ui & TAGMASK; +		setclienttagprop(c);  		focus(NULL);  		arrange(selmon);  	} @@ -2075,6 +2110,7 @@ toggletag(const Arg *arg)  	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);  	if (newtags) {  		selmon->sel->tags = newtags; +		setclienttagprop(selmon->sel);  		focus(NULL);  		arrange(selmon);  	} | 
