Use a prefix key to execute the key handler

The default prefix key is C-x, and can be changed in config.def.h. The
first key pressed after the prefix key will be passed the external key
handler, unless the key is Escape, which is used to cancel the prefix.
This commit is contained in:
András Mohari
2014-01-31 14:17:52 +01:00
parent d5b2d377a4
commit 54d7b7f20f
4 changed files with 25 additions and 5 deletions

14
main.c
View File

@ -504,6 +504,7 @@ void run_key_handler(const char *key, unsigned int mask)
void on_keypress(XKeyEvent *kev)
{
static bool seen_prefix_key = false;
int i;
unsigned int sh;
KeySym ksym, shksym;
@ -523,6 +524,17 @@ void on_keypress(XKeyEvent *kev)
if (IsModifierKey(ksym))
return;
if (seen_prefix_key) {
seen_prefix_key = false;
if (!(MODMASK(kev->state) == 0 && ksym == XK_Escape))
run_key_handler(XKeysymToString(ksym), kev->state & ~sh);
return;
} else if (MODMASK(kev->state) == PREFIX_KEYMASK && ksym == PREFIX_KEYSYM) {
seen_prefix_key = true;
prefix = 0;
return;
}
if ((ksym == XK_Escape && MODMASK(kev->state) == 0) ||
(key >= '0' && key <= '9'))
{
@ -545,8 +557,6 @@ void on_keypress(XKeyEvent *kev)
break;
}
}
if (i == ARRLEN(keys))
run_key_handler(XKeysymToString(ksym), kev->state & ~sh);
prefix = 0;
}