Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add wlr_virtual_pointer_v1 interface #86

Merged
merged 1 commit into from
May 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions wlroots/ffi_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add ...; to the structs here?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah yep, done.

...;
};

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,
Expand Down Expand Up @@ -2343,6 +2380,7 @@ def has_xwayland() -> bool:
#include <wlr/types/wlr_seat.h>
#include <wlr/types/wlr_server_decoration.h>
#include <wlr/types/wlr_virtual_keyboard_v1.h>
#include <wlr/types/wlr_virtual_pointer_v1.h>
#include <wlr/types/wlr_xcursor_manager.h>
#include <wlr/types/wlr_xdg_decoration_v1.h>
#include <wlr/types/wlr_xdg_output_v1.h>
Expand Down
66 changes: 66 additions & 0 deletions wlroots/wlr_types/virtual_pointer_v1.py
Original file line number Diff line number Diff line change
@@ -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