summaryrefslogtreecommitdiff
path: root/cmd/wmii/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/wmii/main.c')
-rw-r--r--cmd/wmii/main.c48
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;