wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit f56c6edc86eab2221c7b14a85dc7572a86e7ff97
parent bac71bfccbd67c94d7fd866b35ccfe2d734e48de
Author: Kris Maglione <jg@suckless.org>
Date:   Thu, 16 Oct 2008 16:48:25 -0400

Fix XRandR, especially with relation to Xinerama

Diffstat:
cmd/wmii/bar.c | 14+++++---------
cmd/wmii/client.c | 4++--
cmd/wmii/dat.h | 5++++-
cmd/wmii/event.c | 4+++-
cmd/wmii/frame.c | 2+-
cmd/wmii/main.c | 25+++++++++++++++----------
cmd/wmii/message.c | 2+-
cmd/wmii/view.c | 7++++---
cmd/wmii/xext.c | 9++++++---
rc/rc.wmii.rc | 1-
10 files changed, 41 insertions(+), 32 deletions(-)

diff --git a/cmd/wmii/bar.c b/cmd/wmii/bar.c @@ -42,13 +42,9 @@ void bar_resize(WMScreen *s) { s->brect = s->r; - s->brect.max.y = labelh(def.font); - - /* Not guarangeed to exist on xinerama displays, for the - * moment; - */ - if(screen->sel) - view_update(screen->sel); + s->brect.min.y = s->r.max.y - labelh(def.font); + reshapewin(s->barwin, s->brect); + /* FIXME: view_arrange. */ } void @@ -77,7 +73,7 @@ bar_sety(WMScreen *s, int y) { Bar* bar_create(Bar **bp, const char *name) { static uint id = 1; - WMScreen *s; + WMScreen *s, **sp; Bar *b; uint i; @@ -91,7 +87,7 @@ bar_create(Bar **bp, const char *name) { b->col = def.normcolor; /* FIXME: Kludge. */ - for(s=screens; s < screens+nscreens; s++) { + for(sp=screens; (s = *sp); sp++) { i = bp - s->bar; if(i < nelem(s->bar)) b->bar = i; diff --git a/cmd/wmii/client.c b/cmd/wmii/client.c @@ -110,11 +110,11 @@ client_create(XWindow w, XWindowAttributes *wa) { depth = scr.depth; vis = scr.visual; /* XXX: Multihead. */ - c->ibuf = &screen->ibuf; + c->ibuf = &ibuf; if(render_argb_p(wa->visual)) { depth = 32; vis = render_visual; - c->ibuf = &screen->ibuf32; + c->ibuf = &ibuf32; } client_prop(c, xatom("WM_PROTOCOLS")); diff --git a/cmd/wmii/dat.h b/cmd/wmii/dat.h @@ -330,12 +330,13 @@ EXTERN struct WMScreen { Window* barwin; Image* ibuf; Image* ibuf32; + bool showing; int barpos; int idx; Rectangle r; Rectangle brect; -} *screens, *screen; +} **screens, *screen; EXTERN Client* client; EXTERN View* view; @@ -364,6 +365,8 @@ EXTERN uint nscreens; EXTERN uint valid_mask; EXTERN uint numlock_mask; EXTERN bool sel_screen; +EXTERN Image* ibuf; +EXTERN Image* ibuf32; EXTERN Cursor cursor[CurLast]; diff --git a/cmd/wmii/event.c b/cmd/wmii/event.c @@ -367,7 +367,9 @@ check_x_event(IxpConn *c) { XEvent ev; USED(c); - while(XCheckMaskEvent(display, ~0, &ev)) + while(XPending(display)) { + XNextEvent(display, &ev); dispatch_event(&ev); + } } diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c @@ -654,7 +654,7 @@ constrain(Rectangle r) { bestx = nil; besty = nil; for(i=0; i < nscreens; i++) { - s = &screens[i]; + s = screens[i]; isect = rect_intersection(r, s->r); if(!bestx || Dx(isect) > nbestx && Dy(isect) > 0) { bestx = s; diff --git a/cmd/wmii/main.c b/cmd/wmii/main.c @@ -155,7 +155,6 @@ void init_screens(void) { Rectangle *rects; View *v; - static Image *ibuf, *ibuf32; int i, n, m; #ifdef notdef @@ -170,14 +169,15 @@ init_screens(void) { /* Reallocate screens, zero any new ones. */ rects = xinerama_screens(&n); m = max(n, nscreens); - screens = erealloc(screens, m * sizeof *screens); + screens = erealloc(screens, (m + 1) * sizeof *screens); + screens[m] = nil; for(v=view; v; v=v->next) { v->areas = erealloc(v->areas, m * sizeof *v->areas); v->r = erealloc(v->r, m * sizeof *v->r); } for(i=nscreens; i < m; i++) { - screens[i] = (WMScreen){0}; + screens[i] = emallocz(sizeof *screens[i]); for(v=view; v; v=v->next) view_init(v, i); } @@ -193,18 +193,23 @@ init_screens(void) { ibuf32 = allocimage(Dx(scr.rect), Dy(scr.rect), 32); /* Resize and initialize screens. */ - for(i=0; i < n; i++) { - screen = &screens[i]; + for(i=0; i < nscreens; i++) { + screen = screens[i]; screen->idx = i; - screen->r = rects[i]; - def.snap = Dy(rects[i]) / 63; + screen->showing = i < n; + if(screen->showing) + screen->r = rects[i]; + else + screen->r = rectsetorigin(screen->r, scr.rect.max); + def.snap = Dy(screen->r) / 63; screen->ibuf = ibuf; screen->ibuf32 = ibuf32; - - bar_init(screen); + bar_init(screens[i]); } - screen = &screens[0]; + screen = screens[0]; + if(screen->sel) + view_update(screen->sel); } static void diff --git a/cmd/wmii/message.c b/cmd/wmii/message.c @@ -475,7 +475,7 @@ message_root(void *p, IxpMsg *m) { freefont(def.font); def.font = fn; for(n=0; n < nscreens; n++) - bar_resize(&screens[n]); + bar_resize(screens[n]); }else ret = "can't load font"; view_update(screen->sel); diff --git a/cmd/wmii/view.c b/cmd/wmii/view.c @@ -104,6 +104,7 @@ view_create(const char *name) { void view_init(View *v, int iscreen) { + v->areas[iscreen] = nil; column_new(v, nil, iscreen, 0); } @@ -237,7 +238,7 @@ view_update_rect(View *v) { v->floating->r = scr.rect; for(s=0; s < nscreens; s++) { - scrn = &screens[s]; + scrn = screens[s]; r = fix_rect(scrn->r, scrnr); if(scrn->barpos == BTop) { @@ -501,7 +502,7 @@ view_scale(View *v, int w) { a->r.max.x = xoff + Dx(a->r) * scale; a->r.min.x = xoff; if(!a->next) - a->r.max.x = v->r[s].min.x + w; /* XXX: Multihead. */ + a->r.max.x = v->r[s].min.x + w; xoff = a->r.max.x; } } @@ -559,7 +560,7 @@ view_rects(View *v, uint *num, Frame *ignore) { vector_rpush(&result, f->r); for(i=0; i < nscreens; i++) { vector_rpush(&result, v->r[i]); - vector_rpush(&result, screens[i].r); + vector_rpush(&result, screens[i]->r); } *num = result.n; diff --git a/cmd/wmii/xext.c b/cmd/wmii/xext.c @@ -124,8 +124,11 @@ xinerama_init(void) { int base; have_xinerama = XineramaQueryExtension(display, &base, &base); - if(have_xinerama) - have_xinerama = XineramaIsActive(display); +} + +static bool +xinerama_active(void) { + return have_xinerama && XineramaIsActive(display); } Rectangle* @@ -134,7 +137,7 @@ xinerama_screens(int *np) { XineramaScreenInfo *res; int i, n; - if(!have_xinerama) { + if(!xinerama_active()) { *np = 1; return &scr.rect; } diff --git a/rc/rc.wmii.rc b/rc/rc.wmii.rc @@ -251,7 +251,6 @@ Action overridekeys progs_file=`{namespace}^/proglist.$pid hist=`{namespace}^/history histlen=5000 -touch $progs_hist Action status & Action rehash &