Allow storage of keysyms in the 0x0100xxxx space. Map AltGr to Ctrl+Alt.

This commit is contained in:
Michael Jumper 2013-05-08 18:24:46 -07:00
parent 4cb9b67a6f
commit 7fa531cc2e
3 changed files with 22 additions and 8 deletions

View File

@ -114,12 +114,12 @@ struct guac_rdp_keymap {
/**
* Static mapping from keysyms to scancodes.
*/
typedef guac_rdp_keysym_desc guac_rdp_static_keymap[256][256];
typedef guac_rdp_keysym_desc guac_rdp_static_keymap[0x200][0x100];
/**
* Mapping from keysym to current state
*/
typedef int guac_rdp_keysym_state_map[256][256];
typedef int guac_rdp_keysym_state_map[0x200][0x100];
/**
* US English keymap.
@ -147,10 +147,22 @@ extern const guac_rdp_keymap guac_rdp_keymap_failsafe;
extern const guac_rdp_keymap guac_rdp_keymap_base;
/**
* Simple macro for referencing the mapped value of a scancode for a given
* keysym.
* Simple macro for determing whether a keysym can be stored (or retrieved)
* from any keymap.
*/
#define GUAC_RDP_KEYSYM_LOOKUP(keysym_mapping, keysym) ((keysym_mapping)[((keysym) & 0xFF00) >> 8][(keysym) & 0xFF])
#define GUAC_RDP_KEYSYM_STORABLE(keysym) ((keysym) <= 0xFFFF || ((keysym) & 0xFFFF0000) == 0x01000000)
/**
* Simple macro for referencing the mapped value of a scancode for a given
* keysym. The idea here is that a keysym of the form 0xABCD will map to
* mapping[0xAB][0xCD] while a keysym of the form 0x100ABCD will map to
* mapping[0x1AB][0xCD].
*/
#define GUAC_RDP_KEYSYM_LOOKUP(keysym_mapping, keysym) ( \
(keysym_mapping) \
[(((keysym) & 0xFF00) >> 8) | ((keysym) >> 16)] \
[(keysym) & 0xFF] \
)
/**
* Keysym string containing only the left "shift" key.

View File

@ -301,7 +301,7 @@ int __guac_rdp_send_keysym(guac_client* client, int keysym, int pressed) {
freerdp* rdp_inst = guac_client_data->rdp_inst;
/* If keysym can be in lookup table */
if (keysym <= 0xFFFF) {
if (GUAC_RDP_KEYSYM_STORABLE(keysym)) {
/* Look up scancode mapping */
const guac_rdp_keysym_desc* keysym_desc =
@ -402,6 +402,7 @@ 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;
/* Update keysym state */
if (GUAC_RDP_KEYSYM_STORABLE(keysym))
GUAC_RDP_KEYSYM_LOOKUP(guac_client_data->keysym_state, keysym) = pressed;
return __guac_rdp_send_keysym(client, keysym, pressed);

View File

@ -186,7 +186,8 @@ static guac_rdp_keysym_desc __guac_rdp_keymap_mapping[] = {
{ .keysym = 0xffe9, .scancode = 0x38 },
/* Alt_R */
{ .keysym = 0xffea, .scancode = 0xB8 },
{ .keysym = 0xffea, .scancode = 0x38,
.set_keysyms = GUAC_KEYSYMS_CTRL },
/* Super_L */
{ .keysym = 0xffeb, .scancode = 0x5B,