mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2025-12-27 15:45:54 +00:00
inputs_channel: Fix wrong handling of key up/down on big endian
The client will send 0x000000## codes for regular keys, and 0x0000##e0 codes for extended keys. The current code which simply walks the uint32_t code in memory order relies on the memory order being little endian, which will clearly fail on big endian machines, this fixes this. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
a179434aa9
commit
cb27e9dad6
@ -309,6 +309,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
|
||||
InputsChannel *inputs_channel = (InputsChannel *)rcc->channel;
|
||||
InputsChannelClient *icc = (InputsChannelClient *)rcc;
|
||||
uint8_t *buf = (uint8_t *)message;
|
||||
uint32_t i;
|
||||
|
||||
spice_assert(g_inputs_channel == inputs_channel);
|
||||
switch (type) {
|
||||
@ -321,15 +322,16 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui
|
||||
}
|
||||
case SPICE_MSGC_INPUTS_KEY_UP: {
|
||||
SpiceMsgcKeyDown *key_down = (SpiceMsgcKeyDown *)buf;
|
||||
uint8_t *now = (uint8_t *)&key_down->code;
|
||||
uint8_t *end = now + sizeof(key_down->code);
|
||||
for (; now < end && *now; now++) {
|
||||
kbd_push_scan(keyboard, *now);
|
||||
for (i = 0; i < 4; i++) {
|
||||
uint8_t code = (key_down->code >> (i * 8)) & 0xff;
|
||||
if (code == 0) {
|
||||
break;
|
||||
}
|
||||
kbd_push_scan(keyboard, code);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPICE_MSGC_INPUTS_KEY_SCANCODE: {
|
||||
uint32_t i;
|
||||
uint8_t *code = (uint8_t *)buf;
|
||||
for (i = 0; i < size; i++) {
|
||||
kbd_push_scan(keyboard, code[i]);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user