git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit0e41afff4694150223968d566588a080f5774680
parentc5ca690340
authorMarten Ringwelski <[email protected]>
date2020-10-30 12:37
Implement wlr_virtual_pointer_unstable_v1 protocol

 river/InputManager.zig | 25 +++++++++++++++++++++++++
 river/c.zig            |  1 +
 2 files changed, 26 insertions(+)

diff --git a/river/InputManager.zig b/river/InputManager.zig
index d618c52..12aa6fb 100644
--- a/river/InputManager.zig
+++ b/river/InputManager.zig
@@ -1,6 +1,7 @@
 // This file is part of river, a dynamic tiling wayland compositor.
 //
 // Copyright 2020 Isaac Freund
+// Copyright 2020 Marten Ringwelski
 //
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -34,6 +35,7 @@ server: *Server,
 
 wlr_idle: *c.wlr_idle,
 wlr_input_inhibit_manager: *c.wlr_input_inhibit_manager,
+wlr_virtual_pointer_manager: *c.wlr_virtual_pointer_manager_v1,
 
 seats: std.TailQueue(Seat) = .{},
 
@@ -42,6 +44,7 @@ exclusive_client: ?*c.wl_client = null,
 listen_inhibit_activate: c.wl_listener = undefined,
 listen_inhibit_deactivate: c.wl_listener = undefined,
 listen_new_input: c.wl_listener = undefined,
+listen_new_virtual_pointer: c.wl_listener = undefined,
 
 pub fn init(self: *Self, server: *Server) !void {
     const seat_node = try util.gpa.create(std.TailQueue(Seat).Node);
@@ -52,6 +55,8 @@ pub fn init(self: *Self, server: *Server) !void {
         .wlr_idle = c.wlr_idle_create(server.wl_display) orelse return error.OutOfMemory,
         .wlr_input_inhibit_manager = c.wlr_input_inhibit_manager_create(server.wl_display) orelse
             return error.OutOfMemory,
+        .wlr_virtual_pointer_manager = c.wlr_virtual_pointer_manager_v1_create(server.wl_display) orelse
+            return error.OutOfMemory,
     };
 
     self.seats.prepend(seat_node);
@@ -68,6 +73,9 @@ pub fn init(self: *Self, server: *Server) !void {
 
     self.listen_new_input.notify = handleNewInput;
     c.wl_signal_add(&self.server.wlr_backend.events.new_input, &self.listen_new_input);
+
+    self.listen_new_virtual_pointer.notify = handleNewVirtualPointer;
+    c.wl_signal_add(&self.wlr_virtual_pointer_manager.events.new_virtual_pointer, &self.listen_new_virtual_pointer);
 }
 
 pub fn deinit(self: *Self) void {
@@ -156,3 +164,20 @@ fn handleNewInput(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
     // TODO: suport multiple seats
     self.defaultSeat().addDevice(device);
 }
+
+fn handleNewVirtualPointer(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
+    const self = @fieldParentPtr(Self, "listen_new_virtual_pointer", listener.?);
+    const event = util.voidCast(c.wlr_virtual_pointer_v1_new_pointer_event, data.?);
+
+    // TODO Support multiple seats and don't ignore 
+    if (event.suggested_seat != null) {
+        log.debug(.input_manager, "Ignoring seat suggestion from virtual pointer", .{});
+    }
+    // TODO dont ignore output suggestion
+    if (event.suggested_output != null) {
+        log.debug(.input_manager, "Ignoring output suggestion from virtual pointer", .{});
+    }
+
+    const new_pointer: *c.wlr_virtual_pointer_v1 = event.new_pointer;
+    self.defaultSeat().addDevice(&new_pointer.input_device);
+}
diff --git a/river/c.zig b/river/c.zig
index 69abff6..0b2755a 100644
--- a/river/c.zig
+++ b/river/c.zig
@@ -53,6 +53,7 @@ pub usingnamespace @cImport({
     @cInclude("wlr/types/wlr_screencopy_v1.h");
     @cInclude("wlr/types/wlr_seat.h");
     @cInclude("wlr/types/wlr_viewporter.h");
+    @cInclude("wlr/types/wlr_virtual_pointer_v1.h");
     @cInclude("wlr/types/wlr_xcursor_manager.h");
     @cInclude("wlr/types/wlr_xdg_decoration_v1.h");
     @cInclude("wlr/types/wlr_xdg_output_v1.h");