[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] input: allow the user to finish Unicode input with <Enter> or <S
From: |
Benno Schulenberg |
Subject: |
[PATCH] input: allow the user to finish Unicode input with <Enter> or <Space> |
Date: |
Wed, 7 Sep 2022 09:15:25 +0200 |
Instead of requiring always six digits, allow the user to indicate
with <Enter> or <Space> that the digits typed so far are the complete
Unicode code point (when prefixed with the missing number of zeroes).
This fulfills https://savannah.gnu.org/bugs/?63021.
Inspired-by: the <Ctrl+Shift+U> shortcut that some desktops have
---
src/winio.c | 24 ++++++++++--------------
1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/src/winio.c b/src/winio.c
index 9a80b8d2..76b37cee 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -1357,6 +1357,8 @@ long add_unicode_digit(int symbol, long factor, long
*unicode)
*unicode += (symbol - '0') * factor;
else if ('a' <= tolower(symbol) && tolower(symbol) <= 'f')
*unicode += (tolower(symbol) - 'a' + 10) * factor;
+ else if (symbol == '\r' || symbol == ' ')
+ return (*unicode / factor) >> 4;
else
return INVALID_DIGIT;
@@ -1374,18 +1376,13 @@ long assemble_unicode(int symbol)
switch (++digits) {
case 1:
- unicode = (symbol - '0') * 0x100000;
+ unicode = 0;
+ retval = add_unicode_digit(symbol, 0x100000, &unicode);
break;
case 2:
- /* The second digit must be zero if the first was one,
but
- * may be any hexadecimal value if the first was zero.
*/
- if (symbol == '0' || unicode == 0)
- retval = add_unicode_digit(symbol, 0x10000,
&unicode);
- else
- retval = INVALID_DIGIT;
+ retval = add_unicode_digit(symbol, 0x10000, &unicode);
break;
case 3:
- /* Later digits may be any hexadecimal value. */
retval = add_unicode_digit(symbol, 0x1000, &unicode);
break;
case 4:
@@ -1397,9 +1394,9 @@ long assemble_unicode(int symbol)
case 6:
retval = add_unicode_digit(symbol, 0x1, &unicode);
/* If also the sixth digit was a valid hexadecimal
value, then
- * the Unicode sequence is complete, so return it. */
+ * the Unicode sequence is complete, so return it when
valid. */
if (retval == PROCEED)
- retval = unicode;
+ retval = (unicode < 0x110000) ? unicode :
INVALID_DIGIT;
break;
}
@@ -1407,9 +1404,8 @@ long assemble_unicode(int symbol)
if (retval == PROCEED && currmenu == MMAIN) {
char partial[7] = "......";
- /* Construct the partial result, right-padding it with dots. */
- snprintf(partial, digits + 1, "%06lX", unicode);
- partial[digits] = '.';
+ /* Construct the partial result, left-padded with dots. */
+ snprintf(partial + 6 - digits, digits + 1, "%06lX", unicode);
/* TRANSLATORS: This is shown while a six-digit hexadecimal
* Unicode character code (%s) is being typed in. */
@@ -1451,7 +1447,7 @@ int *parse_verbatim_kbinput(WINDOW *frame, size_t *count)
#ifdef ENABLE_UTF8
/* If the first code is a valid Unicode starter digit (0 or 1),
* commence Unicode input. Otherwise, put the code back. */
- if (using_utf8() && (keycode == '0' || keycode == '1')) {
+ if (using_utf8() && isxdigit(keycode)) {
long unicode = assemble_unicode(keycode);
char multibyte[MB_CUR_MAX];
--
2.37.2
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] input: allow the user to finish Unicode input with <Enter> or <Space>,
Benno Schulenberg <=