srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/crates/core/src/event.rs
diff options
context:
space:
mode:
authorsrdusr <[email protected]>2024-05-14 00:42:00 +0200
committersrdusr <[email protected]>2024-05-14 00:42:00 +0200
commitdd31bf5ac2a692617d478478d36c733586b93cf8 (patch)
tree2adb42ad8b24172cbbea3bf362a0d284acd54439 /crates/core/src/event.rs
parenta9dd8a6d4947cb537f7919c5a66ba4624af61800 (diff)
downloadsrdwm-dd31bf5ac2a692617d478478d36c733586b93cf8.tar.gz
srdwm-dd31bf5ac2a692617d478478d36c733586b93cf8.zip
Draw a cursor, handle the lid, and everything a real config needs
Groundwork for actually daily-driving this: porting the user's Hyprland config exposed what srdwm couldn't yet express, and testing on a bare TTY exposed something worse. A visible mouse cursor. Nothing drew a pointer at all - on a bare TTY the mouse was simply invisible. It hid because the nested backend runs inside another compositor, which draws a cursor over srdwm's window; only the DRM backend, i.e. the actual session path, was affected. A built-in arrow is now composited above everything on the output the pointer is on. It's a reviewable ASCII bitmap rather than an XCursor theme: a cursor that is always present beats a prettier one that sometimes isn't, the same reasoning as decoration.rs's font fallback. Client-set cursor surfaces and named shapes are still not rendered, so an app asking for an I-beam gets the arrow. Lid switch. libinput switch events are handled and surfaced to config as srd.on("lid_closed"/"lid_open", fn), so closing the lid can lock and suspend instead of doing nothing. Config-driven additions, each needed by a binding in the ported config and none of which existed: fullscreen (Window.fullscreen was a dead field -- declared, never read or written), directional window move that swaps with the neighbour and reorders the stack so tiling follows, focus cycling, modifier+drag to move/resize anywhere in a window rather than only by the titlebar, modifier+scroll to change workspace, and 8 XF86 media/power keysyms taken from the system's own XF86keysym.h. The keysym tables are hand-maintained in both directions and a key missing from either fails silently, so a round-trip test now covers every one the configs bind. Verified in the QEMU VM: a bare-TTY screendump shows a recognisable arrow at the pointer position (113 white fill + 58 black outline pixels at screen centre, where the pointer starts).
Diffstat (limited to 'crates/core/src/event.rs')
-rw-r--r--crates/core/src/event.rs7
1 files changed, 7 insertions, 0 deletions
diff --git a/crates/core/src/event.rs b/crates/core/src/event.rs
index 9b464b5..eb2d8aa 100644
--- a/crates/core/src/event.rs
+++ b/crates/core/src/event.rs
@@ -60,4 +60,11 @@ pub enum Event {
MouseMotion { x: i32, y: i32 },
MonitorAdded(Monitor),
MonitorRemoved(MonitorId),
+ /// The laptop lid was closed or opened. Emitted by the udev backend from
+ /// libinput switch events; `closed` is true when the lid is shut.
+ ///
+ /// Exposed to config as `srd.on_lid("closed"/"open", fn)` so a session
+ /// can lock and suspend, which is otherwise impossible: a laptop that
+ /// does nothing on lid-close is a real problem, not a nicety.
+ LidSwitch { closed: bool },
}