xfreerdp-server: use libwinpr-input for keyboard mapping

This commit is contained in:
Marc-André Moreau 2013-05-02 01:34:54 -04:00
parent 54096f7b9b
commit 9bf924929c
6 changed files with 108 additions and 3 deletions

View File

@ -30,6 +30,8 @@ set(${MODULE_PREFIX}_SRCS
xf_encode.h
xf_update.c
xf_update.h
xf_cursor.c
xf_cursor.h
xf_monitors.c
xf_monitors.h
xf_interface.c
@ -137,7 +139,7 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS
set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS
MONOLITHIC ${MONOLITHIC_BUILD}
MODULE winpr
MODULES winpr-sspi)
MODULES winpr-sspi winpr-crt winpr-utils winpr-input winpr-sysinfo)
set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} winpr-makecert-tool)

35
server/X11/xf_cursor.c Normal file
View File

@ -0,0 +1,35 @@
/**
* FreeRDP: A Remote Desktop Protocol Implementation
* X11 Server Cursor
*
* Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* 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.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#ifdef WITH_XCURSOR
#include <X11/Xcursor/Xcursor.h>
#endif
#include <winpr/crt.h>
#include "xf_cursor.h"

28
server/X11/xf_cursor.h Normal file
View File

@ -0,0 +1,28 @@
/**
* FreeRDP: A Remote Desktop Protocol Implementation
* X11 Server Cursor
*
* Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* 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.
*/
#ifndef XFREERDP_SERVER_CURSOR_H
#define XFREERDP_SERVER_CURSOR_H
#include "xfreerdp.h"
#endif /* XFREERDP_SERVER_CURSOR_H */

View File

@ -25,6 +25,9 @@
#include <freerdp/locale/keyboard.h>
#include <winpr/crt.h>
#include <winpr/input.h>
#include "xf_peer.h"
#include "xf_input.h"
@ -37,7 +40,8 @@ void xf_input_synchronize_event(rdpInput* input, UINT32 flags)
void xf_input_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
{
#ifdef WITH_XTEST
unsigned int keycode;
DWORD vkcode;
DWORD keycode;
BOOL extended = FALSE;
xfPeerContext* xfp = (xfPeerContext*) input->context;
xfInfo* xfi = xfp->info;
@ -45,7 +49,11 @@ void xf_input_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code)
if (flags & KBD_FLAGS_EXTENDED)
extended = TRUE;
keycode = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(code, extended);
if (extended)
code |= KBDEXT;
vkcode = GetVirtualKeyCodeFromVirtualScanCode(code, 4);
keycode = GetKeycodeFromVirtualKeyCode(vkcode, KEYCODE_TYPE_EVDEV);
if (keycode != 0)
{

View File

@ -874,6 +874,7 @@ WINPR_API DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeybo
#define KEYCODE_TYPE_EVDEV 0x00000002
WINPR_API DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, DWORD dwFlags);
WINPR_API DWORD GetKeycodeFromVirtualKeyCode(DWORD keycode, DWORD dwFlags);
#ifdef __cplusplus
}

View File

@ -584,3 +584,34 @@ DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, DWORD dwFlags)
return vkcode;
}
DWORD GetKeycodeFromVirtualKeyCode(DWORD vkcode, DWORD dwFlags)
{
int index;
DWORD keycode = 0;
if (dwFlags & KEYCODE_TYPE_APPLE)
{
for (index = 0; index < 256; index++)
{
if (vkcode == KEYCODE_TO_VKCODE_APPLE[index])
{
keycode = index;
break;
}
}
}
else if (dwFlags & KEYCODE_TYPE_EVDEV)
{
for (index = 0; index < 256; index++)
{
if (vkcode == KEYCODE_TO_VKCODE_EVDEV[index])
{
keycode = index;
break;
}
}
}
return keycode;
}