Restructure input initialisation

vencrypt
Andri Yngvason 2020-01-24 20:56:47 +00:00
parent b0077c93fe
commit 7eaece7c0a
3 changed files with 42 additions and 36 deletions

View File

@ -22,7 +22,6 @@
struct pointer { struct pointer {
struct nvnc* vnc; struct nvnc* vnc;
struct zwlr_virtual_pointer_manager_v1* manager;
struct zwlr_virtual_pointer_v1* pointer; struct zwlr_virtual_pointer_v1* pointer;
enum nvnc_button_mask current_mask; enum nvnc_button_mask current_mask;
@ -34,7 +33,7 @@ struct pointer {
uint32_t height; uint32_t height;
}; };
int pointer_init(struct pointer* self, struct wl_seat* seat); int pointer_init(struct pointer* self);
void pointer_destroy(struct pointer* self); void pointer_destroy(struct pointer* self);
void pointer_set(struct pointer* self, uint32_t x, uint32_t y, void pointer_set(struct pointer* self, uint32_t x, uint32_t y,

View File

@ -66,6 +66,7 @@ struct wayvnc {
struct zxdg_output_manager_v1* xdg_output_manager; struct zxdg_output_manager_v1* xdg_output_manager;
struct zwp_virtual_keyboard_manager_v1* keyboard_manager; struct zwp_virtual_keyboard_manager_v1* keyboard_manager;
struct zwlr_virtual_pointer_manager_v1* pointer_manager;
struct renderer renderer; struct renderer renderer;
const struct output* selected_output; const struct output* selected_output;
@ -158,7 +159,7 @@ static void registry_add(void* data, struct wl_registry* registry,
} }
if (strcmp(interface, zwlr_virtual_pointer_manager_v1_interface.name) == 0) { if (strcmp(interface, zwlr_virtual_pointer_manager_v1_interface.name) == 0) {
self->pointer_backend.manager = self->pointer_manager =
wl_registry_bind(registry, id, wl_registry_bind(registry, id,
&zwlr_virtual_pointer_manager_v1_interface, &zwlr_virtual_pointer_manager_v1_interface,
1); 1);
@ -229,7 +230,7 @@ void wayvnc_destroy(struct wayvnc* self)
zwp_virtual_keyboard_manager_v1_destroy(self->keyboard_manager); zwp_virtual_keyboard_manager_v1_destroy(self->keyboard_manager);
keyboard_destroy(&self->keyboard_backend); keyboard_destroy(&self->keyboard_backend);
zwlr_virtual_pointer_manager_v1_destroy(self->pointer_backend.manager); zwlr_virtual_pointer_manager_v1_destroy(self->pointer_manager);
pointer_destroy(&self->pointer_backend); pointer_destroy(&self->pointer_backend);
if (self->screencopy_backend.manager) if (self->screencopy_backend.manager)
@ -241,6 +242,18 @@ void wayvnc_destroy(struct wayvnc* self)
wl_display_disconnect(self->display); wl_display_disconnect(self->display);
} }
static void init_xdg_outputs(struct wayvnc* self)
{
struct output* output;
wl_list_for_each(output, &self->outputs, link) {
struct zxdg_output_v1* xdg_output =
zxdg_output_manager_v1_get_xdg_output(
self->xdg_output_manager, output->wl_output);
output_set_xdg_output(output, xdg_output);
}
}
static int init_wayland(struct wayvnc* self) static int init_wayland(struct wayvnc* self)
{ {
static const struct wl_registry_listener registry_listener = { static const struct wl_registry_listener registry_listener = {
@ -264,6 +277,21 @@ static int init_wayland(struct wayvnc* self)
wl_display_dispatch(self->display); wl_display_dispatch(self->display);
wl_display_roundtrip(self->display); wl_display_roundtrip(self->display);
init_xdg_outputs(self);
if (!self->pointer_manager) {
log_error("Virtual Pointer protocol not supported by compositor.\n");
goto failure;
}
if (!self->keyboard_manager) {
log_error("Virtual Keyboard protocol not supported by compositor.\n");
goto failure;
}
wl_display_dispatch(self->display);
wl_display_roundtrip(self->display);
if (!self->dmabuf_backend.manager && !self->screencopy_backend.manager) { if (!self->dmabuf_backend.manager && !self->screencopy_backend.manager) {
log_error("Compositor supports neither screencopy nor export-dmabuf! Exiting.\n"); log_error("Compositor supports neither screencopy nor export-dmabuf! Exiting.\n");
goto failure; goto failure;
@ -275,18 +303,6 @@ static int init_wayland(struct wayvnc* self)
self->screencopy_backend.frame_capture.on_done = on_capture_done; self->screencopy_backend.frame_capture.on_done = on_capture_done;
self->screencopy_backend.frame_capture.userdata = self; self->screencopy_backend.frame_capture.userdata = self;
struct output* output;
wl_list_for_each(output, &self->outputs, link) {
struct zxdg_output_v1* xdg_output =
zxdg_output_manager_v1_get_xdg_output(
self->xdg_output_manager, output->wl_output);
output_set_xdg_output(output, xdg_output);
}
wl_display_dispatch(self->display);
wl_display_roundtrip(self->display);
return 0; return 0;
failure: failure:
@ -405,7 +421,7 @@ int init_nvnc(struct wayvnc* self, const char* addr, uint16_t port)
self->selected_output->height, self->selected_output->height,
format); format);
if (self->pointer_backend.manager) if (self->pointer_manager)
nvnc_set_pointer_fn(self->nvnc, on_pointer_event); nvnc_set_pointer_fn(self->nvnc, on_pointer_event);
if (self->keyboard_backend.virtual_keyboard) if (self->keyboard_backend.virtual_keyboard)
@ -676,27 +692,21 @@ int main(int argc, char* argv[])
self.dmabuf_backend.fc.wl_output = out->wl_output; self.dmabuf_backend.fc.wl_output = out->wl_output;
self.screencopy_backend.frame_capture.wl_output = out->wl_output; self.screencopy_backend.frame_capture.wl_output = out->wl_output;
if (self.pointer_backend.manager) {
self.pointer_backend.width = out->width;
self.pointer_backend.height = out->height;
}
assert(self.keyboard_manager);
self.keyboard_backend.virtual_keyboard = self.keyboard_backend.virtual_keyboard =
zwp_virtual_keyboard_manager_v1_create_virtual_keyboard( zwp_virtual_keyboard_manager_v1_create_virtual_keyboard(
self.keyboard_manager, self.selected_seat->wl_seat); self.keyboard_manager, self.selected_seat->wl_seat);
keyboard_init(&self.keyboard_backend, self.kb_layout); keyboard_init(&self.keyboard_backend, self.kb_layout);
if (self.pointer_backend.manager) { self.pointer_backend.vnc = self.nvnc;
self.pointer_backend.vnc = self.nvnc; self.pointer_backend.width = out->width;
pointer_init(&self.pointer_backend, self.selected_seat->wl_seat); self.pointer_backend.height = out->height;
} else {
log_error("Compositor does not support %s.\n", self.pointer_backend.pointer =
zwlr_virtual_pointer_manager_v1_interface.name); zwlr_virtual_pointer_manager_v1_create_virtual_pointer(
goto failure; self.pointer_manager, self.selected_seat->wl_seat);
}
pointer_init(&self.pointer_backend);
if (renderer_init(&self.renderer, self.selected_output->width, if (renderer_init(&self.renderer, self.selected_output->width,
self.selected_output->height) < 0) { self.selected_output->height) < 0) {

View File

@ -23,11 +23,8 @@
#include "wlr-virtual-pointer-unstable-v1.h" #include "wlr-virtual-pointer-unstable-v1.h"
#include "time-util.h" #include "time-util.h"
int pointer_init(struct pointer* self, struct wl_seat* seat) int pointer_init(struct pointer* self)
{ {
self->pointer =
zwlr_virtual_pointer_manager_v1_create_virtual_pointer(self->manager, seat);
zwlr_virtual_pointer_v1_axis_source(self->pointer, zwlr_virtual_pointer_v1_axis_source(self->pointer,
WL_POINTER_AXIS_SOURCE_WHEEL); WL_POINTER_AXIS_SOURCE_WHEEL);
return 0; return 0;