commit e30b35b530a47c7af005a79fcc10eddc7ad5dc50
parent 19d8c7123d07481f521adb01aa42610eb9449819
Author: Kris Maglione <jg@suckless.org>
Date: Fri, 1 Feb 2008 22:11:06 -0500
Reallocate the screen buffer on RandR resize.
Diffstat:
4 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h
@@ -161,6 +161,9 @@ void kpress(XWindow, ulong mod, KeyCode);
ulong str2modmask(const char*);
void update_keys(void);
+/* main.c */
+void init_screen(WMScreen*);
+
/* map.c */
MapEnt* hash_get(Map*, const char*, int create);
void* hash_rm(Map*, const char*);
diff --git a/cmd/wmii/main.c b/cmd/wmii/main.c
@@ -184,13 +184,13 @@ init_cursors(void) {
XFreePixmap(display, pix);
}
-static void
+void
init_screen(WMScreen *screen) {
screen->r = scr.rect;
def.snap = Dy(scr.rect) / 63;
-
- sel_screen = pointerscreen();
+ freeimage(screen->ibuf);
+ screen->ibuf = allocimage(Dx(screen->r), Dy(screen->r), scr.depth);
}
static void
@@ -446,6 +446,8 @@ main(int argc, char *argv[]) {
loadcolor(&def.focuscolor, FOCUSCOLORS);
loadcolor(&def.normcolor, NORMCOLORS);
+ sel_screen = pointerscreen();
+
num_screens = 1;
screens = emallocz(num_screens * sizeof(*screens));
screen = &screens[0];
@@ -453,8 +455,6 @@ main(int argc, char *argv[]) {
s = &screens[i];
init_screen(s);
- s->ibuf = allocimage(Dx(s->r), Dy(s->r), scr.depth);
-
wa.event_mask =
SubstructureRedirectMask
| SubstructureNotifyMask
diff --git a/cmd/wmii/x11.c b/cmd/wmii/x11.c
@@ -203,6 +203,9 @@ allocimage(int w, int h, int depth) {
void
freeimage(Image *img) {
+ if(img == nil)
+ return;
+
assert(img->type == WImage);
XFreePixmap(display, img->w);
diff --git a/cmd/wmii/xext.c b/cmd/wmii/xext.c
@@ -45,14 +45,15 @@ randr_screenchange(XRRScreenChangeNotifyEvent *ev) {
Point d;
XRRUpdateConfiguration((XEvent*)ev);
-
+ scr.rect = Rect(0, 0, ev->width, ev->height);
+
d.x = ev->width - Dx(screen->r);
d.y = ev->height - Dy(screen->r);
for(v=view; v; v=v->next) {
v->r.max.x += d.x;
v->r.max.y += d.y;
}
- screen->r = Rect(0, 0, ev->width, ev->height);
+ init_screen(screen);
bar_resize(screen);
}