wmii

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

commit 79d7dd25a8e2baa595517e8402d8de22ecd5c2f8
parent e30b35b530a47c7af005a79fcc10eddc7ad5dc50
Author: Kris Maglione <jg@suckless.org>
Date:   Sun,  3 Feb 2008 15:06:21 -0500

Take rotation into account on RandR screen change notify.

Diffstat:
cmd/wmii/xext.c | 49++++++++++++++++++++++++++++++-------------------
1 file changed, 30 insertions(+), 19 deletions(-)

diff --git a/cmd/wmii/xext.c b/cmd/wmii/xext.c @@ -10,10 +10,21 @@ #endif static void randr_screenchange(XRRScreenChangeNotifyEvent*); +static bool randr_event_p(XEvent *e); + +typedef void (*EvHandler)(XEvent*); +static EvHandler randr_handlers[RRNumberEvents]; bool have_RandR; int randr_eventbase; +static void +handle(XEvent *e, EvHandler ha[], int base) { + + if(ha[e->type-base]) + ha[e->type-base](e); +} + void xext_init(void) { randr_init(); @@ -22,8 +33,8 @@ xext_init(void) { void xext_event(XEvent *e) { - if(have_RandR && (ulong)(e->type - randr_eventbase) < RRNumberEvents) - randr_event(e); + if(randr_event_p(e)) + handle(e, randr_handlers, randr_eventbase); } void @@ -34,9 +45,14 @@ randr_init(void) { if(have_RandR) if(XRRQueryVersion(display, &major, &minor) && major < 1) have_RandR = false; - if(!have_RandR) - return; - XRRSelectInput(display, scr.root.w, RRScreenChangeNotifyMask); + if(have_RandR) + XRRSelectInput(display, scr.root.w, RRScreenChangeNotifyMask); +} + +static bool +randr_event_p(XEvent *e) { + return have_RandR + && (uint)e->type - randr_eventbase < RRNumberEvents; } static void @@ -45,10 +61,13 @@ randr_screenchange(XRRScreenChangeNotifyEvent *ev) { Point d; XRRUpdateConfiguration((XEvent*)ev); - scr.rect = Rect(0, 0, ev->width, ev->height); + if(ev->rotation+90 % 180) + scr.rect = Rect(0, 0, ev->width, ev->height); + else + scr.rect = Rect(0, 0, ev->height, ev->width); - d.x = ev->width - Dx(screen->r); - d.y = ev->height - Dy(screen->r); + d.x = Dx(scr.rect) - Dx(screen->r); + d.y = Dy(scr.rect) - Dy(screen->r); for(v=view; v; v=v->next) { v->r.max.x += d.x; v->r.max.y += d.y; @@ -57,15 +76,7 @@ randr_screenchange(XRRScreenChangeNotifyEvent *ev) { bar_resize(screen); } -void -randr_event(XEvent *e) { - - switch(e->type-randr_eventbase) { - default: - break; - case RRScreenChangeNotify: /* Yuck. */ - randr_screenchange((XRRScreenChangeNotifyEvent*)e); - break; - } -} +static EvHandler randr_handlers[] = { + [RRScreenChangeNotify] = (EvHandler)randr_screenchange, +};