🔒 Repository is read-only – file editing is disabled.

luna/crates/libluna-core/src/event.rs main

130 lines Raw ← Back
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
//! Zdarzenia wejścia i okna — wspólny format dla całej reszty toolkitu.
//!
//! Warstwa platformy tłumaczy zdarzenia Waylanda na [`Event`]; widgety konsumują
//! je w jednym drzewie i zwracają, czy zdarzenie zostało obsłużone.

use crate::geometry::{Point, Size};

/// Klawisz myszy.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PointerButton {
    Left,
    Middle,
    Right,
    Back,
    Forward,
    Other(u32),
}

/// Stan wciśnięcia (dla przycisków i klawiszy).
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ButtonState {
    Pressed,
    Released,
}

/// Modyfikatory klawiatury.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct Modifiers {
    pub ctrl: bool,
    pub alt: bool,
    pub shift: bool,
    pub logo: bool,
    /// AltGr / `ISO_Level3_Shift` — poziom 3 układu (m.in. polskie ą, ć, ę, ł, ń, ó, ś, ź, ż).
    pub level3: bool,
}

impl Modifiers {
    pub const NONE: Modifiers = Modifiers {
        ctrl: false,
        alt: false,
        shift: false,
        logo: false,
        level3: false,
    };
}

/// Zdarzenie przycisku wskaźnika.
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct PointerEvent {
    pub position: Point,
    pub button: PointerButton,
    pub state: ButtonState,
    pub modifiers: Modifiers,
}

/// Zdarzenie przewijania (rolka/gładzik); wartości w „krokach”.
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct ScrollEvent {
    pub position: Point,
    pub dx: f64,
    pub dy: f64,
}

/// Zdarzenie klawiatury.
#[derive(Debug, Clone, PartialEq)]
pub struct KeyEvent {
    /// Keysym w rozumieniu XKB.
    pub keysym: u32,
    /// Fizyczny kod klawisza (Linux input `KEY_*`, protokół Wayland `wl_keyboard.key`).
    ///
    /// Protokół przekazuje **kod fizyczny**, a klient sam liczy z niego znak według
    /// swojej mapy klawiszy — dlatego nie wolno tu wstawiać kodu X11 (`evdev + 8`).
    pub keycode: u32,
    /// Tekst wygenerowany przez klawisz (jeśli dotyczy).
    pub text: Option<String>,
    pub state: ButtonState,
    pub modifiers: Modifiers,
    /// Czy zdarzenie zostało powtórzone przez auto-repeat.
    pub repeat: bool,
}

/// Zdarzenia cyklu życia okna.
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum WindowEvent {
    /// Nowy rozmiar w pikselach logicznych.
    Resize(Size),
    /// Skala ekranu uległa zmianie.
    ScaleChanged(f64),
    /// Uzyskano/utracono fokus.
    Focused(bool),
    /// Użytkownik (lub kompozytor) poprosił o zamknięcie okna.
    CloseRequested,
    /// Należy przerysować zawartość.
    Redraw,
}

/// Zunifikowane zdarzenie trafiające do drzewa widgetów.
#[derive(Debug, Clone, PartialEq)]
pub enum Event {
    PointerButton(PointerEvent),
    /// Ruch wskaźnika; `position` w pikselach logicznych.
    PointerMotion {
        position: Point,
        modifiers: Modifiers,
    },
    /// Wskaźnik opuścił powierzchnię.
    PointerLeave,
    Scroll(ScrollEvent),
    Key(KeyEvent),
    /// Wprowadzony tekst (po złożeniu IME).
    Text(String),
    Window(WindowEvent),
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn pointer_event_is_copy() {
        let e = PointerEvent {
            position: Point::new(1.0, 2.0),
            button: PointerButton::Left,
            state: ButtonState::Pressed,
            modifiers: Modifiers::NONE,
        };
        let copy = e;
        assert_eq!(e, copy);
    }
}