Discard unknown SDL events
Mouse and keyboard events with unknown button/keycode/scancode cannot be handled properly. Discard them without forwarding them to the keyboard or mouse processors. This can happen for example if a more recent version of SDL introduces new enum values. PR #5270 <https://github.com/Genymobile/scrcpy/pull/5270>
This commit is contained in:
parent
de8455400c
commit
c8479fe8bf
@ -400,7 +400,7 @@ sc_input_manager_process_key(struct sc_input_manager *im,
|
|||||||
bool paused = im->screen->paused;
|
bool paused = im->screen->paused;
|
||||||
bool video = im->screen->video;
|
bool video = im->screen->video;
|
||||||
|
|
||||||
SDL_Keycode keycode = event->keysym.sym;
|
SDL_Keycode sdl_keycode = event->keysym.sym;
|
||||||
uint16_t mod = event->keysym.mod;
|
uint16_t mod = event->keysym.mod;
|
||||||
bool down = event->type == SDL_KEYDOWN;
|
bool down = event->type == SDL_KEYDOWN;
|
||||||
bool ctrl = event->keysym.mod & KMOD_CTRL;
|
bool ctrl = event->keysym.mod & KMOD_CTRL;
|
||||||
@ -412,21 +412,21 @@ sc_input_manager_process_key(struct sc_input_manager *im,
|
|||||||
// The second condition is necessary to ignore the release of the modifier
|
// The second condition is necessary to ignore the release of the modifier
|
||||||
// key (because in this case mod is 0).
|
// key (because in this case mod is 0).
|
||||||
bool is_shortcut = is_shortcut_mod(im, mod)
|
bool is_shortcut = is_shortcut_mod(im, mod)
|
||||||
|| is_shortcut_key(im, keycode);
|
|| is_shortcut_key(im, sdl_keycode);
|
||||||
|
|
||||||
if (down && !repeat) {
|
if (down && !repeat) {
|
||||||
if (keycode == im->last_keycode && mod == im->last_mod) {
|
if (sdl_keycode == im->last_keycode && mod == im->last_mod) {
|
||||||
++im->key_repeat;
|
++im->key_repeat;
|
||||||
} else {
|
} else {
|
||||||
im->key_repeat = 0;
|
im->key_repeat = 0;
|
||||||
im->last_keycode = keycode;
|
im->last_keycode = sdl_keycode;
|
||||||
im->last_mod = mod;
|
im->last_mod = mod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_shortcut) {
|
if (is_shortcut) {
|
||||||
enum sc_action action = down ? SC_ACTION_DOWN : SC_ACTION_UP;
|
enum sc_action action = down ? SC_ACTION_DOWN : SC_ACTION_UP;
|
||||||
switch (keycode) {
|
switch (sdl_keycode) {
|
||||||
case SDLK_h:
|
case SDLK_h:
|
||||||
if (im->kp && !shift && !repeat && !paused) {
|
if (im->kp && !shift && !repeat && !paused) {
|
||||||
action_home(im, action);
|
action_home(im, action);
|
||||||
@ -585,7 +585,7 @@ sc_input_manager_process_key(struct sc_input_manager *im,
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint64_t ack_to_wait = SC_SEQUENCE_INVALID;
|
uint64_t ack_to_wait = SC_SEQUENCE_INVALID;
|
||||||
bool is_ctrl_v = ctrl && !shift && keycode == SDLK_v && down && !repeat;
|
bool is_ctrl_v = ctrl && !shift && sdl_keycode == SDLK_v && down && !repeat;
|
||||||
if (im->clipboard_autosync && is_ctrl_v) {
|
if (im->clipboard_autosync && is_ctrl_v) {
|
||||||
if (im->legacy_paste) {
|
if (im->legacy_paste) {
|
||||||
// inject the text as input events
|
// inject the text as input events
|
||||||
@ -613,10 +613,20 @@ sc_input_manager_process_key(struct sc_input_manager *im,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum sc_keycode keycode = sc_keycode_from_sdl(sdl_keycode);
|
||||||
|
if (keycode == SC_KEYCODE_UNKNOWN) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum sc_scancode scancode = sc_scancode_from_sdl(event->keysym.scancode);
|
||||||
|
if (scancode == SC_SCANCODE_UNKNOWN) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
struct sc_key_event evt = {
|
struct sc_key_event evt = {
|
||||||
.action = sc_action_from_sdl_keyboard_type(event->type),
|
.action = sc_action_from_sdl_keyboard_type(event->type),
|
||||||
.keycode = sc_keycode_from_sdl(event->keysym.sym),
|
.keycode = keycode,
|
||||||
.scancode = sc_scancode_from_sdl(event->keysym.scancode),
|
.scancode = scancode,
|
||||||
.repeat = event->repeat,
|
.repeat = event->repeat,
|
||||||
.mods_state = sc_mods_state_from_sdl(event->keysym.mod),
|
.mods_state = sc_mods_state_from_sdl(event->keysym.mod),
|
||||||
};
|
};
|
||||||
@ -739,6 +749,10 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im,
|
|||||||
bool down = event->type == SDL_MOUSEBUTTONDOWN;
|
bool down = event->type == SDL_MOUSEBUTTONDOWN;
|
||||||
|
|
||||||
enum sc_mouse_button button = sc_mouse_button_from_sdl(event->button);
|
enum sc_mouse_button button = sc_mouse_button_from_sdl(event->button);
|
||||||
|
if (button == SC_MOUSE_BUTTON_UNKNOWN) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!down) {
|
if (!down) {
|
||||||
// Mark the button as released
|
// Mark the button as released
|
||||||
im->mouse_buttons_state &= ~button;
|
im->mouse_buttons_state &= ~button;
|
||||||
@ -827,7 +841,7 @@ sc_input_manager_process_mouse_button(struct sc_input_manager *im,
|
|||||||
struct sc_mouse_click_event evt = {
|
struct sc_mouse_click_event evt = {
|
||||||
.position = sc_input_manager_get_position(im, event->x, event->y),
|
.position = sc_input_manager_get_position(im, event->x, event->y),
|
||||||
.action = sc_action_from_sdl_mousebutton_type(event->type),
|
.action = sc_action_from_sdl_mousebutton_type(event->type),
|
||||||
.button = sc_mouse_button_from_sdl(event->button),
|
.button = button,
|
||||||
.pointer_id = use_finger ? SC_POINTER_ID_GENERIC_FINGER
|
.pointer_id = use_finger ? SC_POINTER_ID_GENERIC_FINGER
|
||||||
: SC_POINTER_ID_MOUSE,
|
: SC_POINTER_ID_MOUSE,
|
||||||
.buttons_state = im->mouse_buttons_state,
|
.buttons_state = im->mouse_buttons_state,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user