From 5a62f87d8e1d2121968a1244f4b95a800522b6c3 Mon Sep 17 00:00:00 2001 From: Jeffy Chen 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 --- 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 +#include #include #include #include @@ -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