Krolyxon
Commit 06164c2

Branches

Refs →

nsxiv06164c2

Revised command structure and key and mouse button mappings

Author
Bert Münnich
Date
2014-07-23 21:50 +0200
Parent
5d0679b
Commit
06164c29b759c3e21e79be03b285bdf3da6f5a25

+324 −380

8 files changed

  1. M Makefile +1 −1
  2. M README.md +14 −29
  3. M commands.c +139 −177
  4. M commands.h +18 −39
  5. A commands.lst +34 −0
  6. M config.def.h +47 −51
  7. M main.c +6 −12
  8. M sxiv.1 +65 −71
M Makefile View
@@ -1,4 +1,4 @@
1−VERSION = git-20140615
1+VERSION = git-20140723
22
33 PREFIX = /usr/local
44 MANPREFIX = $(PREFIX)/share/man
M README.md View
@@ -89,24 +89,17 @@ of small previews is displayed, making it easy to choose an image to open.
8989
9090 **Key mappings:**
9191
92+ 0-9 Prefix the next command with a number (denoted via [count])
9293 q Quit sxiv
9394 Return Switch to thumbnail mode / open selected image
94−
95− 0-9 Prefix the next command with a number (denoted via [count])
96−
95+ f Toggle fullscreen mode
96+ b Toggle visibility of info bar on bottom of window
9797 Ctrl-x Send the next key to the external key-handler
98−
9998 g Go to first image
10099 G Go to the last image, or image number [count]
101−
102− f Toggle fullscreen mode (requires an EWMH/NetWM compliant
103− window manager)
104− b Toggle visibility of info bar on bottom of window
105−
106100 r Reload image
107− R Reload all thumbnails
108101 D Remove image from file list and go to next image
109−
102+ Ctrl-h,j,k,l Scroll one window width/height left/down/up/right
110103 m Mark/unmark current image
111104 M Reverse all image marks
112105 N Go [count] marked images forward
@@ -114,18 +107,20 @@ of small previews is displayed, making it easy to choose an image to open.
114107
115108 *Thumbnail mode:*
116109
117− h,j,k,l Move selection left/down/up/right [count] times
118− Ctrl-j,k Scroll thumbnail grid one window height down/up
110+ h,j,k,l Move selection left/down/up/right [count] times (also with
111+ arrow keys)
112+ R Reload all thumbnails
119113
120114 *Image mode:*
121115
122116 n,Space Go [count] images forward
123117 p,Backspace Go [count] images backward
124118 [,] Go [count] * 10 images backward/forward
125−
126119 Ctrl-n,p Go to the next/previous frame of a multi-frame image
127120 Ctrl-Space Play/pause animation of a multi-frame image
128−
121+ h,j,k,l Scroll image 1/5 of window width/height or [count] pixels
122+ left/down/up/right (also with arrow keys)
123+ H,J,K,L Scroll to left/bottom/top/right image edge
129124 + Zoom in
130125 - Zoom out
131126 = Set zoom level to 100%, or [count]%
@@ -133,23 +128,13 @@ of small previews is displayed, making it easy to choose an image to open.
133128 W Fit image to window
134129 e Fit image to window width
135130 E Fit image to window height
136−
137− h,j,k,l Pan image 1/5 of window width/height or [count] pixels
138− left/down/up/right (also with arrow keys)
139− H,J,K,L Pan to left/bottom/top/right image edge
140− Ctrl-h,j,k,l Pan image one window width/height left/down/up/right
141− (also with Ctrl-arrow keys)
142−
143131 <,> Rotate image (counter-)clockwise by 90 degrees
144132 ? Rotate image by 180 degrees
145133 |,_ Flip image horizontally/vertically
146−
147134 {,} Decrease/increase gamma
148135 Ctrl-g Reset gamma
149−
150136 a Toggle anti-aliasing
151137 A Toggle visibility of alpha-channel, i.e. transparency
152−
153138 s Toggle slideshow or set delay to [count] seconds
154139
155140
@@ -158,11 +143,11 @@ of small previews is displayed, making it easy to choose an image to open.
158143 *Image mode:*
159144
160145 Button1 Go to the next image
161− Button2 Drag image with mouse while keeping it pressed
162146 Button3 Go to the previous image
163− Scroll Pan image up/down
164− Shift+Scroll Pan image left/right
165− Ctrl+Scroll Zoom in/out
147+ Button2 Drag image with mouse while keeping it pressed
148+ Wheel Scroll image up/down
149+ Shift+Wheel Scroll image left/right
150+ Ctrl+Wheel Zoom in/out
166151
167152
168153 Download & Changelog
M commands.c View
@@ -1,4 +1,4 @@
1−/* Copyright 2011, 2012 Bert Muennich
1+/* Copyright 2011, 2012, 2014 Bert Muennich
22 *
33 * This file is part of sxiv.
44 *
@@ -58,7 +58,7 @@ const int ss_delays[] = {
5858 1, 2, 3, 5, 10, 15, 20, 30, 60, 120, 180, 300, 600
5959 };
6060
61−cmdreturn_t it_quit(arg_t a)
61+bool cg_quit(arg_t a)
6262 {
6363 unsigned int i;
6464
@@ -72,7 +72,7 @@ cmdreturn_t it_quit(arg_t a)
7272 exit(EXIT_SUCCESS);
7373 }
7474
75−cmdreturn_t it_switch_mode(arg_t a)
75+bool cg_switch_mode(arg_t a)
7676 {
7777 if (mode == MODE_IMAGE) {
7878 if (tns.thumbs == NULL)
@@ -90,10 +90,10 @@ cmdreturn_t it_switch_mode(arg_t a)
9090 load_image(tns.sel);
9191 mode = MODE_IMAGE;
9292 }
93− return CMD_DIRTY;
93+ return true;
9494 }
9595
96−cmdreturn_t it_toggle_fullscreen(arg_t a)
96+bool cg_toggle_fullscreen(arg_t a)
9797 {
9898 win_toggle_fullscreen(&win);
9999 /* redraw after next ConfigureNotify event */
@@ -102,10 +102,10 @@ cmdreturn_t it_toggle_fullscreen(arg_t a)
102102 img.checkpan = img.dirty = true;
103103 else
104104 tns.dirty = true;
105− return CMD_OK;
105+ return false;
106106 }
107107
108−cmdreturn_t it_toggle_bar(arg_t a)
108+bool cg_toggle_bar(arg_t a)
109109 {
110110 win_toggle_bar(&win);
111111 if (mode == MODE_IMAGE) {
@@ -115,27 +115,16 @@ cmdreturn_t it_toggle_bar(arg_t a)
115115 } else {
116116 tns.dirty = true;
117117 }
118− return CMD_DIRTY;
118+ return true;
119119 }
120120
121−cmdreturn_t it_prefix_external(arg_t a)
121+bool cg_prefix_external(arg_t a)
122122 {
123123 extprefix = true;
124− return CMD_OK;
124+ return false;
125125 }
126126
127−cmdreturn_t t_reload_all(arg_t a)
128−{
129− if (mode == MODE_THUMB) {
130− tns_free(&tns);
131− tns_init(&tns, filecnt, &win);
132− return CMD_DIRTY;
133− } else {
134− return CMD_INVALID;
135− }
136−}
137−
138−cmdreturn_t it_reload_image(arg_t a)
127+bool cg_reload_image(arg_t a)
139128 {
140129 if (mode == MODE_IMAGE) {
141130 load_image(fileidx);
@@ -148,120 +137,77 @@ cmdreturn_t it_reload_image(arg_t a)
148137 tns.sel = tns.cnt - 1;
149138 }
150139 }
151− return CMD_DIRTY;
140+ return true;
152141 }
153142
154−cmdreturn_t it_remove_image(arg_t a)
143+bool cg_remove_image(arg_t a)
155144 {
156145 if (mode == MODE_IMAGE) {
157146 remove_file(fileidx, true);
158147 load_image(fileidx >= filecnt ? filecnt - 1 : fileidx);
159− return CMD_DIRTY;
148+ return true;
160149 } else if (tns.sel < tns.cnt) {
161150 remove_file(tns.sel, true);
162151 tns.dirty = true;
163152 if (tns.sel >= tns.cnt)
164153 tns.sel = tns.cnt - 1;
165− return CMD_DIRTY;
166− } else {
167− return CMD_OK;
168− }
169−}
170−
171−cmdreturn_t i_navigate(arg_t a)
172−{
173− long n = (long) a;
174−
175− if (mode == MODE_IMAGE) {
176− if (prefix > 0)
177− n *= prefix;
178− n += fileidx;
179− if (n < 0)
180− n = 0;
181− if (n >= filecnt)
182− n = filecnt - 1;
183−
184− if (n != fileidx) {
185− load_image(n);
186− return CMD_DIRTY;
187− }
188− }
189− return CMD_INVALID;
190−}
191−
192−cmdreturn_t i_alternate(arg_t a)
193−{
194− if (mode == MODE_IMAGE) {
195− load_image(alternate);
196− return CMD_DIRTY;
154+ return true;
197155 } else {
198− return CMD_INVALID;
156+ return false;
199157 }
200158 }
201159
202−cmdreturn_t it_first(arg_t a)
160+bool cg_first(arg_t a)
203161 {
204162 if (mode == MODE_IMAGE && fileidx != 0) {
205163 load_image(0);
206− return CMD_DIRTY;
164+ return true;
207165 } else if (mode == MODE_THUMB && tns.sel != 0) {
208166 tns.sel = 0;
209167 tns.dirty = true;
210− return CMD_DIRTY;
168+ return true;
211169 } else {
212− return CMD_OK;
170+ return false;
213171 }
214172 }
215173
216−cmdreturn_t it_n_or_last(arg_t a)
174+bool cg_n_or_last(arg_t a)
217175 {
218176 int n = prefix != 0 && prefix - 1 < filecnt ? prefix - 1 : filecnt - 1;
219177
220178 if (mode == MODE_IMAGE && fileidx != n) {
221179 load_image(n);
222− return CMD_DIRTY;
180+ return true;
223181 } else if (mode == MODE_THUMB && tns.sel != n) {
224182 tns.sel = n;
225183 tns.dirty = true;
226− return CMD_DIRTY;
184+ return true;
227185 } else {
228− return CMD_OK;
186+ return false;
229187 }
230188 }
231189
232−cmdreturn_t i_navigate_frame(arg_t a)
190+bool cg_scroll_screen(arg_t a)
233191 {
234− if (mode != MODE_IMAGE)
235− return CMD_INVALID;
236− else
237− return !img.multi.animate && img_frame_navigate(&img, (long) a);
238−}
239−
240−cmdreturn_t i_toggle_animation(arg_t a)
241−{
242− if (mode != MODE_IMAGE)
243− return CMD_INVALID;
192+ direction_t dir = (direction_t) a;
244193
245− if (img.multi.animate) {
246− reset_timeout(animate);
247− img.multi.animate = false;
248− } else if (img_frame_animate(&img, true)) {
249− set_timeout(animate, img.multi.frames[img.multi.sel].delay, true);
250− }
251− return CMD_DIRTY;
194+ if (mode == MODE_IMAGE)
195+ return img_pan(&img, dir, -1);
196+ else
197+ return tns_scroll(&tns, dir, true);
252198 }
253199
254−cmdreturn_t it_toggle_image_mark(arg_t a)
200+bool cg_toggle_image_mark(arg_t a)
255201 {
256202 int sel = mode == MODE_IMAGE ? fileidx : tns.sel;
257203
258204 files[sel].marked = !files[sel].marked;
259205 if (mode == MODE_THUMB)
260206 tns_mark(&tns, sel, files[sel].marked);
261− return CMD_DIRTY;
207+ return true;
262208 }
263209
264−cmdreturn_t it_reverse_marks(arg_t a)
210+bool cg_reverse_marks(arg_t a)
265211 {
266212 int i, cnt = mode == MODE_IMAGE ? filecnt : tns.cnt;
267213
@@ -269,10 +215,10 @@ cmdreturn_t it_reverse_marks(arg_t a)
269215 files[i].marked = !files[i].marked;
270216 if (mode == MODE_THUMB)
271217 tns.dirty = true;
272− return CMD_DIRTY;
218+ return true;
273219 }
274220
275−cmdreturn_t it_navigate_marked(arg_t a)
221+bool cg_navigate_marked(arg_t a)
276222 {
277223 long n = (long) a;
278224 int d, i, cnt, sel, new;
@@ -297,40 +243,66 @@ cmdreturn_t it_navigate_marked(arg_t a)
297243 tns.sel = new;
298244 tns.dirty = true;
299245 }
300− return CMD_DIRTY;
246+ return true;
301247 } else {
302− return CMD_OK;
248+ return false;
303249 }
304250 }
305251
306−cmdreturn_t it_scroll_move(arg_t a)
252+bool ci_navigate(arg_t a)
307253 {
308− direction_t dir = (direction_t) a;
254+ long n = (long) a;
309255
310− if (mode == MODE_IMAGE)
311− return img_pan(&img, dir, prefix);
312− else
313− return tns_move_selection(&tns, dir, prefix);
256+ if (prefix > 0)
257+ n *= prefix;
258+ n += fileidx;
259+ if (n < 0)
260+ n = 0;
261+ if (n >= filecnt)
262+ n = filecnt - 1;
263+
264+ if (n != fileidx) {
265+ load_image(n);
266+ return true;
267+ } else {
268+ return false;
269+ }
270+}
271+
272+bool ci_alternate(arg_t a)
273+{
274+ load_image(alternate);
275+ return true;
276+}
277+
278+bool ci_navigate_frame(arg_t a)
279+{
280+ return !img.multi.animate && img_frame_navigate(&img, (long) a);
281+}
282+
283+bool ci_toggle_animation(arg_t a)
284+{
285+ if (img.multi.animate) {
286+ reset_timeout(animate);
287+ img.multi.animate = false;
288+ } else if (img_frame_animate(&img, true)) {
289+ set_timeout(animate, img.multi.frames[img.multi.sel].delay, true);
290+ }
291+ return true;
314292 }
315293
316−cmdreturn_t it_scroll_screen(arg_t a)
294+bool ci_scroll(arg_t a)
317295 {
318296 direction_t dir = (direction_t) a;
319297
320− if (mode == MODE_IMAGE)
321− return img_pan(&img, dir, -1);
322− else
323− return tns_scroll(&tns, dir, true);
298+ return img_pan(&img, dir, prefix);
324299 }
325300
326−cmdreturn_t i_scroll_to_edge(arg_t a)
301+bool ci_scroll_to_edge(arg_t a)
327302 {
328303 direction_t dir = (direction_t) a;
329304
330− if (mode == MODE_IMAGE)
331− return img_pan_edge(&img, dir);
332− else
333− return CMD_INVALID;
305+ return img_pan_edge(&img, dir);
334306 }
335307
336308 /* Xlib helper function for i_drag() */
@@ -344,7 +316,7 @@ Bool is_motionnotify(Display *d, XEvent *e, XPointer a)
344316 ox = x, oy = y; \
345317 break
346318
347−cmdreturn_t i_drag(arg_t a)
319+bool ci_drag(arg_t a)
348320 {
349321 int dx = 0, dy = 0, i, ox, oy, x, y;
350322 unsigned int ui;
@@ -352,10 +324,8 @@ cmdreturn_t i_drag(arg_t a)
352324 XEvent e;
353325 Window w;
354326
355− if (mode != MODE_IMAGE)
356− return CMD_INVALID;
357327 if (!XQueryPointer(win.env.dpy, win.xwin, &w, &w, &i, &i, &ox, &oy, &ui))
358− return CMD_OK;
328+ return false;
359329
360330 win_set_cursor(&win, CURSOR_HAND);
361331
@@ -398,117 +368,109 @@ cmdreturn_t i_drag(arg_t a)
398368 dx = dy = 0;
399369 }
400370 }
401−
402371 win_set_cursor(&win, CURSOR_ARROW);
403372 set_timeout(reset_cursor, TO_CURSOR_HIDE, true);
404373 reset_timeout(redraw);
405374
406− return CMD_OK;
375+ return true;
407376 }
408377
409−cmdreturn_t i_zoom(arg_t a)
378+bool ci_zoom(arg_t a)
410379 {
411380 long scale = (long) a;
412381
413− if (mode != MODE_IMAGE)
414− return CMD_INVALID;
415−
416382 if (scale > 0)
417383 return img_zoom_in(&img);
418384 else if (scale < 0)
419385 return img_zoom_out(&img);
420386 else
421− return CMD_OK;
387+ return false;
422388 }
423389
424−cmdreturn_t i_set_zoom(arg_t a)
390+bool ci_set_zoom(arg_t a)
425391 {
426− if (mode == MODE_IMAGE)
427− return img_zoom(&img, (prefix ? prefix : (long) a) / 100.0);
428− else
429− return CMD_INVALID;
392+ return img_zoom(&img, (prefix ? prefix : (long) a) / 100.0);
430393 }
431394
432−cmdreturn_t i_fit_to_win(arg_t a)
395+bool ci_fit_to_win(arg_t a)
433396 {
434397 scalemode_t sm = (scalemode_t) a;
435398
436− if (mode == MODE_IMAGE)
437− return img_fit_win(&img, sm);
438− else
439− return CMD_INVALID;
399+ return img_fit_win(&img, sm);
440400 }
441401
442−cmdreturn_t i_rotate(arg_t a)
402+bool ci_rotate(arg_t a)
443403 {
444404 degree_t degree = (degree_t) a;
445405
446− if (mode == MODE_IMAGE) {
447− img_rotate(&img, degree);
448− return CMD_DIRTY;
449− } else {
450− return CMD_INVALID;
451− }
406+ img_rotate(&img, degree);
407+ return true;
452408 }
453409
454−cmdreturn_t i_flip(arg_t a)
410+bool ci_flip(arg_t a)
455411 {
456412 flipdir_t dir = (flipdir_t) a;
457413
458− if (mode == MODE_IMAGE) {
459− img_flip(&img, dir);
460− return CMD_DIRTY;
461− } else {
462− return CMD_INVALID;
463− }
414+ img_flip(&img, dir);
415+ return true;
464416 }
465417
466−cmdreturn_t i_slideshow(arg_t a)
418+bool ci_change_gamma(arg_t a)
467419 {
468− if (mode == MODE_IMAGE) {
469− if (prefix > 0) {
470− img.ss.on = true;
471− img.ss.delay = prefix;
472− set_timeout(slideshow, img.ss.delay * 1000, true);
473− } else if (img.ss.on) {
474− img.ss.on = false;
475− reset_timeout(slideshow);
476− } else {
477− img.ss.on = true;
478− }
479− return CMD_DIRTY;
480− } else {
481− return CMD_INVALID;
482− }
420+ return img_change_gamma(&img, (long) a);
483421 }
484422
485−cmdreturn_t i_toggle_antialias(arg_t a)
423+bool ci_toggle_antialias(arg_t a)
486424 {
487− if (mode == MODE_IMAGE) {
488− img_toggle_antialias(&img);
489− return CMD_DIRTY;
490− } else {
491− return CMD_INVALID;
492− }
425+ img_toggle_antialias(&img);
426+ return true;
493427 }
494428
495−cmdreturn_t i_toggle_alpha(arg_t a)
429+bool ci_toggle_alpha(arg_t a)
496430 {
497− if (mode == MODE_IMAGE) {
498− img.alpha = !img.alpha;
499− img.dirty = true;
500− return CMD_DIRTY;
501− } else {
502− return CMD_INVALID;
503− }
431+ img.alpha = !img.alpha;
432+ img.dirty = true;
433+ return true;
504434 }
505435
506−cmdreturn_t i_change_gamma(arg_t a)
436+bool ci_slideshow(arg_t a)
507437 {
508− if (mode == MODE_IMAGE) {
509− return img_change_gamma(&img, (long) a);
438+ if (prefix > 0) {
439+ img.ss.on = true;
440+ img.ss.delay = prefix;
441+ set_timeout(slideshow, img.ss.delay * 1000, true);
442+ } else if (img.ss.on) {
443+ img.ss.on = false;
444+ reset_timeout(slideshow);
510445 } else {
511− return CMD_INVALID;
446+ img.ss.on = true;
512447 }
448+ return true;
513449 }
514450
451+bool ct_move_sel(arg_t a)
452+{
453+ direction_t dir = (direction_t) a;
454+
455+ return tns_move_selection(&tns, dir, prefix);
456+}
457+
458+bool ct_reload_all(arg_t a)
459+{
460+ tns_free(&tns);
461+ tns_init(&tns, filecnt, &win);
462+ return false;
463+}
464+
465+
466+#undef G_CMD
467+#define G_CMD(c) { -1, cg_##c },
468+#undef I_CMD
469+#define I_CMD(c) { MODE_IMAGE, ci_##c },
470+#undef T_CMD
471+#define T_CMD(c) { MODE_THUMB, ct_##c },
472+
473+const cmd_t cmds[CMD_COUNT] = {
474+#include "commands.lst"
475+};
476+
M commands.h View
@@ -1,4 +1,4 @@
1−/* Copyright 2011 Bert Muennich
1+/* Copyright 2011, 2014 Bert Muennich
22 *
33 * This file is part of sxiv.
44 *
@@ -23,58 +23,37 @@
2323
2424 #include "types.h"
2525
26+typedef void* arg_t;
27+typedef bool (*cmd_f)(arg_t);
28+
29+#define G_CMD(c) g_##c,
30+#define I_CMD(c) i_##c,
31+#define T_CMD(c) t_##c,
32+
2633 typedef enum {
27− CMD_INVALID = -1,
28− CMD_OK = 0,
29− CMD_DIRTY = 1
30−} cmdreturn_t;
34+#include "commands.lst"
35+ CMD_COUNT
36+} cmd_id_t;
3137
32−typedef void* arg_t;
33−typedef cmdreturn_t (*command_f)(arg_t);
38+typedef struct {
39+ int mode;
40+ cmd_f func;
41+} cmd_t;
3442
3543 typedef struct {
3644 unsigned int mask;
3745 KeySym ksym;
38− command_f cmd;
46+ cmd_id_t cmd;
3947 arg_t arg;
4048 } keymap_t;
4149
4250 typedef struct {
4351 unsigned int mask;
4452 unsigned int button;
45− command_f cmd;
53+ cmd_id_t cmd;
4654 arg_t arg;
4755 } button_t;
4856
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 it_prefix_external(arg_t);
54−cmdreturn_t t_reload_all(arg_t);
55−cmdreturn_t it_reload_image(arg_t);
56−cmdreturn_t it_remove_image(arg_t);
57−cmdreturn_t i_navigate(arg_t);
58−cmdreturn_t i_alternate(arg_t);
59−cmdreturn_t it_first(arg_t);
60−cmdreturn_t it_n_or_last(arg_t);
61−cmdreturn_t i_navigate_frame(arg_t);
62−cmdreturn_t i_toggle_animation(arg_t);
63−cmdreturn_t it_toggle_image_mark(arg_t);
64−cmdreturn_t it_reverse_marks(arg_t);
65−cmdreturn_t it_navigate_marked(arg_t);
66−cmdreturn_t it_scroll_move(arg_t);
67−cmdreturn_t it_scroll_screen(arg_t);
68−cmdreturn_t i_scroll_to_edge(arg_t);
69−cmdreturn_t i_drag(arg_t);
70−cmdreturn_t i_zoom(arg_t);
71−cmdreturn_t i_set_zoom(arg_t);
72−cmdreturn_t i_fit_to_win(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 i_toggle_alpha(arg_t);
78−cmdreturn_t i_change_gamma(arg_t);
57+const extern cmd_t cmds[CMD_COUNT];
7958
8059 #endif /* COMMANDS_H */
A commands.lst View
@@ -0,0 +1,34 @@
1+G_CMD(quit)
2+G_CMD(switch_mode)
3+G_CMD(toggle_fullscreen)
4+G_CMD(toggle_bar)
5+G_CMD(prefix_external)
6+G_CMD(reload_image)
7+G_CMD(remove_image)
8+G_CMD(first)
9+G_CMD(n_or_last)
10+G_CMD(scroll_screen)
11+G_CMD(toggle_image_mark)
12+G_CMD(reverse_marks)
13+G_CMD(navigate_marked)
14+
15+I_CMD(navigate)
16+I_CMD(alternate)
17+I_CMD(navigate_frame)
18+I_CMD(toggle_animation)
19+I_CMD(scroll)
20+I_CMD(scroll_to_edge)
21+I_CMD(drag)
22+I_CMD(zoom)
23+I_CMD(set_zoom)
24+I_CMD(fit_to_win)
25+I_CMD(rotate)
26+I_CMD(flip)
27+I_CMD(change_gamma)
28+I_CMD(toggle_antialias)
29+I_CMD(toggle_alpha)
30+I_CMD(slideshow)
31+
32+T_CMD(move_sel)
33+T_CMD(reload_all)
34+
M config.def.h View
@@ -69,16 +69,37 @@ enum { THUMB_SIZE = 60 };
6969 /* keyboard mappings for image and thumbnail mode: */
7070 static const keymap_t keys[] = {
7171 /* modifiers key function argument */
72− { 0, XK_q, it_quit, (arg_t) None },
73− { 0, XK_Return, it_switch_mode, (arg_t) None },
74− { 0, XK_f, it_toggle_fullscreen, (arg_t) None },
75− { 0, XK_b, it_toggle_bar, (arg_t) None },
76−
77− { ControlMask, XK_x, it_prefix_external, (arg_t) None },
78−
79− { 0, XK_r, it_reload_image, (arg_t) None },
72+ { 0, XK_q, g_quit, (arg_t) None },
73+ { 0, XK_Return, g_switch_mode, (arg_t) None },
74+ { 0, XK_f, g_toggle_fullscreen, (arg_t) None },
75+ { 0, XK_b, g_toggle_bar, (arg_t) None },
76+ { ControlMask, XK_x, g_prefix_external, (arg_t) None },
77+ { 0, XK_g, g_first, (arg_t) None },
78+ { 0, XK_G, g_n_or_last, (arg_t) None },
79+ { 0, XK_r, g_reload_image, (arg_t) None },
80+ { 0, XK_D, g_remove_image, (arg_t) None },
81+ { ControlMask, XK_h, g_scroll_screen, (arg_t) DIR_LEFT },
82+ { ControlMask, XK_Left, g_scroll_screen, (arg_t) DIR_LEFT },
83+ { ControlMask, XK_j, g_scroll_screen, (arg_t) DIR_DOWN },
84+ { ControlMask, XK_Down, g_scroll_screen, (arg_t) DIR_DOWN },
85+ { ControlMask, XK_k, g_scroll_screen, (arg_t) DIR_UP },
86+ { ControlMask, XK_Up, g_scroll_screen, (arg_t) DIR_UP },
87+ { ControlMask, XK_l, g_scroll_screen, (arg_t) DIR_RIGHT },
88+ { ControlMask, XK_Right, g_scroll_screen, (arg_t) DIR_RIGHT },
89+ { 0, XK_m, g_toggle_image_mark, (arg_t) None },
90+ { 0, XK_M, g_reverse_marks, (arg_t) None },
91+ { 0, XK_N, g_navigate_marked, (arg_t) +1 },
92+ { 0, XK_P, g_navigate_marked, (arg_t) -1 },
93+
94+ { 0, XK_h, t_move_sel, (arg_t) DIR_LEFT },
95+ { 0, XK_Left, t_move_sel, (arg_t) DIR_LEFT },
96+ { 0, XK_j, t_move_sel, (arg_t) DIR_DOWN },
97+ { 0, XK_Down, t_move_sel, (arg_t) DIR_DOWN },
98+ { 0, XK_k, t_move_sel, (arg_t) DIR_UP },
99+ { 0, XK_Up, t_move_sel, (arg_t) DIR_UP },
100+ { 0, XK_l, t_move_sel, (arg_t) DIR_RIGHT },
101+ { 0, XK_Right, t_move_sel, (arg_t) DIR_RIGHT },
80102 { 0, XK_R, t_reload_all, (arg_t) None },
81− { 0, XK_D, it_remove_image, (arg_t) None },
82103
83104 { 0, XK_n, i_navigate, (arg_t) +1 },
84105 { 0, XK_space, i_navigate, (arg_t) +1 },
@@ -87,41 +108,21 @@ static const keymap_t keys[] = {
87108 { 0, XK_bracketright, i_navigate, (arg_t) +10 },
88109 { 0, XK_bracketleft, i_navigate, (arg_t) -10 },
89110 { ControlMask, XK_6, i_alternate, (arg_t) None },
90− { 0, XK_g, it_first, (arg_t) None },
91− { 0, XK_G, it_n_or_last, (arg_t) None },
92−
93111 { ControlMask, XK_n, i_navigate_frame, (arg_t) +1 },
94112 { ControlMask, XK_p, i_navigate_frame, (arg_t) -1 },
95113 { ControlMask, XK_space, i_toggle_animation, (arg_t) None },
96−
97− { 0, XK_m, it_toggle_image_mark, (arg_t) None },
98− { 0, XK_M, it_reverse_marks, (arg_t) None },
99− { 0, XK_N, it_navigate_marked, (arg_t) +1 },
100− { 0, XK_P, it_navigate_marked, (arg_t) -1 },
101−
102− { 0, XK_h, it_scroll_move, (arg_t) DIR_LEFT },
103− { 0, XK_Left, it_scroll_move, (arg_t) DIR_LEFT },
104− { 0, XK_j, it_scroll_move, (arg_t) DIR_DOWN },
105− { 0, XK_Down, it_scroll_move, (arg_t) DIR_DOWN },
106− { 0, XK_k, it_scroll_move, (arg_t) DIR_UP },
107− { 0, XK_Up, it_scroll_move, (arg_t) DIR_UP },
108− { 0, XK_l, it_scroll_move, (arg_t) DIR_RIGHT },
109− { 0, XK_Right, it_scroll_move, (arg_t) DIR_RIGHT },
110−
111− { ControlMask, XK_h, it_scroll_screen, (arg_t) DIR_LEFT },
112− { ControlMask, XK_Left, it_scroll_screen, (arg_t) DIR_LEFT },
113− { ControlMask, XK_j, it_scroll_screen, (arg_t) DIR_DOWN },
114− { ControlMask, XK_Down, it_scroll_screen, (arg_t) DIR_DOWN },
115− { ControlMask, XK_k, it_scroll_screen, (arg_t) DIR_UP },
116− { ControlMask, XK_Up, it_scroll_screen, (arg_t) DIR_UP },
117− { ControlMask, XK_l, it_scroll_screen, (arg_t) DIR_RIGHT },
118− { ControlMask, XK_Right, it_scroll_screen, (arg_t) DIR_RIGHT },
119−
114+ { 0, XK_h, i_scroll, (arg_t) DIR_LEFT },
115+ { 0, XK_Left, i_scroll, (arg_t) DIR_LEFT },
116+ { 0, XK_j, i_scroll, (arg_t) DIR_DOWN },
117+ { 0, XK_Down, i_scroll, (arg_t) DIR_DOWN },
118+ { 0, XK_k, i_scroll, (arg_t) DIR_UP },
119+ { 0, XK_Up, i_scroll, (arg_t) DIR_UP },
120+ { 0, XK_l, i_scroll, (arg_t) DIR_RIGHT },
121+ { 0, XK_Right, i_scroll, (arg_t) DIR_RIGHT },
120122 { 0, XK_H, i_scroll_to_edge, (arg_t) DIR_LEFT },
121123 { 0, XK_J, i_scroll_to_edge, (arg_t) DIR_DOWN },
122124 { 0, XK_K, i_scroll_to_edge, (arg_t) DIR_UP },
123125 { 0, XK_L, i_scroll_to_edge, (arg_t) DIR_RIGHT },
124−
125126 { 0, XK_plus, i_zoom, (arg_t) +1 },
126127 { 0, XK_KP_Add, i_zoom, (arg_t) +1 },
127128 { 0, XK_minus, i_zoom, (arg_t) -1 },
@@ -131,22 +132,17 @@ static const keymap_t keys[] = {
131132 { 0, XK_W, i_fit_to_win, (arg_t) SCALE_FIT },
132133 { 0, XK_e, i_fit_to_win, (arg_t) SCALE_WIDTH },
133134 { 0, XK_E, i_fit_to_win, (arg_t) SCALE_HEIGHT },
134−
135135 { 0, XK_less, i_rotate, (arg_t) DEGREE_270 },
136136 { 0, XK_greater, i_rotate, (arg_t) DEGREE_90 },
137137 { 0, XK_question, i_rotate, (arg_t) DEGREE_180 },
138−
139138 { 0, XK_bar, i_flip, (arg_t) FLIP_HORIZONTAL },
140139 { 0, XK_underscore, i_flip, (arg_t) FLIP_VERTICAL },
141−
142− { 0, XK_s, i_slideshow, (arg_t) None },
143−
144− { 0, XK_a, i_toggle_antialias, (arg_t) None },
145− { 0, XK_A, i_toggle_alpha, (arg_t) None },
146−
147140 { 0, XK_braceleft, i_change_gamma, (arg_t) -1 },
148141 { 0, XK_braceright, i_change_gamma, (arg_t) +1 },
149142 { ControlMask, XK_g, i_change_gamma, (arg_t) 0 },
143+ { 0, XK_a, i_toggle_antialias, (arg_t) None },
144+ { 0, XK_A, i_toggle_alpha, (arg_t) None },
145+ { 0, XK_s, i_slideshow, (arg_t) None },
150146 };
151147
152148 /* mouse button mappings for image mode: */
@@ -155,12 +151,12 @@ static const button_t buttons[] = {
155151 { 0, 1, i_navigate, (arg_t) +1 },
156152 { 0, 3, i_navigate, (arg_t) -1 },
157153 { 0, 2, i_drag, (arg_t) None },
158− { 0, 4, it_scroll_move, (arg_t) DIR_UP },
159− { 0, 5, it_scroll_move, (arg_t) DIR_DOWN },
160− { ShiftMask, 4, it_scroll_move, (arg_t) DIR_LEFT },
161− { ShiftMask, 5, it_scroll_move, (arg_t) DIR_RIGHT },
162− { 0, 6, it_scroll_move, (arg_t) DIR_LEFT },
163− { 0, 7, it_scroll_move, (arg_t) DIR_RIGHT },
154+ { 0, 4, i_scroll, (arg_t) DIR_UP },
155+ { 0, 5, i_scroll, (arg_t) DIR_DOWN },
156+ { ShiftMask, 4, i_scroll, (arg_t) DIR_LEFT },
157+ { ShiftMask, 5, i_scroll, (arg_t) DIR_RIGHT },
158+ { 0, 6, i_scroll, (arg_t) DIR_LEFT },
159+ { 0, 7, i_scroll, (arg_t) DIR_RIGHT },
164160 { ControlMask, 4, i_zoom, (arg_t) +1 },
165161 { ControlMask, 5, i_zoom, (arg_t) -1 },
166162 };
M main.c View
@@ -567,13 +567,10 @@ void on_keypress(XKeyEvent *kev)
567567 } else for (i = 0; i < ARRLEN(keys); i++) {
568568 if (keys[i].ksym == ksym &&
569569 MODMASK(keys[i].mask | sh) == MODMASK(kev->state) &&
570− keys[i].cmd != NULL)
570+ keys[i].cmd >= 0 && keys[i].cmd < CMD_COUNT &&
571+ (cmds[keys[i].cmd].mode < 0 || cmds[keys[i].cmd].mode == mode))
571572 {
572− cmdreturn_t ret = keys[i].cmd(keys[i].arg);
573−
574− if (ret == CMD_INVALID)
575− continue;
576− if (ret == CMD_DIRTY)
573+ if (cmds[keys[i].cmd].func(keys[i].arg))
577574 redraw();
578575 break;
579576 }
@@ -596,13 +593,10 @@ void on_buttonpress(XButtonEvent *bev)
596593 for (i = 0; i < ARRLEN(buttons); i++) {
597594 if (buttons[i].button == bev->button &&
598595 MODMASK(buttons[i].mask) == MODMASK(bev->state) &&
599− buttons[i].cmd != NULL)
596+ buttons[i].cmd >= 0 && buttons[i].cmd < CMD_COUNT &&
597+ (cmds[buttons[i].cmd].mode < 0 || cmds[buttons[i].cmd].mode == mode))
600598 {
601− cmdreturn_t ret = buttons[i].cmd(buttons[i].arg);
602−
603− if (ret == CMD_INVALID)
604− continue;
605− if (ret == CMD_DIRTY)
599+ if (cmds[buttons[i].cmd].func(buttons[i].arg))
606600 redraw();
607601 break;
608602 }
M sxiv.1 View
@@ -92,22 +92,15 @@ Set zoom level to ZOOM percent.
9292 .SH GENERAL KEYBOARD COMMANDS
9393 The following keyboard commands are available in both image and thumbnail mode:
9494 .TP
95−.B q
96−Quit sxiv.
97−.TP
98−.B Return
99−Switch to thumbnail mode / open selected image in image mode.
100−.TP
10195 .BR 0 \- 9
10296 Prefix the next command with a number (denoted via
10397 .IR count ).
10498 .TP
105−.B g
106−Go to the first image.
99+.B q
100+Quit sxiv.
107101 .TP
108−.B G
109−Go to the last image, or image number
110−.IR count .
102+.B Return
103+Switch to thumbnail mode / open selected image in image mode.
111104 .TP
112105 .B f
113106 Toggle fullscreen mode.
@@ -118,15 +111,31 @@ Toggle visibility of info bar on bottom of window.
118111 .B Ctrl-x
119112 Send the next key to the external key-handler.
120113 .TP
114+.B g
115+Go to the first image.
116+.TP
117+.B G
118+Go to the last image, or image number
119+.IR count .
120+.TP
121121 .B r
122122 Reload image.
123123 .TP
124−.B R
125−Reload all thumbnails.
126−.TP
127124 .B D
128125 Remove current image from file list and go to next image.
129126 .TP
127+.BR Ctrl-h ", " Ctrl-Left
128+Scroll left one screen width.
129+.TP
130+.BR Ctrl-j ", " Ctrl-Down
131+Scroll down one screen height.
132+.TP
133+.BR Ctrl-k ", " Ctrl-Up
134+Scroll up one screen height.
135+.TP
136+.BR Ctrl-l ", " Ctrl-Right
137+Scroll right one screen width.
138+.TP
130139 .B m
131140 Mark/unmark the current image.
132141 .TP
@@ -165,11 +174,8 @@ Move selection right
165174 .I count
166175 times.
167176 .TP
168−.BR Ctrl-j ", " Ctrl-Down
169−Scroll thumbnail grid one window height down.
170−.TP
171−.BR Ctrl-k ", " Ctrl-Up
172−Scroll thumbnail grid one window height up.
177+.B R
178+Reload all thumbnails.
173179 .SH IMAGE KEYBOARD COMMANDS
174180 The following keyboard commands are only available in image mode:
175181 .SS Navigate image list
@@ -203,74 +209,62 @@ Go to the previous frame of a multi-frame image.
203209 .TP
204210 .B Ctrl-Space
205211 Play/pause animation of a multi-frame image.
206−.SS Zooming
207−.TP
208−.BR +
209−Zoom in.
210−.TP
211−.B \-
212−Zoom out.
213−.TP
214−.B =
215−Set zoom level to 100%, or
216−.IR count %.
217−.TP
218−.B w
219−Set zoom level to 100%, but fit large images into window.
220−.TP
221−.B W
222−Fit image to window.
223−.TP
224−.B e
225−Fit image to window width.
226−.TP
227−.B E
228−Fit image to window height.
229212 .SS Panning
230213 .TP
231214 .BR h ", " Left
232−Pan image 1/5 of window width or
215+Scroll image 1/5 of window width or
233216 .I count
234217 pixel left.
235218 .TP
236219 .BR j ", " Down
237−Pan image 1/5 of window height or
220+Scroll image 1/5 of window height or
238221 .I count
239222 pixel down.
240223 .TP
241224 .BR k ", " Up
242−Pan image 1/5 of window height or
225+Scroll image 1/5 of window height or
243226 .I count
244227 pixel up.
245228 .TP
246229 .BR l ", " Right
247−Pan image 1/5 of window width or
230+Scroll image 1/5 of window width or
248231 .I count
249232 pixel right.
250233 .TP
251234 .B H
252−Pan to left image edge.
235+Scroll to left image edge.
253236 .TP
254237 .B J
255−Pan to bottom image edge.
238+Scroll to bottom image edge.
256239 .TP
257240 .B K
258−Pan to top image edge.
241+Scroll to top image edge.
259242 .TP
260243 .B L
261−Pan to right image edge.
244+Scroll to right image edge.
245+.SS Zooming
262246 .TP
263−.BR Ctrl-h ", " Ctrl-Left
264−Pan image one window width left.
247+.BR +
248+Zoom in.
265249 .TP
266−.BR Ctrl-j ", " Ctrl-Down
267−Pan image one window height down.
250+.B \-
251+Zoom out.
268252 .TP
269−.BR Ctrl-k ", " Ctrl-Up
270−Pan image one window height up.
253+.B =
254+Set zoom level to 100%, or
255+.IR count %.
271256 .TP
272−.BR Ctrl-l ", " Ctrl-Right
273−Pan image one window width right.
257+.B w
258+Set zoom level to 100%, but fit large images into window.
259+.TP
260+.B W
261+Fit image to window.
262+.TP
263+.B e
264+Fit image to window width.
265+.TP
266+.B E
267+Fit image to window height.
274268 .SS Rotation
275269 .TP
276270 .B <
@@ -281,7 +275,7 @@ Rotate image clockwise by 90 degrees.
281275 .TP
282276 .B ?
283277 Rotate image by 180 degrees.
284−.SS Flip
278+.SS Flipping
285279 .TP
286280 .B |
287281 Flip image horizontally.
@@ -319,29 +313,29 @@ Go to next image.
319313 .TP
320314 .B Button3
321315 Go to the previous image.
322−.SS Zooming
323−.TP
324−.B Ctrl+ScrollUp
325−Zoom in.
326−.TP
327−.B Ctrl+ScrollDown
328−Zoom out.
329−.SS Panning/Moving
316+.SS Panning
330317 .TP
331318 .B Button2
332319 Drag the image with the mouse while keeping this button pressed down.
333320 .TP
334321 .B ScrollUp
335−Pan image up.
322+Scroll image up.
336323 .TP
337324 .B ScrollDown
338−Pan image down.
325+Scroll image down.
339326 .TP
340327 .B Shift+ScrollUp
341−Pan image left.
328+Scroll image left.
342329 .TP
343330 .B Shift+ScrollDown
344−Pan image right.
331+Scroll image right.
332+.SS Zooming
333+.TP
334+.B Ctrl+ScrollUp
335+Zoom in.
336+.TP
337+.B Ctrl+ScrollDown
338+Zoom out.
345339 .SH STATUS BAR
346340 The information displayed on the left side of the status bar can be replaced
347341 with the output of a user-provided script, which is called by sxiv whenever an