diff options
| author | srdusr <[email protected]> | 2024-04-02 01:07:00 +0200 |
|---|---|---|
| committer | srdusr <[email protected]> | 2024-04-02 01:07:00 +0200 |
| commit | 43175c78a5b450eb108738187b72e80d36a7bf5d (patch) | |
| tree | dbbadbcc18162f766f5af653d81882aaaa6f5e41 /crates/x11/src | |
| parent | 8110bb2773b6c841029a51eca7971f42a36f480c (diff) | |
| download | srdwm-43175c78a5b450eb108738187b72e80d36a7bf5d.tar.gz srdwm-43175c78a5b450eb108738187b72e80d36a7bf5d.zip | |
Add window rules, real config validation, and a Wayland DRM/udev backend
- srd.rule(): match windows by title/class, apply floating/maximized/
workspace/geometry/decoration actions on creation (crates/core/src/rules.rs)
- srd.validate_config()/srd.debug.*: real range/format checks and
status/profiling helpers, replacing the always-true stub
- Wayland titlebar text rendering via fontdue, unit-tested without a
display (crates/wayland/src/decoration.rs)
- Wayland precise keybinding matching, replacing the "any Super-held key"
heuristic, sharing the keysym table with X11 (moved to
crates/core/src/keysyms.rs)
- Wayland DRM/udev backend (crates/wayland/src/udev.rs): runs as the real
compositor on a bare TTY via libseat/libinput/KMS, software rendering
via Pixman + dumb buffers (no GBM/EGL required)
- srdwm_platform::detect() fix, found via VM testing: a bare TTY with no
DISPLAY/WAYLAND_DISPLAY now correctly resolves to Wayland instead of an
X11 backend that can never work there
- XWayland integration groundwork (crates/wayland/src/xwayland.rs): spawn,
X11Wm, and full XwmHandler event routing into the same WindowManager/
Space pipeline as native clients. Windows don't render yet - a real
glamor-vs-software-renderer conflict in XWayland's own fallback path,
root-caused via WAYLAND_DEBUG tracing and documented in
docs/IMPLEMENTATION_STATUS.md rather than worked around blind.
All verified live in an isolated QEMU VM: X11 backend shows two
decorated, correctly-tiled xterms with real title text; the DRM/udev
Wayland backend opens the GPU, initializes input, and scans out a
rendered frame via KMS page-flip.
Diffstat (limited to 'crates/x11/src')
| -rw-r--r-- | crates/x11/src/keysyms.rs | 112 | ||||
| -rw-r--r-- | crates/x11/src/lib.rs | 8 |
2 files changed, 4 insertions, 116 deletions
diff --git a/crates/x11/src/keysyms.rs b/crates/x11/src/keysyms.rs deleted file mode 100644 index 0baa6bc..0000000 --- a/crates/x11/src/keysyms.rs +++ /dev/null @@ -1,112 +0,0 @@ -//! A small, hand-maintained keysym <-> name table covering the keys used in -//! practice by window-manager keybindings (letters, digits, navigation, -//! function keys). Not a full xkbcommon-level keymap - see module docs in -//! `lib.rs` for why that trade-off was made for this pass. - -pub fn keysym_to_name(keysym: u32) -> Option<String> { - Some(match keysym { - 0x0020 => "Space".to_string(), - 0x0061..=0x007a => (((keysym - 0x0061) as u8 + b'a') as char).to_string(), - 0x0030..=0x0039 => (((keysym - 0x0030) as u8 + b'0') as char).to_string(), - 0xff0d => "Return".to_string(), - 0xff1b => "Escape".to_string(), - 0xff09 => "Tab".to_string(), - 0xff08 => "BackSpace".to_string(), - 0xffff => "Delete".to_string(), - 0xff51 => "Left".to_string(), - 0xff52 => "Up".to_string(), - 0xff53 => "Right".to_string(), - 0xff54 => "Down".to_string(), - 0xff55 => "Prior".to_string(), - 0xff56 => "Next".to_string(), - 0xff50 => "Home".to_string(), - 0xff57 => "End".to_string(), - 0xffbe..=0xffc9 => format!("F{}", keysym - 0xffbe + 1), - 0x1008ff13 => "XF86AudioRaiseVolume".to_string(), - 0x1008ff11 => "XF86AudioLowerVolume".to_string(), - 0x1008ff12 => "XF86AudioMute".to_string(), - 0x1008ff02 => "XF86MonBrightnessUp".to_string(), - 0x1008ff03 => "XF86MonBrightnessDown".to_string(), - _ => return None, - }) -} - -/// Case-insensitive: config authors reasonably write both `"Space"` and -/// `"space"`, and X11 key names aren't consistently capitalized in the wild. -pub fn name_to_keysym(name: &str) -> Option<u32> { - match name.to_ascii_lowercase().as_str() { - "space" => return Some(0x0020), - "return" | "enter" => return Some(0xff0d), - "escape" => return Some(0xff1b), - "tab" => return Some(0xff09), - "backspace" => return Some(0xff08), - "delete" => return Some(0xffff), - "left" => return Some(0xff51), - "up" => return Some(0xff52), - "right" => return Some(0xff53), - "down" => return Some(0xff54), - "prior" | "pageup" => return Some(0xff55), - "next" | "pagedown" => return Some(0xff56), - "home" => return Some(0xff50), - "end" => return Some(0xff57), - "xf86audioraisevolume" => return Some(0x1008ff13), - "xf86audiolowervolume" => return Some(0x1008ff11), - "xf86audiomute" => return Some(0x1008ff12), - "xf86monbrightnessup" => return Some(0x1008ff02), - "xf86monbrightnessdown" => return Some(0x1008ff03), - _ => {} - } - if name.len() == 1 { - let c = name.chars().next().unwrap().to_ascii_lowercase(); - if c.is_ascii_lowercase() { - return Some(0x0061 + (c as u32 - 'a' as u32)); - } - if c.is_ascii_digit() { - return Some(0x0030 + (c as u32 - '0' as u32)); - } - } - if let Some(rest) = name.to_ascii_lowercase().strip_prefix('f') { - if let Ok(n) = rest.parse::<u32>() { - if (1..=12).contains(&n) { - return Some(0xffbe + n - 1); - } - } - } - None -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn letters_and_digits_roundtrip() { - for c in 'a'..='z' { - let name = c.to_string(); - let ks = name_to_keysym(&name).unwrap(); - assert_eq!(keysym_to_name(ks), Some(name)); - } - for c in '0'..='9' { - let name = c.to_string(); - let ks = name_to_keysym(&name).unwrap(); - assert_eq!(keysym_to_name(ks), Some(name)); - } - } - - #[test] - fn lowercase_names_resolve_case_insensitively() { - // Config authors reasonably write "Mod4+Shift+space"; this must - // resolve to the same keysym as "Space". - assert_eq!(name_to_keysym("space"), name_to_keysym("Space")); - assert_eq!(name_to_keysym("return"), name_to_keysym("Return")); - assert_eq!(name_to_keysym("f5"), name_to_keysym("F5")); - } - - #[test] - fn named_keys_roundtrip() { - for name in ["Return", "Escape", "Tab", "Left", "Right", "Up", "Down", "F1", "F12"] { - let ks = name_to_keysym(name).unwrap(); - assert_eq!(keysym_to_name(ks), Some(name.to_string())); - } - } -} diff --git a/crates/x11/src/lib.rs b/crates/x11/src/lib.rs index 0faf513..d025efa 100644 --- a/crates/x11/src/lib.rs +++ b/crates/x11/src/lib.rs @@ -18,12 +18,12 @@ //! millimeters instead of the CRTC's pixel mode; here it reads the CRTC. //! //! Not implemented (documented rather than faked): XKB-level keymaps (only -//! a hand-maintained keysym table covering common keys, see `keysyms.rs`), -//! ICCCM `WM_HINTS`/urgency, and EWMH pager/taskbar hints beyond +//! a hand-maintained keysym table covering common keys, shared with the +//! Wayland backend via `srdwm_core::keysyms`), ICCCM `WM_HINTS`/urgency, and +//! EWMH pager/taskbar hints beyond //! `_NET_SUPPORTED`/`_NET_CLIENT_LIST`/`_NET_WM_STATE` maximize. -mod keysyms; - +use srdwm_core::keysyms; use srdwm_core::{Event, Modifiers, MouseButton, TitlebarHit, Window as CoreWindow, WindowId, TITLEBAR_HEIGHT}; use srdwm_core::{Monitor, Rect, WindowManager}; use srdwm_platform::{Platform, PlatformError, PlatformKind, Result as PlatformResult}; |