Simplified mapping and lookups, added required structuring for future selectable keymaps.
This commit is contained in:
parent
b984832687
commit
a366c189c5
@ -41,7 +41,8 @@ AM_CFLAGS = -Werror -Wall -pedantic -Iinclude
|
||||
|
||||
lib_LTLIBRARIES = libguac-client-rdp.la
|
||||
|
||||
libguac_client_rdp_la_SOURCES = src/client.c src/rdp_keymap.c src/rdp_bitmap.c src/rdp_glyph.c src/rdp_pointer.c src/rdp_gdi.c src/guac_handlers.c
|
||||
libguac_client_rdp_la_SOURCES = src/client.c src/rdp_bitmap.c src/rdp_glyph.c src/rdp_pointer.c src/rdp_gdi.c src/guac_handlers.c \
|
||||
src/rdp_keymap_en_us.c
|
||||
|
||||
libguac_client_rdp_la_LDFLAGS = -version-info 0:0:0
|
||||
|
||||
|
@ -43,6 +43,8 @@
|
||||
|
||||
#include <guacamole/client.h>
|
||||
|
||||
#include "rdp_keymap.h"
|
||||
|
||||
#define RDP_DEFAULT_PORT 3389
|
||||
|
||||
typedef struct guac_rdp_color {
|
||||
@ -63,6 +65,8 @@ typedef struct rdp_guac_client_data {
|
||||
|
||||
const guac_layer* current_surface;
|
||||
|
||||
const guac_rdp_keysym_scancode_map* keysym_scancodes;
|
||||
|
||||
} rdp_guac_client_data;
|
||||
|
||||
typedef struct rdp_freerdp_context {
|
||||
|
@ -42,7 +42,7 @@
|
||||
* Represents a keysym-to-scancode mapping for RDP, with extra information
|
||||
* about the state of prerequisite keysyms.
|
||||
*/
|
||||
typedef struct guac_rdp_keymap {
|
||||
typedef struct guac_rdp_scancode_map {
|
||||
|
||||
/**
|
||||
* The scancode this keysym maps to.
|
||||
@ -66,7 +66,7 @@ typedef struct guac_rdp_keymap {
|
||||
*/
|
||||
int* clear_keysyms;
|
||||
|
||||
} guac_rdp_keymap;
|
||||
} guac_rdp_scancode_map;
|
||||
|
||||
/**
|
||||
* Represents the Alt-code which types a given keysym. This is used as a
|
||||
@ -74,24 +74,39 @@ typedef struct guac_rdp_keymap {
|
||||
*
|
||||
* See: http://en.wikipedia.org/wiki/Alt_code
|
||||
*/
|
||||
typedef struct guac_rdp_alt_keymap {
|
||||
typedef struct guac_rdp_altcode_map {
|
||||
|
||||
/**
|
||||
* The 4-digit Alt-code which types this keysym.
|
||||
*/
|
||||
char alt_code[4];
|
||||
char altcode[4];
|
||||
|
||||
} guac_rdp_alt_keymap;
|
||||
} guac_rdp_altcode_map;
|
||||
|
||||
/**
|
||||
* Map of X11 keysyms to RDP scancodes.
|
||||
* Static mapping from keysyms to scancodes.
|
||||
*/
|
||||
extern const guac_rdp_keymap guac_rdp_keysym_scancode[256][256];
|
||||
typedef guac_rdp_scancode_map guac_rdp_keysym_scancode_map[256][256];
|
||||
|
||||
/**
|
||||
* Static mapping from keysyms to Alt-codes.
|
||||
*/
|
||||
typedef guac_rdp_altcode_map guac_rdp_keysym_altcode_map[256][256];
|
||||
|
||||
/**
|
||||
* Map of X11 keysyms to RDP scancodes (US English).
|
||||
*/
|
||||
extern const guac_rdp_keysym_scancode_map guac_rdp_keysym_scancode_en_us;
|
||||
|
||||
/**
|
||||
* Map of X11 keysyms to Windows Alt-codes.
|
||||
*/
|
||||
extern const guac_rdp_alt_keymap guac_rdp_keysym_altcode[256][256];
|
||||
extern const guac_rdp_keysym_altcode_map guac_rdp_keysym_altcode;
|
||||
|
||||
/**
|
||||
* Simple macro for referencing the mapped value of an altcode or scancode for a given keysym.
|
||||
*/
|
||||
#define GUAC_RDP_KEYSYM_LOOKUP(keysym_mapping, keysym) (&((keysym_mapping)[((keysym) & 0xFF00) >> 8][(keysym) & 0xFF]))
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -323,6 +323,7 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||
guac_client_data->rdp_inst = rdp_inst;
|
||||
guac_client_data->mouse_button_mask = 0;
|
||||
guac_client_data->current_surface = GUAC_DEFAULT_LAYER;
|
||||
guac_client_data->keysym_scancodes = &guac_rdp_keysym_scancode_en_us;
|
||||
|
||||
((rdp_freerdp_context*) rdp_inst->context)->client = client;
|
||||
client->data = guac_client_data;
|
||||
|
@ -227,21 +227,21 @@ int rdp_guac_client_key_handler(guac_client* client, int keysym, int pressed) {
|
||||
|
||||
rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data;
|
||||
freerdp* rdp_inst = guac_client_data->rdp_inst;
|
||||
const guac_rdp_keysym_scancode_map* keysym_scancodes = guac_client_data->keysym_scancodes;
|
||||
|
||||
/* If keysym can be in lookup table */
|
||||
if (keysym <= 0xFFFF) {
|
||||
|
||||
/* Look up scancode */
|
||||
const guac_rdp_keymap* keymap =
|
||||
&guac_rdp_keysym_scancode[(keysym & 0xFF00) >> 8][keysym & 0xFF];
|
||||
/* Look up scancode mapping */
|
||||
const guac_rdp_scancode_map* scancode_map = GUAC_RDP_KEYSYM_LOOKUP(*keysym_scancodes, keysym);
|
||||
|
||||
/* If defined, send event */
|
||||
if (keymap->scancode != 0)
|
||||
if (scancode_map->scancode != 0)
|
||||
rdp_inst->input->KeyboardEvent(
|
||||
rdp_inst->input,
|
||||
keymap->flags
|
||||
scancode_map->flags
|
||||
| (pressed ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE),
|
||||
keymap->scancode);
|
||||
scancode_map->scancode);
|
||||
else
|
||||
guac_client_log_info(client, "unmapped keysym: 0x%x", keysym);
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
||||
|
||||
#include "rdp_keymap.h"
|
||||
|
||||
const guac_rdp_keymap guac_rdp_keysym_scancode[256][256] = {
|
||||
const guac_rdp_scancode_map guac_rdp_keysym_scancode_en_us[256][256] = {
|
||||
{ /* 0x00?? */
|
||||
{ .scancode = 0x00, .flags = 0x00 }, /* 0x0000 */
|
||||
{ .scancode = 0x00, .flags = 0x00 }, /* 0x0001 */
|
Loading…
Reference in New Issue
Block a user