Removed Alt-code mapping, using convenient identity relationship between keysyms and Alt-codes instead.

This commit is contained in:
Michael Jumper 2012-03-20 22:48:18 -07:00
parent 52eddf515a
commit af4d4681e1
4 changed files with 23 additions and 5488 deletions

View File

@ -43,8 +43,7 @@ lib_LTLIBRARIES = libguac-client-rdp.la
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 \ 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.c \ src/rdp_keymap.c \
src/rdp_keymap_en_us.c \ src/rdp_keymap_en_us.c
src/rdp_keymap_alt.c
libguac_client_rdp_la_LDFLAGS = -version-info 0:0:0 libguac_client_rdp_la_LDFLAGS = -version-info 0:0:0

View File

@ -68,21 +68,6 @@ typedef struct guac_rdp_scancode_map {
} guac_rdp_scancode_map; } guac_rdp_scancode_map;
/**
* Represents the Alt-code which types a given keysym. This is used as a
* fallback mapping, should a particular keymap not support a certain keysym.
*
* See: http://en.wikipedia.org/wiki/Alt_code
*/
typedef struct guac_rdp_altcode_map {
/**
* The 4-digit Alt-code which types this keysym.
*/
const char* altcode;
} guac_rdp_altcode_map;
/** /**
* Mapping from keysym to current state * Mapping from keysym to current state
*/ */
@ -93,21 +78,11 @@ typedef int guac_rdp_keysym_state_map[256][256];
*/ */
typedef guac_rdp_scancode_map guac_rdp_keysym_scancode_map[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). * Map of X11 keysyms to RDP scancodes (US English).
*/ */
extern const guac_rdp_keysym_scancode_map guac_rdp_keysym_scancode_en_us; 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_keysym_altcode_map guac_rdp_keysym_altcode;
/** /**
* Simple macro for referencing the mapped value of an altcode or scancode for a given keysym. * Simple macro for referencing the mapped value of an altcode or scancode for a given keysym.
*/ */

View File

@ -56,7 +56,7 @@
void __guac_rdp_update_keysyms(guac_client* client, const int* keysym_string, int from, int to); void __guac_rdp_update_keysyms(guac_client* client, const int* keysym_string, int from, int to);
int __guac_rdp_send_keysym(guac_client* client, int keysym, int pressed); int __guac_rdp_send_keysym(guac_client* client, int keysym, int pressed);
void __guac_rdp_send_altcode(guac_client* client, const char* altcode); void __guac_rdp_send_altcode(guac_client* client, int altcode);
int rdp_guac_client_free_handler(guac_client* client) { int rdp_guac_client_free_handler(guac_client* client) {
@ -227,11 +227,12 @@ int rdp_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) {
return 0; return 0;
} }
void __guac_rdp_send_altcode(guac_client* client, const char* altcode) { void __guac_rdp_send_altcode(guac_client* client, int altcode) {
rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data;
freerdp* rdp_inst = guac_client_data->rdp_inst; freerdp* rdp_inst = guac_client_data->rdp_inst;
const guac_rdp_keysym_scancode_map* keysym_scancodes = guac_client_data->keysym_scancodes; const guac_rdp_keysym_scancode_map* keysym_scancodes = guac_client_data->keysym_scancodes;
int i;
/* Lookup scancode for Alt */ /* Lookup scancode for Alt */
int alt = GUAC_RDP_KEYSYM_LOOKUP(*keysym_scancodes, 0xFFE9 /* Alt_L */).scancode; int alt = GUAC_RDP_KEYSYM_LOOKUP(*keysym_scancodes, 0xFFE9 /* Alt_L */).scancode;
@ -242,18 +243,22 @@ void __guac_rdp_send_altcode(guac_client* client, const char* altcode) {
/* Press Alt */ /* Press Alt */
rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_DOWN, alt); rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_DOWN, alt);
/* For each character in Alt-code ... */ /* For each character in four-digit Alt-code ... */
while (*altcode != '\0') { for (i=0; i<4; i++) {
/* Get scancode of keypad digit */ /* Get scancode of keypad digit */
int scancode = GUAC_RDP_KEYSYM_LOOKUP(*keysym_scancodes, 0xFFB0 + (*altcode) - '0').scancode; int scancode = GUAC_RDP_KEYSYM_LOOKUP(
*keysym_scancodes,
0xFFB0 + (altcode / 1000)
).scancode;
/* Press and release digit */ /* Press and release digit */
rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_DOWN, scancode); rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_DOWN, scancode);
rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_RELEASE, scancode); rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_RELEASE, scancode);
/* Next character */ /* Shift digits left by one place */
altcode++; altcode = (altcode * 10) % 10000;
} }
/* Release Alt */ /* Release Alt */
@ -304,24 +309,21 @@ int __guac_rdp_send_keysym(guac_client* client, int keysym, int pressed) {
} }
/* If undefined, try to type using Alt-code */ /* If undefined but has Alt-code, use Alt-Code */
else { else if (keysym <= 0xFF) {
const guac_rdp_altcode_map* altcode_map = &GUAC_RDP_KEYSYM_LOOKUP(guac_rdp_keysym_altcode, keysym); /* NOTE: The Alt-codes are conveniently identical to keysyms. */
if (altcode_map->altcode != NULL) {
/* Only send Alt-code on press */ /* Only send Alt-code on press */
if (pressed) if (pressed)
__guac_rdp_send_altcode(client, altcode_map->altcode); __guac_rdp_send_altcode(client, keysym);
}
/* If no defined Alt-code, log warning */
else
guac_client_log_info(client, "unmapped keysym: 0x%x", keysym);
} }
/* If no defined Alt-code, log warning */
else
guac_client_log_info(client, "unmapped keysym: 0x%x", keysym);
} }
return 0; return 0;

File diff suppressed because it is too large Load Diff