seat: add keyboard grabs to close sessions and start new terminals

You can now use ctrl+alt+w to close the current session and
ctrl+alt+Return to start a new terminal (if it is built-in).

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-10-18 11:50:57 +02:00
parent c22fac0129
commit 9946a9e458
3 changed files with 50 additions and 12 deletions

View File

@ -103,18 +103,22 @@ static void print_help()
"\t --xkb-repeat-rate <msecs> [50]\n"
"\t Delay between two key-repeats in ms\n"
"\n"
"\t --grab-scroll-up <grab> [<Shift>Up]\n"
"\t Shortcut to scroll up\n"
"\t --grab-scroll-down <grab> [<Shift>Down]\n"
"\t Shortcut to scroll down\n"
"\t --grab-page-up <grab> [<Shift>Prior]\n"
"\t Shortcut to scroll page up\n"
"\t --grab-page-down <grab> [<Shift>Next]\n"
"\t Shortcut to scroll page down\n"
"\t --grab-session-next <grab> [<Ctrl><Alt>Right]\n"
"\t Switch to next session\n"
"\t --grab-session-prev <grab> [<Ctrl><Alt>Left]\n"
"\t Switch to previous session\n"
"\t --grab-scroll-up <grab> [<Shift>Up]\n"
"\t Shortcut to scroll up\n"
"\t --grab-scroll-down <grab> [<Shift>Down]\n"
"\t Shortcut to scroll down\n"
"\t --grab-page-up <grab> [<Shift>Prior]\n"
"\t Shortcut to scroll page up\n"
"\t --grab-page-down <grab> [<Shift>Next]\n"
"\t Shortcut to scroll page down\n"
"\t --grab-session-next <grab> [<Ctrl><Alt>Right]\n"
"\t Switch to next session\n"
"\t --grab-session-prev <grab> [<Ctrl><Alt>Left]\n"
"\t Switch to previous session\n"
"\t --grab-session-close <grab> [<Ctrl><Alt>W]\n"
"\t Close current session\n"
"\t --grab-terminal-new <grab> [<Ctrl><Alt>Return]\n"
"\t Create new terminal session\n"
"\n"
"Font Options:\n"
"\t --font-engine <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, ""),

View File

@ -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;

View File

@ -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,