From 76217970f5d21f66e97678265f6bb5fb2120a5e4 Mon Sep 17 00:00:00 2001 From: Marten Ringwelski Date: Fri, 30 Oct 2020 12:37:20 +0100 Subject: [PATCH] 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");