input: Introduce ProducerHandle type

This commit is contained in:
bjorn3
2024-12-24 15:28:34 +01:00
parent e3eb5fbb5d
commit aa35e573cf
10 changed files with 57 additions and 46 deletions
Generated
+3
View File
@@ -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",
+1
View File
@@ -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"
+2 -1
View File
@@ -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();
+4 -5
View File
@@ -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<File>,
pub display: Option<ProducerHandle>,
}
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,
}
+1
View File
@@ -13,3 +13,4 @@ redox-daemon = "0.1"
libredox = "0.1.3"
common = { path = "../../common" }
inputd = { path = "../../inputd" }
+2 -4
View File
@@ -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 {
+22 -26
View File
@@ -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<F: Fn(u8, bool) -> 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<F: Fn(u8, bool) -> char> {
}
impl<F: Fn(u8, bool) -> char> Ps2d<F> {
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<F: Fn(u8, bool) -> char> Ps2d<F> {
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<F: Fn(u8, bool) -> char> Ps2d<F> {
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<F: Fn(u8, bool) -> char> Ps2d<F> {
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<F: Fn(u8, bool) -> char> Ps2d<F> {
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<F: Fn(u8, bool) -> char> Ps2d<F> {
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<F: Fn(u8, bool) -> char> Ps2d<F> {
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(),
)
+1
View File
@@ -16,3 +16,4 @@ rehid = { git = "https://gitlab.redox-os.org/redox-os/rehid.git" }
xhcid = { path = "../../xhcid" }
common = { path = "../../common" }
inputd = { path = "../../inputd" }
+8 -10
View File
@@ -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);
+13
View File
@@ -162,3 +162,16 @@ impl Damage {
self
}
}
pub struct ProducerHandle(File);
impl ProducerHandle {
pub fn new() -> Result<Self, Error> {
File::open("/scheme/input/producer").map(ProducerHandle)
}
pub fn write_event(&mut self, event: orbclient::Event) -> Result<(), Error> {
self.0.write(&event)?;
Ok(())
}
}