🔒 Repository is read-only – file editing is disabled.
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);
}
}