{
struct kmscon_terminal *term = data;
- if (!term->opened || !term->awake)
+ if (!term->opened || !term->awake || ev->handled)
return;
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_up->mods) &&
ev->keysym == kmscon_conf.grab_scroll_up->keysym) {
tsm_screen_sb_up(term->console, 1);
schedule_redraw(term);
+ ev->handled = true;
return;
}
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_down->mods) &&
ev->keysym == kmscon_conf.grab_scroll_down->keysym) {
tsm_screen_sb_down(term->console, 1);
schedule_redraw(term);
+ ev->handled = true;
return;
}
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_up->mods) &&
ev->keysym == kmscon_conf.grab_page_up->keysym) {
tsm_screen_sb_page_up(term->console, 1);
schedule_redraw(term);
+ ev->handled = true;
return;
}
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_down->mods) &&
ev->keysym == kmscon_conf.grab_page_down->keysym) {
tsm_screen_sb_page_down(term->console, 1);
schedule_redraw(term);
+ ev->handled = true;
return;
}
ev->unicode)) {
tsm_screen_sb_reset(term->console);
schedule_redraw(term);
+ ev->handled = true;
}
}
{
struct kmscon_ui *ui = data;
- if (!ui->awake)
+ if (!ui->awake || ev->handled)
return;
}
#define UTERM_INPUT_INVALID 0xffffffff
struct uterm_input_event {
+ bool handled;
uint16_t keycode; /* linux keycode - KEY_* - linux/input.h */
uint32_t keysym; /* X keysym - XKB_KEY_* - X11/keysym.h */
unsigned int mods; /* active modifiers - uterm_modifier mask */
if (type != EV_KEY)
return;
+ memset(&ev, 0, sizeof(ev));
ret = kbd_dev_process(dev->kbd, value, code, &ev);
if (ret)
return;
struct vt_stat vts;
int ret;
+ if (ev->handled)
+ return;
+
ret = ioctl(vt->real_fd, VT_GETSTATE, &vts);
if (ret) {
log_warn("cannot find current VT (%d): %m", errno);
id = 0;
if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_ALT_MASK) &&
ev->keysym >= XKB_KEY_F1 && ev->keysym <= XKB_KEY_F12) {
+ ev->handled = true;
id = ev->keysym - XKB_KEY_F1 + 1;
if (id == vt->real_num)
return;
} else if (ev->keysym >= XKB_KEY_XF86Switch_VT_1 &&
ev->keysym <= XKB_KEY_XF86Switch_VT_12) {
+ ev->handled = true;
id = ev->keysym - XKB_KEY_XF86Switch_VT_1 + 1;
if (id == vt->real_num)
return;
static void fake_input(struct uterm_vt *vt, struct uterm_input_event *ev)
{
+ if (ev->handled)
+ return;
+
if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_LOGO_MASK) &&
ev->keysym == XKB_KEY_F12) {
+ ev->handled = true;
if (vt->active) {
log_debug("deactivating fake VT due to user input");
vt_call(vt, UTERM_VT_DEACTIVATE);