On Tue, May 13, 2025 at 10:56:23AM +0000, NRK wrote: > On Mon, May 12, 2025 at 01:53:08AM +0900, yahei wrote: > > If XBufferOverflow occuers, the client should recall the function with > > the same event and a buffer of adequate size to obtain the string. > > Do you have any actual usecase where the current buffer size is a > problem? If yes, I think it's better to increase the buffer size to > something more reasonable if possible than to mess around with static > variables. > > - NRK >
Patch didn't attach correctly to my previous message. -- Storkman
>From 4268fe94eaa4d56ed2b4fc5bf0c3d846de52f296 Mon Sep 17 00:00:00 2001 From: Paul Storkman <stork...@storkman.nl> Date: Tue, 13 May 2025 16:54:35 +0200 Subject: [PATCH] Temporarily allocate a larger input buffer if needed --- x.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/x.c b/x.c index d73152b..e9f7287 100644 --- a/x.c +++ b/x.c @@ -1843,7 +1843,7 @@ kpress(XEvent *ev) { XKeyEvent *e = &ev->xkey; KeySym ksym = NoSymbol; - char buf[64], *customkey; + char buf[64], *customkey, *str = buf; int len; Rune c; Status status; @@ -1854,23 +1854,28 @@ kpress(XEvent *ev) if (xw.ime.xic) { len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); - if (status == XBufferOverflow) - return; + if (status == XBufferOverflow) { + str = xmalloc(len); + len = XmbLookupString(xw.ime.xic, e, str, len, &ksym, &status); + if (status == XBufferOverflow) + goto FINISH; + } } else { len = XLookupString(e, buf, sizeof buf, &ksym, NULL); } + /* 1. shortcuts */ for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { if (ksym == bp->keysym && match(bp->mod, e->state)) { bp->func(&(bp->arg)); - return; + goto FINISH; } } /* 2. custom keys from config.h */ if ((customkey = kmap(ksym, e->state))) { ttywrite(customkey, strlen(customkey), 1); - return; + goto FINISH; } /* 3. composed string from input method */ @@ -1878,17 +1883,20 @@ kpress(XEvent *ev) return; if (len == 1 && e->state & Mod1Mask) { if (IS_SET(MODE_8BIT)) { - if (*buf < 0177) { - c = *buf | 0x80; - len = utf8encode(c, buf); + if (*str < 0177) { + c = *str | 0x80; + len = utf8encode(c, str); } } else { - buf[1] = buf[0]; - buf[0] = '\033'; + str[1] = str[0]; + str[0] = '\033'; len = 2; } } - ttywrite(buf, len, 1); + ttywrite(str, len, 1); +FINISH: + if (str != buf) + free(str); } void -- 2.45.2