Correctly handle extended RDP keycodes
The keycodes received by the FreeRDP server aren't evdev keycodes. This patch adds the correct convertion to evdev keycodes. After the patch all keys that are marked as extended in RDP packets become functionnal (that's the case for the windows key). Please note that this patch rely on some corrections that have been pushed on the FreeRDP github tonight.
This commit is contained in:
committed by
Kristian Høgsberg
parent
b67c91d46d
commit
4a3c150c96
+33
-3
@@ -36,6 +36,7 @@
|
|||||||
#include <freerdp/codec/color.h>
|
#include <freerdp/codec/color.h>
|
||||||
#include <freerdp/codec/rfx.h>
|
#include <freerdp/codec/rfx.h>
|
||||||
#include <freerdp/codec/nsc.h>
|
#include <freerdp/codec/nsc.h>
|
||||||
|
#include <winpr/input.h>
|
||||||
|
|
||||||
#include "compositor.h"
|
#include "compositor.h"
|
||||||
#include "pixman-renderer.h"
|
#include "pixman-renderer.h"
|
||||||
@@ -608,6 +609,7 @@ xf_peer_capabilities(freerdp_peer* client)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct rdp_to_xkb_keyboard_layout {
|
struct rdp_to_xkb_keyboard_layout {
|
||||||
UINT32 rdpLayoutCode;
|
UINT32 rdpLayoutCode;
|
||||||
char *xkbLayout;
|
char *xkbLayout;
|
||||||
@@ -648,7 +650,6 @@ xf_peer_post_connect(freerdp_peer* client)
|
|||||||
struct xkb_keymap *keymap;
|
struct xkb_keymap *keymap;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
||||||
peerCtx = (RdpPeerContext *)client->context;
|
peerCtx = (RdpPeerContext *)client->context;
|
||||||
c = peerCtx->rdpCompositor;
|
c = peerCtx->rdpCompositor;
|
||||||
output = c->output;
|
output = c->output;
|
||||||
@@ -783,9 +784,22 @@ xf_input_synchronize_event(rdpInput *input, UINT32 flags)
|
|||||||
pixman_region32_fini(&damage);
|
pixman_region32_fini(&damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern DWORD KEYCODE_TO_VKCODE_EVDEV[];
|
||||||
|
static uint32_t vk_to_keycode[256];
|
||||||
|
static void
|
||||||
|
init_vk_translator(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(vk_to_keycode, 0, sizeof(vk_to_keycode));
|
||||||
|
for(i = 0; i < 256; i++)
|
||||||
|
vk_to_keycode[KEYCODE_TO_VKCODE_EVDEV[i] & 0xff] = i-8;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xf_input_keyboard_event(rdpInput *input, UINT16 flags, UINT16 code)
|
xf_input_keyboard_event(rdpInput *input, UINT16 flags, UINT16 code)
|
||||||
{
|
{
|
||||||
|
uint32_t scan_code, vk_code, full_code;
|
||||||
enum wl_keyboard_key_state keyState;
|
enum wl_keyboard_key_state keyState;
|
||||||
RdpPeerContext *peerContext = (RdpPeerContext *)input->context;
|
RdpPeerContext *peerContext = (RdpPeerContext *)input->context;
|
||||||
int notify = 0;
|
int notify = 0;
|
||||||
@@ -798,9 +812,24 @@ xf_input_keyboard_event(rdpInput *input, UINT16 flags, UINT16 code)
|
|||||||
notify = 1;
|
notify = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(notify)
|
if(notify) {
|
||||||
|
full_code = code;
|
||||||
|
if(flags & KBD_FLAGS_EXTENDED)
|
||||||
|
full_code |= KBD_FLAGS_EXTENDED;
|
||||||
|
|
||||||
|
vk_code = GetVirtualKeyCodeFromVirtualScanCode(full_code, 4);
|
||||||
|
if(vk_code > 0xff) {
|
||||||
|
weston_log("invalid vk_code %x", vk_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scan_code = vk_to_keycode[vk_code];
|
||||||
|
|
||||||
|
|
||||||
|
/*weston_log("code=%x ext=%d vk_code=%x scan_code=%x\n", code, (flags & KBD_FLAGS_EXTENDED) ? 1 : 0,
|
||||||
|
vk_code, scan_code);*/
|
||||||
notify_key(&peerContext->item.seat, weston_compositor_get_time(),
|
notify_key(&peerContext->item.seat, weston_compositor_get_time(),
|
||||||
code, keyState, STATE_UPDATE_AUTOMATIC);
|
scan_code, keyState, STATE_UPDATE_AUTOMATIC);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -991,6 +1020,7 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
|
|||||||
|
|
||||||
freerdp_get_version(&major, &minor, &revision);
|
freerdp_get_version(&major, &minor, &revision);
|
||||||
weston_log("using FreeRDP version %d.%d.%d\n", major, minor, revision);
|
weston_log("using FreeRDP version %d.%d.%d\n", major, minor, revision);
|
||||||
|
init_vk_translator();
|
||||||
|
|
||||||
const struct weston_option rdp_options[] = {
|
const struct weston_option rdp_options[] = {
|
||||||
{ WESTON_OPTION_BOOLEAN, "env-socket", 0, &config.env_socket },
|
{ WESTON_OPTION_BOOLEAN, "env-socket", 0, &config.env_socket },
|
||||||
|
|||||||
Reference in New Issue
Block a user