1From b44de26492873a65a12a4e0f0059dc11f195a021 Mon Sep 17 00:00:00 2001
2From: Philipp Zabel <p.zabel@pengutronix.de>
3Date: Thu, 6 Oct 2022 16:26:58 +0200
4Subject: [PATCH 85/92] backend-vnc: implement direct key code handling
5
6Allow clients that support the QEMU Extended Key Event Message to send
7keycodes directly.
8
9Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
10(cherry picked from commit 5cd87ff80188d3a9007a861e165626a03274ac61)
11Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
12---
13 libweston/backend-vnc/vnc.c | 19 +++++++++++++++++++
14 1 file changed, 19 insertions(+)
15
16diff --git a/libweston/backend-vnc/vnc.c b/libweston/backend-vnc/vnc.c
17index 8cfad2a..dbcb395 100644
18--- a/libweston/backend-vnc/vnc.c
19+++ b/libweston/backend-vnc/vnc.c
20@@ -333,6 +333,24 @@ vnc_handle_key_event(struct nvnc_client *client, uint32_t keysym,
21 			   STATE_UPDATE_AUTOMATIC);
22 }
23
24+static void
25+vnc_handle_key_code_event(struct nvnc_client *client, uint32_t key,
26+			  bool is_pressed)
27+{
28+	struct vnc_peer *peer = nvnc_get_userdata(client);
29+	enum wl_keyboard_key_state state;
30+	struct timespec time;
31+
32+	weston_compositor_get_time(&time);
33+
34+	if (is_pressed)
35+		state = WL_KEYBOARD_KEY_STATE_PRESSED;
36+	else
37+		state = WL_KEYBOARD_KEY_STATE_RELEASED;
38+
39+	notify_key(peer->seat, &time, key, state, STATE_UPDATE_AUTOMATIC);
40+}
41+
42 static void
43 vnc_pointer_event(struct nvnc_client *client, uint16_t x, uint16_t y,
44 		  enum nvnc_button_mask button_mask)
45@@ -975,6 +993,7 @@ vnc_backend_create(struct weston_compositor *compositor,
46 	nvnc_set_new_client_fn(backend->server, vnc_new_client);
47 	nvnc_set_pointer_fn(backend->server, vnc_pointer_event);
48 	nvnc_set_key_fn(backend->server, vnc_handle_key_event);
49+	nvnc_set_key_code_fn(backend->server, vnc_handle_key_code_event);
50 	nvnc_set_userdata(backend->server, backend, NULL);
51 	nvnc_set_name(backend->server, "Weston VNC backend");
52
53--
542.20.1
55
56