aboutsummaryrefslogtreecommitdiffstats
path: root/src/keys.c
diff options
context:
space:
mode:
authorLars Henriksen <LarsHenriksen@get2net.dk>2018-03-26 18:44:08 +0200
committerLukas Fleischer <lfleischer@calcurse.org>2018-06-03 11:26:12 +0200
commit7078556f9d055cb46339d436add2a03cc8abbc71 (patch)
tree49cc66196b08fffa061987fbba6490ebda4c2a1f /src/keys.c
parent431e4a00e7792d3421c7122c32ca5df81505caf3 (diff)
downloadcalcurse-7078556f9d055cb46339d436add2a03cc8abbc71.tar.gz
calcurse-7078556f9d055cb46339d436add2a03cc8abbc71.zip
Key bindings for UTF-8 encoded characters
Internally characters (keys) have two representations: integers and key names. Key names are characters strings, usually the name of the character; e.g., the character A has the representations 65 and "A", and the tab character the representations 9 and "TAB". The function keys_int2str() turns the integer representation of a key/character into the key name. For display purposes the key names are usually confined to have display width at most three. Some curses pseudo-keys have longer key names; e.g., the back-tab character is "KEY_BTAB". A long key name makes a character difficult to recognize in the status bar menu. The key name of a multibyte, UTF-8 encoded character is the conventional Unicode name of the code point; e.g., the character ü has key name "U+00FC" because ü is the code point 0xFC. Most of these look alike in the status bar menu. The patch makes the key name of a multibyte character look like that of a singlebyte character: the character itself, i.e. the key name of the character ü is "ü". The main tool is implementation of a utf8_encode() routine. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'src/keys.c')
-rw-r--r--src/keys.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/src/keys.c b/src/keys.c
index e609cb5..36bd64c 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -395,9 +395,6 @@ int keys_str2int(const char *key)
else if (strcmp(key, "KEY_END") == 0)
return KEY_END;
- /* UTF-8 multibyte keys. */
- if (starts_with(key, "U+"))
- return strtol(&key[strlen("U+")], NULL, 16) + KEY_MAX;
/* Lookup in the keynames table. */
for (int i = 1; i < 128; i++)
@@ -407,8 +404,8 @@ int keys_str2int(const char *key)
if (strcmp(key, keynames[i]) == 0)
return i;
-
- return -1;
+ /* UTF-8 multibyte keys. */
+ return utf8_decode(key) + KEY_MAX;
}
char *keys_int2str(int key)
@@ -421,7 +418,7 @@ char *keys_int2str(int key)
else
return mem_strdup(keynames[key]);
} else {
- asprintf(&res, "U+%04X", key - KEY_MAX);
+ asprintf(&res, "%s", utf8_encode(key - KEY_MAX));
return res;
}
}
@@ -476,7 +473,7 @@ char *keys_action_allkeys(enum key action)
static char *keys_format_label(char *key, int keylen)
{
static char fmtkey[BUFSIZ];
- const int len = strlen(key);
+ const int len = utf8_strwidth(key);
const char dot = '.';
int i;
@@ -520,7 +517,7 @@ keys_display_bindings_bar(WINDOW * win, int *bindings, int count,
const int label_pos_x = key_pos_x + KEYS_KEYLEN + 1;
const int label_pos_y = key_pos_y;
- char key[KEYS_KEYLEN + 1], *fmtkey;
+ char key[UTF8_MAXLEN + 1], *fmtkey;
int binding_key;
@@ -532,9 +529,8 @@ keys_display_bindings_bar(WINDOW * win, int *bindings, int count,
const char *label;
if (binding_key < NBKEYS) {
- strncpy(key, keys_action_firstkey(binding_key),
- KEYS_KEYLEN);
- key[KEYS_KEYLEN] = '\0';
+ strncpy(key, keys_action_firstkey(binding_key), UTF8_MAXLEN);
+ key[UTF8_MAXLEN] = '\0';
label = gettext(keydef[binding_key].sb_label);
} else {
switch (binding_key) {