Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
{
py_callback = callback;
wlr_log_init(verbosity, wrapped_log_callback);
}
}
"""
ffi_builder = FFI()
ffi_builder.set_source(
"wlroots._ffi",
SOURCE,
libraries=["wlroots"],
define_macros=[("WLR_USE_UNSTABLE", None)],
include_dirs=["/usr/include/pixman-1", "include"],
)
ffi_builder.include(pywayland_ffi)
ffi_builder.cdef(CDEF)
if __name__ == "__main__":
ffi_builder.compile()
def __init__(self, display: Display) -> None:
"""Create a backend to interact with a Wayland display
:param display:
The Wayland server display to create the backend against. If this
display is destroyed, the backend will be automatically cleaned-up.
"""
ptr = lib.wlr_backend_autocreate(display._ptr, ffi.NULL)
if ptr == ffi.NULL:
raise RuntimeError("Failed to create wlroots backend")
self._ptr = ffi.gc(ptr, lib.wlr_backend_destroy)
self._weak_display = weakref.ref(display)
self.destroy_event = Signal(ptr=ffi.addressof(self._ptr.events.destroy))
self.new_input_event = Signal(
ptr=ffi.addressof(self._ptr.events.new_input), data_wrapper=InputDevice
)
self.new_output_event = Signal(
ptr=ffi.addressof(self._ptr.events.new_output), data_wrapper=Output
)
The output layout to attach the cursor to and bound the cursor by.
"""
ptr = lib.wlr_cursor_create()
self._ptr = ffi.gc(ptr, lib.wlr_cursor_destroy)
lib.wlr_cursor_attach_output_layout(self._ptr, output_layout._ptr)
self.motion_event = Signal(
ptr=ffi.addressof(self._ptr.events.motion), data_wrapper=PointerEventMotion
)
self.motion_absolute_event = Signal(
ptr=ffi.addressof(self._ptr.events.motion_absolute), data_wrapper=PointerEventMotionAbsolute
)
self.button_event = Signal(
ptr=ffi.addressof(self._ptr.events.button), data_wrapper=PointerEventButton
)
self.axis_event = Signal(
ptr=ffi.addressof(self._ptr.events.axis), data_wrapper=PointerEventAxis
)
self.frame_event = Signal(ptr=ffi.addressof(self._ptr.events.frame))
An xdg-surface is a user interface element requiring management by the
compositor. An xdg-surface alone isn't useful, a role should be
assigned to it in order to map it.
When a surface has a role and is ready to be displayed, the `map` event
is emitted. When a surface should no longer be displayed, the `unmap`
event is emitted. The `unmap` event is guaranteed to be emitted before
the `destroy` event if the view is destroyed when mapped
"""
self._ptr = ffi.cast("struct wlr_xdg_surface *", ptr)
self.map_event = Signal(
ptr=ffi.addressof(self._ptr.events.map)
)
self.unmap_event = Signal(
ptr=ffi.addressof(self._ptr.events.unmap)
)
self.destroy_event = Signal(
ptr=ffi.addressof(self._ptr.events.destroy)
)
def __init__(self, display: Display) -> None:
"""Create the shell for protocol windows
:param display:
The Wayland server display to create the shell on.
"""
ptr = lib.wlr_xdg_shell_create(display._ptr)
self._ptr = ffi.gc(ptr, lib.wlr_xdg_shell_destroy)
self.new_surface_event = Signal(
ptr=ffi.addressof(self._ptr.events.new_surface), data_wrapper=XdgSurface
)
self.destroy_event = Signal(ptr=ffi.addressof(self._ptr.events.destroy))
def __init__(self, output_layout: OutputLayout) -> None:
"""Manage a cursor attached to the given output layout
Uses the given layout to establish the boundaries and movement
semantics of this cursor. Cursors without an output layout allow
infinite movement in any direction and do not support absolute input
events.
:param output_layout:
The output layout to attach the cursor to and bound the cursor by.
"""
ptr = lib.wlr_cursor_create()
self._ptr = ffi.gc(ptr, lib.wlr_cursor_destroy)
lib.wlr_cursor_attach_output_layout(self._ptr, output_layout._ptr)
self.motion_event = Signal(
ptr=ffi.addressof(self._ptr.events.motion), data_wrapper=PointerEventMotion
)
self.motion_absolute_event = Signal(
ptr=ffi.addressof(self._ptr.events.motion_absolute), data_wrapper=PointerEventMotionAbsolute
)
self.button_event = Signal(
ptr=ffi.addressof(self._ptr.events.button), data_wrapper=PointerEventButton
)
self.axis_event = Signal(
ptr=ffi.addressof(self._ptr.events.axis), data_wrapper=PointerEventAxis
)
self.frame_event = Signal(ptr=ffi.addressof(self._ptr.events.frame))
events.
:param output_layout:
The output layout to attach the cursor to and bound the cursor by.
"""
ptr = lib.wlr_cursor_create()
self._ptr = ffi.gc(ptr, lib.wlr_cursor_destroy)
lib.wlr_cursor_attach_output_layout(self._ptr, output_layout._ptr)
self.motion_event = Signal(
ptr=ffi.addressof(self._ptr.events.motion), data_wrapper=PointerEventMotion
)
self.motion_absolute_event = Signal(
ptr=ffi.addressof(self._ptr.events.motion_absolute), data_wrapper=PointerEventMotionAbsolute
)
self.button_event = Signal(
ptr=ffi.addressof(self._ptr.events.button), data_wrapper=PointerEventButton
)
self.axis_event = Signal(
ptr=ffi.addressof(self._ptr.events.axis), data_wrapper=PointerEventAxis
)
self.frame_event = Signal(ptr=ffi.addressof(self._ptr.events.frame))
compositor space.
The `frame` event will be emitted when it is a good time for the
compositor to submit a new frame.
To render a new frame, compositors should call
`wlr_output_attach_render`, render and call `wlr_output_commit`. No
rendering should happen outside a `frame` event handler or before
`wlr_output_attach_render`.
:param ptr:
The wlr_output cdata pointer
"""
self._ptr = ffi.cast("struct wlr_output *", ptr)
self.frame_event = Signal(ptr=ffi.addressof(self._ptr.events.frame))
def __init__(self, display: Display, name: str) -> None:
"""Allocates a new seat and adds a seat global to the display
:param display:
The Wayland server display to attach the seat to
:param name:
The name of the seat to create
"""
ptr = lib.wlr_seat_create(display._ptr, name.encode())
self._ptr = ffi.gc(ptr, lib.wlr_seat_destroy)
self.request_set_cursor_event = Signal(ptr=ffi.addressof(self._ptr.events.request_set_cursor))
def __init__(self, display: Display) -> None:
"""Create the shell for protocol windows
:param display:
The Wayland server display to create the shell on.
"""
ptr = lib.wlr_xdg_shell_create(display._ptr)
self._ptr = ffi.gc(ptr, lib.wlr_xdg_shell_destroy)
self.new_surface_event = Signal(
ptr=ffi.addressof(self._ptr.events.new_surface), data_wrapper=XdgSurface
)
self.destroy_event = Signal(ptr=ffi.addressof(self._ptr.events.destroy))