From a36648e1721367e3e423be7a567aeeafc25e3f54 Mon Sep 17 00:00:00 2001 From: Paul LeoNerd Evans Date: Mon, 26 Aug 2013 01:14:35 +0100 Subject: [PATCH] Added TERMKEY_FORMAT_LOWERMOD --- man/termkey_strfkey.3 | 3 +++ man/termkey_strpkey.3 | 3 +++ t/11strfkey.c | 12 +++++++++++- t/12strpkey.c | 12 ++++++------ termkey.c | 10 ++++++++-- termkey.h.in | 1 + 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/man/termkey_strfkey.3 b/man/termkey_strfkey.3 index 60c5f3d..99780b6 100644 --- a/man/termkey_strfkey.3 +++ b/man/termkey_strfkey.3 @@ -30,6 +30,9 @@ If the key event is a special key instead of unmodified Unicode, wrap it in "\f( .B TERMKEY_FORMAT_SPACEMOD Use spaces instead of hyphens to separate the modifier name(s) from the base key name. .TP +.B TERMKEY_FORMAT_LOWERMOD +Use lowercase for the modifier name +.TP .B TERMKEY_FORMAT_MOUSE_POS If the event is a mouse event, include the position rendered as "\f(CW@ (col,line)\fP". .PP diff --git a/man/termkey_strpkey.3 b/man/termkey_strpkey.3 index 6c7d0b0..89efb1c 100644 --- a/man/termkey_strpkey.3 +++ b/man/termkey_strpkey.3 @@ -26,6 +26,9 @@ Use the name "\f(CWMeta\fP" or the letter "\f(CWM\fP" instead of "\f(CWAlt\fP" o .TP .B TERMKEY_FORMAT_SPACEMOD Expect spaces instead of hyphens to separate the modifer name(s) from the base key name. +.TP +.B TERMKEY_FORMAT_LOWERMOD +Expect lowercase for the modifier name .PP Before returning, this function canonicalises the \fIkey\fP structure according to the rules given for \fBtermkey_canonicalise\fP(3). .PP diff --git a/t/11strfkey.c b/t/11strfkey.c index 20d822f..3125553 100644 --- a/t/11strfkey.c +++ b/t/11strfkey.c @@ -8,7 +8,7 @@ int main(int argc, char *argv[]) char buffer[16]; size_t len; - plan_tests(32); + plan_tests(36); tk = termkey_new_abstract("vt100", 0); @@ -43,6 +43,16 @@ int main(int argc, char *argv[]) is_int(len, 6, "length for unicode/b/CTRL longmod|spacemod"); is_str(buffer, "Ctrl b", "buffer for unicode/b/CTRL longmod|spacemod"); + len = termkey_strfkey(tk, buffer, sizeof buffer, &key, + TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_LOWERMOD); + is_int(len, 6, "length for unicode/b/CTRL longmod|lowermod"); + is_str(buffer, "ctrl-b", "buffer for unicode/b/CTRL longmod|lowermod"); + + len = termkey_strfkey(tk, buffer, sizeof buffer, &key, + TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_SPACEMOD|TERMKEY_FORMAT_LOWERMOD); + is_int(len, 6, "length for unicode/b/CTRL longmod|spacemod|lowermode"); + is_str(buffer, "ctrl b", "buffer for unicode/b/CTRL longmod|spacemod|lowermode"); + len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_CARETCTRL); is_int(len, 2, "length for unicode/b/CTRL caretctrl"); is_str(buffer, "^B", "buffer for unicode/b/CTRL caretctrl"); diff --git a/t/12strpkey.c b/t/12strpkey.c index 9f20883..099fe9a 100644 --- a/t/12strpkey.c +++ b/t/12strpkey.c @@ -86,12 +86,12 @@ int main(int argc, char *argv[]) is_str(endp, "", "consumed entire input for unicode/c/ALT altismeta+longmod"); CLEAR_KEY; - endp = termkey_strpkey(tk, "Meta c", &key, TERMKEY_FORMAT_ALTISMETA|TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_SPACEMOD); - is_int(key.type, TERMKEY_TYPE_UNICODE, "key.type for unicode/c/ALT altismeta+long/lowermod"); - is_int(key.code.codepoint, 'c', "key.code.codepoint for unicode/c/ALT altismeta+long/lowermod"); - is_int(key.modifiers, TERMKEY_KEYMOD_ALT, "key.modifiers for unicode/c/ALT altismeta+long/lowermod"); - is_str(key.utf8, "c", "key.utf8 for unicode/c/ALT altismeta+long/lowermod"); - is_str(endp, "", "consumed entire input for unicode/c/ALT altismeta+longmod"); + endp = termkey_strpkey(tk, "meta c", &key, TERMKEY_FORMAT_ALTISMETA|TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_SPACEMOD|TERMKEY_FORMAT_LOWERMOD); + is_int(key.type, TERMKEY_TYPE_UNICODE, "key.type for unicode/c/ALT altismeta+long/space+lowermod"); + is_int(key.code.codepoint, 'c', "key.code.codepoint for unicode/c/ALT altismeta+long/space+lowermod"); + is_int(key.modifiers, TERMKEY_KEYMOD_ALT, "key.modifiers for unicode/c/ALT altismeta+long/space+lowermod"); + is_str(key.utf8, "c", "key.utf8 for unicode/c/ALT altismeta+long/space_lowermod"); + is_str(endp, "", "consumed entire input for unicode/c/ALT altismeta+long/space+lowermod"); CLEAR_KEY; endp = termkey_strpkey(tk, "Up", &key, 0); diff --git a/termkey.c b/termkey.c index a45dc56..c8388df 100644 --- a/termkey.c +++ b/termkey.c @@ -1178,6 +1178,10 @@ modnames[] = { { "Shift", "Alt", "Ctrl" }, // LONGMOD { "S", "M", "C" }, // ALTISMETA { "Shift", "Meta", "Ctrl" }, // ALTISMETA+LONGMOD + { "s", "a", "c" }, // LOWERMOD + { "shift", "alt", "ctrl" }, // LOWERMOD+LONGMOD + { "s", "m", "c" }, // LOWERMOD+ALTISMETA + { "shift", "meta", "ctrl" }, // LOWERMOD+ALTISMETA+LONGMOD }; size_t termkey_strfkey(TermKey *tk, char *buffer, size_t len, TermKeyKey *key, TermKeyFormat format) @@ -1186,7 +1190,8 @@ size_t termkey_strfkey(TermKey *tk, char *buffer, size_t len, TermKeyKey *key, T size_t l = 0; struct modnames *mods = &modnames[!!(format & TERMKEY_FORMAT_LONGMOD) + - !!(format & TERMKEY_FORMAT_ALTISMETA) * 2]; + !!(format & TERMKEY_FORMAT_ALTISMETA) * 2 + + !!(format & TERMKEY_FORMAT_LOWERMOD) * 4]; int wrapbracket = (format & TERMKEY_FORMAT_WRAPBRACKET) && (key->type != TERMKEY_TYPE_UNICODE || key->modifiers != 0); @@ -1302,7 +1307,8 @@ size_t termkey_strfkey(TermKey *tk, char *buffer, size_t len, TermKeyKey *key, T const char *termkey_strpkey(TermKey *tk, const char *str, TermKeyKey *key, TermKeyFormat format) { struct modnames *mods = &modnames[!!(format & TERMKEY_FORMAT_LONGMOD) + - !!(format & TERMKEY_FORMAT_ALTISMETA) * 2]; + !!(format & TERMKEY_FORMAT_ALTISMETA) * 2 + + !!(format & TERMKEY_FORMAT_LOWERMOD) * 4]; key->modifiers = 0; diff --git a/termkey.h.in b/termkey.h.in index b893cbc..04e0418 100644 --- a/termkey.h.in +++ b/termkey.h.in @@ -216,6 +216,7 @@ typedef enum { TERMKEY_FORMAT_ALTISMETA = 1 << 2, /* Meta- or M- instead of Alt- or A- */ TERMKEY_FORMAT_WRAPBRACKET = 1 << 3, /* Wrap special keys in brackets like */ TERMKEY_FORMAT_SPACEMOD = 1 << 4, /* M Foo instead of M-Foo */ + TERMKEY_FORMAT_LOWERMOD = 1 << 5, /* meta or m instead of Meta or M */ TERMKEY_FORMAT_MOUSE_POS = 1 << 8 /* Include mouse position if relevant; @ col,line */ } TermKeyFormat;