void feh_event_handle_stdin() { char stdin_buf[2]; static char is_esc = 0; KeySym keysym = NoSymbol; if (read(STDIN_FILENO, &stdin_buf, 1) == -1) { control_via_stdin = 0; if (isatty(STDIN_FILENO) && getpgrp() == (tcgetpgrp(STDIN_FILENO))) { weprintf("reading a command from stdin failed - disabling control via stdin"); restore_stdin(); } return; } stdin_buf[1] = '\0'; // escape? if (stdin_buf[0] == 0x1b) { is_esc = 1; return; } if ((is_esc == 1) && (stdin_buf[0] == '[')) { is_esc = 2; return; } if (stdin_buf[0] == ' ') keysym = XK_space; else if (stdin_buf[0] == '\n') keysym = XK_Return; else if ((stdin_buf[0] == '\b') || (stdin_buf[0] == 127)) keysym = XK_BackSpace; else if (is_esc == 2) { if (stdin_buf[0] == 'A') keysym = XK_Up; else if (stdin_buf[0] == 'B') keysym = XK_Down; else if (stdin_buf[0] == 'C') keysym = XK_Right; else if (stdin_buf[0] == 'D') keysym = XK_Left; is_esc = 0; } else keysym = XStringToKeysym(stdin_buf); if (window_num) feh_event_handle_generic(windows[0], is_esc * Mod1Mask, keysym, 0); is_esc = 0; }
void feh_event_handle_keypress(XEvent * ev) { int state; char kbuf[20]; KeySym keysym; XKeyEvent *kev; winwidget winwid = NULL; feh_menu_item *selected_item; feh_menu *selected_menu; winwid = winwidget_get_from_window(ev->xkey.window); /* nuke dupe events, unless we're typing text */ if (winwid && !winwid->caption_entry) { while (XCheckTypedWindowEvent(disp, ev->xkey.window, KeyPress, ev)); } kev = (XKeyEvent *) ev; XLookupString(&ev->xkey, (char *) kbuf, sizeof(kbuf), &keysym, NULL); state = kev->state & (ControlMask | ShiftMask | Mod1Mask | Mod4Mask); if (ignore_space(keysym)) state &= ~ShiftMask; /* 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(EVENT_menu_close, state, keysym, 0)) feh_menu_hide(menu_root, True); else if (feh_is_kp(EVENT_menu_parent, state, keysym, 0)) feh_menu_select_parent(selected_menu); else if (feh_is_kp(EVENT_menu_down, state, keysym, 0)) feh_menu_select_next(selected_menu, selected_item); else if (feh_is_kp(EVENT_menu_up, state, keysym, 0)) feh_menu_select_prev(selected_menu, selected_item); else if (feh_is_kp(EVENT_menu_child, state, keysym, 0)) feh_menu_select_submenu(selected_menu); else if (feh_is_kp(EVENT_menu_select, state, keysym, 0)) feh_menu_item_activate(selected_menu, selected_item); return; } if (winwid == NULL) return; feh_event_handle_generic(winwid, state, keysym, 0); }
void feh_event_handle_keypress(XEvent * ev) { int state; char kbuf[20]; KeySym keysym; XKeyEvent *kev; winwidget winwid = NULL; feh_menu_item *selected_item; feh_menu *selected_menu; winwid = winwidget_get_from_window(ev->xkey.window); /* nuke dupe events, unless we're typing text */ if (winwid && !winwid->caption_entry) { while (XCheckTypedWindowEvent(disp, ev->xkey.window, KeyPress, ev)); } kev = (XKeyEvent *) ev; XLookupString(&ev->xkey, (char *) kbuf, sizeof(kbuf), &keysym, NULL); state = kev->state & (ControlMask | ShiftMask | Mod1Mask | Mod4Mask); if (isascii(keysym)) state &= ~ShiftMask; /* 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, state, keysym, 0)) feh_menu_hide(menu_root, True); else if (feh_is_kp(&keys.menu_parent, state, keysym, 0)) feh_menu_select_parent(selected_menu); else if (feh_is_kp(&keys.menu_down, state, keysym, 0)) feh_menu_select_next(selected_menu, selected_item); else if (feh_is_kp(&keys.menu_up, state, keysym, 0)) feh_menu_select_prev(selected_menu, selected_item); else if (feh_is_kp(&keys.menu_child, state, keysym, 0)) feh_menu_select_submenu(selected_menu); else if (feh_is_kp(&keys.menu_select, state, keysym, 0)) feh_menu_item_activate(selected_menu, selected_item); return; } if (winwid == NULL) return; if (winwid->caption_entry) { switch (keysym) { case XK_Return: if (state & ControlMask) { /* insert actual newline */ ESTRAPPEND(FEH_FILE(winwid->file->data)->caption, "\n"); winwidget_render_image_cached(winwid); } else { /* finish caption entry, write to captions file */ FILE *fp; char *caption_filename; caption_filename = build_caption_filename(FEH_FILE(winwid->file->data), 1); winwid->caption_entry = 0; winwidget_render_image_cached(winwid); XFreePixmap(disp, winwid->bg_pmap_cache); winwid->bg_pmap_cache = 0; fp = fopen(caption_filename, "w"); if (!fp) { eprintf("couldn't write to captions file %s:", caption_filename); return; } fprintf(fp, "%s", FEH_FILE(winwid->file->data)->caption); free(caption_filename); fclose(fp); } break; case XK_Escape: /* cancel, revert caption */ winwid->caption_entry = 0; free(FEH_FILE(winwid->file->data)->caption); FEH_FILE(winwid->file->data)->caption = NULL; winwidget_render_image_cached(winwid); XFreePixmap(disp, winwid->bg_pmap_cache); winwid->bg_pmap_cache = 0; break; case XK_BackSpace: /* backspace */ ESTRTRUNC(FEH_FILE(winwid->file->data)->caption, 1); winwidget_render_image_cached(winwid); break; default: if (isascii(keysym)) { /* append to caption */ ESTRAPPEND_CHAR(FEH_FILE(winwid->file->data)->caption, keysym); winwidget_render_image_cached(winwid); } break; } return; } feh_event_handle_generic(winwid, state, keysym, 0); }