Krolyxon
Commit 0f714bc

Branches

Refs →

nsxiv0f714bc

Handle window resize events properly

Author
Bert
Date
2011-01-22 23:27 +0100
Parent
60a9ed7
Commit
0f714bccda28cd2faa5095fa1ace5d8a113beaec

+63 −32

4 files changed

  1. M image.c +23 −19
  2. M image.h +2 −1
  3. M main.c +29 −4
  4. M window.c +9 −8
M image.c View
@@ -65,6 +65,9 @@ int img_load(img_t *img, const char *filename) {
6565 imlib_context_set_image(im);
6666
6767 img->re = 0;
68+ img->checkpan = 0;
69+ img->zoomed = 0;
70+
6871 img->w = imlib_image_get_width();
6972 img->h = imlib_image_get_height();
7073
@@ -101,32 +104,32 @@ void img_render(img_t *img, win_t *win) {
101104 if (!img || !win || !imlib_context_get_image())
102105 return;
103106
104− if (!img->re) {
105− /* rendered for the first time */
106− img->re = 1;
107−
107+ if ((!img->re || !img->zoomed) && SCALE_MODE != SCALE_ZOOM) {
108108 /* set zoom level to fit image into window */
109− if (SCALE_MODE != SCALE_ZOOM) {
110− zw = (float) win->w / (float) img->w;
111− zh = (float) win->h / (float) img->h;
112− img->zoom = MIN(zw, zh);
109+ zw = (float) win->w / (float) img->w;
110+ zh = (float) win->h / (float) img->h;
111+ img->zoom = MIN(zw, zh);
113112
114− if (img->zoom < zoom_min)
115− img->zoom = zoom_min;
116− else if (img->zoom > zoom_max)
117− img->zoom = zoom_max;
113+ if (img->zoom < zoom_min)
114+ img->zoom = zoom_min;
115+ else if (img->zoom > zoom_max)
116+ img->zoom = zoom_max;
118117
119− if (SCALE_MODE == SCALE_DOWN && img->zoom > 1.0)
120− img->zoom = 1.0;
121− }
118+ if (SCALE_MODE == SCALE_DOWN && img->zoom > 1.0)
119+ img->zoom = 1.0;
120+ }
122121
122+ if (!img->re) {
123+ /* rendered for the first time */
124+ img->re = 1;
123125 /* center image in window */
124126 img->x = (win->w - img->w * img->zoom) / 2;
125127 img->y = (win->h - img->h * img->zoom) / 2;
126− } else if (img->cp) {
127− /* only useful after zooming */
128+ }
129+
130+ if (img->checkpan) {
128131 img_check_pan(img, win);
129− img->cp = 0;
132+ img->checkpan = 0;
130133 }
131134
132135 /* calculate source and destination offsets */
@@ -174,7 +177,8 @@ int img_zoom(img_t *img, float z) {
174177 img->x -= (img->w * z - img->w * img->zoom) / 2;
175178 img->y -= (img->h * z - img->h * img->zoom) / 2;
176179 img->zoom = z;
177− img->cp = 1;
180+ img->checkpan = 1;
181+ img->zoomed = 1;
178182 return 1;
179183 } else {
180184 return 0;
M image.h View
@@ -37,7 +37,8 @@ typedef enum pandir_e {
3737 typedef struct img_s {
3838 float zoom;
3939 unsigned char re;
40− unsigned char cp;
40+ unsigned char checkpan;
41+ unsigned char zoomed;
4142 int x;
4243 int y;
4344 int w;
M main.c View
@@ -18,6 +18,7 @@
1818
1919 #include <stdlib.h>
2020 #include <stdio.h>
21+#include <sys/select.h>
2122
2223 #include <X11/Xlib.h>
2324 #include <X11/Xutil.h>
@@ -45,14 +46,34 @@ const char **filenames;
4546 unsigned int filecnt;
4647 unsigned int fileidx;
4748
49+unsigned char timeout;
50+
4851 #define TITLE_LEN 256
4952 char win_title[TITLE_LEN];
5053
5154 void run() {
55+ int xfd;
56+ fd_set fds;
57+ struct timeval t;
5258 XEvent ev;
5359
54− while (!XNextEvent(win.env.dpy, &ev)) {
55− if (handler[ev.type])
60+ timeout = 0;
61+
62+ while (1) {
63+ if (timeout) {
64+ t.tv_sec = 0;
65+ t.tv_usec = 250;
66+ xfd = ConnectionNumber(win.env.dpy);
67+ FD_ZERO(&fds);
68+ FD_SET(xfd, &fds);
69+
70+ if (!XPending(win.env.dpy) && !select(xfd + 1, &fds, 0, 0, &t)) {
71+ img_render(&img, &win);
72+ timeout = 0;
73+ }
74+ }
75+
76+ if (!XNextEvent(win.env.dpy, &ev) && handler[ev.type])
5677 handler[ev.type](&ev);
5778 }
5879 }
@@ -175,14 +196,18 @@ void on_keypress(XEvent *ev) {
175196 if (changed) {
176197 img_render(&img, &win);
177198 update_title();
199+ timeout = 0;
178200 }
179201 }
180202
181203 void on_configurenotify(XEvent *ev) {
182204 if (!ev)
183205 return;
184−
185− win_configure(&win, &ev->xconfigure);
206+
207+ if (win_configure(&win, &ev->xconfigure)) {
208+ img.checkpan = 1;
209+ timeout = 1;
210+ }
186211 }
187212
188213 void update_title() {
M window.c View
@@ -102,19 +102,20 @@ void win_set_title(win_t *win, const char *title) {
102102 XSetIconName(win->env.dpy, win->xwin, title);
103103 }
104104
105−int win_configure(win_t *win, XConfigureEvent *cev) {
105+int win_configure(win_t *win, XConfigureEvent *c) {
106106 int changed;
107107
108108 if (!win)
109109 return 0;
110110
111− changed = win->x != cev->x || win->y != cev->y ||
112− win->w != cev->width || win->h != cev->height;
113− win->x = cev->x;
114− win->y = cev->y;
115− win->w = cev->width;
116− win->h = cev->height;
117− win->bw = cev->border_width;
111+ changed = win->w != c->width || win->h != c->height;
112+
113+ win->x = c->x;
114+ win->y = c->y;
115+ win->w = c->width;
116+ win->h = c->height;
117+ win->bw = c->border_width;
118+
118119 return changed;
119120 }
120121