summaryrefslogtreecommitdiff
path: root/src/input.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c125
1 files changed, 40 insertions, 85 deletions
diff --git a/src/input.c b/src/input.c
index 960f488..9fee179 100644
--- a/src/input.c
+++ b/src/input.c
@@ -9,13 +9,6 @@ struct seqbuf {
bool overflow;
};
-static inline void sb_init(struct seqbuf *sb, char *buf, size_t buf_sz)
-{
- sb->p = buf;
- sb->left = buf_sz;
- sb->overflow = false;
-}
-
static inline void sb_ch(struct seqbuf *sb, char c)
{
if (!sb->left) { sb->overflow = true; return; }
@@ -57,9 +50,23 @@ static inline void sb_u32(struct seqbuf *sb, uint32_t val)
sb_bytes(sb, p, (size_t)(end - p));
}
-static inline size_t sb_len(const struct seqbuf *sb, const char *buf)
+static inline void sb_utf8(struct seqbuf *sb, uint32_t cp)
{
- return (size_t)(sb->p - buf);
+ char tmp[8];
+ size_t n = (size_t)utf8_encode(cp, tmp);
+ sb_bytes(sb, tmp, n);
+}
+
+static struct term_input_result sb_result(const struct seqbuf *sb, const char *buf)
+{
+ if (sb->overflow)
+ return (struct term_input_result){ .status = TERM_INPUT_BUFFER_FULL };
+
+ size_t len = (size_t)(sb->p - buf);
+ return (struct term_input_result){
+ .status = len ? TERM_INPUT_BYTES : TERM_INPUT_CONSUMED,
+ .len = len,
+ };
}
struct kitty_desc {
@@ -295,12 +302,6 @@ static inline bool key_is_modifier(enum term_key k)
mod_desc[k].group == MOD_KEY_ISO5);
}
-static inline bool key_is_lock(enum term_key k)
-{
- return k == TERM_KEY_CAPS_LOCK || k == TERM_KEY_SCROLL_LOCK ||
- k == TERM_KEY_NUM_LOCK;
-}
-
static unsigned effective_mods(const struct term_keyboard_state *s,
const struct term_key_event *ev)
{
@@ -317,27 +318,6 @@ static unsigned effective_mods(const struct term_keyboard_state *s,
return mods;
}
-static unsigned lock_mod_bit(enum term_key key)
-{
- if (key == TERM_KEY_CAPS_LOCK) return TERM_MOD_CAPS;
- if (key == TERM_KEY_NUM_LOCK) return TERM_MOD_NUM;
- return 0;
-}
-
-static unsigned toggle_locks(enum term_key key, enum term_key_action action,
- unsigned mods)
-{
- unsigned bit = lock_mod_bit(key);
- if (bit && action == TERM_KEY_PRESS) mods ^= bit;
- return mods;
-}
-
-/* Convert logical input modifiers to terminal protocol bits. */
-static inline unsigned protocol_modifiers(unsigned mods)
-{
- return mods & 0xff;
-}
-
static void format_kitty(struct seqbuf *sb, uint32_t code, char final,
unsigned flags, bool functional, uint32_t shifted,
uint32_t base, unsigned mods, unsigned event,
@@ -392,11 +372,16 @@ static bool encode_kitty(const struct term_keyboard_state *s,
char final = functional ? d->final : 'u';
bool all = (flags & TERM_KEYBOARD_ALL_KEYS) != 0;
- if ((key_is_modifier(ev->key) || key_is_lock(ev->key)) && !all)
+ bool lock = ev->key == TERM_KEY_CAPS_LOCK || ev->key == TERM_KEY_SCROLL_LOCK ||
+ ev->key == TERM_KEY_NUM_LOCK;
+ if ((key_is_modifier(ev->key) || lock) && !all)
return true;
unsigned mods = effective_mods(s, ev);
- mods = toggle_locks(ev->key, ev->action, mods);
+ if (ev->action == TERM_KEY_PRESS) {
+ if (ev->key == TERM_KEY_CAPS_LOCK) mods ^= TERM_MOD_CAPS;
+ if (ev->key == TERM_KEY_NUM_LOCK) mods ^= TERM_MOD_NUM;
+ }
bool plain_control = ev->key == TERM_KEY_RETURN || ev->key == TERM_KEY_TAB ||
ev->key == TERM_KEY_BACKSPACE;
@@ -411,7 +396,7 @@ static bool encode_kitty(const struct term_keyboard_state *s,
bool has_text = text >= 32 && !(text >= 127 && text < 160) &&
!(mods & command_mods);
if (!all && has_text) return ev->action == TERM_KEY_RELEASE;
- if (!all && plain_control && !(protocol_modifiers(mods) & 63))
+ if (!all && plain_control && !(mods & 63))
return ev->action == TERM_KEY_RELEASE;
if (!(flags & (TERM_KEYBOARD_DISAMBIGUATE | TERM_KEYBOARD_EVENT_TYPES | TERM_KEYBOARD_ALL_KEYS)))
return ev->action == TERM_KEY_RELEASE;
@@ -430,7 +415,7 @@ static bool encode_kitty(const struct term_keyboard_state *s,
bool report_text = all && (flags & TERM_KEYBOARD_ASSOCIATED_TEXT) && has_text &&
ev->action != TERM_KEY_RELEASE;
- format_kitty(sb, code, final, flags, functional, shifted, base, protocol_modifiers(mods),
+ format_kitty(sb, code, final, flags, functional, shifted, base, mods & 0xff,
event, report_text, text);
return true;
}
@@ -463,12 +448,12 @@ static bool encode_legacy(const struct term_key_event *ev,
if (ch == '-') { sb_ch(sb, 0x1f); return true; }
}
- unsigned csi = protocol_modifiers(ev->mods) & 63;
+ unsigned csi = ev->mods & 63;
unsigned p = csi + 1;
bool shift = (ev->mods & TERM_MOD_SHIFT) != 0;
enum term_key k = ev->key;
- if ((unsigned)k < TERM_KEY_COUNT && legacy_desc[k].equiv != TERM_KEY_NONE)
+ if (legacy_desc[k].equiv != TERM_KEY_NONE)
k = legacy_desc[k].equiv;
if ((unsigned)k < TERM_KEY_COUNT) {
@@ -511,9 +496,7 @@ static bool encode_legacy(const struct term_key_event *ev,
}
if (ev->text && !ev->text_deferred) {
- char tmp[8];
- size_t n = (size_t)utf8_encode(ev->text, tmp);
- sb_bytes(sb, tmp, n);
+ sb_utf8(sb, ev->text);
return true;
}
return false;
@@ -544,7 +527,7 @@ static inline bool legacy_is_escape(const struct term_key_event *ev,
if ((ev->mods & TERM_MOD_CTRL) && control_base_char(ev) == '[')
return true;
enum term_key k = ev->key;
- if ((unsigned)k < TERM_KEY_COUNT && legacy_desc[k].equiv != TERM_KEY_NONE)
+ if (legacy_desc[k].equiv != TERM_KEY_NONE)
k = legacy_desc[k].equiv;
if ((unsigned)k < TERM_KEY_COUNT && legacy_desc[k].final)
return true;
@@ -569,8 +552,7 @@ struct term_input_result term_input_encode_key(const struct term_keyboard_state
(unsigned)ev->key >= TERM_KEY_COUNT)
return out;
- struct seqbuf sb;
- sb_init(&sb, buf, buf_sz);
+ struct seqbuf sb = { .p = buf, .left = buf_sz };
bool handled = encode_kitty(s, ev, m, &sb);
if (!handled) {
@@ -586,14 +568,7 @@ struct term_input_result term_input_encode_key(const struct term_keyboard_state
if (!handled)
return out;
- if (sb.overflow) {
- out.status = TERM_INPUT_BUFFER_FULL;
- out.len = 0;
- } else {
- out.len = sb_len(&sb, buf);
- out.status = out.len ? TERM_INPUT_BYTES : TERM_INPUT_CONSUMED;
- }
- return out;
+ return sb_result(&sb, buf);
}
struct term_input_result term_input_encode_mouse(const struct term_mouse_event *ev,
@@ -641,8 +616,7 @@ struct term_input_result term_input_encode_mouse(const struct term_mouse_event *
uint32_t report_x = (uint32_t)report.x + 1;
uint32_t report_y = (uint32_t)report.y + 1;
- struct seqbuf sb;
- sb_init(&sb, buf, buf_sz);
+ struct seqbuf sb = { .p = buf, .left = buf_sz };
if (m->mouse_encoding == TERM_MOUSE_ENC_SGR ||
m->mouse_encoding == TERM_MOUSE_ENC_SGR_PIXELS) {
@@ -663,14 +637,9 @@ struct term_input_result term_input_encode_mouse(const struct term_mouse_event *
sb_ch(&sb, 'M');
} else if (m->mouse_encoding == TERM_MOUSE_ENC_UTF8) {
sb_bytes(&sb, "\033[M", 3);
- char tmp[8];
- size_t n;
- n = (size_t)utf8_encode((unsigned)legacy_code + 32, tmp);
- sb_bytes(&sb, tmp, n);
- n = (size_t)utf8_encode((unsigned)cell.x + 33, tmp);
- sb_bytes(&sb, tmp, n);
- n = (size_t)utf8_encode((unsigned)cell.y + 33, tmp);
- sb_bytes(&sb, tmp, n);
+ sb_utf8(&sb, (unsigned)legacy_code + 32);
+ sb_utf8(&sb, (unsigned)cell.x + 33);
+ sb_utf8(&sb, (unsigned)cell.y + 33);
} else {
if (legacy_code > 223 || cell.x > 222 || cell.y > 222)
return out;
@@ -683,14 +652,7 @@ struct term_input_result term_input_encode_mouse(const struct term_mouse_event *
sb_bytes(&sb, tmp, 6);
}
- if (sb.overflow) {
- out.status = TERM_INPUT_BUFFER_FULL;
- out.len = 0;
- return out;
- }
- out.len = sb_len(&sb, buf);
- out.status = TERM_INPUT_BYTES;
- return out;
+ return sb_result(&sb, buf);
}
/* Bidi controls can make pasted text look different from what runs. */
@@ -710,10 +672,9 @@ struct term_input_result term_input_encode_paste(const struct term_modes *m,
struct term_input_result out = {0};
if (!m || !buf || (!text && len)) return out;
- struct seqbuf sb;
- sb_init(&sb, buf, capacity);
+ struct seqbuf sb = { .p = buf, .left = capacity };
if (m->bracketed_paste) sb_bytes(&sb, "\033[200~", 6);
- size_t body = sb_len(&sb, buf);
+ char *body = sb.p;
for (size_t i = 0; i < len;) {
if (sb.overflow) break;
size_t run = term_scan_printable_span(text + i, len - i, 0x7f);
@@ -743,13 +704,7 @@ struct term_input_result term_input_encode_paste(const struct term_modes *m,
}
out.status = TERM_INPUT_CONSUMED;
- if (!sb.overflow && sb_len(&sb, buf) == body) return out;
+ if (!sb.overflow && sb.p == body) return out;
if (m->bracketed_paste) sb_bytes(&sb, "\033[201~", 6);
- if (sb.overflow) {
- out.status = TERM_INPUT_BUFFER_FULL;
- return out;
- }
- out.len = sb_len(&sb, buf);
- out.status = TERM_INPUT_BYTES;
- return out;
+ return sb_result(&sb, buf);
}