Removed Alt-code mapping, using convenient identity relationship between keysyms and Alt-codes instead.
This commit is contained in:
parent
52eddf515a
commit
af4d4681e1
@ -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 \
|
||||
src/rdp_keymap.c \
|
||||
src/rdp_keymap_en_us.c \
|
||||
src/rdp_keymap_alt.c
|
||||
src/rdp_keymap_en_us.c
|
||||
|
||||
libguac_client_rdp_la_LDFLAGS = -version-info 0:0:0
|
||||
|
||||
|
@ -68,21 +68,6 @@ typedef struct 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
|
||||
*/
|
||||
@ -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];
|
||||
|
||||
/**
|
||||
* 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_keysym_altcode_map guac_rdp_keysym_altcode;
|
||||
|
||||
/**
|
||||
* Simple macro for referencing the mapped value of an altcode or scancode for a given keysym.
|
||||
*/
|
||||
|
@ -56,7 +56,7 @@
|
||||
|
||||
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);
|
||||
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) {
|
||||
|
||||
@ -227,11 +227,12 @@ int rdp_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) {
|
||||
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;
|
||||
freerdp* rdp_inst = guac_client_data->rdp_inst;
|
||||
const guac_rdp_keysym_scancode_map* keysym_scancodes = guac_client_data->keysym_scancodes;
|
||||
int i;
|
||||
|
||||
/* Lookup scancode for Alt */
|
||||
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 */
|
||||
rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_DOWN, alt);
|
||||
|
||||
/* For each character in Alt-code ... */
|
||||
while (*altcode != '\0') {
|
||||
/* For each character in four-digit Alt-code ... */
|
||||
for (i=0; i<4; i++) {
|
||||
|
||||
/* 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 */
|
||||
rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_DOWN, scancode);
|
||||
rdp_inst->input->KeyboardEvent(rdp_inst->input, KBD_FLAGS_RELEASE, scancode);
|
||||
|
||||
/* Next character */
|
||||
altcode++;
|
||||
/* Shift digits left by one place */
|
||||
altcode = (altcode * 10) % 10000;
|
||||
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
else {
|
||||
/* If undefined but has Alt-code, use Alt-Code */
|
||||
else if (keysym <= 0xFF) {
|
||||
|
||||
const guac_rdp_altcode_map* altcode_map = &GUAC_RDP_KEYSYM_LOOKUP(guac_rdp_keysym_altcode, keysym);
|
||||
if (altcode_map->altcode != NULL) {
|
||||
/* NOTE: The Alt-codes are conveniently identical to keysyms. */
|
||||
|
||||
/* Only send Alt-code on press */
|
||||
if (pressed)
|
||||
__guac_rdp_send_altcode(client, altcode_map->altcode);
|
||||
|
||||
}
|
||||
|
||||
/* If no defined Alt-code, log warning */
|
||||
else
|
||||
guac_client_log_info(client, "unmapped keysym: 0x%x", keysym);
|
||||
/* Only send Alt-code on press */
|
||||
if (pressed)
|
||||
__guac_rdp_send_altcode(client, keysym);
|
||||
|
||||
}
|
||||
|
||||
/* If no defined Alt-code, log warning */
|
||||
else
|
||||
guac_client_log_info(client, "unmapped keysym: 0x%x", keysym);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user