diff --git a/src/kmscon_conf.c b/src/kmscon_conf.c index 4eca1a4..e49c8f8 100644 --- a/src/kmscon_conf.c +++ b/src/kmscon_conf.c @@ -103,18 +103,22 @@ static void print_help() "\t --xkb-repeat-rate [50]\n" "\t Delay between two key-repeats in ms\n" "\n" - "\t --grab-scroll-up [Up]\n" - "\t Shortcut to scroll up\n" - "\t --grab-scroll-down [Down]\n" - "\t Shortcut to scroll down\n" - "\t --grab-page-up [Prior]\n" - "\t Shortcut to scroll page up\n" - "\t --grab-page-down [Next]\n" - "\t Shortcut to scroll page down\n" - "\t --grab-session-next [Right]\n" - "\t Switch to next session\n" - "\t --grab-session-prev [Left]\n" - "\t Switch to previous session\n" + "\t --grab-scroll-up [Up]\n" + "\t Shortcut to scroll up\n" + "\t --grab-scroll-down [Down]\n" + "\t Shortcut to scroll down\n" + "\t --grab-page-up [Prior]\n" + "\t Shortcut to scroll page up\n" + "\t --grab-page-down [Next]\n" + "\t Shortcut to scroll page down\n" + "\t --grab-session-next [Right]\n" + "\t Switch to next session\n" + "\t --grab-session-prev [Left]\n" + "\t Switch to previous session\n" + "\t --grab-session-close [W]\n" + "\t Close current session\n" + "\t --grab-terminal-new [Return]\n" + "\t Create new terminal session\n" "\n" "Font Options:\n" "\t --font-engine [pango]\n" @@ -255,6 +259,12 @@ static struct conf_grab def_grab_session_next = static struct conf_grab def_grab_session_prev = CONF_SINGLE_GRAB(SHL_CONTROL_MASK | SHL_ALT_MASK, XKB_KEY_Left); +static struct conf_grab def_grab_session_close = + CONF_SINGLE_GRAB(SHL_CONTROL_MASK | SHL_ALT_MASK, XKB_KEY_w); + +static struct conf_grab def_grab_terminal_new = + CONF_SINGLE_GRAB(SHL_CONTROL_MASK | SHL_ALT_MASK, XKB_KEY_Return); + struct conf_option options[] = { CONF_OPTION_BOOL('h', "help", aftercheck_help, &kmscon_conf.help, false), CONF_OPTION_BOOL('v', "verbose", NULL, &kmscon_conf.verbose, false), @@ -277,6 +287,8 @@ struct conf_option options[] = { CONF_OPTION_GRAB(0, "grab-page-down", NULL, &kmscon_conf.grab_page_down, &def_grab_page_down), CONF_OPTION_GRAB(0, "grab-session-next", NULL, &kmscon_conf.grab_session_next, &def_grab_session_next), CONF_OPTION_GRAB(0, "grab-session-prev", NULL, &kmscon_conf.grab_session_prev, &def_grab_session_prev), + CONF_OPTION_GRAB(0, "grab-session-close", NULL, &kmscon_conf.grab_session_close, &def_grab_session_close), + CONF_OPTION_GRAB(0, "grab-terminal-new", NULL, &kmscon_conf.grab_terminal_new, &def_grab_terminal_new), CONF_OPTION_STRING(0, "xkb-layout", NULL, &kmscon_conf.xkb_layout, "us"), CONF_OPTION_STRING(0, "xkb-variant", NULL, &kmscon_conf.xkb_variant, ""), CONF_OPTION_STRING(0, "xkb-options", NULL, &kmscon_conf.xkb_options, ""), diff --git a/src/kmscon_conf.h b/src/kmscon_conf.h index 43bccaa..6abb1da 100644 --- a/src/kmscon_conf.h +++ b/src/kmscon_conf.h @@ -85,6 +85,10 @@ struct kmscon_conf_t { struct conf_grab *grab_session_next; /* session-prev grab */ struct conf_grab *grab_session_prev; + /* session-close grab */ + struct conf_grab *grab_session_close; + /* terminal-new grab */ + struct conf_grab *grab_terminal_new; /* seats */ char **seats; diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c index 1d217b3..b2a6162 100644 --- a/src/kmscon_seat.c +++ b/src/kmscon_seat.c @@ -303,6 +303,8 @@ static void seat_input_event(struct uterm_input *input, void *data) { struct kmscon_seat *seat = data; + struct kmscon_session *s; + int ret; if (ev->handled) return; @@ -319,6 +321,26 @@ static void seat_input_event(struct uterm_input *input, seat_activate_prev(seat); return; } + if (conf_grab_matches(kmscon_conf.grab_session_close, + ev->mods, ev->num_syms, ev->keysyms)) { + ev->handled = true; + kmscon_session_unregister(seat->cur_sess); + return; + } + if (conf_grab_matches(kmscon_conf.grab_terminal_new, + ev->mods, ev->num_syms, ev->keysyms)) { + ev->handled = true; + ret = kmscon_terminal_register(&s, seat); + if (ret == -EOPNOTSUPP) { + log_notice("terminal support not compiled in"); + } else if (ret) { + log_error("cannot register terminal session: %d", ret); + } else { + kmscon_session_enable(s); + kmscon_session_activate(s); + } + return; + } } int kmscon_seat_new(struct kmscon_seat **out,