tags should be persistent now during X server run
This commit is contained in:
		
							parent
							
								
									e4ad320599
								
							
						
					
					
						commit
						9e56e1ded6
					
				
							
								
								
									
										2
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								dwm.h
									
									
									
									
									
								
							| @ -81,7 +81,7 @@ extern int wax, way, wah, waw;			/* windowarea geometry */ | |||||||
| extern unsigned int bh, blw, bpos;		/* bar height, bar layout label width, bar position */ | extern unsigned int bh, blw, bpos;		/* bar height, bar layout label width, bar position */ | ||||||
| extern unsigned int ntags, numlockmask;		/* number of tags, numlock mask */ | extern unsigned int ntags, numlockmask;		/* number of tags, numlock mask */ | ||||||
| extern void (*handler[LASTEvent])(XEvent *);	/* event handler */ | extern void (*handler[LASTEvent])(XEvent *);	/* event handler */ | ||||||
| extern Atom wmatom[WMLast], netatom[NetLast]; | extern Atom dwmtags, wmatom[WMLast], netatom[NetLast]; | ||||||
| extern Bool selscreen, *seltag;			/* seltag is array of Bool */ | extern Bool selscreen, *seltag;			/* seltag is array of Bool */ | ||||||
| extern Client *clients, *sel, *stack;		/* global client list and stack */ | extern Client *clients, *sel, *stack;		/* global client list and stack */ | ||||||
| extern Cursor cursor[CurLast]; | extern Cursor cursor[CurLast]; | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								layout.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								layout.c
									
									
									
									
									
								
							| @ -2,6 +2,8 @@ | |||||||
| #include "dwm.h" | #include "dwm.h" | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| 
 | 
 | ||||||
|  | /* static */ | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| 	const char *symbol; | 	const char *symbol; | ||||||
| 	void (*arrange)(void); | 	void (*arrange)(void); | ||||||
| @ -10,10 +12,8 @@ typedef struct { | |||||||
| unsigned int blw = 0; | unsigned int blw = 0; | ||||||
| static Layout *lt = NULL; | static Layout *lt = NULL; | ||||||
| 
 | 
 | ||||||
| /* static */ |  | ||||||
| 
 |  | ||||||
| static void | static void | ||||||
| floating(void) { | floating(void) { /* default floating layout */ | ||||||
| 	Client *c; | 	Client *c; | ||||||
| 
 | 
 | ||||||
| 	for(c = clients; c; c = c->next) | 	for(c = clients; c; c = c->next) | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								main.c
									
									
									
									
									
								
							| @ -19,7 +19,7 @@ int screen, sx, sy, sw, sh, wax, way, waw, wah; | |||||||
| unsigned int bh, ntags; | unsigned int bh, ntags; | ||||||
| unsigned int bpos = BARPOS; | unsigned int bpos = BARPOS; | ||||||
| unsigned int numlockmask = 0; | unsigned int numlockmask = 0; | ||||||
| Atom wmatom[WMLast], netatom[NetLast]; | Atom dwmtags, wmatom[WMLast], netatom[NetLast]; | ||||||
| Bool *seltag; | Bool *seltag; | ||||||
| Bool selscreen = True; | Bool selscreen = True; | ||||||
| Client *clients = NULL; | Client *clients = NULL; | ||||||
| @ -139,6 +139,7 @@ setup(void) { | |||||||
| 	XSetWindowAttributes wa; | 	XSetWindowAttributes wa; | ||||||
| 
 | 
 | ||||||
| 	/* init atoms */ | 	/* init atoms */ | ||||||
|  | 	dwmtags = XInternAtom(dpy, "__DWM_TAGS", False); | ||||||
| 	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | 	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | ||||||
| 	wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); | 	wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); | ||||||
| 	wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); | 	wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); | ||||||
|  | |||||||
							
								
								
									
										29
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								tag.c
									
									
									
									
									
								
							| @ -3,6 +3,8 @@ | |||||||
| #include <regex.h> | #include <regex.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <X11/Xatom.h> | ||||||
| #include <X11/Xutil.h> | #include <X11/Xutil.h> | ||||||
| 
 | 
 | ||||||
| /* static */ | /* static */ | ||||||
| @ -23,6 +25,7 @@ RULES | |||||||
| 
 | 
 | ||||||
| static Regs *regs = NULL; | static Regs *regs = NULL; | ||||||
| static unsigned int nrules = 0; | static unsigned int nrules = 0; | ||||||
|  | static char prop[512]; | ||||||
| 
 | 
 | ||||||
| /* extern */ | /* extern */ | ||||||
| 
 | 
 | ||||||
| @ -65,16 +68,32 @@ isvisible(Client *c) { | |||||||
| 
 | 
 | ||||||
| void | void | ||||||
| settags(Client *c, Client *trans) { | settags(Client *c, Client *trans) { | ||||||
| 	char prop[512]; |  | ||||||
| 	unsigned int i, j; | 	unsigned int i, j; | ||||||
| 	regmatch_t tmp; | 	regmatch_t tmp; | ||||||
| 	Bool matched = trans != NULL; | 	Bool matched = trans != NULL; | ||||||
| 	XClassHint ch = { 0 }; | 	XClassHint ch = { 0 }; | ||||||
|  | 	XTextProperty name; | ||||||
| 
 | 
 | ||||||
| 	if(matched) | 	if(matched) { | ||||||
| 		for(i = 0; i < ntags; i++) | 		for(i = 0; i < ntags; i++) | ||||||
| 			c->tags[i] = trans->tags[i]; | 			c->tags[i] = trans->tags[i]; | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
| 	else { | 	else { | ||||||
|  | 		/* check if window has set a property */ | ||||||
|  | 		name.nitems = 0; | ||||||
|  | 		XGetTextProperty(dpy, c->win, &name, dwmtags); | ||||||
|  | 		if(name.nitems && name.encoding == XA_STRING) { | ||||||
|  | 			strncpy(prop, (char *)name.value, sizeof prop - 1); | ||||||
|  | 			prop[sizeof prop - 1] = '\0'; | ||||||
|  | 			XFree(name.value); | ||||||
|  | 			for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++) | ||||||
|  | 				if((c->tags[i] = prop[i] == '+')) | ||||||
|  | 					matched = True; | ||||||
|  | 		} | ||||||
|  | 		if(matched) | ||||||
|  | 			return; | ||||||
|  | 		/* rule matching */ | ||||||
| 		XGetClassHint(dpy, c->win, &ch); | 		XGetClassHint(dpy, c->win, &ch); | ||||||
| 		snprintf(prop, sizeof prop, "%s:%s:%s", | 		snprintf(prop, sizeof prop, "%s:%s:%s", | ||||||
| 				ch.res_class ? ch.res_class : "", | 				ch.res_class ? ch.res_class : "", | ||||||
| @ -110,6 +129,12 @@ tag(const char *arg) { | |||||||
| 	i = arg ? atoi(arg) : 0; | 	i = arg ? atoi(arg) : 0; | ||||||
| 	if(i >= 0 && i < ntags) | 	if(i >= 0 && i < ntags) | ||||||
| 		sel->tags[i] = True; | 		sel->tags[i] = True; | ||||||
|  | 	if(sel) { | ||||||
|  | 		for(i = 0; i < ntags && i < sizeof prop - 1; i++) | ||||||
|  | 			prop[i] = sel->tags[i] ? '+' : '-'; | ||||||
|  | 		prop[i] = '\0'; | ||||||
|  | 		XChangeProperty(dpy, sel->win, dwmtags, XA_STRING, 8, PropModeReplace, (unsigned char *)prop, i); | ||||||
|  | 	} | ||||||
| 	arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user