FreeRDP
Loading...
Searching...
No Matches
sdlInput Class Reference

#include <sdl_kbd.hpp>

Public Member Functions

 sdlInput (SdlContext *sdl)
 
 sdlInput (const sdlInput &other)=delete
 
 sdlInput (sdlInput &&other)=delete
 
sdlInputoperator= (const sdlInput &other)=delete
 
sdlInputoperator= (sdlInput &&other)=delete
 
BOOL keyboard_sync_state ()
 
BOOL keyboard_focus_in ()
 
BOOL keyboard_handle_event (const SDL_KeyboardEvent *ev)
 
BOOL keyboard_grab (Uint32 windowID, bool enable)
 
BOOL mouse_focus (Uint32 windowID)
 
BOOL mouse_grab (Uint32 windowID, SDL_bool enable)
 
 sdlInput (SdlContext *sdl)
 
 sdlInput (const sdlInput &other)=delete
 
 sdlInput (sdlInput &&other)=delete
 
sdlInputoperator= (const sdlInput &other)=delete
 
sdlInputoperator= (sdlInput &&other)=delete
 
BOOL initialize ()
 
BOOL keyboard_sync_state ()
 
BOOL keyboard_focus_in ()
 
BOOL keyboard_handle_event (const SDL_KeyboardEvent *ev)
 
BOOL keyboard_grab (Uint32 windowID, bool enable)
 
BOOL mouse_focus (Uint32 windowID)
 
BOOL mouse_grab (Uint32 windowID, bool enable)
 
bool prefToEnabled ()
 
uint32_t prefToMask ()
 

Static Public Member Functions

static BOOL keyboard_set_indicators (rdpContext *context, UINT16 led_flags)
 
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)
 
static BOOL keyboard_set_indicators (rdpContext *context, UINT16 led_flags)
 
static BOOL keyboard_set_ime_status (rdpContext *context, UINT16 imeId, UINT32 imeState, UINT32 imeConvMode)
 
static uint32_t prefKeyValue (const std::string &key, uint32_t fallback=SDL_SCANCODE_UNKNOWN)
 

Detailed Description

FreeRDP: A Remote Desktop Protocol Implementation SDL Client keyboard helper

Copyright 2022 Armin Novak armin.nosp@m..nov.nosp@m.ak@th.nosp@m.inca.nosp@m.st.co.nosp@m.m

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Definition at line 34 of file SDL2/sdl_kbd.hpp.

Constructor & Destructor Documentation

◆ sdlInput()

sdlInput::sdlInput ( SdlContext sdl)
explicit

Definition at line 594 of file SDL2/sdl_kbd.cpp.

595 : _sdl(sdl), _lastWindowID(UINT32_MAX), _hotkeysEnabled(prefToEnabled()),
596 _hotkeyModmask(prefToMask())
597{
598 auto list =
599 freerdp_settings_get_string(_sdl->context()->settings, FreeRDP_KeyboardRemappingList);
600 _remapTable = freerdp_keyboard_remap_string_to_list(list);
601 assert(_remapTable);
602 _hotkeyFullscreen = prefKeyValue("SDL_Fullscreen", SDL_SCANCODE_RETURN);
603 _hotkeyResizable = prefKeyValue("SDL_Resizeable", SDL_SCANCODE_R);
604 _hotkeyGrab = prefKeyValue("SDL_Grab", SDL_SCANCODE_G);
605 _hotkeyDisconnect = prefKeyValue("SDL_Disconnect", SDL_SCANCODE_D);
606 _hotkeyMinimize = prefKeyValue("SDL_Minimize", SDL_SCANCODE_M);
607}
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.

◆ ~sdlInput()

sdlInput::~sdlInput ( )

Definition at line 609 of file SDL2/sdl_kbd.cpp.

610{
611 freerdp_keyboard_remap_free(_remapTable);
612}

Member Function Documentation

◆ initialize()

BOOL sdlInput::initialize ( )

Definition at line 699 of file SDL3/sdl_kbd.cpp.

700{
701 auto settings = _sdl->context()->settings;
702 WINPR_ASSERT(settings);
703 WINPR_ASSERT(!_remapTable);
704
705 {
706 auto list = freerdp_settings_get_string(settings, FreeRDP_KeyboardRemappingList);
707 _remapTable = freerdp_keyboard_remap_string_to_list(list);
708 if (!_remapTable)
709 return FALSE;
710 }
711
712 if (freerdp_settings_get_uint32(settings, FreeRDP_KeyboardLayout) == 0)
713 {
714 DWORD KeyboardLayout = 0;
715
716 freerdp_detect_keyboard_layout_from_system_locale(&KeyboardLayout);
717 if (KeyboardLayout == 0)
718 KeyboardLayout = ENGLISH_UNITED_STATES;
719
720 if (!freerdp_settings_set_uint32(settings, FreeRDP_KeyboardLayout, KeyboardLayout))
721 return FALSE;
722 }
723 return TRUE;
724}
FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 param)
Sets a UINT32 settings value.

◆ keyboard_focus_in()

BOOL sdlInput::keyboard_focus_in ( )

Definition at line 323 of file SDL2/sdl_kbd.cpp.

324{
325 auto input = _sdl->context()->input;
326 WINPR_ASSERT(input);
327
328 auto syncFlags = sdl_get_kbd_flags();
329 freerdp_input_send_focus_in_event(input, WINPR_ASSERTING_INT_CAST(UINT16, syncFlags));
330
331 /* finish with a mouse pointer position like mstsc.exe if required */
332 // TODO: fullscreen/remote app
333 int x = 0;
334 int y = 0;
335 if (_sdl->fullscreen)
336 {
337 SDL_GetGlobalMouseState(&x, &y);
338 }
339 else
340 {
341 SDL_GetMouseState(&x, &y);
342 }
343 auto w = SDL_GetMouseFocus();
344 if (w)
345 {
346 auto id = SDL_GetWindowID(w);
347 sdl_scale_coordinates(_sdl, id, &x, &y, TRUE, TRUE);
348 }
349 return freerdp_client_send_button_event(_sdl->common(), FALSE, PTR_FLAGS_MOVE, x, y);
350}

◆ keyboard_grab()

BOOL sdlInput::keyboard_grab ( Uint32  windowID,
bool  enable 
)

Definition at line 560 of file SDL2/sdl_kbd.cpp.

561{
562 auto it = _sdl->windows.find(windowID);
563 if (it == _sdl->windows.end())
564 return FALSE;
565
566 auto status = enable && _sdl->grab_kbd_enabled;
567 _sdl->grab_kbd = status;
568 return it->second.grabKeyboard(status);
569}

◆ keyboard_handle_event()

BOOL sdlInput::keyboard_handle_event ( const SDL_KeyboardEvent *  ev)

Definition at line 516 of file SDL2/sdl_kbd.cpp.

517{
518 WINPR_ASSERT(ev);
519 const UINT32 rdp_scancode = sdl_scancode_to_rdp(ev->keysym.scancode);
520 const SDL_Keymod mods = SDL_GetModState();
521
522 if (_hotkeysEnabled && (mods & _hotkeyModmask) == _hotkeyModmask)
523 {
524 if (ev->type == SDL_KEYDOWN)
525 {
526 if (ev->keysym.scancode == _hotkeyFullscreen)
527 {
528 _sdl->update_fullscreen(!_sdl->fullscreen);
529 return TRUE;
530 }
531 if (ev->keysym.scancode == _hotkeyResizable)
532 {
533 _sdl->update_resizeable(!_sdl->resizeable);
534 return TRUE;
535 }
536
537 if (ev->keysym.scancode == _hotkeyGrab)
538 {
539 keyboard_grab(ev->windowID, !_sdl->grab_kbd);
540 return TRUE;
541 }
542 if (ev->keysym.scancode == _hotkeyDisconnect)
543 {
544 freerdp_abort_connect_context(_sdl->context());
545 return TRUE;
546 }
547 if (ev->keysym.scancode == _hotkeyMinimize)
548 {
549 _sdl->update_minimize();
550 return TRUE;
551 }
552 }
553 }
554
555 auto scancode = freerdp_keyboard_remap_key(_remapTable, rdp_scancode);
556 return freerdp_input_send_keyboard_event_ex(_sdl->context()->input, ev->type == SDL_KEYDOWN,
557 ev->repeat, scancode);
558}

◆ keyboard_set_ime_status()

BOOL sdlInput::keyboard_set_ime_status ( rdpContext *  context,
UINT16  imeId,
UINT32  imeState,
UINT32  imeConvMode 
)
static

Definition at line 376 of file SDL2/sdl_kbd.cpp.

378{
379 if (!context)
380 return FALSE;
381
382 WLog_WARN(TAG,
383 "KeyboardSetImeStatus(unitId=%04" PRIx16 ", imeState=%08" PRIx32
384 ", imeConvMode=%08" PRIx32 ") ignored",
385 imeId, imeState, imeConvMode);
386 return TRUE;
387}

◆ keyboard_set_indicators()

BOOL sdlInput::keyboard_set_indicators ( rdpContext *  context,
UINT16  led_flags 
)
static

Definition at line 353 of file SDL2/sdl_kbd.cpp.

354{
355 WINPR_UNUSED(context);
356
357 int state = KMOD_NONE;
358
359 if ((led_flags & KBD_SYNC_NUM_LOCK) != 0)
360 state |= KMOD_NUM;
361 if ((led_flags & KBD_SYNC_CAPS_LOCK) != 0)
362 state |= KMOD_CAPS;
363#if SDL_VERSION_ATLEAST(2, 0, 18)
364 if ((led_flags & KBD_SYNC_SCROLL_LOCK) != 0)
365 state |= KMOD_SCROLL;
366#endif
367
368 // TODO: KBD_SYNC_KANA_LOCK
369
370 SDL_SetModState(static_cast<SDL_Keymod>(state));
371
372 return TRUE;
373}

◆ keyboard_sync_state()

BOOL sdlInput::keyboard_sync_state ( )

Definition at line 317 of file SDL2/sdl_kbd.cpp.

318{
319 const auto syncFlags = sdl_get_kbd_flags();
320 return freerdp_input_send_synchronize_event(_sdl->context()->input, syncFlags);
321}

◆ mouse_focus()

BOOL sdlInput::mouse_focus ( Uint32  windowID)

Definition at line 571 of file SDL2/sdl_kbd.cpp.

572{
573 if (_lastWindowID != windowID)
574 {
575 _lastWindowID = windowID;
576 auto it = _sdl->windows.find(windowID);
577 if (it == _sdl->windows.end())
578 return FALSE;
579
580 it->second.raise();
581 }
582 return TRUE;
583}

◆ mouse_grab() [1/2]

BOOL sdlInput::mouse_grab ( Uint32  windowID,
bool  enable 
)

Definition at line 674 of file SDL3/sdl_kbd.cpp.

675{
676 auto it = _sdl->windows.find(windowID);
677 if (it == _sdl->windows.end())
678 return FALSE;
679 _sdl->grab_mouse = enable;
680 return it->second.grabMouse(enable);
681}

◆ mouse_grab() [2/2]

BOOL sdlInput::mouse_grab ( Uint32  windowID,
SDL_bool  enable 
)

Definition at line 585 of file SDL2/sdl_kbd.cpp.

586{
587 auto it = _sdl->windows.find(windowID);
588 if (it == _sdl->windows.end())
589 return FALSE;
590 _sdl->grab_mouse = enable;
591 return it->second.grabMouse(enable);
592}

◆ prefKeyValue()

uint32_t sdlInput::prefKeyValue ( const std::string &  key,
uint32_t  fallback = SDL_SCANCODE_UNKNOWN 
)
static

Definition at line 484 of file SDL2/sdl_kbd.cpp.

485{
486 auto item = SdlPref::instance()->get_string(key);
487 if (item.empty())
488 return fallback;
489 auto val = sdl_scancode_val(item.c_str());
490 if (val == SDL_SCANCODE_UNKNOWN)
491 return fallback;
492 return val;
493}

◆ prefToEnabled()

bool sdlInput::prefToEnabled ( )
static

Definition at line 417 of file SDL2/sdl_kbd.cpp.

418{
419 bool enable = true;
420 const auto& m = getSdlMap();
421 for (const auto& val : SdlPref::instance()->get_array("SDL_KeyModMask", { "KMOD_RSHIFT" }))
422 {
423 auto it = m.find(val);
424 if (it != m.end())
425 {
426 if (it->second == KMOD_NONE)
427 enable = false;
428 }
429 else
430 {
431 WLog_WARN(TAG, "Invalid config::SDL_KeyModMask entry value '%s', disabling hotkeys",
432 val.c_str());
433 enable = false;
434 }
435 }
436 return enable;
437}

◆ prefToMask()

uint32_t sdlInput::prefToMask ( )
static

Definition at line 439 of file SDL2/sdl_kbd.cpp.

440{
441 const auto& mapping = getSdlMap();
442 uint32_t mod = KMOD_NONE;
443 for (const auto& val : SdlPref::instance()->get_array("SDL_KeyModMask", { "KMOD_RSHIFT" }))
444 {
445 auto it = mapping.find(val);
446 if (it != mapping.end())
447 mod |= it->second;
448 }
449 return mod;
450}

The documentation for this class was generated from the following files: