219 lines
7.9 KiB
Diff
219 lines
7.9 KiB
Diff
|
From 99956cd5301ad1c19e3a3d07e022c942ca8b312d Mon Sep 17 00:00:00 2001
|
||
|
From: Dominique Martinet <dominique.martinet@atmark-techno.com>
|
||
|
Date: Tue, 18 May 2021 08:52:06 +0900
|
||
|
Subject: [PATCH 1/2] seat: add wlr_virtual_keyboard_manager_v1
|
||
|
|
||
|
---
|
||
|
seat.c | 43 ++++++++++++++++++++++++++++++++++++-------
|
||
|
seat.h | 4 ++++
|
||
|
2 files changed, 40 insertions(+), 7 deletions(-)
|
||
|
|
||
|
diff --git a/seat.c b/seat.c
|
||
|
index 08f25a3..d8556f6 100644
|
||
|
--- a/seat.c
|
||
|
+++ b/seat.c
|
||
|
@@ -21,6 +21,7 @@
|
||
|
#include <wlr/types/wlr_seat.h>
|
||
|
#include <wlr/types/wlr_surface.h>
|
||
|
#include <wlr/types/wlr_touch.h>
|
||
|
+#include <wlr/types/wlr_virtual_keyboard_v1.h>
|
||
|
#include <wlr/types/wlr_xcursor_manager.h>
|
||
|
#include <wlr/util/log.h>
|
||
|
#if CAGE_HAS_XWAYLAND
|
||
|
@@ -294,10 +295,16 @@ handle_keyboard_group_modifiers(struct wl_listener *listener, void *data)
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
-cg_keyboard_group_add(struct wlr_input_device *device, struct cg_seat *seat)
|
||
|
+cg_keyboard_group_add(struct wlr_input_device *device, struct cg_seat *seat, bool virtual)
|
||
|
{
|
||
|
struct wlr_keyboard *wlr_keyboard = device->keyboard;
|
||
|
|
||
|
+ if (virtual)
|
||
|
+ /* We apparently should not group virtual keyboards,
|
||
|
+ * so create a new group with it
|
||
|
+ */
|
||
|
+ goto create_new;
|
||
|
+
|
||
|
struct cg_keyboard_group *group;
|
||
|
wl_list_for_each (group, &seat->keyboard_groups, link) {
|
||
|
struct wlr_keyboard_group *wlr_group = group->wlr_group;
|
||
|
@@ -309,7 +316,9 @@ cg_keyboard_group_add(struct wlr_input_device *device, struct cg_seat *seat)
|
||
|
|
||
|
/* This is reached if and only if the keyboard could not be inserted into
|
||
|
* any group */
|
||
|
- struct cg_keyboard_group *cg_group = calloc(1, sizeof(struct cg_keyboard_group));
|
||
|
+ struct cg_keyboard_group *cg_group;
|
||
|
+create_new:
|
||
|
+ cg_group = calloc(1, sizeof(struct cg_keyboard_group));
|
||
|
if (cg_group == NULL) {
|
||
|
wlr_log(WLR_ERROR, "Failed to allocate keyboard group.");
|
||
|
return;
|
||
|
@@ -322,7 +331,7 @@ cg_keyboard_group_add(struct wlr_input_device *device, struct cg_seat *seat)
|
||
|
}
|
||
|
|
||
|
cg_group->wlr_group->data = cg_group;
|
||
|
- wlr_keyboard_set_keymap(&cg_group->wlr_group->keyboard, device->keyboard->keymap);
|
||
|
+ wlr_keyboard_set_keymap(&cg_group->wlr_group->keyboard, wlr_keyboard->keymap);
|
||
|
|
||
|
wlr_keyboard_set_repeat_info(&cg_group->wlr_group->keyboard, wlr_keyboard->repeat_info.rate,
|
||
|
wlr_keyboard->repeat_info.delay);
|
||
|
@@ -330,7 +339,10 @@ cg_keyboard_group_add(struct wlr_input_device *device, struct cg_seat *seat)
|
||
|
wlr_log(WLR_DEBUG, "Created keyboard group");
|
||
|
|
||
|
wlr_keyboard_group_add_keyboard(cg_group->wlr_group, wlr_keyboard);
|
||
|
- wl_list_insert(&seat->keyboard_groups, &cg_group->link);
|
||
|
+ if (!virtual)
|
||
|
+ wl_list_insert(&seat->keyboard_groups, &cg_group->link);
|
||
|
+ else
|
||
|
+ wl_list_init(&cg_group->link);
|
||
|
|
||
|
wl_signal_add(&cg_group->wlr_group->keyboard.events.key, &cg_group->key);
|
||
|
cg_group->key.notify = handle_keyboard_group_key;
|
||
|
@@ -347,7 +359,7 @@ cg_keyboard_group_add(struct wlr_input_device *device, struct cg_seat *seat)
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
-handle_new_keyboard(struct cg_seat *seat, struct wlr_input_device *device)
|
||
|
+handle_new_keyboard(struct cg_seat *seat, struct wlr_input_device *device, bool virtual)
|
||
|
{
|
||
|
struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
|
||
|
if (!context) {
|
||
|
@@ -374,11 +386,24 @@ handle_new_keyboard(struct cg_seat *seat, struct wlr_input_device *device)
|
||
|
xkb_context_unref(context);
|
||
|
wlr_keyboard_set_repeat_info(device->keyboard, 25, 600);
|
||
|
|
||
|
- cg_keyboard_group_add(device, seat);
|
||
|
+ cg_keyboard_group_add(device, seat, virtual);
|
||
|
|
||
|
wlr_seat_set_keyboard(seat->seat, device);
|
||
|
}
|
||
|
|
||
|
+static void
|
||
|
+handle_virtual_keyboard(struct wl_listener *listener, void *data)
|
||
|
+{
|
||
|
+ struct cg_seat *seat = wl_container_of(listener, seat, new_virtual_keyboard);
|
||
|
+ struct wlr_virtual_keyboard_v1 *keyboard = data;
|
||
|
+ struct wlr_input_device *device = &keyboard->input_device;
|
||
|
+
|
||
|
+ /* If multiple seats are supported, check keyboard->seat
|
||
|
+ * to select the appropriate one */
|
||
|
+
|
||
|
+ handle_new_keyboard(seat, device, true);
|
||
|
+}
|
||
|
+
|
||
|
static void
|
||
|
handle_new_input(struct wl_listener *listener, void *data)
|
||
|
{
|
||
|
@@ -387,7 +412,7 @@ handle_new_input(struct wl_listener *listener, void *data)
|
||
|
|
||
|
switch (device->type) {
|
||
|
case WLR_INPUT_DEVICE_KEYBOARD:
|
||
|
- handle_new_keyboard(seat, device);
|
||
|
+ handle_new_keyboard(seat, device, false);
|
||
|
break;
|
||
|
case WLR_INPUT_DEVICE_POINTER:
|
||
|
handle_new_pointer(seat, device);
|
||
|
@@ -818,6 +843,10 @@ seat_create(struct cg_server *server, struct wlr_backend *backend)
|
||
|
seat->start_drag.notify = handle_start_drag;
|
||
|
wl_signal_add(&seat->seat->events.start_drag, &seat->start_drag);
|
||
|
|
||
|
+ seat->virtual_keyboard = wlr_virtual_keyboard_manager_v1_create(server->wl_display);
|
||
|
+ wl_signal_add(&seat->virtual_keyboard->events.new_virtual_keyboard, &seat->new_virtual_keyboard);
|
||
|
+ seat->new_virtual_keyboard.notify = handle_virtual_keyboard;
|
||
|
+
|
||
|
return seat;
|
||
|
}
|
||
|
|
||
|
diff --git a/seat.h b/seat.h
|
||
|
index 188543d..428801a 100644
|
||
|
--- a/seat.h
|
||
|
+++ b/seat.h
|
||
|
@@ -25,6 +25,10 @@ struct cg_seat {
|
||
|
struct wl_list touch;
|
||
|
struct wl_listener new_input;
|
||
|
|
||
|
+ // These belong to higher level if multiple seats are allowed
|
||
|
+ struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard;
|
||
|
+ struct wl_listener new_virtual_keyboard;
|
||
|
+
|
||
|
struct wlr_cursor *cursor;
|
||
|
struct wlr_xcursor_manager *xcursor_manager;
|
||
|
struct wl_listener cursor_motion;
|
||
|
|
||
|
From 9d2e1c2131c27fd656f37580689fce92a663dad0 Mon Sep 17 00:00:00 2001
|
||
|
From: Dominique Martinet <dominique.martinet@atmark-techno.com>
|
||
|
Date: Tue, 18 May 2021 08:52:22 +0900
|
||
|
Subject: [PATCH 2/2] seat: add wlr_virtual_pointer_manager_v1
|
||
|
|
||
|
together with the previous patch, wayvnc can now be used with cage:
|
||
|
$ cage something
|
||
|
# figure out which wayland socket cage used
|
||
|
$ WAYLAND_DISPLAY=wayland-0 wayvnc
|
||
|
|
||
|
Note this does not appear to work with headless backend, e.g. starting cage with
|
||
|
WLR_BACKENDS=headless WLR_LIBINPUT_NO_DEVICES=1 cage something
|
||
|
does start and wayvnc connects/displays output, but there are tons of errors
|
||
|
and input does not work
|
||
|
---
|
||
|
seat.c | 17 +++++++++++++++++
|
||
|
seat.h | 2 ++
|
||
|
2 files changed, 19 insertions(+)
|
||
|
|
||
|
diff --git a/seat.c b/seat.c
|
||
|
index d8556f6..9bf6672 100644
|
||
|
--- a/seat.c
|
||
|
+++ b/seat.c
|
||
|
@@ -22,6 +22,7 @@
|
||
|
#include <wlr/types/wlr_surface.h>
|
||
|
#include <wlr/types/wlr_touch.h>
|
||
|
#include <wlr/types/wlr_virtual_keyboard_v1.h>
|
||
|
+#include <wlr/types/wlr_virtual_pointer_v1.h>
|
||
|
#include <wlr/types/wlr_xcursor_manager.h>
|
||
|
#include <wlr/util/log.h>
|
||
|
#if CAGE_HAS_XWAYLAND
|
||
|
@@ -216,6 +217,18 @@ handle_new_pointer(struct cg_seat *seat, struct wlr_input_device *device)
|
||
|
map_input_device_to_output(seat, device);
|
||
|
}
|
||
|
|
||
|
+static void
|
||
|
+handle_virtual_pointer(struct wl_listener *listener, void *data)
|
||
|
+{
|
||
|
+ struct cg_seat *seat = wl_container_of(listener, seat, new_virtual_pointer);
|
||
|
+ struct wlr_virtual_pointer_v1_new_pointer_event *event = data;
|
||
|
+ struct wlr_virtual_pointer_v1 *pointer = event->new_pointer;
|
||
|
+ struct wlr_input_device *device = &pointer->input_device;
|
||
|
+
|
||
|
+ /* event->suggested_seat should be checked if we handle multiple seats */
|
||
|
+ handle_new_pointer(seat, device);
|
||
|
+}
|
||
|
+
|
||
|
static void
|
||
|
handle_modifier_event(struct wlr_input_device *device, struct cg_seat *seat)
|
||
|
{
|
||
|
@@ -847,6 +860,10 @@ seat_create(struct cg_server *server, struct wlr_backend *backend)
|
||
|
wl_signal_add(&seat->virtual_keyboard->events.new_virtual_keyboard, &seat->new_virtual_keyboard);
|
||
|
seat->new_virtual_keyboard.notify = handle_virtual_keyboard;
|
||
|
|
||
|
+ seat->virtual_pointer = wlr_virtual_pointer_manager_v1_create(server->wl_display);
|
||
|
+ wl_signal_add(&seat->virtual_pointer->events.new_virtual_pointer, &seat->new_virtual_pointer);
|
||
|
+ seat->new_virtual_pointer.notify = handle_virtual_pointer;
|
||
|
+
|
||
|
return seat;
|
||
|
}
|
||
|
|
||
|
diff --git a/seat.h b/seat.h
|
||
|
index 428801a..0f6de59 100644
|
||
|
--- a/seat.h
|
||
|
+++ b/seat.h
|
||
|
@@ -27,7 +27,9 @@ struct cg_seat {
|
||
|
|
||
|
// These belong to higher level if multiple seats are allowed
|
||
|
struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard;
|
||
|
+ struct wlr_virtual_pointer_manager_v1 *virtual_pointer;
|
||
|
struct wl_listener new_virtual_keyboard;
|
||
|
+ struct wl_listener new_virtual_pointer;
|
||
|
|
||
|
struct wlr_cursor *cursor;
|
||
|
struct wlr_xcursor_manager *xcursor_manager;
|