compositor, backend-vnc: Allow to disable output resizing

In some use cases the VNC client should not be allowed to resize the VNC
output. Add a boolean option "resizeable" in the VNC [output] section to
control this.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
Philipp Zabel 2023-10-05 11:39:23 +02:00 committed by Philipp Zabel
parent 690beab475
commit d1df848d94
3 changed files with 16 additions and 5 deletions

View File

@ -3444,6 +3444,7 @@ vnc_backend_output_configure(struct weston_output *output)
struct weston_config_section *section; struct weston_config_section *section;
int width; int width;
int height; int height;
bool resizeable;
assert(parsed_options); assert(parsed_options);
@ -3457,10 +3458,12 @@ vnc_backend_output_configure(struct weston_output *output)
parse_simple_mode(output, section, &width, &height, &defaults, parse_simple_mode(output, section, &width, &height, &defaults,
compositor->parsed_options); compositor->parsed_options);
weston_config_section_get_bool(section, "resizeable", &resizeable, true);
weston_output_set_scale(output, 1); weston_output_set_scale(output, 1);
weston_output_set_transform(output, WL_OUTPUT_TRANSFORM_NORMAL); weston_output_set_transform(output, WL_OUTPUT_TRANSFORM_NORMAL);
if (api->output_set_size(output, width, height) < 0) { if (api->output_set_size(output, width, height, resizeable) < 0) {
weston_log("Cannot configure output \"%s\" using weston_vnc_output_api.\n", weston_log("Cannot configure output \"%s\" using weston_vnc_output_api.\n",
output->name); output->name);
return -1; return -1;

View File

@ -33,7 +33,7 @@ extern "C" {
#include <libweston/libweston.h> #include <libweston/libweston.h>
#include <libweston/plugin-registry.h> #include <libweston/plugin-registry.h>
#define WESTON_VNC_OUTPUT_API_NAME "weston_vnc_output_api_v1" #define WESTON_VNC_OUTPUT_API_NAME "weston_vnc_output_api_v2"
#define VNC_DEFAULT_FREQ 60 #define VNC_DEFAULT_FREQ 60
struct weston_vnc_output_api { struct weston_vnc_output_api {
@ -42,7 +42,7 @@ struct weston_vnc_output_api {
* Returns 0 on success, -1 on failure. * Returns 0 on success, -1 on failure.
*/ */
int (*output_set_size)(struct weston_output *output, int (*output_set_size)(struct weston_output *output,
int width, int height); int width, int height, bool resizeable);
}; };
static inline const struct weston_vnc_output_api * static inline const struct weston_vnc_output_api *

View File

@ -92,6 +92,8 @@ struct vnc_output {
struct nvnc_fb_pool *fb_pool; struct nvnc_fb_pool *fb_pool;
struct wl_list peers; struct wl_list peers;
bool resizeable;
}; };
struct vnc_peer { struct vnc_peer {
@ -400,13 +402,16 @@ vnc_handle_desktop_layout_event(struct nvnc_client *client,
vnc_log_desktop_layout(peer->backend, layout); vnc_log_desktop_layout(peer->backend, layout);
if (!output->resizeable)
return false;
new_mode.width = width; new_mode.width = width;
new_mode.height = height; new_mode.height = height;
new_mode.refresh = peer->backend->vnc_monitor_refresh_rate; new_mode.refresh = peer->backend->vnc_monitor_refresh_rate;
weston_output_mode_set_native(&output->base, &new_mode, 1); weston_output_mode_set_native(&output->base, &new_mode, 1);
return false; return true;
} }
static void static void
@ -1140,7 +1145,8 @@ vnc_switch_mode(struct weston_output *base, struct weston_mode *target_mode)
} }
static int static int
vnc_output_set_size(struct weston_output *base, int width, int height) vnc_output_set_size(struct weston_output *base, int width, int height,
bool resizeable)
{ {
struct vnc_output *output = to_vnc_output(base); struct vnc_output *output = to_vnc_output(base);
struct vnc_backend *backend = output->backend; struct vnc_backend *backend = output->backend;
@ -1164,6 +1170,8 @@ vnc_output_set_size(struct weston_output *base, int width, int height)
output->base.set_dpms = NULL; output->base.set_dpms = NULL;
output->base.switch_mode = vnc_switch_mode; output->base.switch_mode = vnc_switch_mode;
output->resizeable = resizeable;
return 0; return 0;
} }