138 lines
3.7 KiB
Diff
138 lines
3.7 KiB
Diff
From 5a62f87d8e1d2121968a1244f4b95a800522b6c3 Mon Sep 17 00:00:00 2001
|
|
From: Jeffy Chen <jeffy.chen@rock-chips.com>
|
|
Date: Fri, 31 May 2024 14:53:16 +0800
|
|
Subject: [PATCH 84/95] HACK: vnc: Support dynamically enabling and disabling
|
|
|
|
Tested on RK3588 EVB with:
|
|
weston -B drm,vnc
|
|
pkill -x weston -USR1
|
|
pkill -x weston -USR1
|
|
|
|
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
|
|
---
|
|
libweston/backend-vnc/vnc.c | 45 ++++++++++++++++++++++++++++++++++---
|
|
1 file changed, 42 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/libweston/backend-vnc/vnc.c b/libweston/backend-vnc/vnc.c
|
|
index 574b699..1589d28 100644
|
|
--- a/libweston/backend-vnc/vnc.c
|
|
+++ b/libweston/backend-vnc/vnc.c
|
|
@@ -30,6 +30,7 @@
|
|
#include "config.h"
|
|
|
|
#include <assert.h>
|
|
+#include <signal.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
@@ -83,6 +84,9 @@ struct vnc_backend {
|
|
struct nvnc *server;
|
|
int vnc_monitor_refresh_rate;
|
|
|
|
+ struct wl_event_source *toggle_signal;
|
|
+ struct weston_head *head;
|
|
+
|
|
const struct pixel_format_info **formats;
|
|
unsigned int formats_count;
|
|
|
|
@@ -443,6 +447,9 @@ vnc_pointer_event(struct nvnc_client *client, uint16_t x, uint16_t y,
|
|
struct timespec time;
|
|
enum nvnc_button_mask changed_button_mask;
|
|
|
|
+ if (!output)
|
|
+ return;
|
|
+
|
|
weston_compositor_get_time(&time);
|
|
|
|
if (x < output->base.width && y < output->base.height) {
|
|
@@ -1024,7 +1031,6 @@ vnc_output_disable(struct weston_output *base)
|
|
return 0;
|
|
|
|
nvnc_remove_display(backend->server, output->display);
|
|
- nvnc_display_unref(output->display);
|
|
|
|
switch (renderer->type) {
|
|
case WESTON_RENDERER_PIXMAN:
|
|
@@ -1105,6 +1111,8 @@ vnc_destroy(struct weston_backend *base)
|
|
|
|
wl_list_remove(&backend->base.link);
|
|
|
|
+ wl_event_source_remove(backend->toggle_signal);
|
|
+
|
|
wl_event_source_remove(backend->aml_event);
|
|
|
|
aml_unref(backend->aml);
|
|
@@ -1137,6 +1145,7 @@ vnc_head_create(struct vnc_backend *backend, const char *name)
|
|
weston_head_set_physical_size(&head->base, 0, 0);
|
|
|
|
head->base.backend = &backend->base;
|
|
+ backend->head = &head->base;
|
|
|
|
weston_head_set_connection_status(&head->base, true);
|
|
weston_compositor_add_head(backend->compositor, &head->base);
|
|
@@ -1306,7 +1315,11 @@ static const struct weston_vnc_output_api api = {
|
|
static int
|
|
vnc_aml_dispatch(int fd, uint32_t mask, void *data)
|
|
{
|
|
- struct aml *aml = data;
|
|
+ struct vnc_backend *backend = data;
|
|
+ struct aml *aml = backend->aml;
|
|
+
|
|
+ if (!backend->output || !backend->output->display)
|
|
+ return 0;
|
|
|
|
aml_poll(aml, 0);
|
|
aml_dispatch(aml);
|
|
@@ -1314,6 +1327,28 @@ vnc_aml_dispatch(int fd, uint32_t mask, void *data)
|
|
return 0;
|
|
}
|
|
|
|
+static int on_toggle_signal(int signal_number, void *data)
|
|
+{
|
|
+ struct vnc_backend *backend = data;
|
|
+
|
|
+ if (backend->head) {
|
|
+ struct vnc_peer *peer, *next;
|
|
+
|
|
+ weston_log("Disabling VNC...\n");
|
|
+
|
|
+ wl_list_for_each_safe(peer, next, &backend->output->peers, link)
|
|
+ nvnc_client_close(peer->client);
|
|
+
|
|
+ vnc_head_destroy(backend->head);
|
|
+ backend->head = NULL;
|
|
+ } else {
|
|
+ weston_log("Enabling VNC...\n");
|
|
+ vnc_head_create(backend, "vnc");
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static struct vnc_backend *
|
|
vnc_backend_create(struct weston_compositor *compositor,
|
|
struct weston_vnc_backend_config *config)
|
|
@@ -1415,7 +1450,7 @@ vnc_backend_create(struct weston_compositor *compositor,
|
|
|
|
backend->aml_event = wl_event_loop_add_fd(loop, fd, WL_EVENT_READABLE,
|
|
vnc_aml_dispatch,
|
|
- backend->aml);
|
|
+ backend);
|
|
|
|
backend->server = nvnc_open(config->bind_address, config->port);
|
|
if (!backend->server)
|
|
@@ -1499,6 +1534,10 @@ vnc_backend_create(struct weston_compositor *compositor,
|
|
"support failed.\n");
|
|
}
|
|
|
|
+ backend->toggle_signal = wl_event_loop_add_signal(loop, SIGUSR1,
|
|
+ on_toggle_signal,
|
|
+ backend);
|
|
+
|
|
return backend;
|
|
|
|
err_output:
|
|
--
|
|
2.20.1
|
|
|