diff --git a/wlroots/ffi_build.py b/wlroots/ffi_build.py index c2299d5f..502f29c6 100644 --- a/wlroots/ffi_build.py +++ b/wlroots/ffi_build.py @@ -1873,6 +1873,43 @@ def has_xwayland() -> bool: struct wl_display *display); """ +# types/wlr_virtual_pointer_v1.h +CDEF += """ +struct wlr_virtual_pointer_manager_v1 { + struct wl_global *global; + struct wl_list virtual_pointers; + struct wl_listener display_destroy; + struct { + struct wl_signal new_virtual_pointer; + struct wl_signal destroy; + } events; + ...; +}; + +struct wlr_virtual_pointer_v1 { + struct wlr_input_device input_device; + struct wl_resource *resource; + struct wlr_event_pointer_axis axis_event[2]; + enum wl_pointer_axis axis; + bool axis_valid[2]; + struct wl_list link; + struct { + struct wl_signal destroy; + } events; + ...; +}; + +struct wlr_virtual_pointer_v1_new_pointer_event { + struct wlr_virtual_pointer_v1 *new_pointer; + struct wlr_seat *suggested_seat; + struct wlr_output *suggested_output; + ...; +}; + +struct wlr_virtual_pointer_manager_v1* wlr_virtual_pointer_manager_v1_create( + struct wl_display *display); +""" + # types/wlr_xcursor_manager.h CDEF += """ struct wlr_xcursor_manager *wlr_xcursor_manager_create(const char *name, @@ -2343,6 +2380,7 @@ def has_xwayland() -> bool: #include #include #include +#include #include #include #include diff --git a/wlroots/wlr_types/virtual_pointer_v1.py b/wlroots/wlr_types/virtual_pointer_v1.py new file mode 100644 index 00000000..1cdbf336 --- /dev/null +++ b/wlroots/wlr_types/virtual_pointer_v1.py @@ -0,0 +1,66 @@ +# Copyright (c) 2022 Matt Colligan + +from __future__ import annotations + +from typing import Iterable +from weakref import WeakKeyDictionary + +from pywayland.protocol.wayland.wl_pointer import WlPointer +from pywayland.server import Display, Signal + +from wlroots import Ptr, ffi, lib +from wlroots.wlr_types.input_device import InputDevice +from wlroots.wlr_types.pointer import PointerEventAxis + +_weakkeydict: WeakKeyDictionary = WeakKeyDictionary() + + +class VirtualPointerManagerV1(Ptr): + def __init__(self, display: Display) -> None: + """A wlr_virtual_pointer_manager_v1 struct.""" + self._ptr = lib.wlr_virtual_pointer_manager_v1_create(display._ptr) + + self.new_virtual_pointer_event = Signal( + ptr=ffi.addressof(self._ptr.events.new_virtual_pointer), + data_wrapper=VirtualPointerV1NewPointerEvent, + ) + self.destroy_event = Signal(ptr=ffi.addressof(self._ptr.events.destroy)) + + +class VirtualPointerV1NewPointerEvent(Ptr): + def __init__(self, ptr) -> None: + """A wlr_virtual_pointer_v1_new_pointer_event struct.""" + self._ptr = ffi.cast("struct wlr_virtual_pointer_v1_new_pointer_event *", ptr) + + @property + def new_pointer(self) -> VirtualPointerV1: + return VirtualPointerV1(self._ptr.new_pointer) + + +class VirtualPointerV1(Ptr): + def __init__(self, ptr) -> None: + """A wlr_virtual_pointer_v1 struct.""" + self._ptr = ffi.cast("struct wlr_virtual_pointer_v1 *", ptr) + + self.destroy_event = Signal( + ptr=ffi.addressof(self._ptr.events.destroy), data_wrapper=VirtualPointerV1 + ) + + @property + def input_device(self) -> InputDevice: + device_ptr = ffi.addressof(self._ptr.input_device) + _weakkeydict[device_ptr] = self._ptr + return InputDevice(device_ptr) + + @property + def axis_event(self) -> Iterable[PointerEventAxis]: + for axis_event in self._ptr.axis_event: + yield PointerEventAxis(axis_event) + + @property + def axis(self) -> WlPointer.axis: + return WlPointer.axis(self._ptr.axis) + + @property + def axis_valid(self) -> Iterable[bool]: + yield from self._ptr.axis_valid