code: drawterm

Download patch

ref: 45d5ae0b39ece30ecb7804e1e98239e8fe119bfa
parent: 4fd4bb2017a76e09d8f2309211037479d6219507
author: Jacob Moody <moody@posixcafe.org>
date: Fri Jan 20 01:47:44 EST 2023

gui-wl: implement pointer warp for wlroots

--- a/gui-wl/Makefile
+++ b/gui-wl/Makefile
@@ -10,6 +10,7 @@
 	xdg-shell-protocol.h\
 	xdg-decoration-protocol.h\
 	xdg-primary-selection-protocol.h\
+	wlr-virtual-pointer.h\
 	wl-inc.h\
 
 OFILES=\
@@ -16,9 +17,19 @@
 	xdg-shell-protocol.$O\
 	xdg-decoration-protocol.$O\
 	xdg-primary-selection-protocol.$O\
+	wlr-virtual-pointer.$O\
 	wl-cb.$O\
 	wl-screen.$O\
 	wl-util.$O\
+
+wlr-virtual-pointer-unstable-v1.xml:
+	curl https://gitlab.freedesktop.org/wlroots/wlr-protocols/-/raw/master/unstable/wlr-virtual-pointer-unstable-v1.xml > $@
+
+wlr-virtual-pointer.c: wlr-virtual-pointer-unstable-v1.xml
+	wayland-scanner private-code < wlr-virtual-pointer-unstable-v1.xml > $@ || { rm -f $@; exit 1; }
+
+wlr-virtual-pointer.h: wlr-virtual-pointer-unstable-v1.xml
+	wayland-scanner client-header < wlr-virtual-pointer-unstable-v1.xml > $@ || { rm -f $@; exit 1; }
 
 xdg-shell-protocol.c:
 	wayland-scanner private-code < $(XDG_SHELL) > $@ || { rm -f $@; exit 1; }
--- a/gui-wl/wl-cb.c
+++ b/gui-wl/wl-cb.c
@@ -7,10 +7,12 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <time.h>
 #include <xkbcommon/xkbcommon.h>
 #include "xdg-shell-protocol.h"
 #include "xdg-decoration-protocol.h"
 #include "xdg-primary-selection-protocol.h"
+#include "wlr-virtual-pointer.h"
 
 #include "u.h"
 #include "lib.h"
@@ -29,6 +31,7 @@
 #undef pipe
 #undef write
 #undef read
+#undef time
 
 static void
 xdg_surface_handle_configure(void *data, struct xdg_surface *xdg_surface, uint32_t serial)
@@ -660,6 +663,8 @@
 		wl->decoman = wl_registry_bind(registry, name, &zxdg_decoration_manager_v1_interface, 1);
 	} else if(strcmp(interface, zwp_primary_selection_device_manager_v1_interface.name) == 0) {
 		wl->primsel = wl_registry_bind(registry, name, &zwp_primary_selection_device_manager_v1_interface, 1);
+	} else if(strcmp(interface, zwlr_virtual_pointer_manager_v1_interface.name) == 0) {
+		wl->vpmgr = wl_registry_bind(registry, name, &zwlr_virtual_pointer_manager_v1_interface, 1);
 	}
 }
 
@@ -696,6 +701,9 @@
 	if(wl->shm == nil || wl->compositor == nil || wl->xdg_wm_base == nil || wl->seat == nil || wl->decoman == nil || wl->primsel == nil)
 		sysfatal("registration fell short");
 
+	if(wl->vpmgr != nil)
+		wl->vpointer = zwlr_virtual_pointer_manager_v1_create_virtual_pointer(wl->vpmgr, wl->seat);
+
 	wlallocbuffer(wl);
 	wl->surface = wl_compositor_create_surface(wl->compositor);
 
@@ -760,4 +768,18 @@
 	s = strdup(wl->clip.content != nil ? wl->clip.content : "");
 	qunlock(&wl->clip.lk);
 	return s;
+}
+
+void
+wlsetmouse(Wlwin *wl, Point p)
+{
+	Point delta;
+	if (wl->vpointer == nil)
+		return;
+
+	delta.x = p.x - wl->mouse.xy.x;
+	delta.y = p.y - wl->mouse.xy.y;
+	wl->mouse.xy = p;
+	zwlr_virtual_pointer_v1_motion(wl->vpointer,  time(nil) * 1000, delta.x * 256, delta.y * 256);
+	zwlr_virtual_pointer_v1_frame(wl->vpointer);
 }
--- a/gui-wl/wl-inc.h
+++ b/gui-wl/wl-inc.h
@@ -80,6 +80,9 @@
 
 	struct zwp_primary_selection_device_manager_v1 *primsel;
 	struct zwp_primary_selection_device_v1 *primsel_device;
+
+	struct zwlr_virtual_pointer_manager_v1 *vpmgr;
+	struct zwlr_virtual_pointer_v1 *vpointer;
 };
 
 void wlallocbuffer(Wlwin*);
@@ -87,6 +90,7 @@
 void wlsettitle(Wlwin*, char*);
 char* wlgetsnarf(Wlwin*);
 void wlsetsnarf(Wlwin*, char*);
+void wlsetmouse(Wlwin*, Point);
 void wldrawcursor(Wlwin*, Cursorinfo*);
 void wlresize(Wlwin*, int, int);
 void wlflush(Wlwin*);
--- a/gui-wl/wl-screen.c
+++ b/gui-wl/wl-screen.c
@@ -177,6 +177,7 @@
 void
 mouseset(Point p)
 {
+	wlsetmouse(gwin, p);
 }
 
 char*