diff --git a/vesad/src/main.rs b/vesad/src/main.rs index 634f3d4687..ea11dd9006 100644 --- a/vesad/src/main.rs +++ b/vesad/src/main.rs @@ -91,20 +91,22 @@ fn main() { } } - for (screen_id, screen) in scheme.screens.iter() { - if let Some(count) = screen.can_read() { - let event_packet = Packet { - id: 0, - pid: 0, - uid: 0, - gid: 0, - a: syscall::number::SYS_FEVENT, - b: *screen_id, - c: EVENT_READ, - d: count - }; + for (handle_id, handle) in scheme.handles.iter() { + if handle.flags & EVENT_READ != 0 { + if let Some(count) = scheme.can_read(*handle_id) { + let event_packet = Packet { + id: 0, + pid: 0, + uid: 0, + gid: 0, + a: syscall::number::SYS_FEVENT, + b: *handle_id, + c: EVENT_READ, + d: count + }; - socket.write(&event_packet).expect("vesad: failed to write display event"); + socket.write(&event_packet).expect("vesad: failed to write display event"); + } } } } diff --git a/vesad/src/scheme.rs b/vesad/src/scheme.rs index 88382ea3af..f4d59a78ce 100644 --- a/vesad/src/scheme.rs +++ b/vesad/src/scheme.rs @@ -8,15 +8,16 @@ use display::Display; use screen::{Screen, GraphicScreen, TextScreen}; #[derive(Clone)] -enum HandleKind { +pub enum HandleKind { Input, Screen(usize), } #[derive(Clone)] -struct Handle { - kind: HandleKind, - flags: usize, +pub struct Handle { + pub kind: HandleKind, + pub flags: usize, + pub events: usize, } pub struct DisplayScheme { @@ -25,7 +26,7 @@ pub struct DisplayScheme { active: usize, pub screens: BTreeMap>, next_id: usize, - handles: BTreeMap, + pub handles: BTreeMap, } impl DisplayScheme { @@ -81,7 +82,8 @@ impl SchemeMut for DisplayScheme { self.handles.insert(id, Handle { kind: HandleKind::Input, - flags: flags + flags: flags, + events: 0, }); Ok(id) @@ -104,7 +106,8 @@ impl SchemeMut for DisplayScheme { self.handles.insert(id, Handle { kind: HandleKind::Screen(screen_i), - flags: flags + flags: flags, + events: 0, }); Ok(id) @@ -130,15 +133,14 @@ impl SchemeMut for DisplayScheme { } fn fevent(&mut self, id: usize, flags: usize) -> Result { - let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; - if let HandleKind::Screen(screen_i) = handle.kind { - if let Some(screen) = self.screens.get_mut(&screen_i) { - return screen.event(flags).and(Ok(screen_i)); - } + if let HandleKind::Screen(_screen_i) = handle.kind { + handle.events = flags; + Ok(id) + } else { + Err(Error::new(EBADF)) } - - Err(Error::new(EBADF)) } fn fmap(&mut self, id: usize, offset: usize, size: usize) -> Result { diff --git a/vesad/src/screen/graphic.rs b/vesad/src/screen/graphic.rs index d672426f22..f428099c7a 100644 --- a/vesad/src/screen/graphic.rs +++ b/vesad/src/screen/graphic.rs @@ -13,7 +13,6 @@ pub struct GraphicScreen { pub display: Display, pub seek: usize, pub input: VecDeque, - pub requested: usize } impl GraphicScreen { @@ -22,7 +21,6 @@ impl GraphicScreen { display: display, seek: 0, input: VecDeque::new(), - requested: 0 } } } @@ -45,11 +43,6 @@ impl Screen for GraphicScreen { }.to_event()); } - fn event(&mut self, flags: usize) -> Result { - self.requested = flags; - Ok(0) - } - fn map(&self, offset: usize, size: usize) -> Result { if offset + size <= self.display.offscreen.len() * 4 { Ok(self.display.offscreen.as_ptr() as usize + offset) diff --git a/vesad/src/screen/mod.rs b/vesad/src/screen/mod.rs index 5927cf4f50..9983728e5b 100644 --- a/vesad/src/screen/mod.rs +++ b/vesad/src/screen/mod.rs @@ -14,8 +14,6 @@ pub trait Screen { fn resize(&mut self, width: usize, height: usize); - fn event(&mut self, flags: usize) -> Result; - fn map(&self, offset: usize, size: usize) -> Result; fn input(&mut self, event: &Event); diff --git a/vesad/src/screen/text.rs b/vesad/src/screen/text.rs index af247c1238..34e794ff17 100644 --- a/vesad/src/screen/text.rs +++ b/vesad/src/screen/text.rs @@ -15,7 +15,6 @@ pub struct TextScreen { pub changed: BTreeSet, pub ctrl: bool, pub input: VecDeque, - pub requested: usize } impl TextScreen { @@ -26,7 +25,6 @@ impl TextScreen { changed: BTreeSet::new(), ctrl: false, input: VecDeque::new(), - requested: 0 } } } @@ -46,11 +44,6 @@ impl Screen for TextScreen { self.console.state.h = height / 16; } - fn event(&mut self, flags: usize) -> Result { - self.requested = flags; - Ok(0) - } - fn map(&self, _offset: usize, _size: usize) -> Result { Err(Error::new(EBADF)) }