diff --git a/key-string.c b/key-string.c index 715324f1..63ab4c98 100644 --- a/key-string.c +++ b/key-string.c @@ -1,4 +1,4 @@ -/* $Id: key-string.c,v 1.33 2010-06-05 06:27:19 micahcowan Exp $ */ +/* $Id: key-string.c,v 1.34 2010-06-05 20:29:11 micahcowan Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -184,6 +184,15 @@ key_string_lookup_key(int key) *out = '\0'; + /* + * Special case: display C-@ as C-Space. Could do this below in + * the (key >= 0 && key <= 32), but this way we let it be found + * in key_string_table, for the unlikely chance that we might + * change its name. + */ + if ((key & KEYC_MASK_KEY) == 0) + key = ' ' | KEYC_CTRL | (key & KEYC_MASK_MOD); + /* Fill in the modifiers. */ if (key & KEYC_CTRL) strlcat(out, "C-", sizeof out); @@ -191,7 +200,7 @@ key_string_lookup_key(int key) strlcat(out, "M-", sizeof out); if (key & KEYC_SHIFT) strlcat(out, "S-", sizeof out); - key &= ~(KEYC_CTRL|KEYC_ESCAPE|KEYC_SHIFT); + key &= KEYC_MASK_KEY; /* Try the key against the string table. */ for (i = 0; i < nitems(key_string_table); i++) { diff --git a/tmux.h b/tmux.h index bf9c294c..effb690a 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.558 2010-05-22 21:56:04 micahcowan Exp $ */ +/* $Id: tmux.h,v 1.559 2010-06-05 20:29:11 micahcowan Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -110,6 +110,10 @@ extern char **environ; #define KEYC_SHIFT 0x8000 #define KEYC_PREFIX 0x10000 +/* Mask to obtain key w/o modifiers */ +#define KEYC_MASK_MOD (KEYC_ESCAPE|KEYC_CTRL|KEYC_SHIFT|KEYC_PREFIX) +#define KEYC_MASK_KEY (~KEYC_MASK_MOD) + /* Other key codes. */ enum key_code { /* Mouse key. */ diff --git a/window-copy.c b/window-copy.c index 917a4e97..fdc97949 100644 --- a/window-copy.c +++ b/window-copy.c @@ -1,4 +1,4 @@ -/* $Id: window-copy.c,v 1.118 2010-06-05 07:48:35 micahcowan Exp $ */ +/* $Id: window-copy.c,v 1.119 2010-06-05 20:29:11 micahcowan Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -367,7 +367,7 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) if (data->inputtype == WINDOW_COPY_JUMPFORWARD || data->inputtype == WINDOW_COPY_JUMPBACK) { /* Ignore keys with modifiers. */ - if ((key & 0xff00) == 0) { + if ((key & KEYC_MASK_MOD) == 0) { data->jumpchar = key; if (data->inputtype == WINDOW_COPY_JUMPFORWARD) { for (; np != 0; np--) @@ -627,7 +627,7 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key) *data->inputstr = '\0'; goto input_on; case MODEKEYCOPY_STARTNUMBERPREFIX: - key &= 0xff; + key &= KEYC_MASK_KEY; if (key >= '0' && key <= '9') { data->inputtype = WINDOW_COPY_NUMERICPREFIX; data->numprefix = 0; @@ -741,7 +741,7 @@ window_copy_key_numeric_prefix(struct window_pane *wp, int key) struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; - key &= 0xff; + key &= KEYC_MASK_KEY; if (key < '0' || key > '9') return 1;