nsxiv06164c2
Revised command structure and key and mouse button mappings
+324 −380
8 files changed
- M Makefile +1 −1
- M README.md +14 −29
- M commands.c +139 −177
- M commands.h +18 −39
- A commands.lst +34 −0
- M config.def.h +47 −51
- M main.c +6 −12
- M sxiv.1 +65 −71
| @@ -1,4 +1,4 @@ | |||
| 1 | − | VERSION = git-20140615 | |
| 1 | + | VERSION = git-20140723 | |
| 2 | 2 | ||
| 3 | 3 | PREFIX = /usr/local | |
| 4 | 4 | MANPREFIX = $(PREFIX)/share/man | |
| @@ -89,24 +89,17 @@ of small previews is displayed, making it easy to choose an image to open. | |||
| 89 | 89 | ||
| 90 | 90 | **Key mappings:** | |
| 91 | 91 | ||
| 92 | + | 0-9 Prefix the next command with a number (denoted via [count]) | |
| 92 | 93 | q Quit sxiv | |
| 93 | 94 | 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 | |
| 97 | 97 | Ctrl-x Send the next key to the external key-handler | |
| 98 | − | ||
| 99 | 98 | g Go to first image | |
| 100 | 99 | 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 | − | ||
| 106 | 100 | r Reload image | |
| 107 | − | R Reload all thumbnails | |
| 108 | 101 | 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 | |
| 110 | 103 | m Mark/unmark current image | |
| 111 | 104 | M Reverse all image marks | |
| 112 | 105 | N Go [count] marked images forward | |
| @@ -114,18 +107,20 @@ of small previews is displayed, making it easy to choose an image to open. | |||
| 114 | 107 | ||
| 115 | 108 | *Thumbnail mode:* | |
| 116 | 109 | ||
| 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 | |
| 119 | 113 | ||
| 120 | 114 | *Image mode:* | |
| 121 | 115 | ||
| 122 | 116 | n,Space Go [count] images forward | |
| 123 | 117 | p,Backspace Go [count] images backward | |
| 124 | 118 | [,] Go [count] * 10 images backward/forward | |
| 125 | − | ||
| 126 | 119 | Ctrl-n,p Go to the next/previous frame of a multi-frame image | |
| 127 | 120 | 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 | |
| 129 | 124 | + Zoom in | |
| 130 | 125 | - Zoom out | |
| 131 | 126 | = 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. | |||
| 133 | 128 | W Fit image to window | |
| 134 | 129 | e Fit image to window width | |
| 135 | 130 | 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 | − | ||
| 143 | 131 | <,> Rotate image (counter-)clockwise by 90 degrees | |
| 144 | 132 | ? Rotate image by 180 degrees | |
| 145 | 133 | |,_ Flip image horizontally/vertically | |
| 146 | − | ||
| 147 | 134 | {,} Decrease/increase gamma | |
| 148 | 135 | Ctrl-g Reset gamma | |
| 149 | − | ||
| 150 | 136 | a Toggle anti-aliasing | |
| 151 | 137 | A Toggle visibility of alpha-channel, i.e. transparency | |
| 152 | − | ||
| 153 | 138 | s Toggle slideshow or set delay to [count] seconds | |
| 154 | 139 | ||
| 155 | 140 | ||
| @@ -158,11 +143,11 @@ of small previews is displayed, making it easy to choose an image to open. | |||
| 158 | 143 | *Image mode:* | |
| 159 | 144 | ||
| 160 | 145 | Button1 Go to the next image | |
| 161 | − | Button2 Drag image with mouse while keeping it pressed | |
| 162 | 146 | 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 | |
| 166 | 151 | ||
| 167 | 152 | ||
| 168 | 153 | Download & Changelog | |
| @@ -1,4 +1,4 @@ | |||
| 1 | − | /* Copyright 2011, 2012 Bert Muennich | |
| 1 | + | /* Copyright 2011, 2012, 2014 Bert Muennich | |
| 2 | 2 | * | |
| 3 | 3 | * This file is part of sxiv. | |
| 4 | 4 | * | |
| @@ -58,7 +58,7 @@ const int ss_delays[] = { | |||
| 58 | 58 | 1, 2, 3, 5, 10, 15, 20, 30, 60, 120, 180, 300, 600 | |
| 59 | 59 | }; | |
| 60 | 60 | ||
| 61 | − | cmdreturn_t it_quit(arg_t a) | |
| 61 | + | bool cg_quit(arg_t a) | |
| 62 | 62 | { | |
| 63 | 63 | unsigned int i; | |
| 64 | 64 | ||
| @@ -72,7 +72,7 @@ cmdreturn_t it_quit(arg_t a) | |||
| 72 | 72 | exit(EXIT_SUCCESS); | |
| 73 | 73 | } | |
| 74 | 74 | ||
| 75 | − | cmdreturn_t it_switch_mode(arg_t a) | |
| 75 | + | bool cg_switch_mode(arg_t a) | |
| 76 | 76 | { | |
| 77 | 77 | if (mode == MODE_IMAGE) { | |
| 78 | 78 | if (tns.thumbs == NULL) | |
| @@ -90,10 +90,10 @@ cmdreturn_t it_switch_mode(arg_t a) | |||
| 90 | 90 | load_image(tns.sel); | |
| 91 | 91 | mode = MODE_IMAGE; | |
| 92 | 92 | } | |
| 93 | − | return CMD_DIRTY; | |
| 93 | + | return true; | |
| 94 | 94 | } | |
| 95 | 95 | ||
| 96 | − | cmdreturn_t it_toggle_fullscreen(arg_t a) | |
| 96 | + | bool cg_toggle_fullscreen(arg_t a) | |
| 97 | 97 | { | |
| 98 | 98 | win_toggle_fullscreen(&win); | |
| 99 | 99 | /* redraw after next ConfigureNotify event */ | |
| @@ -102,10 +102,10 @@ cmdreturn_t it_toggle_fullscreen(arg_t a) | |||
| 102 | 102 | img.checkpan = img.dirty = true; | |
| 103 | 103 | else | |
| 104 | 104 | tns.dirty = true; | |
| 105 | − | return CMD_OK; | |
| 105 | + | return false; | |
| 106 | 106 | } | |
| 107 | 107 | ||
| 108 | − | cmdreturn_t it_toggle_bar(arg_t a) | |
| 108 | + | bool cg_toggle_bar(arg_t a) | |
| 109 | 109 | { | |
| 110 | 110 | win_toggle_bar(&win); | |
| 111 | 111 | if (mode == MODE_IMAGE) { | |
| @@ -115,27 +115,16 @@ cmdreturn_t it_toggle_bar(arg_t a) | |||
| 115 | 115 | } else { | |
| 116 | 116 | tns.dirty = true; | |
| 117 | 117 | } | |
| 118 | − | return CMD_DIRTY; | |
| 118 | + | return true; | |
| 119 | 119 | } | |
| 120 | 120 | ||
| 121 | − | cmdreturn_t it_prefix_external(arg_t a) | |
| 121 | + | bool cg_prefix_external(arg_t a) | |
| 122 | 122 | { | |
| 123 | 123 | extprefix = true; | |
| 124 | − | return CMD_OK; | |
| 124 | + | return false; | |
| 125 | 125 | } | |
| 126 | 126 | ||
| 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) | |
| 139 | 128 | { | |
| 140 | 129 | if (mode == MODE_IMAGE) { | |
| 141 | 130 | load_image(fileidx); | |
| @@ -148,120 +137,77 @@ cmdreturn_t it_reload_image(arg_t a) | |||
| 148 | 137 | tns.sel = tns.cnt - 1; | |
| 149 | 138 | } | |
| 150 | 139 | } | |
| 151 | − | return CMD_DIRTY; | |
| 140 | + | return true; | |
| 152 | 141 | } | |
| 153 | 142 | ||
| 154 | − | cmdreturn_t it_remove_image(arg_t a) | |
| 143 | + | bool cg_remove_image(arg_t a) | |
| 155 | 144 | { | |
| 156 | 145 | if (mode == MODE_IMAGE) { | |
| 157 | 146 | remove_file(fileidx, true); | |
| 158 | 147 | load_image(fileidx >= filecnt ? filecnt - 1 : fileidx); | |
| 159 | − | return CMD_DIRTY; | |
| 148 | + | return true; | |
| 160 | 149 | } else if (tns.sel < tns.cnt) { | |
| 161 | 150 | remove_file(tns.sel, true); | |
| 162 | 151 | tns.dirty = true; | |
| 163 | 152 | if (tns.sel >= tns.cnt) | |
| 164 | 153 | 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; | |
| 197 | 155 | } else { | |
| 198 | − | return CMD_INVALID; | |
| 156 | + | return false; | |
| 199 | 157 | } | |
| 200 | 158 | } | |
| 201 | 159 | ||
| 202 | − | cmdreturn_t it_first(arg_t a) | |
| 160 | + | bool cg_first(arg_t a) | |
| 203 | 161 | { | |
| 204 | 162 | if (mode == MODE_IMAGE && fileidx != 0) { | |
| 205 | 163 | load_image(0); | |
| 206 | − | return CMD_DIRTY; | |
| 164 | + | return true; | |
| 207 | 165 | } else if (mode == MODE_THUMB && tns.sel != 0) { | |
| 208 | 166 | tns.sel = 0; | |
| 209 | 167 | tns.dirty = true; | |
| 210 | − | return CMD_DIRTY; | |
| 168 | + | return true; | |
| 211 | 169 | } else { | |
| 212 | − | return CMD_OK; | |
| 170 | + | return false; | |
| 213 | 171 | } | |
| 214 | 172 | } | |
| 215 | 173 | ||
| 216 | − | cmdreturn_t it_n_or_last(arg_t a) | |
| 174 | + | bool cg_n_or_last(arg_t a) | |
| 217 | 175 | { | |
| 218 | 176 | int n = prefix != 0 && prefix - 1 < filecnt ? prefix - 1 : filecnt - 1; | |
| 219 | 177 | ||
| 220 | 178 | if (mode == MODE_IMAGE && fileidx != n) { | |
| 221 | 179 | load_image(n); | |
| 222 | − | return CMD_DIRTY; | |
| 180 | + | return true; | |
| 223 | 181 | } else if (mode == MODE_THUMB && tns.sel != n) { | |
| 224 | 182 | tns.sel = n; | |
| 225 | 183 | tns.dirty = true; | |
| 226 | − | return CMD_DIRTY; | |
| 184 | + | return true; | |
| 227 | 185 | } else { | |
| 228 | − | return CMD_OK; | |
| 186 | + | return false; | |
| 229 | 187 | } | |
| 230 | 188 | } | |
| 231 | 189 | ||
| 232 | − | cmdreturn_t i_navigate_frame(arg_t a) | |
| 190 | + | bool cg_scroll_screen(arg_t a) | |
| 233 | 191 | { | |
| 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; | |
| 244 | 193 | ||
| 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); | |
| 252 | 198 | } | |
| 253 | 199 | ||
| 254 | − | cmdreturn_t it_toggle_image_mark(arg_t a) | |
| 200 | + | bool cg_toggle_image_mark(arg_t a) | |
| 255 | 201 | { | |
| 256 | 202 | int sel = mode == MODE_IMAGE ? fileidx : tns.sel; | |
| 257 | 203 | ||
| 258 | 204 | files[sel].marked = !files[sel].marked; | |
| 259 | 205 | if (mode == MODE_THUMB) | |
| 260 | 206 | tns_mark(&tns, sel, files[sel].marked); | |
| 261 | − | return CMD_DIRTY; | |
| 207 | + | return true; | |
| 262 | 208 | } | |
| 263 | 209 | ||
| 264 | − | cmdreturn_t it_reverse_marks(arg_t a) | |
| 210 | + | bool cg_reverse_marks(arg_t a) | |
| 265 | 211 | { | |
| 266 | 212 | int i, cnt = mode == MODE_IMAGE ? filecnt : tns.cnt; | |
| 267 | 213 | ||
| @@ -269,10 +215,10 @@ cmdreturn_t it_reverse_marks(arg_t a) | |||
| 269 | 215 | files[i].marked = !files[i].marked; | |
| 270 | 216 | if (mode == MODE_THUMB) | |
| 271 | 217 | tns.dirty = true; | |
| 272 | − | return CMD_DIRTY; | |
| 218 | + | return true; | |
| 273 | 219 | } | |
| 274 | 220 | ||
| 275 | − | cmdreturn_t it_navigate_marked(arg_t a) | |
| 221 | + | bool cg_navigate_marked(arg_t a) | |
| 276 | 222 | { | |
| 277 | 223 | long n = (long) a; | |
| 278 | 224 | int d, i, cnt, sel, new; | |
| @@ -297,40 +243,66 @@ cmdreturn_t it_navigate_marked(arg_t a) | |||
| 297 | 243 | tns.sel = new; | |
| 298 | 244 | tns.dirty = true; | |
| 299 | 245 | } | |
| 300 | − | return CMD_DIRTY; | |
| 246 | + | return true; | |
| 301 | 247 | } else { | |
| 302 | − | return CMD_OK; | |
| 248 | + | return false; | |
| 303 | 249 | } | |
| 304 | 250 | } | |
| 305 | 251 | ||
| 306 | − | cmdreturn_t it_scroll_move(arg_t a) | |
| 252 | + | bool ci_navigate(arg_t a) | |
| 307 | 253 | { | |
| 308 | − | direction_t dir = (direction_t) a; | |
| 254 | + | long n = (long) a; | |
| 309 | 255 | ||
| 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; | |
| 314 | 292 | } | |
| 315 | 293 | ||
| 316 | − | cmdreturn_t it_scroll_screen(arg_t a) | |
| 294 | + | bool ci_scroll(arg_t a) | |
| 317 | 295 | { | |
| 318 | 296 | direction_t dir = (direction_t) a; | |
| 319 | 297 | ||
| 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); | |
| 324 | 299 | } | |
| 325 | 300 | ||
| 326 | − | cmdreturn_t i_scroll_to_edge(arg_t a) | |
| 301 | + | bool ci_scroll_to_edge(arg_t a) | |
| 327 | 302 | { | |
| 328 | 303 | direction_t dir = (direction_t) a; | |
| 329 | 304 | ||
| 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); | |
| 334 | 306 | } | |
| 335 | 307 | ||
| 336 | 308 | /* Xlib helper function for i_drag() */ | |
| @@ -344,7 +316,7 @@ Bool is_motionnotify(Display *d, XEvent *e, XPointer a) | |||
| 344 | 316 | ox = x, oy = y; \ | |
| 345 | 317 | break | |
| 346 | 318 | ||
| 347 | − | cmdreturn_t i_drag(arg_t a) | |
| 319 | + | bool ci_drag(arg_t a) | |
| 348 | 320 | { | |
| 349 | 321 | int dx = 0, dy = 0, i, ox, oy, x, y; | |
| 350 | 322 | unsigned int ui; | |
| @@ -352,10 +324,8 @@ cmdreturn_t i_drag(arg_t a) | |||
| 352 | 324 | XEvent e; | |
| 353 | 325 | Window w; | |
| 354 | 326 | ||
| 355 | − | if (mode != MODE_IMAGE) | |
| 356 | − | return CMD_INVALID; | |
| 357 | 327 | if (!XQueryPointer(win.env.dpy, win.xwin, &w, &w, &i, &i, &ox, &oy, &ui)) | |
| 358 | − | return CMD_OK; | |
| 328 | + | return false; | |
| 359 | 329 | ||
| 360 | 330 | win_set_cursor(&win, CURSOR_HAND); | |
| 361 | 331 | ||
| @@ -398,117 +368,109 @@ cmdreturn_t i_drag(arg_t a) | |||
| 398 | 368 | dx = dy = 0; | |
| 399 | 369 | } | |
| 400 | 370 | } | |
| 401 | − | ||
| 402 | 371 | win_set_cursor(&win, CURSOR_ARROW); | |
| 403 | 372 | set_timeout(reset_cursor, TO_CURSOR_HIDE, true); | |
| 404 | 373 | reset_timeout(redraw); | |
| 405 | 374 | ||
| 406 | − | return CMD_OK; | |
| 375 | + | return true; | |
| 407 | 376 | } | |
| 408 | 377 | ||
| 409 | − | cmdreturn_t i_zoom(arg_t a) | |
| 378 | + | bool ci_zoom(arg_t a) | |
| 410 | 379 | { | |
| 411 | 380 | long scale = (long) a; | |
| 412 | 381 | ||
| 413 | − | if (mode != MODE_IMAGE) | |
| 414 | − | return CMD_INVALID; | |
| 415 | − | ||
| 416 | 382 | if (scale > 0) | |
| 417 | 383 | return img_zoom_in(&img); | |
| 418 | 384 | else if (scale < 0) | |
| 419 | 385 | return img_zoom_out(&img); | |
| 420 | 386 | else | |
| 421 | − | return CMD_OK; | |
| 387 | + | return false; | |
| 422 | 388 | } | |
| 423 | 389 | ||
| 424 | − | cmdreturn_t i_set_zoom(arg_t a) | |
| 390 | + | bool ci_set_zoom(arg_t a) | |
| 425 | 391 | { | |
| 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); | |
| 430 | 393 | } | |
| 431 | 394 | ||
| 432 | − | cmdreturn_t i_fit_to_win(arg_t a) | |
| 395 | + | bool ci_fit_to_win(arg_t a) | |
| 433 | 396 | { | |
| 434 | 397 | scalemode_t sm = (scalemode_t) a; | |
| 435 | 398 | ||
| 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); | |
| 440 | 400 | } | |
| 441 | 401 | ||
| 442 | − | cmdreturn_t i_rotate(arg_t a) | |
| 402 | + | bool ci_rotate(arg_t a) | |
| 443 | 403 | { | |
| 444 | 404 | degree_t degree = (degree_t) a; | |
| 445 | 405 | ||
| 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; | |
| 452 | 408 | } | |
| 453 | 409 | ||
| 454 | − | cmdreturn_t i_flip(arg_t a) | |
| 410 | + | bool ci_flip(arg_t a) | |
| 455 | 411 | { | |
| 456 | 412 | flipdir_t dir = (flipdir_t) a; | |
| 457 | 413 | ||
| 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; | |
| 464 | 416 | } | |
| 465 | 417 | ||
| 466 | − | cmdreturn_t i_slideshow(arg_t a) | |
| 418 | + | bool ci_change_gamma(arg_t a) | |
| 467 | 419 | { | |
| 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); | |
| 483 | 421 | } | |
| 484 | 422 | ||
| 485 | − | cmdreturn_t i_toggle_antialias(arg_t a) | |
| 423 | + | bool ci_toggle_antialias(arg_t a) | |
| 486 | 424 | { | |
| 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; | |
| 493 | 427 | } | |
| 494 | 428 | ||
| 495 | − | cmdreturn_t i_toggle_alpha(arg_t a) | |
| 429 | + | bool ci_toggle_alpha(arg_t a) | |
| 496 | 430 | { | |
| 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; | |
| 504 | 434 | } | |
| 505 | 435 | ||
| 506 | − | cmdreturn_t i_change_gamma(arg_t a) | |
| 436 | + | bool ci_slideshow(arg_t a) | |
| 507 | 437 | { | |
| 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); | |
| 510 | 445 | } else { | |
| 511 | − | return CMD_INVALID; | |
| 446 | + | img.ss.on = true; | |
| 512 | 447 | } | |
| 448 | + | return true; | |
| 513 | 449 | } | |
| 514 | 450 | ||
| 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 | + | ||
| @@ -1,4 +1,4 @@ | |||
| 1 | − | /* Copyright 2011 Bert Muennich | |
| 1 | + | /* Copyright 2011, 2014 Bert Muennich | |
| 2 | 2 | * | |
| 3 | 3 | * This file is part of sxiv. | |
| 4 | 4 | * | |
| @@ -23,58 +23,37 @@ | |||
| 23 | 23 | ||
| 24 | 24 | #include "types.h" | |
| 25 | 25 | ||
| 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 | + | ||
| 26 | 33 | 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; | |
| 31 | 37 | ||
| 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; | |
| 34 | 42 | ||
| 35 | 43 | typedef struct { | |
| 36 | 44 | unsigned int mask; | |
| 37 | 45 | KeySym ksym; | |
| 38 | − | command_f cmd; | |
| 46 | + | cmd_id_t cmd; | |
| 39 | 47 | arg_t arg; | |
| 40 | 48 | } keymap_t; | |
| 41 | 49 | ||
| 42 | 50 | typedef struct { | |
| 43 | 51 | unsigned int mask; | |
| 44 | 52 | unsigned int button; | |
| 45 | − | command_f cmd; | |
| 53 | + | cmd_id_t cmd; | |
| 46 | 54 | arg_t arg; | |
| 47 | 55 | } button_t; | |
| 48 | 56 | ||
| 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]; | |
| 79 | 58 | ||
| 80 | 59 | #endif /* COMMANDS_H */ | |
| @@ -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 | + | ||
| @@ -69,16 +69,37 @@ enum { THUMB_SIZE = 60 }; | |||
| 69 | 69 | /* keyboard mappings for image and thumbnail mode: */ | |
| 70 | 70 | static const keymap_t keys[] = { | |
| 71 | 71 | /* 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 }, | |
| 80 | 102 | { 0, XK_R, t_reload_all, (arg_t) None }, | |
| 81 | − | { 0, XK_D, it_remove_image, (arg_t) None }, | |
| 82 | 103 | ||
| 83 | 104 | { 0, XK_n, i_navigate, (arg_t) +1 }, | |
| 84 | 105 | { 0, XK_space, i_navigate, (arg_t) +1 }, | |
| @@ -87,41 +108,21 @@ static const keymap_t keys[] = { | |||
| 87 | 108 | { 0, XK_bracketright, i_navigate, (arg_t) +10 }, | |
| 88 | 109 | { 0, XK_bracketleft, i_navigate, (arg_t) -10 }, | |
| 89 | 110 | { 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 | − | ||
| 93 | 111 | { ControlMask, XK_n, i_navigate_frame, (arg_t) +1 }, | |
| 94 | 112 | { ControlMask, XK_p, i_navigate_frame, (arg_t) -1 }, | |
| 95 | 113 | { 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 }, | |
| 120 | 122 | { 0, XK_H, i_scroll_to_edge, (arg_t) DIR_LEFT }, | |
| 121 | 123 | { 0, XK_J, i_scroll_to_edge, (arg_t) DIR_DOWN }, | |
| 122 | 124 | { 0, XK_K, i_scroll_to_edge, (arg_t) DIR_UP }, | |
| 123 | 125 | { 0, XK_L, i_scroll_to_edge, (arg_t) DIR_RIGHT }, | |
| 124 | − | ||
| 125 | 126 | { 0, XK_plus, i_zoom, (arg_t) +1 }, | |
| 126 | 127 | { 0, XK_KP_Add, i_zoom, (arg_t) +1 }, | |
| 127 | 128 | { 0, XK_minus, i_zoom, (arg_t) -1 }, | |
| @@ -131,22 +132,17 @@ static const keymap_t keys[] = { | |||
| 131 | 132 | { 0, XK_W, i_fit_to_win, (arg_t) SCALE_FIT }, | |
| 132 | 133 | { 0, XK_e, i_fit_to_win, (arg_t) SCALE_WIDTH }, | |
| 133 | 134 | { 0, XK_E, i_fit_to_win, (arg_t) SCALE_HEIGHT }, | |
| 134 | − | ||
| 135 | 135 | { 0, XK_less, i_rotate, (arg_t) DEGREE_270 }, | |
| 136 | 136 | { 0, XK_greater, i_rotate, (arg_t) DEGREE_90 }, | |
| 137 | 137 | { 0, XK_question, i_rotate, (arg_t) DEGREE_180 }, | |
| 138 | − | ||
| 139 | 138 | { 0, XK_bar, i_flip, (arg_t) FLIP_HORIZONTAL }, | |
| 140 | 139 | { 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 | − | ||
| 147 | 140 | { 0, XK_braceleft, i_change_gamma, (arg_t) -1 }, | |
| 148 | 141 | { 0, XK_braceright, i_change_gamma, (arg_t) +1 }, | |
| 149 | 142 | { 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 }, | |
| 150 | 146 | }; | |
| 151 | 147 | ||
| 152 | 148 | /* mouse button mappings for image mode: */ | |
| @@ -155,12 +151,12 @@ static const button_t buttons[] = { | |||
| 155 | 151 | { 0, 1, i_navigate, (arg_t) +1 }, | |
| 156 | 152 | { 0, 3, i_navigate, (arg_t) -1 }, | |
| 157 | 153 | { 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 }, | |
| 164 | 160 | { ControlMask, 4, i_zoom, (arg_t) +1 }, | |
| 165 | 161 | { ControlMask, 5, i_zoom, (arg_t) -1 }, | |
| 166 | 162 | }; | |
| @@ -567,13 +567,10 @@ void on_keypress(XKeyEvent *kev) | |||
| 567 | 567 | } else for (i = 0; i < ARRLEN(keys); i++) { | |
| 568 | 568 | if (keys[i].ksym == ksym && | |
| 569 | 569 | 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)) | |
| 571 | 572 | { | |
| 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)) | |
| 577 | 574 | redraw(); | |
| 578 | 575 | break; | |
| 579 | 576 | } | |
| @@ -596,13 +593,10 @@ void on_buttonpress(XButtonEvent *bev) | |||
| 596 | 593 | for (i = 0; i < ARRLEN(buttons); i++) { | |
| 597 | 594 | if (buttons[i].button == bev->button && | |
| 598 | 595 | 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)) | |
| 600 | 598 | { | |
| 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)) | |
| 606 | 600 | redraw(); | |
| 607 | 601 | break; | |
| 608 | 602 | } | |
| @@ -92,22 +92,15 @@ Set zoom level to ZOOM percent. | |||
| 92 | 92 | .SH GENERAL KEYBOARD COMMANDS | |
| 93 | 93 | The following keyboard commands are available in both image and thumbnail mode: | |
| 94 | 94 | .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 | |
| 101 | 95 | .BR 0 \- 9 | |
| 102 | 96 | Prefix the next command with a number (denoted via | |
| 103 | 97 | .IR count ). | |
| 104 | 98 | .TP | |
| 105 | − | .B g | |
| 106 | − | Go to the first image. | |
| 99 | + | .B q | |
| 100 | + | Quit sxiv. | |
| 107 | 101 | .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. | |
| 111 | 104 | .TP | |
| 112 | 105 | .B f | |
| 113 | 106 | Toggle fullscreen mode. | |
| @@ -118,15 +111,31 @@ Toggle visibility of info bar on bottom of window. | |||
| 118 | 111 | .B Ctrl-x | |
| 119 | 112 | Send the next key to the external key-handler. | |
| 120 | 113 | .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 | |
| 121 | 121 | .B r | |
| 122 | 122 | Reload image. | |
| 123 | 123 | .TP | |
| 124 | − | .B R | |
| 125 | − | Reload all thumbnails. | |
| 126 | − | .TP | |
| 127 | 124 | .B D | |
| 128 | 125 | Remove current image from file list and go to next image. | |
| 129 | 126 | .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 | |
| 130 | 139 | .B m | |
| 131 | 140 | Mark/unmark the current image. | |
| 132 | 141 | .TP | |
| @@ -165,11 +174,8 @@ Move selection right | |||
| 165 | 174 | .I count | |
| 166 | 175 | times. | |
| 167 | 176 | .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. | |
| 173 | 179 | .SH IMAGE KEYBOARD COMMANDS | |
| 174 | 180 | The following keyboard commands are only available in image mode: | |
| 175 | 181 | .SS Navigate image list | |
| @@ -203,74 +209,62 @@ Go to the previous frame of a multi-frame image. | |||
| 203 | 209 | .TP | |
| 204 | 210 | .B Ctrl-Space | |
| 205 | 211 | 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. | |
| 229 | 212 | .SS Panning | |
| 230 | 213 | .TP | |
| 231 | 214 | .BR h ", " Left | |
| 232 | − | Pan image 1/5 of window width or | |
| 215 | + | Scroll image 1/5 of window width or | |
| 233 | 216 | .I count | |
| 234 | 217 | pixel left. | |
| 235 | 218 | .TP | |
| 236 | 219 | .BR j ", " Down | |
| 237 | − | Pan image 1/5 of window height or | |
| 220 | + | Scroll image 1/5 of window height or | |
| 238 | 221 | .I count | |
| 239 | 222 | pixel down. | |
| 240 | 223 | .TP | |
| 241 | 224 | .BR k ", " Up | |
| 242 | − | Pan image 1/5 of window height or | |
| 225 | + | Scroll image 1/5 of window height or | |
| 243 | 226 | .I count | |
| 244 | 227 | pixel up. | |
| 245 | 228 | .TP | |
| 246 | 229 | .BR l ", " Right | |
| 247 | − | Pan image 1/5 of window width or | |
| 230 | + | Scroll image 1/5 of window width or | |
| 248 | 231 | .I count | |
| 249 | 232 | pixel right. | |
| 250 | 233 | .TP | |
| 251 | 234 | .B H | |
| 252 | − | Pan to left image edge. | |
| 235 | + | Scroll to left image edge. | |
| 253 | 236 | .TP | |
| 254 | 237 | .B J | |
| 255 | − | Pan to bottom image edge. | |
| 238 | + | Scroll to bottom image edge. | |
| 256 | 239 | .TP | |
| 257 | 240 | .B K | |
| 258 | − | Pan to top image edge. | |
| 241 | + | Scroll to top image edge. | |
| 259 | 242 | .TP | |
| 260 | 243 | .B L | |
| 261 | − | Pan to right image edge. | |
| 244 | + | Scroll to right image edge. | |
| 245 | + | .SS Zooming | |
| 262 | 246 | .TP | |
| 263 | − | .BR Ctrl-h ", " Ctrl-Left | |
| 264 | − | Pan image one window width left. | |
| 247 | + | .BR + | |
| 248 | + | Zoom in. | |
| 265 | 249 | .TP | |
| 266 | − | .BR Ctrl-j ", " Ctrl-Down | |
| 267 | − | Pan image one window height down. | |
| 250 | + | .B \- | |
| 251 | + | Zoom out. | |
| 268 | 252 | .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 %. | |
| 271 | 256 | .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. | |
| 274 | 268 | .SS Rotation | |
| 275 | 269 | .TP | |
| 276 | 270 | .B < | |
| @@ -281,7 +275,7 @@ Rotate image clockwise by 90 degrees. | |||
| 281 | 275 | .TP | |
| 282 | 276 | .B ? | |
| 283 | 277 | Rotate image by 180 degrees. | |
| 284 | − | .SS Flip | |
| 278 | + | .SS Flipping | |
| 285 | 279 | .TP | |
| 286 | 280 | .B | | |
| 287 | 281 | Flip image horizontally. | |
| @@ -319,29 +313,29 @@ Go to next image. | |||
| 319 | 313 | .TP | |
| 320 | 314 | .B Button3 | |
| 321 | 315 | 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 | |
| 330 | 317 | .TP | |
| 331 | 318 | .B Button2 | |
| 332 | 319 | Drag the image with the mouse while keeping this button pressed down. | |
| 333 | 320 | .TP | |
| 334 | 321 | .B ScrollUp | |
| 335 | − | Pan image up. | |
| 322 | + | Scroll image up. | |
| 336 | 323 | .TP | |
| 337 | 324 | .B ScrollDown | |
| 338 | − | Pan image down. | |
| 325 | + | Scroll image down. | |
| 339 | 326 | .TP | |
| 340 | 327 | .B Shift+ScrollUp | |
| 341 | − | Pan image left. | |
| 328 | + | Scroll image left. | |
| 342 | 329 | .TP | |
| 343 | 330 | .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. | |
| 345 | 339 | .SH STATUS BAR | |
| 346 | 340 | The information displayed on the left side of the status bar can be replaced | |
| 347 | 341 | with the output of a user-provided script, which is called by sxiv whenever an | |