From 39073b4c7f7085f566231843089fba8bd4a26740 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Tue, 25 Jan 2011 21:13:55 +0100 Subject: key bindings: Don't get confused by keystates we don't support (see GH-30) --- src/keyevents.c | 116 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 57 insertions(+), 59 deletions(-) (limited to 'src') diff --git a/src/keyevents.c b/src/keyevents.c index 723cf1f..c2372bd 100644 --- a/src/keyevents.c +++ b/src/keyevents.c @@ -295,15 +295,10 @@ void init_keyevents(void) { static short feh_is_kp(fehkey *key, int sym, int state) { int i; - /* - * Regarding the | 0x1: state 1 = shift, but we don't care about that. - * Shift produces different keysyms than non-shift anyways. - */ - for (i = 0; i < 3; i++) { if ( - (key->keysyms[i] == sym) && - ((key->keystates[i] | 0x1) == (state | 0x1))) + (key->keysyms[i] == sym) && + (key->keystates[i] == state)) return 1; else if (key->keysyms[i] == 0) return 0; @@ -336,6 +331,7 @@ void feh_event_invoke_action(winwidget winwid, unsigned char action) void feh_event_handle_keypress(XEvent * ev) { int len; + int state; char kbuf[20]; KeySym keysym; XKeyEvent *kev; @@ -353,21 +349,23 @@ void feh_event_handle_keypress(XEvent * ev) kev = (XKeyEvent *) ev; len = XLookupString(&ev->xkey, (char *) kbuf, sizeof(kbuf), &keysym, NULL); + state = kev->state & (ControlMask | Mod1Mask | Mod2Mask | Mod3Mask | + Mod4Mask | Mod5Mask); /* menus are showing, so this is a menu control keypress */ if (ev->xbutton.window == menu_cover) { selected_item = feh_menu_find_selected_r(menu_root, &selected_menu); - if (feh_is_kp(&keys.menu_close, keysym, kev->state)) + if (feh_is_kp(&keys.menu_close, keysym, state)) feh_menu_hide(menu_root, True); - else if (feh_is_kp(&keys.menu_parent, keysym, kev->state)) + else if (feh_is_kp(&keys.menu_parent, keysym, state)) feh_menu_select_parent(selected_menu); - else if (feh_is_kp(&keys.menu_down, keysym, kev->state)) + else if (feh_is_kp(&keys.menu_down, keysym, state)) feh_menu_select_next(selected_menu, selected_item); - else if (feh_is_kp(&keys.menu_up, keysym, kev->state)) + else if (feh_is_kp(&keys.menu_up, keysym, state)) feh_menu_select_prev(selected_menu, selected_item); - else if (feh_is_kp(&keys.menu_child, keysym, kev->state)) + else if (feh_is_kp(&keys.menu_child, keysym, state)) feh_menu_select_submenu(selected_menu); - else if (feh_is_kp(&keys.menu_select, keysym, kev->state)) + else if (feh_is_kp(&keys.menu_select, keysym, state)) feh_menu_item_activate(selected_menu, selected_item); return; } @@ -378,7 +376,7 @@ void feh_event_handle_keypress(XEvent * ev) if (winwid->caption_entry) { switch (keysym) { case XK_Return: - if (kev->state & ControlMask) { + if (state & ControlMask) { /* insert actual newline */ ESTRAPPEND(FEH_FILE(winwid->file->data)->caption, "\n"); winwidget_render_image_cached(winwid); @@ -426,90 +424,90 @@ void feh_event_handle_keypress(XEvent * ev) return; } - if (feh_is_kp(&keys.next_img, keysym, kev->state)) { + if (feh_is_kp(&keys.next_img, keysym, state)) { if (opt.slideshow) slideshow_change_image(winwid, SLIDE_NEXT); } - else if (feh_is_kp(&keys.prev_img, keysym, kev->state)) { + else if (feh_is_kp(&keys.prev_img, keysym, state)) { if (opt.slideshow) slideshow_change_image(winwid, SLIDE_PREV); } - else if (feh_is_kp(&keys.scroll_right, keysym, kev->state)) { + else if (feh_is_kp(&keys.scroll_right, keysym, state)) { winwid->im_x -= 20; winwidget_render_image(winwid, 0, 0); } - else if (feh_is_kp(&keys.scroll_left, keysym, kev->state)) { + else if (feh_is_kp(&keys.scroll_left, keysym, state)) { winwid->im_x += 20; winwidget_render_image(winwid, 0, 0); } - else if (feh_is_kp(&keys.scroll_down, keysym, kev->state)) { + else if (feh_is_kp(&keys.scroll_down, keysym, state)) { winwid->im_y -= 20; winwidget_render_image(winwid, 0, 0); } - else if (feh_is_kp(&keys.scroll_up, keysym, kev->state)) { + else if (feh_is_kp(&keys.scroll_up, keysym, state)) { winwid->im_y += 20; winwidget_render_image(winwid, 0, 0); } - else if (feh_is_kp(&keys.jump_back, keysym, kev->state)) { + else if (feh_is_kp(&keys.jump_back, keysym, state)) { if (opt.slideshow) slideshow_change_image(winwid, SLIDE_JUMP_BACK); } - else if (feh_is_kp(&keys.jump_fwd, keysym, kev->state)) { + else if (feh_is_kp(&keys.jump_fwd, keysym, state)) { if (opt.slideshow) slideshow_change_image(winwid, SLIDE_JUMP_FWD); } - else if (feh_is_kp(&keys.quit, keysym, kev->state)) { + else if (feh_is_kp(&keys.quit, keysym, state)) { winwidget_destroy_all(); } - else if (feh_is_kp(&keys.delete, keysym, kev->state)) { + else if (feh_is_kp(&keys.delete, keysym, state)) { if (winwid->type == WIN_TYPE_THUMBNAIL_VIEWER) feh_thumbnail_mark_removed(FEH_FILE(winwid->file->data), 1); feh_filelist_image_remove(winwid, 1); } - else if (feh_is_kp(&keys.remove, keysym, kev->state)) { + else if (feh_is_kp(&keys.remove, keysym, state)) { if (winwid->type == WIN_TYPE_THUMBNAIL_VIEWER) feh_thumbnail_mark_removed(FEH_FILE(winwid->file->data), 0); feh_filelist_image_remove(winwid, 0); } - else if (feh_is_kp(&keys.jump_first, keysym, kev->state)) { + else if (feh_is_kp(&keys.jump_first, keysym, state)) { if (opt.slideshow) slideshow_change_image(winwid, SLIDE_FIRST); } - else if (feh_is_kp(&keys.jump_last, keysym, kev->state)) { + else if (feh_is_kp(&keys.jump_last, keysym, state)) { if (opt.slideshow) slideshow_change_image(winwid, SLIDE_LAST); } - else if (feh_is_kp(&keys.action_0, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_0, keysym, state)) { feh_event_invoke_action(winwid, 0); } - else if (feh_is_kp(&keys.action_1, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_1, keysym, state)) { feh_event_invoke_action(winwid, 1); } - else if (feh_is_kp(&keys.action_2, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_2, keysym, state)) { feh_event_invoke_action(winwid, 2); } - else if (feh_is_kp(&keys.action_3, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_3, keysym, state)) { feh_event_invoke_action(winwid, 3); } - else if (feh_is_kp(&keys.action_4, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_4, keysym, state)) { feh_event_invoke_action(winwid, 4); } - else if (feh_is_kp(&keys.action_5, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_5, keysym, state)) { feh_event_invoke_action(winwid, 5); } - else if (feh_is_kp(&keys.action_6, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_6, keysym, state)) { feh_event_invoke_action(winwid, 6); } - else if (feh_is_kp(&keys.action_7, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_7, keysym, state)) { feh_event_invoke_action(winwid, 7); } - else if (feh_is_kp(&keys.action_8, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_8, keysym, state)) { feh_event_invoke_action(winwid, 8); } - else if (feh_is_kp(&keys.action_9, keysym, kev->state)) { + else if (feh_is_kp(&keys.action_9, keysym, state)) { feh_event_invoke_action(winwid, 9); } - else if (feh_is_kp(&keys.zoom_in, keysym, kev->state)) { + else if (feh_is_kp(&keys.zoom_in, keysym, state)) { winwid->old_zoom = winwid->zoom; winwid->zoom = winwid->zoom * 1.25; winwid->im_x = (winwid->w / 2) - (((winwid->w / 2) - winwid->im_x) / @@ -519,7 +517,7 @@ void feh_event_handle_keypress(XEvent * ev) winwidget_sanitise_offsets(winwid); winwidget_render_image(winwid, 0, 1); } - else if (feh_is_kp(&keys.zoom_out, keysym, kev->state)) { + else if (feh_is_kp(&keys.zoom_out, keysym, state)) { winwid->old_zoom = winwid->zoom; winwid->zoom = winwid->zoom * 0.80; winwid->im_x = (winwid->w / 2) - (((winwid->w / 2) - winwid->im_x) / @@ -529,72 +527,72 @@ void feh_event_handle_keypress(XEvent * ev) winwidget_sanitise_offsets(winwid); winwidget_render_image(winwid, 0, 1); } - else if (feh_is_kp(&keys.zoom_default, keysym, kev->state)) { + else if (feh_is_kp(&keys.zoom_default, keysym, state)) { winwid->zoom = 1; winwid->old_zoom = 1.001; /* hack for --scale-down */ winwidget_center_image(winwid); winwidget_render_image(winwid, 0, 0); } - else if (feh_is_kp(&keys.zoom_fit, keysym, kev->state)) { + else if (feh_is_kp(&keys.zoom_fit, keysym, state)) { feh_calc_needed_zoom(&winwid->zoom, winwid->im_w, winwid->im_h, winwid->w, winwid->h); winwidget_center_image(winwid); winwidget_render_image(winwid, 0, 1); } - else if (feh_is_kp(&keys.render, keysym, kev->state)) { + else if (feh_is_kp(&keys.render, keysym, state)) { winwidget_render_image(winwid, 0, 1); } - else if (feh_is_kp(&keys.toggle_actions, keysym, kev->state)) { + else if (feh_is_kp(&keys.toggle_actions, keysym, state)) { opt.draw_actions = !opt.draw_actions; winwidget_rerender_all(0, 1); } - else if (feh_is_kp(&keys.toggle_filenames, keysym, kev->state)) { + else if (feh_is_kp(&keys.toggle_filenames, keysym, state)) { opt.draw_filename = !opt.draw_filename; winwidget_rerender_all(0, 1); } - else if (feh_is_kp(&keys.toggle_pointer, keysym, kev->state)) { + else if (feh_is_kp(&keys.toggle_pointer, keysym, state)) { winwidget_set_pointer(winwid, opt.hide_pointer); opt.hide_pointer = !opt.hide_pointer; } - else if (feh_is_kp(&keys.jump_random, keysym, kev->state)) { + else if (feh_is_kp(&keys.jump_random, keysym, state)) { slideshow_change_image(winwid, SLIDE_RAND); } - else if (feh_is_kp(&keys.toggle_caption, keysym, kev->state)) { + else if (feh_is_kp(&keys.toggle_caption, keysym, state)) { if (opt.caption_path) winwid->caption_entry = 1; winwidget_render_image(winwid, 0, 1); } - else if (feh_is_kp(&keys.reload_image, keysym, kev->state)) { + else if (feh_is_kp(&keys.reload_image, keysym, state)) { feh_reload_image(winwid, 0, 0); } - else if (feh_is_kp(&keys.toggle_pause, keysym, kev->state)) { + else if (feh_is_kp(&keys.toggle_pause, keysym, state)) { slideshow_pause_toggle(winwid); } - else if (feh_is_kp(&keys.save_image, keysym, kev->state)) { + else if (feh_is_kp(&keys.save_image, keysym, state)) { slideshow_save_image(winwid); } - else if (feh_is_kp(&keys.save_filelist, keysym, kev->state)) { + else if (feh_is_kp(&keys.save_filelist, keysym, state)) { if ((winwid->type == WIN_TYPE_THUMBNAIL) || (winwid->type == WIN_TYPE_THUMBNAIL_VIEWER)) weprintf("Filelist saving is not supported in thumbnail mode"); else feh_save_filelist(); } - else if (feh_is_kp(&keys.size_to_image, keysym, kev->state)) { + else if (feh_is_kp(&keys.size_to_image, keysym, state)) { winwidget_size_to_image(winwid); } - else if (feh_is_kp(&keys.toggle_menu, keysym, kev->state)) { + else if (feh_is_kp(&keys.toggle_menu, keysym, state)) { winwidget_show_menu(winwid); } - else if (feh_is_kp(&keys.close, keysym, kev->state)) { + else if (feh_is_kp(&keys.close, keysym, state)) { winwidget_destroy(winwid); } - else if (feh_is_kp(&keys.orient_1, keysym, kev->state)) { + else if (feh_is_kp(&keys.orient_1, keysym, state)) { feh_edit_inplace_orient(winwid, 1); } - else if (feh_is_kp(&keys.orient_3, keysym, kev->state)) { + else if (feh_is_kp(&keys.orient_3, keysym, state)) { feh_edit_inplace_orient(winwid, 3); } - else if (feh_is_kp(&keys.toggle_fullscreen, keysym, kev->state)) { + else if (feh_is_kp(&keys.toggle_fullscreen, keysym, state)) { #ifdef HAVE_LIBXINERAMA if (opt.xinerama && xinerama_screens) { int i, rect[4]; @@ -638,13 +636,13 @@ void feh_event_handle_keypress(XEvent * ev) } #endif /* HAVE_LIBXINERAMA */ } - else if (feh_is_kp(&keys.reload_plus, keysym, kev->state)){ + else if (feh_is_kp(&keys.reload_plus, keysym, state)){ if (opt.reload < SLIDESHOW_RELOAD_MAX) opt.reload++; else if (opt.verbose) weprintf("Cannot set RELOAD higher than %d seconds.", opt.reload); } - else if (feh_is_kp(&keys.reload_minus, keysym, kev->state)) { + else if (feh_is_kp(&keys.reload_minus, keysym, state)) { if (opt.reload > 1) opt.reload--; else if (opt.verbose) -- cgit v1.2.3