Move shortcut mod functions to a separate header
This will allow to reuse it for mouse capture keys, which are handled by a component separate from the input manager. PR #5322 <https://github.com/Genymobile/scrcpy/pull/5322>
This commit is contained in:
parent
281fcc7052
commit
a36de26969
@ -5,53 +5,9 @@
|
|||||||
|
|
||||||
#include "input_events.h"
|
#include "input_events.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
#include "shortcut_mod.h"
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
|
||||||
#define SC_SDL_SHORTCUT_MODS_MASK (KMOD_CTRL | KMOD_ALT | KMOD_GUI)
|
|
||||||
|
|
||||||
static inline uint16_t
|
|
||||||
to_sdl_mod(uint8_t shortcut_mod) {
|
|
||||||
uint16_t sdl_mod = 0;
|
|
||||||
if (shortcut_mod & SC_SHORTCUT_MOD_LCTRL) {
|
|
||||||
sdl_mod |= KMOD_LCTRL;
|
|
||||||
}
|
|
||||||
if (shortcut_mod & SC_SHORTCUT_MOD_RCTRL) {
|
|
||||||
sdl_mod |= KMOD_RCTRL;
|
|
||||||
}
|
|
||||||
if (shortcut_mod & SC_SHORTCUT_MOD_LALT) {
|
|
||||||
sdl_mod |= KMOD_LALT;
|
|
||||||
}
|
|
||||||
if (shortcut_mod & SC_SHORTCUT_MOD_RALT) {
|
|
||||||
sdl_mod |= KMOD_RALT;
|
|
||||||
}
|
|
||||||
if (shortcut_mod & SC_SHORTCUT_MOD_LSUPER) {
|
|
||||||
sdl_mod |= KMOD_LGUI;
|
|
||||||
}
|
|
||||||
if (shortcut_mod & SC_SHORTCUT_MOD_RSUPER) {
|
|
||||||
sdl_mod |= KMOD_RGUI;
|
|
||||||
}
|
|
||||||
return sdl_mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool
|
|
||||||
is_shortcut_mod(struct sc_input_manager *im, uint16_t sdl_mod) {
|
|
||||||
// im->sdl_shortcut_mods is within the mask
|
|
||||||
assert(!(im->sdl_shortcut_mods & ~SC_SDL_SHORTCUT_MODS_MASK));
|
|
||||||
|
|
||||||
// at least one shortcut mod pressed?
|
|
||||||
return sdl_mod & im->sdl_shortcut_mods;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
is_shortcut_key(struct sc_input_manager *im, SDL_Keycode keycode) {
|
|
||||||
return (im->sdl_shortcut_mods & KMOD_LCTRL && keycode == SDLK_LCTRL)
|
|
||||||
|| (im->sdl_shortcut_mods & KMOD_RCTRL && keycode == SDLK_RCTRL)
|
|
||||||
|| (im->sdl_shortcut_mods & KMOD_LALT && keycode == SDLK_LALT)
|
|
||||||
|| (im->sdl_shortcut_mods & KMOD_RALT && keycode == SDLK_RALT)
|
|
||||||
|| (im->sdl_shortcut_mods & KMOD_LGUI && keycode == SDLK_LGUI)
|
|
||||||
|| (im->sdl_shortcut_mods & KMOD_RGUI && keycode == SDLK_RGUI);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
sc_input_manager_init(struct sc_input_manager *im,
|
sc_input_manager_init(struct sc_input_manager *im,
|
||||||
const struct sc_input_manager_params *params) {
|
const struct sc_input_manager_params *params) {
|
||||||
@ -73,7 +29,7 @@ sc_input_manager_init(struct sc_input_manager *im,
|
|||||||
im->legacy_paste = params->legacy_paste;
|
im->legacy_paste = params->legacy_paste;
|
||||||
im->clipboard_autosync = params->clipboard_autosync;
|
im->clipboard_autosync = params->clipboard_autosync;
|
||||||
|
|
||||||
im->sdl_shortcut_mods = to_sdl_mod(params->shortcut_mods);
|
im->sdl_shortcut_mods = sc_shortcut_mods_to_sdl(params->shortcut_mods);
|
||||||
|
|
||||||
im->vfinger_down = false;
|
im->vfinger_down = false;
|
||||||
im->vfinger_invert_x = false;
|
im->vfinger_invert_x = false;
|
||||||
@ -346,7 +302,8 @@ sc_input_manager_process_text_input(struct sc_input_manager *im,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_shortcut_mod(im, SDL_GetModState())) {
|
if (sc_shortcut_mods_is_shortcut_mod(im->sdl_shortcut_mods,
|
||||||
|
SDL_GetModState())) {
|
||||||
// A shortcut must never generate text events
|
// A shortcut must never generate text events
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -413,8 +370,9 @@ sc_input_manager_process_key(struct sc_input_manager *im,
|
|||||||
// press/release is a modifier key.
|
// press/release is a modifier key.
|
||||||
// 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)
|
uint16_t mods = im->sdl_shortcut_mods;
|
||||||
|| is_shortcut_key(im, sdl_keycode);
|
bool is_shortcut = sc_shortcut_mods_is_shortcut_mod(mods, mod)
|
||||||
|
|| sc_shortcut_mods_is_shortcut_key(mods, sdl_keycode);
|
||||||
|
|
||||||
if (down && !repeat) {
|
if (down && !repeat) {
|
||||||
if (sdl_keycode == im->last_keycode && mod == im->last_mod) {
|
if (sdl_keycode == im->last_keycode && mod == im->last_mod) {
|
||||||
|
60
app/src/shortcut_mod.h
Normal file
60
app/src/shortcut_mod.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#ifndef SC_SHORTCUT_MOD_H
|
||||||
|
#define SC_SHORTCUT_MOD_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <SDL2/SDL_keycode.h>
|
||||||
|
|
||||||
|
#include "options.h"
|
||||||
|
|
||||||
|
#define SC_SDL_SHORTCUT_MODS_MASK (KMOD_CTRL | KMOD_ALT | KMOD_GUI)
|
||||||
|
|
||||||
|
// input: OR of enum sc_shortcut_mod
|
||||||
|
// output: OR of SDL_Keymod
|
||||||
|
static inline uint16_t
|
||||||
|
sc_shortcut_mods_to_sdl(uint8_t shortcut_mods) {
|
||||||
|
uint16_t sdl_mod = 0;
|
||||||
|
if (shortcut_mods & SC_SHORTCUT_MOD_LCTRL) {
|
||||||
|
sdl_mod |= KMOD_LCTRL;
|
||||||
|
}
|
||||||
|
if (shortcut_mods & SC_SHORTCUT_MOD_RCTRL) {
|
||||||
|
sdl_mod |= KMOD_RCTRL;
|
||||||
|
}
|
||||||
|
if (shortcut_mods & SC_SHORTCUT_MOD_LALT) {
|
||||||
|
sdl_mod |= KMOD_LALT;
|
||||||
|
}
|
||||||
|
if (shortcut_mods & SC_SHORTCUT_MOD_RALT) {
|
||||||
|
sdl_mod |= KMOD_RALT;
|
||||||
|
}
|
||||||
|
if (shortcut_mods & SC_SHORTCUT_MOD_LSUPER) {
|
||||||
|
sdl_mod |= KMOD_LGUI;
|
||||||
|
}
|
||||||
|
if (shortcut_mods & SC_SHORTCUT_MOD_RSUPER) {
|
||||||
|
sdl_mod |= KMOD_RGUI;
|
||||||
|
}
|
||||||
|
return sdl_mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
sc_shortcut_mods_is_shortcut_mod(uint16_t sdl_shortcut_mods, uint16_t sdl_mod) {
|
||||||
|
// sdl_shortcut_mods must be within the mask
|
||||||
|
assert(!(sdl_shortcut_mods & ~SC_SDL_SHORTCUT_MODS_MASK));
|
||||||
|
|
||||||
|
// at least one shortcut mod pressed?
|
||||||
|
return sdl_mod & sdl_shortcut_mods;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
sc_shortcut_mods_is_shortcut_key(uint16_t sdl_shortcut_mods,
|
||||||
|
SDL_Keycode keycode) {
|
||||||
|
return (sdl_shortcut_mods & KMOD_LCTRL && keycode == SDLK_LCTRL)
|
||||||
|
|| (sdl_shortcut_mods & KMOD_RCTRL && keycode == SDLK_RCTRL)
|
||||||
|
|| (sdl_shortcut_mods & KMOD_LALT && keycode == SDLK_LALT)
|
||||||
|
|| (sdl_shortcut_mods & KMOD_RALT && keycode == SDLK_RALT)
|
||||||
|
|| (sdl_shortcut_mods & KMOD_LGUI && keycode == SDLK_LGUI)
|
||||||
|
|| (sdl_shortcut_mods & KMOD_RGUI && keycode == SDLK_RGUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user