|
|
|
@ -136,79 +136,60 @@ void cleanup() {
|
|
|
|
|
|
|
|
|
|
void on_keypress(XEvent *ev) {
|
|
|
|
|
char key;
|
|
|
|
|
KeySym keysym;
|
|
|
|
|
KeySym ksym;
|
|
|
|
|
int changed;
|
|
|
|
|
|
|
|
|
|
if (!ev)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
XLookupString(&ev->xkey, &key, 1, &keysym, NULL);
|
|
|
|
|
XLookupString(&ev->xkey, &key, 1, &ksym, NULL);
|
|
|
|
|
changed = 0;
|
|
|
|
|
|
|
|
|
|
switch (keysym) {
|
|
|
|
|
switch (ksym) {
|
|
|
|
|
case XK_Escape:
|
|
|
|
|
cleanup();
|
|
|
|
|
exit(2);
|
|
|
|
|
case XK_space:
|
|
|
|
|
key = 'n';
|
|
|
|
|
break;
|
|
|
|
|
case XK_BackSpace:
|
|
|
|
|
key = 'p';
|
|
|
|
|
break;
|
|
|
|
|
case XK_Left:
|
|
|
|
|
key = 'h';
|
|
|
|
|
break;
|
|
|
|
|
case XK_Down:
|
|
|
|
|
key = 'j';
|
|
|
|
|
break;
|
|
|
|
|
case XK_Up:
|
|
|
|
|
key = 'k';
|
|
|
|
|
break;
|
|
|
|
|
case XK_Right:
|
|
|
|
|
key = 'l';
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (key) {
|
|
|
|
|
case 'q':
|
|
|
|
|
case XK_q:
|
|
|
|
|
cleanup();
|
|
|
|
|
exit(0);
|
|
|
|
|
|
|
|
|
|
/* navigate image list */
|
|
|
|
|
case 'n':
|
|
|
|
|
case XK_n:
|
|
|
|
|
case XK_space:
|
|
|
|
|
if (fileidx + 1 < filecnt) {
|
|
|
|
|
img_load(&img, filenames[++fileidx]);
|
|
|
|
|
changed = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'p':
|
|
|
|
|
case XK_p:
|
|
|
|
|
case XK_BackSpace:
|
|
|
|
|
if (fileidx > 0) {
|
|
|
|
|
img_load(&img, filenames[--fileidx]);
|
|
|
|
|
changed = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case '[':
|
|
|
|
|
case XK_bracketleft:
|
|
|
|
|
if (fileidx != 0) {
|
|
|
|
|
fileidx = MAX(0, fileidx - 10);
|
|
|
|
|
img_load(&img, filenames[fileidx]);
|
|
|
|
|
changed = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case ']':
|
|
|
|
|
case XK_bracketright:
|
|
|
|
|
if (fileidx != filecnt - 1) {
|
|
|
|
|
fileidx = MIN(fileidx + 10, filecnt - 1);
|
|
|
|
|
img_load(&img, filenames[fileidx]);
|
|
|
|
|
changed = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'g':
|
|
|
|
|
case XK_g:
|
|
|
|
|
if (fileidx != 0) {
|
|
|
|
|
fileidx = 0;
|
|
|
|
|
img_load(&img, filenames[fileidx]);
|
|
|
|
|
changed = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'G':
|
|
|
|
|
case XK_G:
|
|
|
|
|
if (fileidx != filecnt - 1) {
|
|
|
|
|
fileidx = filecnt - 1;
|
|
|
|
|
img_load(&img, filenames[fileidx]);
|
|
|
|
@ -217,43 +198,47 @@ void on_keypress(XEvent *ev) {
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* zooming */
|
|
|
|
|
case '+':
|
|
|
|
|
case '=':
|
|
|
|
|
case XK_plus:
|
|
|
|
|
case XK_equal:
|
|
|
|
|
changed = img_zoom_in(&img);
|
|
|
|
|
break;
|
|
|
|
|
case '-':
|
|
|
|
|
case XK_minus:
|
|
|
|
|
changed = img_zoom_out(&img);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* panning */
|
|
|
|
|
case 'h':
|
|
|
|
|
case XK_h:
|
|
|
|
|
case XK_Left:
|
|
|
|
|
changed = img_pan(&img, &win, PAN_LEFT);
|
|
|
|
|
break;
|
|
|
|
|
case 'j':
|
|
|
|
|
case XK_j:
|
|
|
|
|
case XK_Down:
|
|
|
|
|
changed = img_pan(&img, &win, PAN_DOWN);
|
|
|
|
|
break;
|
|
|
|
|
case 'k':
|
|
|
|
|
case XK_k:
|
|
|
|
|
case XK_Up:
|
|
|
|
|
changed = img_pan(&img, &win, PAN_UP);
|
|
|
|
|
break;
|
|
|
|
|
case 'l':
|
|
|
|
|
case XK_l:
|
|
|
|
|
case XK_Right:
|
|
|
|
|
changed = img_pan(&img, &win, PAN_RIGHT);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* rotation */
|
|
|
|
|
case '<':
|
|
|
|
|
case XK_less:
|
|
|
|
|
changed = img_rotate_left(&img, &win);
|
|
|
|
|
break;
|
|
|
|
|
case '>':
|
|
|
|
|
case XK_greater:
|
|
|
|
|
changed = img_rotate_right(&img, &win);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* control window */
|
|
|
|
|
case 'f':
|
|
|
|
|
case XK_f:
|
|
|
|
|
win_toggle_fullscreen(&win);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
/* miscellaneous */
|
|
|
|
|
case 'a':
|
|
|
|
|
case XK_a:
|
|
|
|
|
changed = img_toggle_antialias(&img);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|