graphics/fbbootlogd: Merge Display into FbbbootlogScheme

This commit is contained in:
bjorn3
2025-03-15 17:27:08 +01:00
parent 54113f8fde
commit 87d71bc708
3 changed files with 45 additions and 72 deletions
-62
View File
@@ -1,62 +0,0 @@
use std::io;
use graphics_ipc::v1::{Damage, V1GraphicsHandle};
use inputd::ConsumerHandle;
fn display_fd_map(display_handle: V1GraphicsHandle) -> io::Result<DisplayMap> {
let display_map = display_handle.map_display()?;
Ok(DisplayMap {
display_handle,
inner: display_map,
})
}
pub struct DisplayMap {
display_handle: V1GraphicsHandle,
pub inner: graphics_ipc::v1::DisplayMap,
}
pub struct Display {
pub input_handle: ConsumerHandle,
pub map: Option<DisplayMap>,
}
impl Display {
pub fn open_first_vt() -> io::Result<Self> {
let mut display = Self {
input_handle: ConsumerHandle::new_vt()?,
map: None,
};
display.handle_handoff();
Ok(display)
}
pub fn handle_handoff(&mut self) {
let new_display_handle = match self.input_handle.open_display() {
Ok(display) => V1GraphicsHandle::from_file(display).unwrap(),
Err(err) => {
eprintln!("fbbootlogd: No display present yet: {err}");
return;
}
};
match display_fd_map(new_display_handle) {
Ok(ok) => {
self.map = Some(ok);
eprintln!("fbbootlogd: mapped display");
}
Err(err) => {
eprintln!("fbbootlogd: failed to open display: {}", err);
}
}
}
pub fn sync_rects(&mut self, sync_rects: Vec<Damage>) {
if let Some(map) = &self.map {
map.display_handle.sync_rects(&sync_rects).unwrap();
}
}
}
+2 -4
View File
@@ -17,7 +17,6 @@ use redox_scheme::{RequestKind, SignalBehavior, Socket};
use crate::scheme::FbbootlogScheme;
mod display;
mod scheme;
fn main() {
@@ -48,7 +47,7 @@ fn inner(daemon: redox_daemon::Daemon) -> ! {
event_queue
.subscribe(
scheme.display.input_handle.event_handle().as_raw_fd() as usize,
scheme.input_handle.event_handle().as_raw_fd() as usize,
Source::Input,
event::EventFlags::READ,
)
@@ -93,7 +92,6 @@ fn inner(daemon: redox_daemon::Daemon) -> ! {
let mut events = [Event::new(); 16];
loop {
match scheme
.display
.input_handle
.read_events(&mut events)
.expect("fbbootlogd: error while reading events")
@@ -102,7 +100,7 @@ fn inner(daemon: redox_daemon::Daemon) -> ! {
ConsumerHandleEvent::Events(_) => {}
ConsumerHandleEvent::Handoff => {
eprintln!("fbbootlogd: handoff requested");
scheme.display.handle_handoff();
scheme.handle_handoff();
}
}
}
+43 -6
View File
@@ -1,20 +1,55 @@
use std::collections::VecDeque;
use graphics_ipc::v1::V1GraphicsHandle;
use inputd::ConsumerHandle;
use redox_scheme::Scheme;
use syscall::{Error, Result, EINVAL, ENOENT};
use crate::display::Display;
pub struct DisplayMap {
display_handle: V1GraphicsHandle,
inner: graphics_ipc::v1::DisplayMap,
}
pub struct FbbootlogScheme {
pub display: Display,
pub input_handle: ConsumerHandle,
display_map: Option<DisplayMap>,
text_screen: console_draw::TextScreen,
}
impl FbbootlogScheme {
pub fn new() -> FbbootlogScheme {
FbbootlogScheme {
display: Display::open_first_vt().expect("Failed to open display for vt"),
let mut scheme = FbbootlogScheme {
input_handle: ConsumerHandle::new_vt().expect("fbbootlogd: Failed to open vt"),
display_map: None,
text_screen: console_draw::TextScreen::new(),
};
scheme.handle_handoff();
scheme
}
pub fn handle_handoff(&mut self) {
let new_display_handle = match self.input_handle.open_display() {
Ok(display) => V1GraphicsHandle::from_file(display).unwrap(),
Err(err) => {
eprintln!("fbbootlogd: No display present yet: {err}");
return;
}
};
match new_display_handle.map_display() {
Ok(display_map) => {
self.display_map = Some(DisplayMap {
display_handle: new_display_handle,
inner: display_map,
});
eprintln!("fbbootlogd: mapped display");
}
Err(err) => {
eprintln!("fbbootlogd: failed to open display: {}", err);
}
}
}
}
@@ -55,7 +90,7 @@ impl Scheme for FbbootlogScheme {
}
fn write(&mut self, _id: usize, buf: &[u8], _offset: u64, _fcntl_flags: u32) -> Result<usize> {
if let Some(map) = &mut self.display.map {
if let Some(map) = &mut self.display_map {
let damage = self.text_screen.write(
&mut console_draw::DisplayMap {
offscreen: map.inner.ptr_mut(),
@@ -66,7 +101,9 @@ impl Scheme for FbbootlogScheme {
&mut VecDeque::new(),
);
self.display.sync_rects(damage);
if let Some(map) = &self.display_map {
map.display_handle.sync_rects(&damage).unwrap();
}
}
Ok(buf.len())