mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-14 00:14:11 +09:00
Merge pull request #11862 from akallabeth/sdl-mod
Sdl mod: disable hotkeys
This commit is contained in:
@@ -10,5 +10,6 @@ set(DEPS
|
||||
|
||||
include(GetSysconfDir)
|
||||
get_sysconf_dir("" SYSCONF_DIR)
|
||||
set(VAR_NAMES "VENDOR" "PRODUCT" "VENDOR_PRODUCT" "SYSCONF_DIR")
|
||||
set(SDL_WIKI_BASE_URL "https://wiki.libsdl.org/SDL2")
|
||||
set(VAR_NAMES "VENDOR" "PRODUCT" "VENDOR_PRODUCT" "SYSCONF_DIR" "SDL_WIKI_BASE_URL")
|
||||
generate_and_install_freerdp_man_from_xml(${MODULE_NAME} "1" "${DEPS}" "${VAR_NAMES}")
|
||||
|
||||
@@ -386,29 +386,65 @@ BOOL sdlInput::keyboard_set_ime_status(rdpContext* context, UINT16 imeId, UINT32
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
uint32_t sdlInput::prefToMask()
|
||||
static const std::map<std::string, uint32_t>& getSdlMap()
|
||||
{
|
||||
const std::map<std::string, uint32_t> mapping = {
|
||||
{ "KMOD_LSHIFT", KMOD_LSHIFT }, { "KMOD_RSHIFT", KMOD_RSHIFT },
|
||||
{ "KMOD_LCTRL", KMOD_LCTRL }, { "KMOD_RCTRL", KMOD_RCTRL },
|
||||
{ "KMOD_LALT", KMOD_LALT }, { "KMOD_RALT", KMOD_RALT },
|
||||
{ "KMOD_LGUI", KMOD_LGUI }, { "KMOD_RGUI", KMOD_RGUI },
|
||||
{ "KMOD_NUM", KMOD_NUM }, { "KMOD_CAPS", KMOD_CAPS },
|
||||
static std::map<std::string, uint32_t> s_map = {
|
||||
{ "KMOD_LSHIFT", KMOD_LSHIFT }, { "KMOD_RSHIFT", KMOD_RSHIFT },
|
||||
{ "KMOD_LCTRL", KMOD_LCTRL }, { "KMOD_RCTRL", KMOD_RCTRL },
|
||||
{ "KMOD_LALT", KMOD_LALT }, { "KMOD_RALT", KMOD_RALT },
|
||||
{ "KMOD_LGUI", KMOD_LGUI }, { "KMOD_RGUI", KMOD_RGUI },
|
||||
{ "KMOD_NUM", KMOD_NUM }, { "KMOD_CAPS", KMOD_CAPS },
|
||||
{ "KMOD_MODE", KMOD_MODE },
|
||||
#if SDL_VERSION_ATLEAST(2, 0, 18)
|
||||
{ "KMOD_SCROLL", KMOD_SCROLL },
|
||||
#endif
|
||||
{ "KMOD_CTRL", KMOD_CTRL }, { "KMOD_SHIFT", KMOD_SHIFT },
|
||||
{ "KMOD_ALT", KMOD_ALT }, { "KMOD_GUI", KMOD_GUI }
|
||||
{ "KMOD_CTRL", KMOD_CTRL }, { "KMOD_SHIFT", KMOD_SHIFT },
|
||||
{ "KMOD_ALT", KMOD_ALT }, { "KMOD_GUI", KMOD_GUI },
|
||||
{ "KMOD_NONE", KMOD_NONE }, { "SDL_KMOD_LSHIFT", KMOD_LSHIFT },
|
||||
{ "SDL_KMOD_RSHIFT", KMOD_RSHIFT }, { "SDL_KMOD_LCTRL", KMOD_LCTRL },
|
||||
{ "SDL_KMOD_RCTRL", KMOD_RCTRL }, { "SDL_KMOD_LALT", KMOD_LALT },
|
||||
{ "SDL_KMOD_RALT", KMOD_RALT }, { "SDL_KMOD_LGUI", KMOD_LGUI },
|
||||
{ "SDL_KMOD_RGUI", KMOD_RGUI }, { "SDL_KMOD_NUM", KMOD_NUM },
|
||||
{ "SDL_KMOD_CAPS", KMOD_CAPS }, { "SDL_KMOD_MODE", KMOD_MODE },
|
||||
{ "SDL_KMOD_SCROLL", KMOD_SCROLL }, { "SDL_KMOD_CTRL", KMOD_CTRL },
|
||||
{ "SDL_KMOD_SHIFT", KMOD_SHIFT }, { "SDL_KMOD_ALT", KMOD_ALT },
|
||||
{ "SDL_KMOD_GUI", KMOD_GUI }, { "SDL_KMOD_NONE", KMOD_NONE }
|
||||
};
|
||||
|
||||
return s_map;
|
||||
}
|
||||
|
||||
bool sdlInput::prefToEnabled()
|
||||
{
|
||||
bool enable = true;
|
||||
const auto& m = getSdlMap();
|
||||
for (const auto& val : SdlPref::instance()->get_array("SDL_KeyModMask", { "KMOD_RSHIFT" }))
|
||||
{
|
||||
auto it = m.find(val);
|
||||
if (it != m.end())
|
||||
{
|
||||
if (it->second == KMOD_NONE)
|
||||
enable = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
WLog_WARN(TAG, "Invalid config::SDL_KeyModMask entry value '%s', disabling hotkeys",
|
||||
val.c_str());
|
||||
enable = false;
|
||||
}
|
||||
}
|
||||
return enable;
|
||||
}
|
||||
|
||||
uint32_t sdlInput::prefToMask()
|
||||
{
|
||||
const auto& mapping = getSdlMap();
|
||||
uint32_t mod = KMOD_NONE;
|
||||
for (const auto& val : SdlPref::instance()->get_array("SDL_KeyModMask", { "KMOD_RSHIFT" }))
|
||||
{
|
||||
auto it = mapping.find(val);
|
||||
if (it != mapping.end())
|
||||
{
|
||||
mod |= it->second;
|
||||
}
|
||||
}
|
||||
return mod;
|
||||
}
|
||||
@@ -483,7 +519,7 @@ BOOL sdlInput::keyboard_handle_event(const SDL_KeyboardEvent* ev)
|
||||
const UINT32 rdp_scancode = sdl_scancode_to_rdp(ev->keysym.scancode);
|
||||
const SDL_Keymod mods = SDL_GetModState();
|
||||
|
||||
if ((mods & _hotkeyModmask) == _hotkeyModmask)
|
||||
if (_hotkeysEnabled && (mods & _hotkeyModmask) == _hotkeyModmask)
|
||||
{
|
||||
if (ev->type == SDL_KEYDOWN)
|
||||
{
|
||||
@@ -556,7 +592,8 @@ BOOL sdlInput::mouse_grab(Uint32 windowID, SDL_bool enable)
|
||||
}
|
||||
|
||||
sdlInput::sdlInput(SdlContext* sdl)
|
||||
: _sdl(sdl), _lastWindowID(UINT32_MAX), _hotkeyModmask(prefToMask())
|
||||
: _sdl(sdl), _lastWindowID(UINT32_MAX), _hotkeysEnabled(prefToEnabled()),
|
||||
_hotkeyModmask(prefToMask())
|
||||
{
|
||||
auto list =
|
||||
freerdp_settings_get_string(_sdl->context()->settings, FreeRDP_KeyboardRemappingList);
|
||||
|
||||
@@ -55,6 +55,7 @@ class sdlInput
|
||||
static BOOL keyboard_set_ime_status(rdpContext* context, UINT16 imeId, UINT32 imeState,
|
||||
UINT32 imeConvMode);
|
||||
|
||||
static bool prefToEnabled();
|
||||
static uint32_t prefToMask();
|
||||
static uint32_t prefKeyValue(const std::string& key, uint32_t fallback = SDL_SCANCODE_UNKNOWN);
|
||||
|
||||
@@ -67,6 +68,7 @@ class sdlInput
|
||||
Uint32 _lastWindowID;
|
||||
|
||||
// hotkey handling
|
||||
bool _hotkeysEnabled;
|
||||
uint32_t _hotkeyModmask; // modifier keys mask
|
||||
uint32_t _hotkeyFullscreen;
|
||||
uint32_t _hotkeyResizable;
|
||||
|
||||
@@ -10,5 +10,6 @@ set(DEPS
|
||||
|
||||
include(GetSysconfDir)
|
||||
get_sysconf_dir("" SYSCONF_DIR)
|
||||
set(VAR_NAMES "VENDOR" "PRODUCT" "VENDOR_PRODUCT" "SYSCONF_DIR")
|
||||
set(SDL_WIKI_BASE_URL "https://wiki.libsdl.org/SDL3")
|
||||
set(VAR_NAMES "VENDOR" "PRODUCT" "VENDOR_PRODUCT" "SYSCONF_DIR" "SDL_WIKI_BASE_URL")
|
||||
generate_and_install_freerdp_man_from_xml(${MODULE_NAME} "1" "${DEPS}" "${VAR_NAMES}")
|
||||
|
||||
@@ -376,14 +376,23 @@ BOOL sdlInput::keyboard_set_ime_status(rdpContext* context, UINT16 imeId, UINT32
|
||||
static const std::map<std::string, uint32_t>& getSdlMap()
|
||||
{
|
||||
static std::map<std::string, uint32_t> s_map = {
|
||||
{ "KMOD_LSHIFT", SDL_KMOD_LSHIFT }, { "KMOD_RSHIFT", SDL_KMOD_RSHIFT },
|
||||
{ "KMOD_LCTRL", SDL_KMOD_LCTRL }, { "KMOD_RCTRL", SDL_KMOD_RCTRL },
|
||||
{ "KMOD_LALT", SDL_KMOD_LALT }, { "KMOD_RALT", SDL_KMOD_RALT },
|
||||
{ "KMOD_LGUI", SDL_KMOD_LGUI }, { "KMOD_RGUI", SDL_KMOD_RGUI },
|
||||
{ "KMOD_NUM", SDL_KMOD_NUM }, { "KMOD_CAPS", SDL_KMOD_CAPS },
|
||||
{ "KMOD_MODE", SDL_KMOD_MODE }, { "KMOD_SCROLL", SDL_KMOD_SCROLL },
|
||||
{ "KMOD_CTRL", SDL_KMOD_CTRL }, { "KMOD_SHIFT", SDL_KMOD_SHIFT },
|
||||
{ "KMOD_ALT", SDL_KMOD_ALT }, { "KMOD_GUI", SDL_KMOD_GUI }
|
||||
{ "KMOD_LSHIFT", SDL_KMOD_LSHIFT }, { "KMOD_RSHIFT", SDL_KMOD_RSHIFT },
|
||||
{ "KMOD_LCTRL", SDL_KMOD_LCTRL }, { "KMOD_RCTRL", SDL_KMOD_RCTRL },
|
||||
{ "KMOD_LALT", SDL_KMOD_LALT }, { "KMOD_RALT", SDL_KMOD_RALT },
|
||||
{ "KMOD_LGUI", SDL_KMOD_LGUI }, { "KMOD_RGUI", SDL_KMOD_RGUI },
|
||||
{ "KMOD_NUM", SDL_KMOD_NUM }, { "KMOD_CAPS", SDL_KMOD_CAPS },
|
||||
{ "KMOD_MODE", SDL_KMOD_MODE }, { "KMOD_SCROLL", SDL_KMOD_SCROLL },
|
||||
{ "KMOD_CTRL", SDL_KMOD_CTRL }, { "KMOD_SHIFT", SDL_KMOD_SHIFT },
|
||||
{ "KMOD_ALT", SDL_KMOD_ALT }, { "KMOD_GUI", SDL_KMOD_GUI },
|
||||
{ "KMOD_NONE", SDL_KMOD_NONE }, { "SDL_KMOD_LSHIFT", SDL_KMOD_LSHIFT },
|
||||
{ "SDL_KMOD_RSHIFT", SDL_KMOD_RSHIFT }, { "SDL_KMOD_LCTRL", SDL_KMOD_LCTRL },
|
||||
{ "SDL_KMOD_RCTRL", SDL_KMOD_RCTRL }, { "SDL_KMOD_LALT", SDL_KMOD_LALT },
|
||||
{ "SDL_KMOD_RALT", SDL_KMOD_RALT }, { "SDL_KMOD_LGUI", SDL_KMOD_LGUI },
|
||||
{ "SDL_KMOD_RGUI", SDL_KMOD_RGUI }, { "SDL_KMOD_NUM", SDL_KMOD_NUM },
|
||||
{ "SDL_KMOD_CAPS", SDL_KMOD_CAPS }, { "SDL_KMOD_MODE", SDL_KMOD_MODE },
|
||||
{ "SDL_KMOD_SCROLL", SDL_KMOD_SCROLL }, { "SDL_KMOD_CTRL", SDL_KMOD_CTRL },
|
||||
{ "SDL_KMOD_SHIFT", SDL_KMOD_SHIFT }, { "SDL_KMOD_ALT", SDL_KMOD_ALT },
|
||||
{ "SDL_KMOD_GUI", SDL_KMOD_GUI }, { "SDL_KMOD_NONE", SDL_KMOD_NONE }
|
||||
};
|
||||
|
||||
return s_map;
|
||||
@@ -424,17 +433,38 @@ static std::string masktostr(uint32_t mask)
|
||||
return str;
|
||||
}
|
||||
|
||||
uint32_t sdlInput::prefToMask()
|
||||
bool sdlInput::prefToEnabled()
|
||||
{
|
||||
auto m = getSdlMap();
|
||||
uint32_t mod = SDL_KMOD_NONE;
|
||||
bool enabled = true;
|
||||
const auto& m = getSdlMap();
|
||||
for (const auto& val : SdlPref::instance()->get_array("SDL_KeyModMask", { "KMOD_RSHIFT" }))
|
||||
{
|
||||
auto it = m.find(val);
|
||||
if (it != m.end())
|
||||
{
|
||||
mod |= it->second;
|
||||
if (it->second == SDL_KMOD_NONE)
|
||||
enabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
WLog_Print(_sdl->log, WLOG_WARN,
|
||||
"Invalid config::SDL_KeyModMask entry value '%s', disabling hotkeys",
|
||||
val.c_str());
|
||||
enabled = false;
|
||||
}
|
||||
}
|
||||
return enabled;
|
||||
}
|
||||
|
||||
uint32_t sdlInput::prefToMask()
|
||||
{
|
||||
const auto& m = getSdlMap();
|
||||
uint32_t mod = SDL_KMOD_NONE;
|
||||
for (const auto& val : SdlPref::instance()->get_array("SDL_KeyModMask", { "KMOD_RSHIFT" }))
|
||||
{
|
||||
auto it = m.find(val);
|
||||
if (it != m.end())
|
||||
mod |= it->second;
|
||||
}
|
||||
return mod;
|
||||
}
|
||||
@@ -544,7 +574,7 @@ BOOL sdlInput::keyboard_handle_event(const SDL_KeyboardEvent* ev)
|
||||
const UINT32 rdp_scancode = scancode_to_rdp(ev->scancode);
|
||||
const SDL_Keymod mods = SDL_GetModState();
|
||||
|
||||
if ((mods & _hotkeyModmask) == _hotkeyModmask)
|
||||
if (_hotkeysEnabled && (mods & _hotkeyModmask) == _hotkeyModmask)
|
||||
{
|
||||
if (ev->type == SDL_EVENT_KEY_DOWN)
|
||||
{
|
||||
@@ -651,7 +681,8 @@ BOOL sdlInput::mouse_grab(Uint32 windowID, bool enable)
|
||||
}
|
||||
|
||||
sdlInput::sdlInput(SdlContext* sdl)
|
||||
: _sdl(sdl), _lastWindowID(UINT32_MAX), _hotkeyModmask(prefToMask())
|
||||
: _sdl(sdl), _lastWindowID(UINT32_MAX), _hotkeysEnabled(prefToEnabled()),
|
||||
_hotkeyModmask(prefToMask())
|
||||
{
|
||||
_hotkeyFullscreen = prefKeyValue("SDL_Fullscreen", SDL_SCANCODE_RETURN);
|
||||
_hotkeyResizable = prefKeyValue("SDL_Resizeable", SDL_SCANCODE_R);
|
||||
|
||||
@@ -57,7 +57,8 @@ class sdlInput
|
||||
static BOOL keyboard_set_ime_status(rdpContext* context, UINT16 imeId, UINT32 imeState,
|
||||
UINT32 imeConvMode);
|
||||
|
||||
static uint32_t prefToMask();
|
||||
bool prefToEnabled();
|
||||
uint32_t prefToMask();
|
||||
static uint32_t prefKeyValue(const std::string& key, uint32_t fallback = SDL_SCANCODE_UNKNOWN);
|
||||
|
||||
private:
|
||||
@@ -71,6 +72,7 @@ class sdlInput
|
||||
Uint32 _lastWindowID;
|
||||
|
||||
// hotkey handling
|
||||
bool _hotkeysEnabled;
|
||||
uint32_t _hotkeyModmask; // modifier keys mask
|
||||
uint32_t _hotkeyFullscreen;
|
||||
uint32_t _hotkeyResizable;
|
||||
|
||||
@@ -39,6 +39,8 @@ An array of
|
||||
\fISDL_Keymod\fR
|
||||
strings as defined at
|
||||
\fI@SDL_WIKI_BASE_URL@/SDL_Keymod\fR
|
||||
.br
|
||||
use \fRKEYMOD_NONE\fR to disable hotkeys
|
||||
.RE
|
||||
.RE
|
||||
.PP
|
||||
@@ -54,7 +56,7 @@ Default
|
||||
.br
|
||||
|
||||
A string as defined at
|
||||
\fI@SDL_WIKI_BASE_URL@/SDLScancodeLookup\fR
|
||||
\fI@SDL_WIKI_BASE_URL@/SDL_Scancode\fR
|
||||
.RE
|
||||
.RE
|
||||
.PP
|
||||
@@ -70,7 +72,7 @@ Default
|
||||
.br
|
||||
|
||||
A string as defined at
|
||||
\fI@SDL_WIKI_BASE_URL@/SDLScancodeLookup\fR
|
||||
\fI@SDL_WIKI_BASE_URL@/SDL_Scancode\fR
|
||||
.RE
|
||||
.RE
|
||||
.PP
|
||||
@@ -86,7 +88,7 @@ Default
|
||||
.br
|
||||
|
||||
A string as defined at
|
||||
\fI@SDL_WIKI_BASE_URL@/SDLScancodeLookup\fR
|
||||
\fI@SDL_WIKI_BASE_URL@/SDL_Scancode\fR
|
||||
.RE
|
||||
.RE
|
||||
.PP
|
||||
@@ -106,7 +108,7 @@ Default
|
||||
.br
|
||||
|
||||
A string as defined at
|
||||
\fI@SDL_WIKI_BASE_URL@/SDLScancodeLookup\fR
|
||||
\fI@SDL_WIKI_BASE_URL@/SDL_Scancode\fR
|
||||
.RE
|
||||
.RE
|
||||
.PP
|
||||
@@ -122,7 +124,7 @@ Default
|
||||
.br
|
||||
|
||||
A string as defined at
|
||||
\fI@SDL_WIKI_BASE_URL@/SDLScancodeLookup\fR
|
||||
\fI@SDL_WIKI_BASE_URL@/SDL_Scancode\fR
|
||||
.RE
|
||||
.RE
|
||||
.RE
|
||||
|
||||
@@ -10,6 +10,5 @@ set(DEPS
|
||||
|
||||
include(GetSysconfDir)
|
||||
get_sysconf_dir("" SYSCONF_DIR)
|
||||
set(SDL_WIKI_BASE_URL "https://wiki.libsdl.org/SDL2")
|
||||
set(VAR_NAMES "VENDOR" "PRODUCT" "VENDOR_PRODUCT" "SYSCONF_DIR" "SDL_WIKI_BASE_URL")
|
||||
set(VAR_NAMES "VENDOR" "PRODUCT" "VENDOR_PRODUCT" "SYSCONF_DIR")
|
||||
generate_and_install_freerdp_man_from_xml(${MODULE_NAME} "1" "${DEPS}" "${VAR_NAMES}")
|
||||
|
||||
Reference in New Issue
Block a user