575{
576 UINT32 rdp_scancode = scancode_to_rdp(ev.scancode);
577#if defined(_WIN32)
578
579
580
581 if ((rdp_scancode == RDP_SCANCODE_UNKNOWN) && (ev.raw == 0xE036))
582 rdp_scancode = RDP_SCANCODE_RSHIFT;
583#endif
584
585
586
587 const SDL_Keymod mods = ev.mod;
588
589 if (_hotkeysEnabled && (mods & _hotkeyModmask) == _hotkeyModmask)
590 {
591 if (ev.type == SDL_EVENT_KEY_DOWN)
592 {
593 if (ev.scancode == _hotkeyFullscreen)
594 {
595 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, toggling fullscreen state",
596 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyFullscreen));
597 if (!keyboard_sync_state())
598 return false;
599 return _sdl->toggleFullscreen();
600 }
601 if (ev.scancode == _hotkeyResizable)
602 {
603 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, toggling resizeable state",
604 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyResizable));
605 if (!keyboard_sync_state())
606 return false;
607 return _sdl->toggleResizeable();
608 }
609
610 if (ev.scancode == _hotkeyGrab)
611 {
612 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, toggling grab state",
613 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyGrab));
614 if (!keyboard_sync_state())
615 return false;
616 return keyboard_grab(ev.windowID, !_sdl->grabKeyboard());
617 }
618 if (ev.scancode == _hotkeyDisconnect)
619 {
620 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, disconnecting RDP session",
621 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyDisconnect));
622 if (!keyboard_sync_state())
623 return false;
624 freerdp_abort_connect_context(_sdl->context());
625 return true;
626 }
627 if (ev.scancode == _hotkeyMinimize)
628 {
629 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, minimizing client",
630 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyMinimize));
631 if (!keyboard_sync_state())
632 return false;
633 return _sdl->setMinimized();
634 }
635 }
636 }
637
638#if defined(WITH_DEBUG_KBD)
639 {
640 const BOOL ex = RDP_SCANCODE_EXTENDED(rdp_scancode);
641 const DWORD sc = RDP_SCANCODE_CODE(rdp_scancode);
642 WLog_Print(_sdl->getWLog(), WLOG_DEBUG,
643 "SDL keycode: %02" PRIX32 " -> rdp code: [%04" PRIx16 "] %02" PRIX8 "%s",
644 ev.scancode, rdp_scancode, sc, ex ? " extended" : "");
645 }
646#endif
647
648 auto scancode = freerdp_keyboard_remap_key(_remapTable, rdp_scancode);
649#if defined(WITH_DEBUG_KBD)
650 {
651 const BOOL ex = RDP_SCANCODE_EXTENDED(scancode);
652 const DWORD sc = RDP_SCANCODE_CODE(scancode);
653 WLog_Print(_sdl->getWLog(), WLOG_DEBUG,
654 "SDL keycode: %02" PRIX32 " -> remapped rdp code: [%04" PRIx16 "] %02" PRIX8
655 "%s",
656 ev.scancode, scancode, sc, ex ? " extended" : "");
657 }
658#endif
660 {
661
662
663 const auto key = SDL_GetKeyFromScancode(ev.scancode, mods, false);
664 std::array<char, 5> str = {};
665 if ((key >= 0x20) && (key != SDLK_DELETE) && (key <= 0x10FFFF))
666 std::ignore = SDL_UCS4ToUTF8(key, str.data());
667 return freerdp_client_send_key_as_unicode(
668 _sdl->common(), (ev.type == SDL_EVENT_KEY_DOWN) ? 0 : KBD_FLAGS_RELEASE, str.data(),
669 scancode, sdl_get_kbd_modmask(mods));
670 }
671 return freerdp_input_send_keyboard_event_ex(_sdl->context()->input,
672 ev.type == SDL_EVENT_KEY_DOWN, ev.repeat, scancode);
673}
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.