From 001f96c4e3ae26a9b2807b549c782a094a36ff3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 28 Jul 2022 19:34:13 +0200 Subject: [PATCH] unicode-input: move input (key press) handling to unicode_mode_input() --- input.c | 59 +------------------------------------------- unicode-mode.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ unicode-mode.h | 4 +++ 3 files changed, 72 insertions(+), 58 deletions(-) diff --git a/input.c b/input.c index 8b47b983..847ff6af 100644 --- a/input.c +++ b/input.c @@ -1411,64 +1411,7 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, if (pressed) { if (seat->unicode_mode.active) { - if (sym == XKB_KEY_Return || - sym == XKB_KEY_space || - sym == XKB_KEY_KP_Enter || - sym == XKB_KEY_KP_Space) - { - char utf8[MB_CUR_MAX]; - size_t chars = c32rtomb( - utf8, seat->unicode_mode.character, &(mbstate_t){0}); - - LOG_DBG("Unicode input: 0x%06x -> %.*s", - seat->unicode_mode.character, (int)chars, utf8); - - if (chars != (size_t)-1) { - if (term->is_searching) - search_add_chars(term, utf8, chars); - else - term_to_slave(term, utf8, chars); - } - - unicode_mode_deactivate(seat); - } - - else if (sym == XKB_KEY_Escape || - (seat->kbd.ctrl && (sym == XKB_KEY_c || - sym == XKB_KEY_d || - sym == XKB_KEY_g))) - { - unicode_mode_deactivate(seat); - } - - else if (sym == XKB_KEY_BackSpace) { - if (seat->unicode_mode.count > 0) { - seat->unicode_mode.character >>= 4; - seat->unicode_mode.count--; - unicode_mode_updated(seat); - } - } - - else if (seat->unicode_mode.count < 6) { - int digit = -1; - - /* 0-9, a-f, A-F */ - if (sym >= XKB_KEY_0 && sym <= XKB_KEY_9) - digit = sym - XKB_KEY_0; - else if (sym >= XKB_KEY_a && sym <= XKB_KEY_f) - digit = 0xa + (sym - XKB_KEY_a); - else if (sym >= XKB_KEY_A && sym <= XKB_KEY_F) - digit = 0xa + (sym - XKB_KEY_A); - - if (digit >= 0) { - xassert(digit >= 0 && digit <= 0xf); - seat->unicode_mode.character <<= 4; - seat->unicode_mode.character |= digit; - seat->unicode_mode.count++; - unicode_mode_updated(seat); - } - } - + unicode_mode_input(seat, term, sym); return; } diff --git a/unicode-mode.c b/unicode-mode.c index 0da86add..6b4b6050 100644 --- a/unicode-mode.c +++ b/unicode-mode.c @@ -1,6 +1,10 @@ #include "unicode-mode.h" +#define LOG_MODULE "unicode-input" +#define LOG_ENABLE_DBG 0 +#include "log.h" #include "render.h" +#include "search.h" void unicode_mode_activate(struct seat *seat) @@ -36,3 +40,66 @@ unicode_mode_updated(struct seat *seat) else render_refresh(term); } + +void +unicode_mode_input(struct seat *seat, struct terminal *term, + xkb_keysym_t sym) +{ + if (sym == XKB_KEY_Return || + sym == XKB_KEY_space || + sym == XKB_KEY_KP_Enter || + sym == XKB_KEY_KP_Space) + { + char utf8[MB_CUR_MAX]; + size_t chars = c32rtomb( + utf8, seat->unicode_mode.character, &(mbstate_t){0}); + + LOG_DBG("Unicode input: 0x%06x -> %.*s", + seat->unicode_mode.character, (int)chars, utf8); + + if (chars != (size_t)-1) { + if (term->is_searching) + search_add_chars(term, utf8, chars); + else + term_to_slave(term, utf8, chars); + } + + unicode_mode_deactivate(seat); + } + + else if (sym == XKB_KEY_Escape || + (seat->kbd.ctrl && (sym == XKB_KEY_c || + sym == XKB_KEY_d || + sym == XKB_KEY_g))) + { + unicode_mode_deactivate(seat); + } + + else if (sym == XKB_KEY_BackSpace) { + if (seat->unicode_mode.count > 0) { + seat->unicode_mode.character >>= 4; + seat->unicode_mode.count--; + unicode_mode_updated(seat); + } + } + + else if (seat->unicode_mode.count < 6) { + int digit = -1; + + /* 0-9, a-f, A-F */ + if (sym >= XKB_KEY_0 && sym <= XKB_KEY_9) + digit = sym - XKB_KEY_0; + else if (sym >= XKB_KEY_a && sym <= XKB_KEY_f) + digit = 0xa + (sym - XKB_KEY_a); + else if (sym >= XKB_KEY_A && sym <= XKB_KEY_F) + digit = 0xa + (sym - XKB_KEY_A); + + if (digit >= 0) { + xassert(digit >= 0 && digit <= 0xf); + seat->unicode_mode.character <<= 4; + seat->unicode_mode.character |= digit; + seat->unicode_mode.count++; + unicode_mode_updated(seat); + } + } +} diff --git a/unicode-mode.h b/unicode-mode.h index eadbe06a..e7c75b9b 100644 --- a/unicode-mode.h +++ b/unicode-mode.h @@ -1,7 +1,11 @@ #pragma once +#include + #include "wayland.h" void unicode_mode_activate(struct seat *seat); void unicode_mode_deactivate(struct seat *seat); void unicode_mode_updated(struct seat *seat); +void unicode_mode_input(struct seat *seat, struct terminal *term, + xkb_keysym_t sym);