From e3eb5fbb5dda8c5c8880e42169f0af9f4c95f868 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Tue, 24 Dec 2024 15:07:27 +0100 Subject: [PATCH] input/ps2d: Use redox_event --- Cargo.lock | 1 + input/ps2d/Cargo.toml | 1 + input/ps2d/src/main.rs | 63 +++++++++++++++++++----------------------- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d1329e6a3..cdb562c6cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1039,6 +1039,7 @@ dependencies = [ "log", "orbclient", "redox-daemon", + "redox_event", "redox_syscall", ] diff --git a/input/ps2d/Cargo.toml b/input/ps2d/Cargo.toml index 233e027e6f..212a3e078a 100644 --- a/input/ps2d/Cargo.toml +++ b/input/ps2d/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" bitflags = "1" log = "0.4" orbclient = "0.3.27" +redox_event = "0.4.1" redox_syscall = "0.5" redox-daemon = "0.1" libredox = "0.1.3" diff --git a/input/ps2d/src/main.rs b/input/ps2d/src/main.rs index 5455aaa161..7399bbd0a2 100644 --- a/input/ps2d/src/main.rs +++ b/input/ps2d/src/main.rs @@ -6,11 +6,12 @@ extern crate orbclient; extern crate syscall; use std::fs::OpenOptions; -use std::io::{Read, Write}; +use std::io::Read; use std::os::unix::fs::OpenOptionsExt; use std::os::unix::io::AsRawFd; use std::{env, process}; +use event::{user_data, EventQueue}; use log::info; use syscall::call::iopl; @@ -54,11 +55,15 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { .open("/scheme/input/producer") .expect("ps2d: failed to open /scheme/input/producer"); - let mut event_file = OpenOptions::new() - .read(true) - .write(true) - .open("/scheme/event") - .expect("ps2d: failed to open /scheme/event"); + user_data! { + enum Source { + Keyboard, + Mouse, + } + } + + let event_queue: EventQueue = + EventQueue::new().expect("ps2d: failed to create event queue"); let mut key_file = OpenOptions::new() .read(true) @@ -67,13 +72,13 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { .open("/scheme/serio/0") .expect("ps2d: failed to open /scheme/serio/0"); - event_file - .write(&syscall::Event { - id: key_file.as_raw_fd() as usize, - flags: syscall::EVENT_READ, - data: 0, - }) - .expect("ps2d: failed to event /scheme/serio/0"); + event_queue + .subscribe( + key_file.as_raw_fd() as usize, + Source::Keyboard, + event::EventFlags::READ, + ) + .unwrap(); let mut mouse_file = OpenOptions::new() .read(true) @@ -82,13 +87,13 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { .open("/scheme/serio/1") .expect("ps2d: failed to open /scheme/serio/1"); - event_file - .write(&syscall::Event { - id: mouse_file.as_raw_fd() as usize, - flags: syscall::EVENT_READ, - data: 1, - }) - .expect("ps2d: failed to event /scheme/serio/1"); + event_queue + .subscribe( + mouse_file.as_raw_fd() as usize, + Source::Mouse, + event::EventFlags::READ, + ) + .unwrap(); libredox::call::setrens(0, 0).expect("ps2d: failed to enter null namespace"); @@ -99,7 +104,7 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { let mut ps2d = Ps2d::new(input, keymap); let mut data = [0; 256]; - loop { + for event in event_queue.map(|e| e.expect("ps2d: failed to get next event").user_data) { // There are some gotchas with ps/2 controllers that require this weird // way of doing things. You read key and mouse data from the same // place. There is a status register that may show you which the data @@ -109,19 +114,9 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { // Due to this, we have a kernel driver doing a small amount of work // to grab bytes and sort them based on the source - let mut event = syscall::Event::default(); - if event_file - .read(&mut event) - .expect("ps2d: failed to read event file") - == 0 - { - break; - } - - let (file, keyboard) = match event.data { - 0 => (&mut key_file, true), - 1 => (&mut mouse_file, false), - _ => continue, + let (file, keyboard) = match event { + Source::Keyboard => (&mut key_file, true), + Source::Mouse => (&mut mouse_file, false), }; loop {