mirror of
https://github.com/dankamongmen/notcurses
synced 2025-03-09 09:09:03 -04:00
Fix misunderstanding in Kitty kbd proto docs
This commit is contained in:
parent
d8cb625b9a
commit
3512f9e812
@ -37,7 +37,9 @@ typedef struct ncinput {
|
||||
ncintype_e evtype;
|
||||
unsigned modifiers;// bitmask over NCKEY_MOD_*
|
||||
int ypx, xpx; // pixel offsets within cell, -1 for undefined
|
||||
char utf8_eff[5]; // Effective utf8 representation, taking modifier keys into account
|
||||
uint32_t eff_text[5]; // Effective utf32 representation, taking
|
||||
// modifier keys into account. This can be multiple
|
||||
// codepoints. Array is zero-terminated.
|
||||
} ncinput;
|
||||
|
||||
|
||||
@ -243,11 +245,12 @@ issues are resolved. You can determine whether the protocol is in use
|
||||
by examining the output of **notcurses-info(1)**. If the **kbd** property
|
||||
is indicated, you're using the Kitty protocol.
|
||||
|
||||
Note that utf_eff will always return the effective text value of the key,
|
||||
Note that eff_text will always return the effective text value of the key,
|
||||
taking into account any meta keys pressed. (So shift-a will always return
|
||||
'A' in this field, regardless of if the Kitty keyboard disambiguation
|
||||
protocol is used.) This field generally only can be trusted on
|
||||
**NCTYPE_PRESS** and **NCTYPE_REPEAT** events, however.
|
||||
**NCTYPE_PRESS** and **NCTYPE_REPEAT** events, however. Also note that
|
||||
this is a (zero-terminated) array as it can return multiple codepoints.
|
||||
|
||||
Mouse events in the left margins will never be delivered to the
|
||||
application (as is intended), but mouse events in the bottom and right margins
|
||||
|
@ -1214,7 +1214,9 @@ typedef struct ncinput {
|
||||
ncintype_e evtype;
|
||||
unsigned modifiers;// bitmask over NCKEY_MOD_*
|
||||
int ypx, xpx; // pixel offsets within cell, -1 for undefined
|
||||
char utf8_eff[5]; // Effective utf8 representation, taking modifier keys into account
|
||||
uint32_t eff_text[5]; // Effective utf32 representation, taking
|
||||
// modifier keys into account. This can be multiple
|
||||
// codepoints. Array is zero-terminated.
|
||||
} ncinput;
|
||||
|
||||
static inline bool
|
||||
|
27
src/lib/in.c
27
src/lib/in.c
@ -797,7 +797,7 @@ kitty_functional(uint32_t val){
|
||||
}
|
||||
|
||||
static void
|
||||
kitty_kbd_txt(inputctx* ictx, int val, int mods, unsigned *txt, int evtype){
|
||||
kitty_kbd_txt(inputctx* ictx, int val, int mods, uint32_t *txt, int evtype){
|
||||
assert(evtype >= 0);
|
||||
assert(mods >= 0);
|
||||
assert(val > 0);
|
||||
@ -830,23 +830,10 @@ kitty_kbd_txt(inputctx* ictx, int val, int mods, unsigned *txt, int evtype){
|
||||
tni.evtype = NCTYPE_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
// Validate the txt array. It needs to be a non-zero-length set of up to 4 bytes.
|
||||
int txt_valid = 0;
|
||||
if(txt){
|
||||
for (int i = 0 ; i<4 ; i++){
|
||||
if(txt[i]==0) break;
|
||||
if(txt[i]>255){
|
||||
txt_valid = 0;
|
||||
break;
|
||||
}
|
||||
txt_valid = 1;
|
||||
}
|
||||
}
|
||||
//note: if we don't populate .utf8_eff here, it will be set to what becomes .utf8 in
|
||||
//internal_get().
|
||||
if(txt_valid){
|
||||
//note: if we don't set eff_text here, it will be set to .id later.
|
||||
if(txt && txt[0]!=0){
|
||||
for(int i=0 ; i<4 ; i++){
|
||||
tni.utf8_eff[i] = (char)txt[i];
|
||||
tni.eff_text[i] = txt[i];
|
||||
}
|
||||
}
|
||||
load_ncinput(ictx, &tni);
|
||||
@ -875,7 +862,7 @@ kitty_cb(inputctx* ictx){
|
||||
|
||||
static int
|
||||
kitty_cb_atxtn(inputctx* ictx, int n, int with_event){
|
||||
unsigned txt[5]={0};
|
||||
uint32_t txt[5]={0};
|
||||
unsigned val = amata_next_numeric(&ictx->amata, "\x1b[", ';');
|
||||
unsigned ev = 0;
|
||||
unsigned mods = 0;
|
||||
@ -2709,9 +2696,7 @@ internal_get(inputctx* ictx, const struct timespec* ts, ncinput* ni){
|
||||
if(notcurses_ucs32_to_utf8(&ni->id, 1, (unsigned char*)ni->utf8, sizeof(ni->utf8)) < 0){
|
||||
ni->utf8[0] = 0;
|
||||
}
|
||||
if(ni->utf8_eff[0] == 0){
|
||||
memcpy(ni->utf8_eff, ni->utf8, sizeof(ni->utf8_eff));
|
||||
}
|
||||
if (ni->eff_text[0]==0) ni->eff_text[0]=ni->id;
|
||||
}
|
||||
if(++ictx->iread == ictx->isize){
|
||||
ictx->iread = 0;
|
||||
|
@ -401,7 +401,12 @@ bool ncreader_offer_input(ncreader* n, const ncinput* ni){
|
||||
return false;
|
||||
}
|
||||
|
||||
ncreader_write_egc(n, ni->utf8_eff);
|
||||
for (int c=0; ni->eff_text[c]!=0; c++){
|
||||
unsigned char egc[5]={0};
|
||||
if(notcurses_ucs32_to_utf8(&ni->eff_text[c], 1, egc, 4)>=0){
|
||||
ncreader_write_egc(n, (char*)egc);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user