#define _GUAC_RDP_CLIENT_H
#include <freerdp/freerdp.h>
-#include <freerdp/channels/channels.h>
+#include <freerdp/codec/color.h>
#include <guacamole/client.h>
-#define RDP_DEFAULT_PORT 3389
+#include "rdp_keymap.h"
-typedef struct guac_rdp_color {
- int red;
- int green;
- int blue;
-} guac_rdp_color;
+/**
+ * The default RDP port.
+ */
+#define RDP_DEFAULT_PORT 3389
+/**
+ * Client data that will remain accessible through the guac_client.
+ * This should generally include data commonly used by Guacamole handlers.
+ */
typedef struct rdp_guac_client_data {
+ /**
+ * Pointer to the FreeRDP client instance handling the current connection.
+ */
freerdp* rdp_inst;
- rdpChannels* channels;
- rdpSettings* settings;
- int mouse_button_mask;
+ /**
+ * The settings structure associated with the FreeRDP client instance
+ * handling the current connection.
+ */
+ rdpSettings* settings;
- guac_rdp_color foreground;
- guac_rdp_color background;
+ /**
+ * Button mask containing the OR'd value of all currently pressed buttons.
+ */
+ int mouse_button_mask;
+ /**
+ * Cairo surface which will receive all TRANSPARENT glyphs.
+ */
+ cairo_surface_t* trans_glyph_surface;
+
+ /**
+ * Cairo surface which will receive all OPAQUE glyphs.
+ */
+ cairo_surface_t* opaque_glyph_surface;
+
+ /**
+ * The current Cairo surface which will receive all drawn glyphs,
+ * depending on whether we are currently drawing transparent or
+ * opaque glyphs.
+ */
+ cairo_surface_t* glyph_surface;
+
+ /**
+ * Cairo instance for drawing to the current glyph surface.
+ */
+ cairo_t* glyph_cairo;
+
+ /**
+ * The Guacamole layer that GDI operations should draw to. RDP messages
+ * exist which change this surface to allow drawing to occur off-screen.
+ */
const guac_layer* current_surface;
+ /**
+ * The keymap to use when translating keysyms into scancodes or sequences
+ * of scancodes for RDP.
+ */
+ guac_rdp_static_keymap keymap;
+
+ /**
+ * The state of all keys, based on whether events for pressing/releasing
+ * particular keysyms have been received. This is necessary in order to
+ * determine which keys must be released/pressed when a particular
+ * keysym can only be typed through a sequence of scancodes (such as
+ * an Alt-code) because the server-side keymap does not support that
+ * keysym.
+ */
+ guac_rdp_keysym_state_map keysym_state;
+
+ /**
+ * The current text (NOT Unicode) clipboard contents.
+ */
+ char* clipboard;
+
} rdp_guac_client_data;
+/**
+ * Client data that will remain accessible through the RDP context.
+ * This should generally include data commonly used by FreeRDP handlers.
+ */
typedef struct rdp_freerdp_context {
+ /**
+ * The parent context. THIS MUST BE THE FIRST ELEMENT.
+ */
rdpContext _p;
+ /**
+ * Pointer to the guac_client instance handling the RDP connection with
+ * this context.
+ */
guac_client* client;
+ /**
+ * Color conversion structure to be used to convert RDP images to PNGs.
+ */
+ CLRCONV* clrconv;
+
} rdp_freerdp_context;
#endif