Function without virtual keyboard, mouse protocol

Some compositors have a working screencopy protocol implementation but
are missing virtual keyboard and/or virtual mouse protocols. On those
compositors, don't just outright fail but instead provide a new option
to disable all remote input: --disable-input.

This is useful for using a different system (like a tablet) as
additional screen without the system providing any kind of input.
pull/131/head
Consolatis 2022-01-28 01:10:20 +01:00 committed by Andri Yngvason
parent 3b26a43b97
commit e9e7c1a33f
2 changed files with 54 additions and 35 deletions

View File

@ -283,12 +283,16 @@ void wayvnc_destroy(struct wayvnc* self)
wl_shm_destroy(wl_shm);
zwp_virtual_keyboard_v1_destroy(self->keyboard_backend.virtual_keyboard);
zwp_virtual_keyboard_manager_v1_destroy(self->keyboard_manager);
keyboard_destroy(&self->keyboard_backend);
if (self->keyboard_manager) {
zwp_virtual_keyboard_v1_destroy(self->keyboard_backend.virtual_keyboard);
zwp_virtual_keyboard_manager_v1_destroy(self->keyboard_manager);
keyboard_destroy(&self->keyboard_backend);
}
zwlr_virtual_pointer_manager_v1_destroy(self->pointer_manager);
pointer_destroy(&self->pointer_backend);
if (self->pointer_manager) {
zwlr_virtual_pointer_manager_v1_destroy(self->pointer_manager);
pointer_destroy(&self->pointer_backend);
}
if (self->screencopy.manager)
zwlr_screencopy_manager_v1_destroy(self->screencopy.manager);
@ -311,7 +315,7 @@ static void init_xdg_outputs(struct wayvnc* self)
}
}
static int init_wayland(struct wayvnc* self)
static int init_wayland(struct wayvnc* self, bool disable_input)
{
static const struct wl_registry_listener registry_listener = {
.global = registry_add,
@ -336,13 +340,15 @@ static int init_wayland(struct wayvnc* self)
init_xdg_outputs(self);
if (!self->pointer_manager) {
if (!self->pointer_manager && !disable_input) {
log_error("Virtual Pointer protocol not supported by compositor.\n");
log_error("wayvnc may still work if started with --disable-input.\n");
goto failure;
}
if (!self->keyboard_manager) {
if (!self->keyboard_manager && !disable_input) {
log_error("Virtual Keyboard protocol not supported by compositor.\n");
log_error("wayvnc may still work if started with --disable-input.\n");
goto failure;
}
@ -504,7 +510,7 @@ int init_nvnc(struct wayvnc* self, const char* addr, uint16_t port, bool is_unix
goto failure;
}
if (self->pointer_manager)
if (self->pointer_backend.pointer)
nvnc_set_pointer_fn(self->nvnc, on_pointer_event);
if (self->keyboard_backend.virtual_keyboard) {
@ -645,6 +651,7 @@ int wayvnc_usage(FILE* stream, int rc)
" -p,--show-performance Show performance counters.\n"
" -u,--unix-socket Create a UNIX domain socket\n"
" instead of TCP.\n"
" -d,--disable-input Disable all remote input\n"
" -V,--version Show version info.\n"
" -h,--help Get help (this text).\n"
"\n";
@ -750,8 +757,9 @@ int main(int argc, char* argv[])
bool overlay_cursor = false;
bool show_performance = false;
int max_rate = 30;
bool disable_input = false;
static const char* shortopts = "C:o:k:s:rf:hpuV";
static const char* shortopts = "C:o:k:s:rf:hpudV";
int drm_fd MAYBE_UNUSED = -1;
static const struct option longopts[] = {
@ -764,6 +772,7 @@ int main(int argc, char* argv[])
{ "help", no_argument, NULL, 'h' },
{ "show-performance", no_argument, NULL, 'p' },
{ "unix-socket", no_argument, NULL, 'u' },
{ "disable-input", no_argument, NULL, 'd' },
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
};
@ -798,6 +807,9 @@ int main(int argc, char* argv[])
case 'u':
use_unix_socket = true;
break;
case 'd':
disable_input = true;
break;
case 'V':
return show_version();
case 'h':
@ -839,7 +851,7 @@ int main(int argc, char* argv[])
if (!address) address = DEFAULT_ADDRESS;
if (!port) port = DEFAULT_PORT;
if (init_wayland(&self) < 0) {
if (init_wayland(&self, disable_input) < 0) {
log_error("Failed to initialise wayland\n");
return 1;
}
@ -879,39 +891,42 @@ int main(int argc, char* argv[])
self.screencopy.wl_output = out->wl_output;
self.screencopy.rate_limit = max_rate;
self.keyboard_backend.virtual_keyboard =
zwp_virtual_keyboard_manager_v1_create_virtual_keyboard(
self.keyboard_manager, self.selected_seat->wl_seat);
if (!disable_input && self.keyboard_manager) {
self.keyboard_backend.virtual_keyboard =
zwp_virtual_keyboard_manager_v1_create_virtual_keyboard(
self.keyboard_manager, self.selected_seat->wl_seat);
struct xkb_rule_names rule_names = {
.rules = self.cfg.xkb_rules,
.layout = self.kb_layout ? self.kb_layout : self.cfg.xkb_layout,
.model = self.cfg.xkb_model ? self.cfg.xkb_model : "pc105",
.variant = self.kb_variant ? self.kb_variant :
self.cfg.xkb_variant,
.options = self.cfg.xkb_options,
};
struct xkb_rule_names rule_names = {
.rules = self.cfg.xkb_rules,
.layout = self.kb_layout ? self.kb_layout : self.cfg.xkb_layout,
.model = self.cfg.xkb_model ? self.cfg.xkb_model : "pc105",
.variant = self.kb_variant ? self.kb_variant :
self.cfg.xkb_variant,
.options = self.cfg.xkb_options,
};
if (keyboard_init(&self.keyboard_backend, &rule_names) < 0) {
log_error("Failed to initialise keyboard\n");
goto failure;
if (keyboard_init(&self.keyboard_backend, &rule_names) < 0) {
log_error("Failed to initialise keyboard\n");
goto failure;
}
}
self.pointer_backend.vnc = self.nvnc;
self.pointer_backend.output = self.selected_output;
int pointer_manager_version =
zwlr_virtual_pointer_manager_v1_get_version(self.pointer_manager);
if (!disable_input && self.pointer_manager) {
int pointer_manager_version =
zwlr_virtual_pointer_manager_v1_get_version(self.pointer_manager);
self.pointer_backend.pointer = pointer_manager_version >= 2
? zwlr_virtual_pointer_manager_v1_create_virtual_pointer_with_output(
self.pointer_manager, self.selected_seat->wl_seat,
out->wl_output)
: zwlr_virtual_pointer_manager_v1_create_virtual_pointer(
self.pointer_manager, self.selected_seat->wl_seat);
pointer_init(&self.pointer_backend);
self.pointer_backend.pointer = pointer_manager_version >= 2
? zwlr_virtual_pointer_manager_v1_create_virtual_pointer_with_output(
self.pointer_manager, self.selected_seat->wl_seat,
out->wl_output)
: zwlr_virtual_pointer_manager_v1_create_virtual_pointer(
self.pointer_manager, self.selected_seat->wl_seat);
pointer_init(&self.pointer_backend);
}
out->on_dimension_change = on_output_dimension_change;
out->userdata = &self;

View File

@ -35,6 +35,10 @@ wayvnc - A VNC server for wlroots based Wayland compositors.
Create a UNIX domain socket instead of TCP, treating the address as a
path.
*-d, --disable-input*
Disable all remote input. This allows using wayvnc without compositor
support of virtual mouse / keyboard protocols.
*-V, --version*
Show version info.