Krolyxon
Commit e82397d

Branches

Refs →

nsxive82397d

Fixed handling of overloaded key mappings

Issue described here:
https://bbs.archlinux.org/viewtopic.php?pid=1117294#p1117294
Author
Bert Münnich
Date
2014-01-08 22:58 +0100
Committer
Bert Münnich · 2014-01-08 22:58 +0100
Parent
9632dd8
Commit
e82397db1507d06db25f952a6b5c470b8cd66e5a

+134 −116

3 files changed

  1. M commands.c +77 −77
  2. M commands.h +37 −31
  3. M main.c +20 −8
M commands.c View
@@ -57,7 +57,7 @@ const int ss_delays[] = {
5757 1, 2, 3, 5, 10, 15, 20, 30, 60, 120, 180, 300, 600
5858 };
5959
60−bool it_quit(arg_t a)
60+cmdreturn_t it_quit(arg_t a)
6161 {
6262 unsigned int i;
6363
@@ -71,7 +71,7 @@ bool it_quit(arg_t a)
7171 exit(EXIT_SUCCESS);
7272 }
7373
74−bool it_switch_mode(arg_t a)
74+cmdreturn_t it_switch_mode(arg_t a)
7575 {
7676 if (mode == MODE_IMAGE) {
7777 if (tns.thumbs == NULL) {
@@ -91,10 +91,10 @@ bool it_switch_mode(arg_t a)
9191 load_image(tns.sel);
9292 mode = MODE_IMAGE;
9393 }
94− return true;
94+ return CMD_DIRTY;
9595 }
9696
97−bool it_toggle_fullscreen(arg_t a)
97+cmdreturn_t it_toggle_fullscreen(arg_t a)
9898 {
9999 win_toggle_fullscreen(&win);
100100 /* redraw after next ConfigureNotify event */
@@ -103,10 +103,10 @@ bool it_toggle_fullscreen(arg_t a)
103103 img.checkpan = img.dirty = true;
104104 else
105105 tns.dirty = true;
106− return false;
106+ return CMD_OK;
107107 }
108108
109−bool it_toggle_bar(arg_t a)
109+cmdreturn_t it_toggle_bar(arg_t a)
110110 {
111111 win_toggle_bar(&win);
112112 if (mode == MODE_IMAGE) {
@@ -116,21 +116,21 @@ bool it_toggle_bar(arg_t a)
116116 } else {
117117 tns.dirty = true;
118118 }
119− return true;
119+ return CMD_DIRTY;
120120 }
121121
122−bool t_reload_all(arg_t a)
122+cmdreturn_t t_reload_all(arg_t a)
123123 {
124124 if (mode == MODE_THUMB) {
125125 tns_free(&tns);
126126 tns_init(&tns, filecnt, &win);
127− return true;
127+ return CMD_DIRTY;
128128 } else {
129− return false;
129+ return CMD_INVALID;
130130 }
131131 }
132132
133−bool it_reload_image(arg_t a)
133+cmdreturn_t it_reload_image(arg_t a)
134134 {
135135 if (mode == MODE_IMAGE) {
136136 load_image(fileidx);
@@ -143,27 +143,27 @@ bool it_reload_image(arg_t a)
143143 tns.sel = tns.cnt - 1;
144144 }
145145 }
146− return true;
146+ return CMD_DIRTY;
147147 }
148148
149−bool it_remove_image(arg_t a)
149+cmdreturn_t it_remove_image(arg_t a)
150150 {
151151 if (mode == MODE_IMAGE) {
152152 remove_file(fileidx, true);
153153 load_image(fileidx >= filecnt ? filecnt - 1 : fileidx);
154− return true;
154+ return CMD_DIRTY;
155155 } else if (tns.sel < tns.cnt) {
156156 remove_file(tns.sel, true);
157157 tns.dirty = true;
158158 if (tns.sel >= tns.cnt)
159159 tns.sel = tns.cnt - 1;
160− return true;
160+ return CMD_DIRTY;
161161 } else {
162− return false;
162+ return CMD_OK;
163163 }
164164 }
165165
166−bool i_navigate(arg_t a)
166+cmdreturn_t i_navigate(arg_t a)
167167 {
168168 long n = (long) a;
169169
@@ -178,64 +178,64 @@ bool i_navigate(arg_t a)
178178
179179 if (n != fileidx) {
180180 load_image(n);
181− return true;
181+ return CMD_DIRTY;
182182 }
183183 }
184− return false;
184+ return CMD_INVALID;
185185 }
186186
187−bool i_alternate(arg_t a)
187+cmdreturn_t i_alternate(arg_t a)
188188 {
189189 if (mode == MODE_IMAGE) {
190190 load_image(alternate);
191− return true;
191+ return CMD_DIRTY;
192192 } else {
193− return false;
193+ return CMD_INVALID;
194194 }
195195 }
196196
197−bool it_first(arg_t a)
197+cmdreturn_t it_first(arg_t a)
198198 {
199199 if (mode == MODE_IMAGE && fileidx != 0) {
200200 load_image(0);
201− return true;
201+ return CMD_DIRTY;
202202 } else if (mode == MODE_THUMB && tns.sel != 0) {
203203 tns.sel = 0;
204204 tns.dirty = true;
205− return true;
205+ return CMD_DIRTY;
206206 } else {
207− return false;
207+ return CMD_OK;
208208 }
209209 }
210210
211−bool it_n_or_last(arg_t a)
211+cmdreturn_t it_n_or_last(arg_t a)
212212 {
213213 int n = prefix != 0 && prefix - 1 < filecnt ? prefix - 1 : filecnt - 1;
214214
215215 if (mode == MODE_IMAGE && fileidx != n) {
216216 load_image(n);
217− return true;
217+ return CMD_DIRTY;
218218 } else if (mode == MODE_THUMB && tns.sel != n) {
219219 tns.sel = n;
220220 tns.dirty = true;
221− return true;
221+ return CMD_DIRTY;
222222 } else {
223− return false;
223+ return CMD_OK;
224224 }
225225 }
226226
227−bool i_navigate_frame(arg_t a)
227+cmdreturn_t i_navigate_frame(arg_t a)
228228 {
229− if (mode == MODE_IMAGE && !img.multi.animate)
230− return img_frame_navigate(&img, (long) a);
229+ if (mode != MODE_IMAGE)
230+ return CMD_INVALID;
231231 else
232− return false;
232+ return !img.multi.animate && img_frame_navigate(&img, (long) a);
233233 }
234234
235−bool i_toggle_animation(arg_t a)
235+cmdreturn_t i_toggle_animation(arg_t a)
236236 {
237237 if (mode != MODE_IMAGE)
238− return false;
238+ return CMD_INVALID;
239239
240240 if (img.multi.animate) {
241241 reset_timeout(animate);
@@ -243,20 +243,20 @@ bool i_toggle_animation(arg_t a)
243243 } else if (img_frame_animate(&img, true)) {
244244 set_timeout(animate, img.multi.frames[img.multi.sel].delay, true);
245245 }
246− return true;
246+ return CMD_DIRTY;
247247 }
248248
249−bool it_toggle_image_mark(arg_t a)
249+cmdreturn_t it_toggle_image_mark(arg_t a)
250250 {
251251 int sel = mode == MODE_IMAGE ? fileidx : tns.sel;
252252
253253 files[sel].marked = !files[sel].marked;
254254 if (mode == MODE_THUMB)
255255 tns_mark(&tns, sel, files[sel].marked);
256− return true;
256+ return CMD_DIRTY;
257257 }
258258
259−bool it_reverse_marks(arg_t a)
259+cmdreturn_t it_reverse_marks(arg_t a)
260260 {
261261 int i, cnt = mode == MODE_IMAGE ? filecnt : tns.cnt;
262262
@@ -264,10 +264,10 @@ bool it_reverse_marks(arg_t a)
264264 files[i].marked = !files[i].marked;
265265 if (mode == MODE_THUMB)
266266 tns.dirty = true;
267− return true;
267+ return CMD_DIRTY;
268268 }
269269
270−bool it_navigate_marked(arg_t a)
270+cmdreturn_t it_navigate_marked(arg_t a)
271271 {
272272 long n = (long) a;
273273 int d, i, cnt, sel, new;
@@ -292,13 +292,13 @@ bool it_navigate_marked(arg_t a)
292292 tns.sel = new;
293293 tns.dirty = true;
294294 }
295− return true;
295+ return CMD_DIRTY;
296296 } else {
297− return false;
297+ return CMD_OK;
298298 }
299299 }
300300
301−bool it_scroll_move(arg_t a)
301+cmdreturn_t it_scroll_move(arg_t a)
302302 {
303303 direction_t dir = (direction_t) a;
304304
@@ -308,7 +308,7 @@ bool it_scroll_move(arg_t a)
308308 return tns_move_selection(&tns, dir, prefix);
309309 }
310310
311−bool it_scroll_screen(arg_t a)
311+cmdreturn_t it_scroll_screen(arg_t a)
312312 {
313313 direction_t dir = (direction_t) a;
314314
@@ -318,14 +318,14 @@ bool it_scroll_screen(arg_t a)
318318 return tns_scroll(&tns, dir, true);
319319 }
320320
321−bool i_scroll_to_edge(arg_t a)
321+cmdreturn_t i_scroll_to_edge(arg_t a)
322322 {
323323 direction_t dir = (direction_t) a;
324324
325325 if (mode == MODE_IMAGE)
326326 return img_pan_edge(&img, dir);
327327 else
328− return false;
328+ return CMD_INVALID;
329329 }
330330
331331 /* Xlib helper function for i_drag() */
@@ -339,7 +339,7 @@ Bool is_motionnotify(Display *d, XEvent *e, XPointer a)
339339 ox = x, oy = y; \
340340 break
341341
342−bool i_drag(arg_t a)
342+cmdreturn_t i_drag(arg_t a)
343343 {
344344 int dx = 0, dy = 0, i, ox, oy, x, y;
345345 unsigned int ui;
@@ -348,9 +348,9 @@ bool i_drag(arg_t a)
348348 Window w;
349349
350350 if (mode != MODE_IMAGE)
351− return false;
351+ return CMD_INVALID;
352352 if (!XQueryPointer(win.env.dpy, win.xwin, &w, &w, &i, &i, &ox, &oy, &ui))
353− return false;
353+ return CMD_OK;
354354
355355 win_set_cursor(&win, CURSOR_HAND);
356356
@@ -398,35 +398,35 @@ bool i_drag(arg_t a)
398398 set_timeout(reset_cursor, TO_CURSOR_HIDE, true);
399399 reset_timeout(redraw);
400400
401− return false;
401+ return CMD_OK;
402402 }
403403
404−bool i_zoom(arg_t a)
404+cmdreturn_t i_zoom(arg_t a)
405405 {
406406 long scale = (long) a;
407407
408408 if (mode != MODE_IMAGE)
409− return false;
409+ return CMD_INVALID;
410410
411411 if (scale > 0)
412412 return img_zoom_in(&img);
413413 else if (scale < 0)
414414 return img_zoom_out(&img);
415415 else
416− return false;
416+ return CMD_OK;
417417 }
418418
419−bool i_set_zoom(arg_t a)
419+cmdreturn_t i_set_zoom(arg_t a)
420420 {
421421 if (mode == MODE_IMAGE)
422422 return img_zoom(&img, (prefix ? prefix : (long) a) / 100.0);
423423 else
424− return false;
424+ return CMD_INVALID;
425425 }
426426
427−bool i_fit_to_win(arg_t a)
427+cmdreturn_t i_fit_to_win(arg_t a)
428428 {
429− bool ret = false;
429+ cmdreturn_t ret = CMD_INVALID;
430430 scalemode_t sm = (scalemode_t) a;
431431
432432 if (mode == MODE_IMAGE) {
@@ -436,11 +436,11 @@ bool i_fit_to_win(arg_t a)
436436 return ret;
437437 }
438438
439−bool i_fit_to_img(arg_t a)
439+cmdreturn_t i_fit_to_img(arg_t a)
440440 {
441441 int x, y;
442442 unsigned int w, h;
443− bool ret = false;
443+ cmdreturn_t ret = CMD_INVALID;
444444
445445 if (mode == MODE_IMAGE) {
446446 x = MAX(0, win.x + img.x);
@@ -456,31 +456,31 @@ bool i_fit_to_img(arg_t a)
456456 return ret;
457457 }
458458
459−bool i_rotate(arg_t a)
459+cmdreturn_t i_rotate(arg_t a)
460460 {
461461 degree_t degree = (degree_t) a;
462462
463463 if (mode == MODE_IMAGE) {
464464 img_rotate(&img, degree);
465− return true;
465+ return CMD_DIRTY;
466466 } else {
467− return false;
467+ return CMD_INVALID;
468468 }
469469 }
470470
471−bool i_flip(arg_t a)
471+cmdreturn_t i_flip(arg_t a)
472472 {
473473 flipdir_t dir = (flipdir_t) a;
474474
475475 if (mode == MODE_IMAGE) {
476476 img_flip(&img, dir);
477− return true;
477+ return CMD_DIRTY;
478478 } else {
479− return false;
479+ return CMD_INVALID;
480480 }
481481 }
482482
483−bool i_slideshow(arg_t a)
483+cmdreturn_t i_slideshow(arg_t a)
484484 {
485485 if (mode == MODE_IMAGE) {
486486 if (prefix > 0) {
@@ -493,38 +493,38 @@ bool i_slideshow(arg_t a)
493493 } else {
494494 img.ss.on = true;
495495 }
496− return true;
496+ return CMD_DIRTY;
497497 } else {
498− return false;
498+ return CMD_INVALID;
499499 }
500500 }
501501
502−bool i_toggle_antialias(arg_t a)
502+cmdreturn_t i_toggle_antialias(arg_t a)
503503 {
504504 if (mode == MODE_IMAGE) {
505505 img_toggle_antialias(&img);
506− return true;
506+ return CMD_DIRTY;
507507 } else {
508− return false;
508+ return CMD_INVALID;
509509 }
510510 }
511511
512−bool it_toggle_alpha(arg_t a)
512+cmdreturn_t it_toggle_alpha(arg_t a)
513513 {
514514 img.alpha = tns.alpha = !img.alpha;
515515 if (mode == MODE_IMAGE)
516516 img.dirty = true;
517517 else
518518 tns.dirty = true;
519− return true;
519+ return CMD_DIRTY;
520520 }
521521
522−bool i_change_gamma(arg_t a)
522+cmdreturn_t i_change_gamma(arg_t a)
523523 {
524524 if (mode == MODE_IMAGE) {
525525 return img_change_gamma(&img, (long) a);
526526 } else {
527− return false;
527+ return CMD_INVALID;
528528 }
529529 }
530530
M commands.h View
@@ -23,8 +23,14 @@
2323
2424 #include "types.h"
2525
26+typedef enum {
27+ CMD_INVALID = -1,
28+ CMD_OK = 0,
29+ CMD_DIRTY = 1
30+} cmdreturn_t;
31+
2632 typedef void* arg_t;
27−typedef bool (*command_f)(arg_t);
33+typedef cmdreturn_t (*command_f)(arg_t);
2834
2935 typedef struct {
3036 unsigned int mask;
@@ -40,35 +46,35 @@ typedef struct {
4046 arg_t arg;
4147 } button_t;
4248
43−bool it_quit(arg_t);
44−bool it_switch_mode(arg_t);
45−bool it_toggle_fullscreen(arg_t);
46−bool it_toggle_bar(arg_t);
47−bool t_reload_all(arg_t);
48−bool it_reload_image(arg_t);
49−bool it_remove_image(arg_t);
50−bool i_navigate(arg_t);
51−bool i_alternate(arg_t);
52−bool it_first(arg_t);
53−bool it_n_or_last(arg_t);
54−bool i_navigate_frame(arg_t);
55−bool i_toggle_animation(arg_t);
56−bool it_toggle_image_mark(arg_t);
57−bool it_reverse_marks(arg_t);
58−bool it_navigate_marked(arg_t);
59−bool it_scroll_move(arg_t);
60−bool it_scroll_screen(arg_t);
61−bool i_scroll_to_edge(arg_t);
62−bool i_drag(arg_t);
63−bool i_zoom(arg_t);
64−bool i_set_zoom(arg_t);
65−bool i_fit_to_win(arg_t);
66−bool i_fit_to_img(arg_t);
67−bool i_rotate(arg_t);
68−bool i_flip(arg_t);
69−bool i_slideshow(arg_t);
70−bool i_toggle_antialias(arg_t);
71−bool it_toggle_alpha(arg_t);
72−bool i_change_gamma(arg_t);
49+cmdreturn_t it_quit(arg_t);
50+cmdreturn_t it_switch_mode(arg_t);
51+cmdreturn_t it_toggle_fullscreen(arg_t);
52+cmdreturn_t it_toggle_bar(arg_t);
53+cmdreturn_t t_reload_all(arg_t);
54+cmdreturn_t it_reload_image(arg_t);
55+cmdreturn_t it_remove_image(arg_t);
56+cmdreturn_t i_navigate(arg_t);
57+cmdreturn_t i_alternate(arg_t);
58+cmdreturn_t it_first(arg_t);
59+cmdreturn_t it_n_or_last(arg_t);
60+cmdreturn_t i_navigate_frame(arg_t);
61+cmdreturn_t i_toggle_animation(arg_t);
62+cmdreturn_t it_toggle_image_mark(arg_t);
63+cmdreturn_t it_reverse_marks(arg_t);
64+cmdreturn_t it_navigate_marked(arg_t);
65+cmdreturn_t it_scroll_move(arg_t);
66+cmdreturn_t it_scroll_screen(arg_t);
67+cmdreturn_t i_scroll_to_edge(arg_t);
68+cmdreturn_t i_drag(arg_t);
69+cmdreturn_t i_zoom(arg_t);
70+cmdreturn_t i_set_zoom(arg_t);
71+cmdreturn_t i_fit_to_win(arg_t);
72+cmdreturn_t i_fit_to_img(arg_t);
73+cmdreturn_t i_rotate(arg_t);
74+cmdreturn_t i_flip(arg_t);
75+cmdreturn_t i_slideshow(arg_t);
76+cmdreturn_t i_toggle_antialias(arg_t);
77+cmdreturn_t it_toggle_alpha(arg_t);
78+cmdreturn_t i_change_gamma(arg_t);
7379
7480 #endif /* COMMANDS_H */
M main.c View
@@ -542,15 +542,21 @@ void on_keypress(XKeyEvent *kev)
542542
543543 for (i = 0; i < ARRLEN(keys); i++) {
544544 if (keys[i].ksym == ksym &&
545− MODMASK(keys[i].mask | sh) == MODMASK(kev->state))
545+ MODMASK(keys[i].mask | sh) == MODMASK(kev->state) &&
546+ keys[i].cmd != NULL)
546547 {
547− if (keys[i].cmd != NULL && keys[i].cmd(keys[i].arg))
548+ cmdreturn_t ret = keys[i].cmd(keys[i].arg);
549+
550+ if (ret == CMD_INVALID)
551+ continue;
552+ if (ret == CMD_DIRTY)
548553 redraw();
549− prefix = 0;
550− return;
554+ break;
551555 }
552556 }
553− key_handler(XKeysymToString(ksym), kev->state & ~sh);
557+ if (i == ARRLEN(keys))
558+ key_handler(XKeysymToString(ksym), kev->state & ~sh);
559+ prefix = 0;
554560 }
555561
556562 void on_buttonpress(XButtonEvent *bev)
@@ -566,11 +572,16 @@ void on_buttonpress(XButtonEvent *bev)
566572
567573 for (i = 0; i < ARRLEN(buttons); i++) {
568574 if (buttons[i].button == bev->button &&
569− MODMASK(buttons[i].mask) == MODMASK(bev->state))
575+ MODMASK(buttons[i].mask) == MODMASK(bev->state) &&
576+ buttons[i].cmd != NULL)
570577 {
571− if (buttons[i].cmd != NULL && buttons[i].cmd(buttons[i].arg))
578+ cmdreturn_t ret = buttons[i].cmd(buttons[i].arg);
579+
580+ if (ret == CMD_INVALID)
581+ continue;
582+ if (ret == CMD_DIRTY)
572583 redraw();
573− return;
584+ break;
574585 }
575586 }
576587 } else {
@@ -606,6 +617,7 @@ void on_buttonpress(XButtonEvent *bev)
606617 break;
607618 }
608619 }
620+ prefix = 0;
609621 }
610622
611623 void run(void)