drastically changed updategeom() handling, see comment in updategeom() for details
This commit is contained in:
		@@ -1,5 +1,5 @@
 | 
				
			|||||||
# dwm version
 | 
					# dwm version
 | 
				
			||||||
VERSION = 6.0-tip
 | 
					VERSION = 6.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Customize below to fit your system
 | 
					# Customize below to fit your system
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										71
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								dwm.c
									
									
									
									
									
								
							@@ -235,7 +235,7 @@ static void toggleview(const Arg *arg);
 | 
				
			|||||||
static void unfocus(Client *c, Bool setfocus);
 | 
					static void unfocus(Client *c, Bool setfocus);
 | 
				
			||||||
static void unmanage(Client *c, Bool destroyed);
 | 
					static void unmanage(Client *c, Bool destroyed);
 | 
				
			||||||
static void unmapnotify(XEvent *e);
 | 
					static void unmapnotify(XEvent *e);
 | 
				
			||||||
static Bool updategeom(void);
 | 
					static void updategeom(void);
 | 
				
			||||||
static void updatebarpos(Monitor *m);
 | 
					static void updatebarpos(Monitor *m);
 | 
				
			||||||
static void updatebars(void);
 | 
					static void updatebars(void);
 | 
				
			||||||
static void updateclientlist(void);
 | 
					static void updateclientlist(void);
 | 
				
			||||||
@@ -573,14 +573,10 @@ void
 | 
				
			|||||||
configurenotify(XEvent *e) {
 | 
					configurenotify(XEvent *e) {
 | 
				
			||||||
	Monitor *m;
 | 
						Monitor *m;
 | 
				
			||||||
	XConfigureEvent *ev = &e->xconfigure;
 | 
						XConfigureEvent *ev = &e->xconfigure;
 | 
				
			||||||
	Bool dirty;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: updategeom handling sucks, needs to be simplified
 | 
					 | 
				
			||||||
	if(ev->window == root) {
 | 
						if(ev->window == root) {
 | 
				
			||||||
		dirty = (sw != ev->width || sh != ev->height);
 | 
					 | 
				
			||||||
		sw = ev->width;
 | 
							sw = ev->width;
 | 
				
			||||||
		sh = ev->height;
 | 
							sh = ev->height;
 | 
				
			||||||
		if(updategeom() || dirty) {
 | 
					 | 
				
			||||||
		if(dc.drawable != 0)
 | 
							if(dc.drawable != 0)
 | 
				
			||||||
			XFreePixmap(dpy, dc.drawable);
 | 
								XFreePixmap(dpy, dc.drawable);
 | 
				
			||||||
		dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
 | 
							dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
 | 
				
			||||||
@@ -590,7 +586,6 @@ configurenotify(XEvent *e) {
 | 
				
			|||||||
		focus(NULL);
 | 
							focus(NULL);
 | 
				
			||||||
		arrange(NULL);
 | 
							arrange(NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@@ -1076,8 +1071,8 @@ initfont(const char *fontstr) {
 | 
				
			|||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) {
 | 
					isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) {
 | 
				
			||||||
	while(n--)
 | 
						while(n--)
 | 
				
			||||||
		if(unique[n].x_org == info->x_org && unique[n].y_org == info->y_org
 | 
							/* treat origin (x, y) as fixpoint for uniqueness only, first screen wins */
 | 
				
			||||||
		&& unique[n].width == info->width && unique[n].height == info->height)
 | 
							if(unique[n].x_org == info->x_org && unique[n].y_org == info->y_org)
 | 
				
			||||||
			return False;
 | 
								return False;
 | 
				
			||||||
	return True;
 | 
						return True;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1887,41 +1882,37 @@ updateclientlist() {
 | 
				
			|||||||
			                (unsigned char *) &(c->win), 1);
 | 
								                (unsigned char *) &(c->win), 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Bool
 | 
					void
 | 
				
			||||||
updategeom(void) {
 | 
					updategeom(void) {
 | 
				
			||||||
	Bool dirty = False;
 | 
						/* Starting with dwm 6.1 this function uses a new (simpler) strategy:
 | 
				
			||||||
 | 
						 * whenever screen changes are reported, we destroy all monitors
 | 
				
			||||||
 | 
						 * and recreate all unique origin monitors and add all clients to
 | 
				
			||||||
 | 
						 * the first monitor, only. In several circumstances this may suck,
 | 
				
			||||||
 | 
						 * but dealing with all corner-cases sucks even more.*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef XINERAMA
 | 
					#ifdef XINERAMA
 | 
				
			||||||
	if(XineramaIsActive(dpy)) {
 | 
						if(XineramaIsActive(dpy)) {
 | 
				
			||||||
		int i, j, n, nn;
 | 
							int i, j, n;
 | 
				
			||||||
		Client *c;
 | 
							Client *c;
 | 
				
			||||||
		Monitor *m;
 | 
							Monitor *m, *oldmons = mons;
 | 
				
			||||||
		XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
 | 
							XineramaScreenInfo *info = XineramaQueryScreens(dpy, &n);
 | 
				
			||||||
		XineramaScreenInfo *unique = NULL;
 | 
							XineramaScreenInfo *unique = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for(n = 0, m = mons; m; m = m->next, n++);
 | 
					 | 
				
			||||||
		/* only consider unique geometries as separate screens */
 | 
							/* only consider unique geometries as separate screens */
 | 
				
			||||||
		if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScreenInfo) * nn)))
 | 
							if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScreenInfo) * n)))
 | 
				
			||||||
			die("fatal: could not malloc() %u bytes\n", sizeof(XineramaScreenInfo) * nn);
 | 
								die("fatal: could not malloc() %u bytes\n", sizeof(XineramaScreenInfo) * n);
 | 
				
			||||||
		for(i = 0, j = 0; i < nn; i++)
 | 
							for(i = 0, j = 0; i < n; i++)
 | 
				
			||||||
			if(isuniquegeom(unique, j, &info[i]))
 | 
								if(isuniquegeom(unique, j, &info[i]))
 | 
				
			||||||
				memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));
 | 
									memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));
 | 
				
			||||||
		XFree(info);
 | 
							XFree(info);
 | 
				
			||||||
		nn = j;
 | 
							/* create new monitor structure */
 | 
				
			||||||
		if(n <= nn) {
 | 
							n = j;
 | 
				
			||||||
			for(i = 0; i < (nn - n); i++) { /* new monitors available */
 | 
							mons = m = createmon(); /* new first monitor */
 | 
				
			||||||
				for(m = mons; m && m->next; m = m->next);
 | 
							for(i = 1; i < n; i++) {
 | 
				
			||||||
				if(m)
 | 
					 | 
				
			||||||
			m->next = createmon();
 | 
								m->next = createmon();
 | 
				
			||||||
				else
 | 
								m = m->next;
 | 
				
			||||||
					mons = createmon();
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
			for(i = 0, m = mons; i < nn && m; m = m->next, i++)
 | 
							for(i = 0, m = mons; i < n && m; m = m->next, i++) {
 | 
				
			||||||
				if(i >= n
 | 
					 | 
				
			||||||
				|| (unique[i].x_org != m->mx || unique[i].y_org != m->my
 | 
					 | 
				
			||||||
				    || unique[i].width != m->mw || unique[i].height != m->mh))
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					dirty = True;
 | 
					 | 
				
			||||||
			m->num = i;
 | 
								m->num = i;
 | 
				
			||||||
			m->mx = m->wx = unique[i].x_org;
 | 
								m->mx = m->wx = unique[i].x_org;
 | 
				
			||||||
			m->my = m->wy = unique[i].y_org;
 | 
								m->my = m->wy = unique[i].y_org;
 | 
				
			||||||
@@ -1929,12 +1920,11 @@ updategeom(void) {
 | 
				
			|||||||
			m->mh = m->wh = unique[i].height;
 | 
								m->mh = m->wh = unique[i].height;
 | 
				
			||||||
			updatebarpos(m);
 | 
								updatebarpos(m);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		}
 | 
							free(unique);
 | 
				
			||||||
		else { /* less monitors available nn < n */
 | 
							/* re-attach old clients and cleanup old monitor structure */
 | 
				
			||||||
			for(i = nn; i < n; i++) {
 | 
							while(oldmons) {
 | 
				
			||||||
				for(m = mons; m && m->next; m = m->next);
 | 
								m = oldmons;
 | 
				
			||||||
			while(m->clients) {
 | 
								while(m->clients) {
 | 
				
			||||||
					dirty = True;
 | 
					 | 
				
			||||||
				c = m->clients;
 | 
									c = m->clients;
 | 
				
			||||||
				m->clients = c->next;
 | 
									m->clients = c->next;
 | 
				
			||||||
				detachstack(c);
 | 
									detachstack(c);
 | 
				
			||||||
@@ -1942,31 +1932,24 @@ updategeom(void) {
 | 
				
			|||||||
				attach(c);
 | 
									attach(c);
 | 
				
			||||||
				attachstack(c);
 | 
									attachstack(c);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
				if(m == selmon)
 | 
								oldmons = m->next;
 | 
				
			||||||
					selmon = mons;
 | 
					 | 
				
			||||||
			cleanupmon(m);
 | 
								cleanupmon(m);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		free(unique);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
#endif /* XINERAMA */
 | 
					#endif /* XINERAMA */
 | 
				
			||||||
	/* default monitor setup */
 | 
						/* default monitor setup */
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if(!mons)
 | 
							if(!mons) /* only true if !XINERAMA compile flag */
 | 
				
			||||||
			mons = createmon();
 | 
								mons = createmon();
 | 
				
			||||||
		if(mons->mw != sw || mons->mh != sh) {
 | 
							if(mons->mw != sw || mons->mh != sh) {
 | 
				
			||||||
			dirty = True;
 | 
					 | 
				
			||||||
			mons->mw = mons->ww = sw;
 | 
								mons->mw = mons->ww = sw;
 | 
				
			||||||
			mons->mh = mons->wh = sh;
 | 
								mons->mh = mons->wh = sh;
 | 
				
			||||||
			updatebarpos(mons);
 | 
								updatebarpos(mons);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if(dirty) {
 | 
					 | 
				
			||||||
	selmon = mons;
 | 
						selmon = mons;
 | 
				
			||||||
	selmon = wintomon(root);
 | 
						selmon = wintomon(root);
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return dirty;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user