keyboard.c: fix update/draw logic in kbd_unpress_key

thanks @0x4261756D @earboxer for pointing out this issue
This commit is contained in:
John Sullivan 2022-01-09 21:02:46 -08:00
parent bddf05e0fc
commit aa65896fbf

View File

@ -166,26 +166,34 @@ kbd_get_key(struct kbd *kb, uint32_t x, uint32_t y) {
void void
kbd_unpress_key(struct kbd *kb, uint32_t time) { kbd_unpress_key(struct kbd *kb, uint32_t time) {
bool unlatch_shift = false;
if (kb->last_press) { if (kb->last_press) {
kbd_draw_key(kb, kb->last_press, Unpress); unlatch_shift = (kb->mods & Shift) == Shift;
if (kb->last_press->type == Copy) {
if (unlatch_shift) {
kb->mods ^= Shift;
zwp_virtual_keyboard_v1_modifiers(kb->vkbd, kb->mods, 0, 0, 0);
}
if (kb->last_press->type == Copy) {
zwp_virtual_keyboard_v1_key(kb->vkbd, time, 127, // COMP key zwp_virtual_keyboard_v1_key(kb->vkbd, time, 127, // COMP key
WL_KEYBOARD_KEY_STATE_RELEASED); WL_KEYBOARD_KEY_STATE_RELEASED);
} else { } else {
zwp_virtual_keyboard_v1_key(kb->vkbd, time, kb->last_press->code, zwp_virtual_keyboard_v1_key(kb->vkbd, time, kb->last_press->code,
WL_KEYBOARD_KEY_STATE_RELEASED); WL_KEYBOARD_KEY_STATE_RELEASED);
} }
kb->last_press = NULL;
if (kb->compose >= 2) { if (kb->compose >= 2) {
kb->compose = 0; kb->compose = 0;
kbd_switch_layout(kb, kb->prevlayout); kbd_switch_layout(kb, kb->prevlayout);
if ((kb->mods & Shift) == Shift) } else if (unlatch_shift) {
kb->mods ^= Shift;
} else if ((kb->mods & Shift) == Shift) {
kb->mods ^= Shift;
kbd_draw_layout(kb); kbd_draw_layout(kb);
} } else {
kbd_draw_key(kb, kb->last_press, Unpress);
}
kb->last_press = NULL;
} }
} }