*
* ***** END LICENSE BLOCK ***** */
-#ifndef _GUAC_CLIENT_RDP_KEYMAP
-#define _GUAC_CLIENT_RDP_KEYMAP
+#ifndef _GUAC_RDP_RDP_KEYMAP_H
+#define _GUAC_RDP_RDP_KEYMAP_H
-typedef struct guac_rdp_keymap {
+#include <freerdp/locale/keyboard.h>
+
+/**
+ * Represents a keysym-to-scancode mapping for RDP, with extra information
+ * about the state of prerequisite keysyms.
+ */
+typedef struct guac_rdp_keysym_desc {
+
+ /**
+ * The keysym being mapped.
+ */
+ int keysym;
+
+ /**
+ * The scancode this keysym maps to.
+ */
int scancode;
+
+ /**
+ * Required RDP-specific flags.
+ */
int flags;
-} guac_rdp_keymap;
-extern const guac_rdp_keymap guac_rdp_keysym_scancode[256][256];
+ /**
+ * Null-terminated list of keysyms which must be down for this keysym
+ * to be properly typed.
+ */
+ const int* set_keysyms;
+
+ /**
+ * Null-terminated list of keysyms which must be up for this keysym
+ * to be properly typed.
+ */
+ const int* clear_keysyms;
+
+} guac_rdp_keysym_desc;
+
+/**
+ * Hierarchical keysym mapping
+ */
+typedef struct guac_rdp_keymap guac_rdp_keymap;
+struct guac_rdp_keymap {
+
+ /**
+ * The parent mapping this map will inherit its initial mapping from.
+ * Any other mapping information will add to or override the mapping
+ * inherited from the parent.
+ */
+ const guac_rdp_keymap* parent;
+
+ /**
+ * Descriptive name of this keymap
+ */
+ const char* name;
+
+ /**
+ * Null-terminated array of scancode mappings.
+ */
+ const guac_rdp_keysym_desc* mapping;
+
+ /**
+ * FreeRDP keyboard layout associated with this
+ * keymap. If this keymap is selected, this layout
+ * will be requested from the server.
+ */
+ const uint32 freerdp_keyboard_layout;
+
+};
+
+/**
+ * Static mapping from keysyms to scancodes.
+ */
+typedef guac_rdp_keysym_desc guac_rdp_static_keymap[256][256];
+
+/**
+ * Mapping from keysym to current state
+ */
+typedef int guac_rdp_keysym_state_map[256][256];
+
+/**
+ * Map of X11 keysyms to RDP scancodes (US English).
+ */
+extern const guac_rdp_keymap guac_rdp_keymap_en_us;
+
+/**
+ * Map of X11 keysyms to RDP scancodes (common non-printable keys).
+ */
+extern const guac_rdp_keymap guac_rdp_keymap_base;
+
+/**
+ * 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])
+
+/**
+ * Keysym string containing only the left "shift" key.
+ */
+extern const int GUAC_KEYSYMS_SHIFT[];
+
+/**
+ * Keysym string containing both "shift" keys.
+ */
+extern const int GUAC_KEYSYMS_ALL_SHIFT[];
+
+/**
+ * Keysym string containing only the left "ctrl" key.
+ */
+extern const int GUAC_KEYSYMS_CTRL[];
+
+/**
+ * Keysym string containing both "ctrl" keys.
+ */
+extern const int GUAC_KEYSYMS_ALL_CTRL[];
+
+/**
+ * Keysym string containing only the left "alt" key.
+ */
+extern const int GUAC_KEYSYMS_ALT[];
+
+/**
+ * Keysym string containing both "alt" keys.
+ */
+extern const int GUAC_KEYSYMS_ALL_ALT[];
+
+/**
+ * Keysym string containing all modifier keys.
+ */
+extern const int GUAC_KEYSYMS_ALL_MODIFIERS[];
#endif