diff options
Diffstat (limited to 'cmd/wmii/main.c')
-rw-r--r-- | cmd/wmii/main.c | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/cmd/wmii/main.c b/cmd/wmii/main.c index e58b858..fc5f43a 100644 --- a/cmd/wmii/main.c +++ b/cmd/wmii/main.c @@ -1,5 +1,5 @@ /* Copyright ©2004-2006 Anselm R. Garbe <garbeam at gmail dot com> - * Copyright ©2006-2010 Kris Maglione <maglione.k at Gmail> + * Copyright ©2006-2014 Kris Maglione <maglione.k at Gmail> * See LICENSE file for license details. */ #define EXTERN @@ -158,12 +158,14 @@ regerror(char *err) { fprint(2, "%s: %s\n", argv0, err); } +static bool keep_screens = true; + void init_screens(void) { static int old_n, old_nscreens; - Rectangle *rects; + Rectangle *rects, *r; View *v; - int i, n, m; + int i, j, n, m; #ifdef notdef d.x = Dx(scr.rect) - Dx(screen->r); @@ -176,15 +178,33 @@ init_screens(void) { /* Reallocate screens, zero any new ones. */ rects = xinerama_screens(&n); + r = malloc(n * sizeof *r); + + /* Weed out subsumed/cloned screens */ + for(m=-1; m < n; n=m) { + for(i=n-1, m=0; i >= 0; i--) { + for(j=0; j < n; j++) + if (i != j && + eqrect(rects[i], + rect_intersection(rects[i], rects[j]))) + break; + if (j == n) + r[m++] = rects[i]; + } + for(i=m-1, j=0; i >= 0; i--) + rects[j++] = r[i]; + } + free(r); + m = nscreens; - nscreens = max(n, nscreens); + nscreens_new = keep_screens ? max(n, nscreens) : n; + + for(v=view; v; v=v->next) + view_update_screens(v); + + nscreens = nscreens_new; screens = erealloc(screens, (nscreens + 1) * sizeof *screens); screens[nscreens] = nil; - for(v=view; v; v=v->next) { - v->areas = erealloc(v->areas, nscreens * sizeof *v->areas); - v->r = erealloc(v->r, nscreens * sizeof *v->r); - v->pad = erealloc(v->pad, nscreens * sizeof *v->pad); - } /* Reallocate buffers. */ freeimage(disp.ibuf); @@ -207,9 +227,11 @@ init_screens(void) { screen->r = rects[i]; else screen->r = rectsetorigin(screen->r, scr.rect.max); + if(i >= m) for(v=view; v; v=v->next) view_init(v, i); + def.snap = Dy(screen->r) / 63; bar_init(screens[i]); } @@ -219,10 +241,18 @@ init_screens(void) { if (old_n != n || old_nscreens != nscreens) event("ScreenChange %d %d\n", n, nscreens); + old_n = n; old_nscreens = nscreens; } +void +wipe_screens(void) { + keep_screens = false; + init_screens(); + keep_screens = true; +} + static void cleanup(void) { starting = -1; |