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

luna/de/selene/src/input.rs main

39 lines Raw ← Back
123456789101112131415161718192021222324252627282930313233343536373839
//! Magistrala wejścia: kolejka zdarzeń + para gniazd do wybudzania pętli głównej.
//!
//! Wątek wyjścia (osobne połączenie Wayland) odbiera zdarzenia wejścia od nadrzędnego
//! kompozytora i przekazuje je tutaj; wątek protokołu opróżnia kolejkę i trasuje je do
//! klientów (`wl_pointer`/`wl_keyboard`).

use std::io::{Read, Write};
use std::os::unix::net::UnixStream;
use std::sync::{Arc, Mutex};

use libluna_core::Event;

use crate::sync::LockExt;

/// Współdzielona kolejka zdarzeń wejścia.
pub type Events = Arc<Mutex<Vec<Event>>>;

/// Tworzy kolejkę i parę gniazd `(read, write)` do wybudzania.
pub fn channel() -> (Events, UnixStream, UnixStream) {
    let (read, write) = UnixStream::pair().expect("socketpair wejścia");
    (Arc::new(Mutex::new(Vec::new())), read, write)
}

/// Dokłada partię zdarzeń i budzi pętlę główną (jeden bajt).
pub fn push(events: &Events, wake: &mut UnixStream, batch: &[Event]) {
    if batch.is_empty() {
        return;
    }
    events.lock_or_recover().extend_from_slice(batch);
    let _ = wake.write_all(&[1u8]);
}

/// Opróżnia bajt wybudzający (nieblokująco).
pub fn drain_wake(wake: &mut UnixStream) {
    let _ = wake.set_nonblocking(true);
    let mut buf = [0u8; 64];
    let _ = wake.read(&mut buf);
    let _ = wake.set_nonblocking(false);
}