From aa35e573cf94157065b100225930caf5bc31c6d1 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Tue, 24 Dec 2024 15:28:34 +0100 Subject: [PATCH] input: Introduce ProducerHandle type --- Cargo.lock | 3 +++ graphics/bgad/Cargo.toml | 1 + graphics/bgad/src/main.rs | 3 ++- graphics/bgad/src/scheme.rs | 9 ++++--- input/ps2d/Cargo.toml | 1 + input/ps2d/src/main.rs | 6 ++--- input/ps2d/src/state.rs | 48 +++++++++++++++++-------------------- input/usbhidd/Cargo.toml | 1 + input/usbhidd/src/main.rs | 18 +++++++------- inputd/src/lib.rs | 13 ++++++++++ 10 files changed, 57 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cdb562c6cc..a56be31c9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,6 +190,7 @@ name = "bgad" version = "0.1.0" dependencies = [ "common", + "inputd", "libredox", "orbclient", "pcid", @@ -1035,6 +1036,7 @@ version = "0.1.0" dependencies = [ "bitflags 1.3.2", "common", + "inputd", "libredox", "log", "orbclient", @@ -1594,6 +1596,7 @@ version = "0.1.0" dependencies = [ "bitflags 2.6.0", "common", + "inputd", "log", "orbclient", "redox_syscall", diff --git a/graphics/bgad/Cargo.toml b/graphics/bgad/Cargo.toml index 4e9fe1ae5f..eadf2c22f9 100644 --- a/graphics/bgad/Cargo.toml +++ b/graphics/bgad/Cargo.toml @@ -9,5 +9,6 @@ redox-daemon = "0.1" redox_syscall = "0.5" common = { path = "../../common" } +inputd = { path = "../../inputd" } pcid = { path = "../../pcid" } libredox = "0.1.3" diff --git a/graphics/bgad/src/main.rs b/graphics/bgad/src/main.rs index ad3a4fe393..a208db2b27 100644 --- a/graphics/bgad/src/main.rs +++ b/graphics/bgad/src/main.rs @@ -4,6 +4,7 @@ extern crate syscall; use std::fs::File; use std::io::{Read, Write}; +use inputd::ProducerHandle; use pcid_interface::PciFunctionHandle; use syscall::call::iopl; use syscall::data::Packet; @@ -35,7 +36,7 @@ fn main() { let mut scheme = BgaScheme { bga, - display: File::open("/scheme/input/producer").ok(), + display: ProducerHandle::new().ok(), }; scheme.update_size(); diff --git a/graphics/bgad/src/scheme.rs b/graphics/bgad/src/scheme.rs index 1a1315df0e..197f0ec01d 100644 --- a/graphics/bgad/src/scheme.rs +++ b/graphics/bgad/src/scheme.rs @@ -1,6 +1,5 @@ -use std::fs::File; -use std::io::Write; use std::str; +use inputd::ProducerHandle; use syscall::data::Stat; use syscall::{Error, Result, SchemeMut, EACCES, EINVAL, MODE_CHR}; @@ -8,14 +7,14 @@ use crate::bga::Bga; pub struct BgaScheme { pub bga: Bga, - pub display: Option, + pub display: Option, } impl BgaScheme { pub fn update_size(&mut self) { if let Some(ref mut display) = self.display { - let _ = display.write( - &orbclient::ResizeEvent { + let _ = display.write_event( + orbclient::ResizeEvent { width: self.bga.width() as u32, height: self.bga.height() as u32, } diff --git a/input/ps2d/Cargo.toml b/input/ps2d/Cargo.toml index 212a3e078a..9e3298eb17 100644 --- a/input/ps2d/Cargo.toml +++ b/input/ps2d/Cargo.toml @@ -13,3 +13,4 @@ redox-daemon = "0.1" libredox = "0.1.3" common = { path = "../../common" } +inputd = { path = "../../inputd" } diff --git a/input/ps2d/src/main.rs b/input/ps2d/src/main.rs index 7399bbd0a2..186904cf9a 100644 --- a/input/ps2d/src/main.rs +++ b/input/ps2d/src/main.rs @@ -12,6 +12,7 @@ use std::os::unix::io::AsRawFd; use std::{env, process}; use event::{user_data, EventQueue}; +use inputd::ProducerHandle; use log::info; use syscall::call::iopl; @@ -50,10 +51,7 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { info!("ps2d: using keymap '{}'", keymap_name); - let input = OpenOptions::new() - .write(true) - .open("/scheme/input/producer") - .expect("ps2d: failed to open /scheme/input/producer"); + let input = ProducerHandle::new().expect("ps2d: failed to open input producer"); user_data! { enum Source { diff --git a/input/ps2d/src/state.rs b/input/ps2d/src/state.rs index b25cec9455..711c7bfbbf 100644 --- a/input/ps2d/src/state.rs +++ b/input/ps2d/src/state.rs @@ -1,8 +1,4 @@ -use std::fs::File; -use std::io::Write; -use std::os::unix::io::AsRawFd; -use std::str; - +use inputd::ProducerHandle; use log::{error, warn}; use orbclient::{ButtonEvent, KeyEvent, MouseEvent, MouseRelativeEvent, ScrollEvent}; @@ -26,7 +22,7 @@ pub struct Ps2d char> { ps2: Ps2, vmmouse: bool, vmmouse_relative: bool, - input: File, + input: ProducerHandle, extended: bool, lshift: bool, rshift: bool, @@ -43,7 +39,7 @@ pub struct Ps2d char> { } impl char> Ps2d { - pub fn new(input: File, keymap: F) -> Self { + pub fn new(input: ProducerHandle, keymap: F) -> Self { let mut ps2 = Ps2::new(); let extra_packet = ps2.init().expect("ps2d: failed to initialize"); @@ -229,8 +225,8 @@ impl char> Ps2d { if scancode != 0 { self.input - .write( - &KeyEvent { + .write_event( + KeyEvent { character: (self.get_char)( ps2_scancode, self.lshift || self.rshift, @@ -263,8 +259,8 @@ impl char> Ps2d { if self.vmmouse_relative { if dx != 0 || dy != 0 { self.input - .write( - &MouseRelativeEvent { + .write_event( + MouseRelativeEvent { dx: dx as i32, dy: dy as i32, } @@ -279,15 +275,15 @@ impl char> Ps2d { self.mouse_x = x; self.mouse_y = y; self.input - .write(&MouseEvent { x, y }.to_event()) + .write_event(MouseEvent { x, y }.to_event()) .expect("ps2d: failed to write mouse event"); } }; if dz != 0 { self.input - .write( - &ScrollEvent { + .write_event( + ScrollEvent { x: 0, y: -(dz as i32), } @@ -307,11 +303,11 @@ impl char> Ps2d { self.mouse_middle = middle; self.mouse_right = right; self.input - .write( - &ButtonEvent { - left: left, - middle: middle, - right: right, + .write_event( + ButtonEvent { + left, + middle, + right, } .to_event(), ) @@ -355,13 +351,13 @@ impl char> Ps2d { if dx != 0 || dy != 0 { self.input - .write(&MouseRelativeEvent { dx: dx, dy: dy }.to_event()) + .write_event(MouseRelativeEvent { dx, dy }.to_event()) .expect("ps2d: failed to write mouse event"); } if dz != 0 { self.input - .write(&ScrollEvent { x: 0, y: dz }.to_event()) + .write_event(ScrollEvent { x: 0, y: dz }.to_event()) .expect("ps2d: failed to write scroll event"); } @@ -376,11 +372,11 @@ impl char> Ps2d { self.mouse_middle = middle; self.mouse_right = right; self.input - .write( - &ButtonEvent { - left: left, - middle: middle, - right: right, + .write_event( + ButtonEvent { + left, + middle, + right, } .to_event(), ) diff --git a/input/usbhidd/Cargo.toml b/input/usbhidd/Cargo.toml index 0d5929a857..0a3df4d43c 100644 --- a/input/usbhidd/Cargo.toml +++ b/input/usbhidd/Cargo.toml @@ -16,3 +16,4 @@ rehid = { git = "https://gitlab.redox-os.org/redox-os/rehid.git" } xhcid = { path = "../../xhcid" } common = { path = "../../common" } +inputd = { path = "../../inputd" } diff --git a/input/usbhidd/src/main.rs b/input/usbhidd/src/main.rs index ca19f1905d..ed79994e1a 100644 --- a/input/usbhidd/src/main.rs +++ b/input/usbhidd/src/main.rs @@ -1,8 +1,7 @@ use std::collections::VecDeque; use std::env; -use std::fs::File; -use std::io::{Read, Write}; +use inputd::ProducerHandle; use orbclient::KeyEvent as OrbKeyEvent; use rehid::{ report_desc::{self, ReportTy, REPORT_DESC_TY}, @@ -17,7 +16,7 @@ mod keymap; mod reqs; fn send_key_event( - display: &mut File, + display: &mut ProducerHandle, usage_page: u16, usage: u16, pressed: bool, @@ -159,7 +158,7 @@ fn send_key_event( pressed, }; - match display.write(&key_event.to_event()) { + match display.write_event(key_event.to_event()) { Ok(_) => (), Err(err) => { log::warn!("failed to send key event to orbital: {}", err); @@ -277,8 +276,7 @@ fn main() { let report_ty = ReportTy::Input; let report_id = 0; - let mut display = - File::open("/scheme/input/producer").expect("Failed to open orbital input socket"); + let mut display = ProducerHandle::new().expect("Failed to open input socket"); let mut endpoint_opt = match endp_desc_opt { Some((endp_num, _endp_desc)) => match handle.open_endpoint(endp_num as u8) { Ok(ok) => Some(ok), @@ -405,7 +403,7 @@ fn main() { y: mouse_pos.1 * 2, }; - match display.write(&mouse_event.to_event()) { + match display.write_event(mouse_event.to_event()) { Ok(_) => (), Err(err) => { log::warn!("failed to send mouse event to orbital: {}", err); @@ -419,7 +417,7 @@ fn main() { dy: mouse_dy, }; - match display.write(&mouse_event.to_event()) { + match display.write_event(mouse_event.to_event()) { Ok(_) => (), Err(err) => { log::warn!("failed to send mouse event to orbital: {}", err); @@ -430,7 +428,7 @@ fn main() { if scroll_y != 0 { let scroll_event = orbclient::event::ScrollEvent { x: 0, y: scroll_y }; - match display.write(&scroll_event.to_event()) { + match display.write_event(scroll_event.to_event()) { Ok(_) => (), Err(err) => { log::warn!("failed to send scroll event to orbital: {}", err); @@ -447,7 +445,7 @@ fn main() { middle: buttons[2], }; - match display.write(&button_event.to_event()) { + match display.write_event(button_event.to_event()) { Ok(_) => (), Err(err) => { log::warn!("failed to send button event to orbital: {}", err); diff --git a/inputd/src/lib.rs b/inputd/src/lib.rs index 8956964ed6..4bc019d4ad 100644 --- a/inputd/src/lib.rs +++ b/inputd/src/lib.rs @@ -162,3 +162,16 @@ impl Damage { self } } + +pub struct ProducerHandle(File); + +impl ProducerHandle { + pub fn new() -> Result { + File::open("/scheme/input/producer").map(ProducerHandle) + } + + pub fn write_event(&mut self, event: orbclient::Event) -> Result<(), Error> { + self.0.write(&event)?; + Ok(()) + } +}