More robust key handling
This commit is contained in:
		
							
								
								
									
										37
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								main.c
									
									
									
									
									
								
							@@ -20,6 +20,7 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#include <X11/Xutil.h>
 | 
			
		||||
#include <X11/keysym.h>
 | 
			
		||||
 | 
			
		||||
#include "sxiv.h"
 | 
			
		||||
@@ -112,44 +113,60 @@ void cleanup() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void on_keypress(XEvent *ev) {
 | 
			
		||||
	char key;
 | 
			
		||||
	int len;
 | 
			
		||||
	KeySym keysym;
 | 
			
		||||
 | 
			
		||||
	if (!ev)
 | 
			
		||||
		return;
 | 
			
		||||
	
 | 
			
		||||
	keysym = XLookupKeysym(&ev->xkey, 0);
 | 
			
		||||
	len = XLookupString(&ev->xkey, &key, 1, &keysym, NULL);
 | 
			
		||||
 | 
			
		||||
	switch (keysym) {
 | 
			
		||||
		case XK_Escape:
 | 
			
		||||
			cleanup();
 | 
			
		||||
			exit(1);
 | 
			
		||||
		case XK_q:
 | 
			
		||||
			exit(2);
 | 
			
		||||
		case XK_space:
 | 
			
		||||
			key = 'n';
 | 
			
		||||
			len = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_BackSpace:
 | 
			
		||||
			key = 'p';
 | 
			
		||||
			len = 1;
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!len)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	printf("%c\n", key);
 | 
			
		||||
 | 
			
		||||
	switch (key) {
 | 
			
		||||
		case 'q':
 | 
			
		||||
			cleanup();
 | 
			
		||||
			exit(0);
 | 
			
		||||
		case XK_n:
 | 
			
		||||
		case XK_space:
 | 
			
		||||
		case 'n':
 | 
			
		||||
			if (fileidx + 1 < filecnt) {
 | 
			
		||||
				img_load(&img, filenames[++fileidx]);
 | 
			
		||||
				img_display(&img, &win);
 | 
			
		||||
				update_title();
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_p:
 | 
			
		||||
		case XK_BackSpace:
 | 
			
		||||
		case 'p':
 | 
			
		||||
			if (fileidx > 0) {
 | 
			
		||||
				img_load(&img, filenames[--fileidx]);
 | 
			
		||||
				img_display(&img, &win);
 | 
			
		||||
				update_title();
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_plus:
 | 
			
		||||
		case XK_equal:
 | 
			
		||||
		case '+':
 | 
			
		||||
		case '=':
 | 
			
		||||
			if (img_zoom_in(&img)) {
 | 
			
		||||
				img_render(&img, &win);
 | 
			
		||||
				update_title();
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case XK_minus:
 | 
			
		||||
		case '-':
 | 
			
		||||
			if (img_zoom_out(&img)) {
 | 
			
		||||
				img_render(&img, &win);
 | 
			
		||||
				update_title();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user