552{
553 UINT32 rdp_scancode = scancode_to_rdp(ev.scancode);
554#if defined(_WIN32)
555
556
557
558 if ((rdp_scancode == RDP_SCANCODE_UNKNOWN) && (ev.raw == 0xE036))
559 rdp_scancode = RDP_SCANCODE_RSHIFT;
560#endif
561 const SDL_Keymod mods = SDL_GetModState();
562
563 if (_hotkeysEnabled && (mods & _hotkeyModmask) == _hotkeyModmask)
564 {
565 if (ev.type == SDL_EVENT_KEY_DOWN)
566 {
567 if (ev.scancode == _hotkeyFullscreen)
568 {
569 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, toggling fullscreen state",
570 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyFullscreen));
571 if (!keyboard_sync_state())
572 return false;
573 return _sdl->toggleFullscreen();
574 }
575 if (ev.scancode == _hotkeyResizable)
576 {
577 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, toggling resizeable state",
578 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyResizable));
579 if (!keyboard_sync_state())
580 return false;
581 return _sdl->toggleResizeable();
582 }
583
584 if (ev.scancode == _hotkeyGrab)
585 {
586 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, toggling grab state",
587 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyGrab));
588 if (!keyboard_sync_state())
589 return false;
590 return keyboard_grab(ev.windowID, !_sdl->grabKeyboard());
591 }
592 if (ev.scancode == _hotkeyDisconnect)
593 {
594 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, disconnecting RDP session",
595 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyDisconnect));
596 if (!keyboard_sync_state())
597 return false;
598 freerdp_abort_connect_context(_sdl->context());
599 return true;
600 }
601 if (ev.scancode == _hotkeyMinimize)
602 {
603 WLog_Print(_sdl->getWLog(), WLOG_INFO, "%s+<%s> pressed, minimizing client",
604 masktostr(_hotkeyModmask).c_str(), sdl_scancode_name(_hotkeyMinimize));
605 if (!keyboard_sync_state())
606 return false;
607 return _sdl->setMinimized();
608 }
609 }
610 }
611
612#if defined(WITH_DEBUG_KBD)
613 {
614 const BOOL ex = RDP_SCANCODE_EXTENDED(rdp_scancode);
615 const DWORD sc = RDP_SCANCODE_CODE(rdp_scancode);
616 WLog_Print(_sdl->getWLog(), WLOG_DEBUG,
617 "SDL keycode: %02" PRIX32 " -> rdp code: [%04" PRIx16 "] %02" PRIX8 "%s",
618 ev.scancode, rdp_scancode, sc, ex ? " extended" : "");
619 }
620#endif
621
622 auto scancode = freerdp_keyboard_remap_key(_remapTable, rdp_scancode);
623#if defined(WITH_DEBUG_KBD)
624 {
625 const BOOL ex = RDP_SCANCODE_EXTENDED(scancode);
626 const DWORD sc = RDP_SCANCODE_CODE(scancode);
627 WLog_Print(_sdl->getWLog(), WLOG_DEBUG,
628 "SDL keycode: %02" PRIX32 " -> remapped rdp code: [%04" PRIx16 "] %02" PRIX8
629 "%s",
630 ev.scancode, scancode, sc, ex ? " extended" : "");
631 }
632#endif
633 return freerdp_input_send_keyboard_event_ex(_sdl->context()->input,
634 ev.type == SDL_EVENT_KEY_DOWN, ev.repeat, scancode);
635}