aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-02-22 13:58:52 -0500
committerDrew DeVault <sir@cmpwn.com>2019-04-08 08:09:07 -0600
commitfd0d7d0907fcb8783c4bd2fbbd8c8812f3ba1494 (patch)
tree003f3d8f144c92cb4073a348fd4191c96eced18d /include
parent9faea17c738d9bfcdd241de7bae0bbe7590c77bf (diff)
Add FreeRDP backend for remote desktop support
Diffstat (limited to 'include')
-rw-r--r--include/backend/rdp.h98
-rw-r--r--include/wlr/backend/rdp.h31
-rw-r--r--include/wlr/config.h.in1
3 files changed, 130 insertions, 0 deletions
diff --git a/include/backend/rdp.h b/include/backend/rdp.h
new file mode 100644
index 00000000..f8faa8fd
--- /dev/null
+++ b/include/backend/rdp.h
@@ -0,0 +1,98 @@
+#ifndef BACKEND_RDP_H
+#define BACKEND_RDP_H
+#include <freerdp/codec/color.h>
+#include <freerdp/codec/nsc.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/input.h>
+#include <freerdp/listener.h>
+#include <freerdp/locale/keyboard.h>
+#include <freerdp/update.h>
+#include <pixman.h>
+#include <wlr/backend/interface.h>
+#include <wlr/backend/rdp.h>
+#include <wlr/types/wlr_input_device.h>
+#include <wlr/types/wlr_keyboard.h>
+#include <wlr/types/wlr_output.h>
+#include <wlr/types/wlr_pointer.h>
+#include <xkbcommon/xkbcommon.h>
+
+#define MAX_FREERDP_FDS 64
+
+struct wlr_rdp_peer_context;
+
+struct wlr_rdp_output {
+ struct wlr_output wlr_output;
+ struct wlr_rdp_backend *backend;
+ struct wlr_rdp_peer_context *context;
+
+ void *egl_surface;
+ pixman_image_t *shadow_surface;
+ struct wl_event_source *frame_timer;
+ int frame_delay; // ms
+};
+
+struct wlr_rdp_input_device {
+ struct wlr_input_device wlr_input_device;
+};
+
+struct wlr_rdp_keyboard {
+ struct wlr_keyboard keyboard;
+ struct xkb_keymap *keymap;
+};
+
+enum wlr_rdp_peer_flags {
+ RDP_PEER_ACTIVATED = 1 << 0,
+ RDP_PEER_OUTPUT_ENABLED = 1 << 1,
+};
+
+struct wlr_rdp_peer_context {
+ rdpContext _p;
+
+ struct wlr_rdp_backend *backend;
+ struct wl_event_source *events[MAX_FREERDP_FDS];
+ freerdp_peer *peer;
+ uint32_t flags;
+ RFX_CONTEXT *rfx_context;
+ wStream *encode_stream;
+ RFX_RECT *rfx_rects;
+ NSC_CONTEXT *nsc_context;
+
+ struct wlr_rdp_output *output;
+ struct wlr_rdp_input_device *pointer;
+ struct wlr_rdp_input_device *keyboard;
+
+ struct wl_list link;
+};
+
+struct wlr_rdp_backend {
+ struct wlr_backend backend;
+ struct wlr_egl egl;
+ struct wlr_renderer *renderer;
+ struct wl_display *display;
+ struct wl_listener display_destroy;
+
+ const char *tls_cert_path;
+ const char *tls_key_path;
+ char *address;
+ int port;
+
+ freerdp_listener *listener;
+ struct wl_event_source *listener_events[MAX_FREERDP_FDS];
+
+ struct wl_list clients;
+};
+
+struct wlr_rdp_backend *rdp_backend_from_backend(
+ struct wlr_backend *wlr_backend);
+bool rdp_configure_listener(struct wlr_rdp_backend *backend);
+int rdp_peer_init(freerdp_peer *client, struct wlr_rdp_backend *backend);
+struct wlr_rdp_output *wlr_rdp_output_create(struct wlr_rdp_backend *backend,
+ struct wlr_rdp_peer_context *context, unsigned int width,
+ unsigned int height);
+struct wlr_rdp_input_device *wlr_rdp_pointer_create(
+ struct wlr_rdp_backend *backend, struct wlr_rdp_peer_context *context);
+struct wlr_rdp_input_device *wlr_rdp_keyboard_create(
+ struct wlr_rdp_backend *backend, rdpSettings *settings);
+
+#endif
diff --git a/include/wlr/backend/rdp.h b/include/wlr/backend/rdp.h
new file mode 100644
index 00000000..3ba60c66
--- /dev/null
+++ b/include/wlr/backend/rdp.h
@@ -0,0 +1,31 @@
+/*
+ * This an unstable interface of wlroots. No guarantees are made regarding the
+ * future consistency of this API.
+ */
+#ifndef WLR_USE_UNSTABLE
+#error "Add -DWLR_USE_UNSTABLE to enable unstable wlroots features"
+#endif
+
+#ifndef WLR_BACKEND_RDP_H
+#define WLR_BACKEND_RDP_H
+#include <wlr/backend.h>
+#include <wlr/types/wlr_input_device.h>
+#include <wlr/types/wlr_output.h>
+
+/**
+ * Creates an RDP backend. An RDP backend will create one output, keyboard, and
+ * pointer for each client that connects.
+ */
+struct wlr_backend *wlr_rdp_backend_create(struct wl_display *display,
+ wlr_renderer_create_func_t create_renderer_func,
+ const char *tls_cert_path, const char *tls_key_path);
+
+void wlr_rdp_backend_set_address(struct wlr_backend *wlr_backend,
+ const char *address);
+void wlr_rdp_backend_set_port(struct wlr_backend *wlr_backend, int port);
+
+bool wlr_backend_is_rdp(struct wlr_backend *backend);
+bool wlr_input_device_is_rdp(struct wlr_input_device *device);
+bool wlr_output_is_rdp(struct wlr_output *output);
+
+#endif
diff --git a/include/wlr/config.h.in b/include/wlr/config.h.in
index 94273fac..8d86b78d 100644
--- a/include/wlr/config.h.in
+++ b/include/wlr/config.h.in
@@ -7,6 +7,7 @@
#mesondefine WLR_HAS_ELOGIND
#mesondefine WLR_HAS_X11_BACKEND
+#mesondefine WLR_HAS_RDP_BACKEND
#mesondefine WLR_HAS_XWAYLAND