nsxiv2d5247a
More robust key handling
+27 −10
1 file changed
- M main.c +27 −10
| @@ -20,6 +20,7 @@ | |||
| 20 | 20 | #include <stdio.h> | |
| 21 | 21 | ||
| 22 | 22 | #include <X11/Xlib.h> | |
| 23 | + | #include <X11/Xutil.h> | |
| 23 | 24 | #include <X11/keysym.h> | |
| 24 | 25 | ||
| 25 | 26 | #include "sxiv.h" | |
| @@ -112,44 +113,60 @@ void cleanup() { | |||
| 112 | 113 | } | |
| 113 | 114 | ||
| 114 | 115 | void on_keypress(XEvent *ev) { | |
| 116 | + | char key; | |
| 117 | + | int len; | |
| 115 | 118 | KeySym keysym; | |
| 116 | 119 | ||
| 117 | 120 | if (!ev) | |
| 118 | 121 | return; | |
| 119 | 122 | ||
| 120 | − | keysym = XLookupKeysym(&ev->xkey, 0); | |
| 123 | + | len = XLookupString(&ev->xkey, &key, 1, &keysym, NULL); | |
| 121 | 124 | ||
| 122 | 125 | switch (keysym) { | |
| 123 | 126 | case XK_Escape: | |
| 124 | 127 | cleanup(); | |
| 125 | − | exit(1); | |
| 126 | − | case XK_q: | |
| 128 | + | exit(2); | |
| 129 | + | case XK_space: | |
| 130 | + | key = 'n'; | |
| 131 | + | len = 1; | |
| 132 | + | break; | |
| 133 | + | case XK_BackSpace: | |
| 134 | + | key = 'p'; | |
| 135 | + | len = 1; | |
| 136 | + | break; | |
| 137 | + | } | |
| 138 | + | ||
| 139 | + | if (!len) | |
| 140 | + | return; | |
| 141 | + | ||
| 142 | + | printf("%c\n", key); | |
| 143 | + | ||
| 144 | + | switch (key) { | |
| 145 | + | case 'q': | |
| 127 | 146 | cleanup(); | |
| 128 | 147 | exit(0); | |
| 129 | − | case XK_n: | |
| 130 | − | case XK_space: | |
| 148 | + | case 'n': | |
| 131 | 149 | if (fileidx + 1 < filecnt) { | |
| 132 | 150 | img_load(&img, filenames[++fileidx]); | |
| 133 | 151 | img_display(&img, &win); | |
| 134 | 152 | update_title(); | |
| 135 | 153 | } | |
| 136 | 154 | break; | |
| 137 | − | case XK_p: | |
| 138 | − | case XK_BackSpace: | |
| 155 | + | case 'p': | |
| 139 | 156 | if (fileidx > 0) { | |
| 140 | 157 | img_load(&img, filenames[--fileidx]); | |
| 141 | 158 | img_display(&img, &win); | |
| 142 | 159 | update_title(); | |
| 143 | 160 | } | |
| 144 | 161 | break; | |
| 145 | − | case XK_plus: | |
| 146 | − | case XK_equal: | |
| 162 | + | case '+': | |
| 163 | + | case '=': | |
| 147 | 164 | if (img_zoom_in(&img)) { | |
| 148 | 165 | img_render(&img, &win); | |
| 149 | 166 | update_title(); | |
| 150 | 167 | } | |
| 151 | 168 | break; | |
| 152 | − | case XK_minus: | |
| 169 | + | case '-': | |
| 153 | 170 | if (img_zoom_out(&img)) { | |
| 154 | 171 | img_render(&img, &win); | |
| 155 | 172 | update_title(); | |