Simplify vesad by using SchemeMut
This commit is contained in:
parent
00ac77765c
commit
b1293046a3
|
@ -9,7 +9,7 @@ extern crate syscall;
|
||||||
use std::{env, mem, thread};
|
use std::{env, mem, thread};
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use syscall::{physmap, physunmap, Packet, Scheme, EVENT_READ, MAP_WRITE, MAP_WRITE_COMBINE};
|
use syscall::{physmap, physunmap, Packet, SchemeMut, EVENT_READ, MAP_WRITE, MAP_WRITE_COMBINE};
|
||||||
|
|
||||||
use mode_info::VBEModeInfo;
|
use mode_info::VBEModeInfo;
|
||||||
use primitive::fast_set64;
|
use primitive::fast_set64;
|
||||||
|
@ -57,7 +57,7 @@ fn main() {
|
||||||
let onscreen = unsafe { physmap(physbaseptr, size * 4, MAP_WRITE | MAP_WRITE_COMBINE).expect("vesad: failed to map VBE LFB") };
|
let onscreen = unsafe { physmap(physbaseptr, size * 4, MAP_WRITE | MAP_WRITE_COMBINE).expect("vesad: failed to map VBE LFB") };
|
||||||
unsafe { fast_set64(onscreen as *mut u64, 0, size/2) };
|
unsafe { fast_set64(onscreen as *mut u64, 0, size/2) };
|
||||||
|
|
||||||
let scheme = DisplayScheme::new(width, height, onscreen, &spec);
|
let mut scheme = DisplayScheme::new(width, height, onscreen, &spec);
|
||||||
|
|
||||||
let mut blocked = Vec::new();
|
let mut blocked = Vec::new();
|
||||||
loop {
|
loop {
|
||||||
|
@ -87,7 +87,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (screen_id, screen) in scheme.screens.borrow().iter() {
|
for (screen_id, screen) in scheme.screens.iter() {
|
||||||
if ! screen.will_block() {
|
if ! screen.will_block() {
|
||||||
let event_packet = Packet {
|
let event_packet = Packet {
|
||||||
id: 0,
|
id: 0,
|
||||||
|
|
|
@ -1,20 +1,15 @@
|
||||||
use std::cell::{Cell, RefCell};
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::{mem, slice, str};
|
use std::{mem, slice, str};
|
||||||
|
|
||||||
use orbclient::{Event, EventOption};
|
use orbclient::{Event, EventOption};
|
||||||
use syscall::{Result, Error, EACCES, EBADF, ENOENT, Scheme};
|
use syscall::{Result, Error, EACCES, EBADF, ENOENT, SchemeMut};
|
||||||
|
|
||||||
use display::Display;
|
use display::Display;
|
||||||
use screen::{Screen, GraphicScreen, TextScreen};
|
use screen::{Screen, GraphicScreen, TextScreen};
|
||||||
|
|
||||||
pub struct DisplayScheme {
|
pub struct DisplayScheme {
|
||||||
width: usize,
|
active: usize,
|
||||||
height: usize,
|
pub screens: BTreeMap<usize, Box<Screen>>
|
||||||
onscreen: usize,
|
|
||||||
active: Cell<usize>,
|
|
||||||
next_screen: Cell<usize>,
|
|
||||||
pub screens: RefCell<BTreeMap<usize, Box<Screen>>>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DisplayScheme {
|
impl DisplayScheme {
|
||||||
|
@ -32,18 +27,13 @@ impl DisplayScheme {
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayScheme {
|
DisplayScheme {
|
||||||
width: width,
|
active: 1,
|
||||||
height: height,
|
screens: screens
|
||||||
onscreen: onscreen,
|
|
||||||
active: Cell::new(1),
|
|
||||||
next_screen: Cell::new(screen_i),
|
|
||||||
screens: RefCell::new(screens)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn will_block(&self, id: usize) -> bool {
|
pub fn will_block(&self, id: usize) -> bool {
|
||||||
let screens = self.screens.borrow();
|
if let Some(screen) = self.screens.get(&id) {
|
||||||
if let Some(screen) = screens.get(&id) {
|
|
||||||
screen.will_block()
|
screen.will_block()
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
|
@ -51,8 +41,8 @@ impl DisplayScheme {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Scheme for DisplayScheme {
|
impl SchemeMut for DisplayScheme {
|
||||||
fn open(&self, path: &[u8], _flags: usize, uid: u32, _gid: u32) -> Result<usize> {
|
fn open(&mut self, path: &[u8], _flags: usize, uid: u32, _gid: u32) -> Result<usize> {
|
||||||
if path == b"input" {
|
if path == b"input" {
|
||||||
if uid == 0 {
|
if uid == 0 {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
|
@ -62,7 +52,7 @@ impl Scheme for DisplayScheme {
|
||||||
} else {
|
} else {
|
||||||
let path_str = str::from_utf8(path).unwrap_or("");
|
let path_str = str::from_utf8(path).unwrap_or("");
|
||||||
let id = path_str.parse::<usize>().unwrap_or(0);
|
let id = path_str.parse::<usize>().unwrap_or(0);
|
||||||
if self.screens.borrow().contains_key(&id) {
|
if self.screens.contains_key(&id) {
|
||||||
Ok(id)
|
Ok(id)
|
||||||
} else {
|
} else {
|
||||||
Err(Error::new(ENOENT))
|
Err(Error::new(ENOENT))
|
||||||
|
@ -70,24 +60,22 @@ impl Scheme for DisplayScheme {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dup(&self, id: usize) -> Result<usize> {
|
fn dup(&mut self, id: usize) -> Result<usize> {
|
||||||
Ok(id)
|
Ok(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fevent(&self, id: usize, flags: usize) -> Result<usize> {
|
fn fevent(&mut self, id: usize, flags: usize) -> Result<usize> {
|
||||||
let mut screens = self.screens.borrow_mut();
|
if let Some(mut screen) = self.screens.get_mut(&id) {
|
||||||
if let Some(mut screen) = screens.get_mut(&id) {
|
|
||||||
screen.event(flags).and(Ok(id))
|
screen.event(flags).and(Ok(id))
|
||||||
} else {
|
} else {
|
||||||
Err(Error::new(EBADF))
|
Err(Error::new(EBADF))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
|
fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
|
||||||
let screens = self.screens.borrow();
|
|
||||||
let path_str = if id == 0 {
|
let path_str = if id == 0 {
|
||||||
format!("display:input")
|
format!("display:input")
|
||||||
} else if let Some(screen) = screens.get(&id) {
|
} else if let Some(screen) = self.screens.get(&id) {
|
||||||
format!("display:{}/{}/{}", id, screen.width(), screen.height())
|
format!("display:{}/{}/{}", id, screen.width(), screen.height())
|
||||||
} else {
|
} else {
|
||||||
return Err(Error::new(EBADF));
|
return Err(Error::new(EBADF));
|
||||||
|
@ -104,10 +92,9 @@ impl Scheme for DisplayScheme {
|
||||||
Ok(i)
|
Ok(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fsync(&self, id: usize) -> Result<usize> {
|
fn fsync(&mut self, id: usize) -> Result<usize> {
|
||||||
let mut screens = self.screens.borrow_mut();
|
if let Some(mut screen) = self.screens.get_mut(&id) {
|
||||||
if let Some(mut screen) = screens.get_mut(&id) {
|
if id == self.active {
|
||||||
if id == self.active.get() {
|
|
||||||
screen.sync();
|
screen.sync();
|
||||||
}
|
}
|
||||||
Ok(0)
|
Ok(0)
|
||||||
|
@ -116,22 +103,20 @@ impl Scheme for DisplayScheme {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
|
fn read(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
|
||||||
let mut screens = self.screens.borrow_mut();
|
if let Some(mut screen) = self.screens.get_mut(&id) {
|
||||||
if let Some(mut screen) = screens.get_mut(&id) {
|
|
||||||
screen.read(buf)
|
screen.read(buf)
|
||||||
} else {
|
} else {
|
||||||
Err(Error::new(EBADF))
|
Err(Error::new(EBADF))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write(&self, id: usize, buf: &[u8]) -> Result<usize> {
|
fn write(&mut self, id: usize, buf: &[u8]) -> Result<usize> {
|
||||||
let mut screens = self.screens.borrow_mut();
|
|
||||||
if id == 0 {
|
if id == 0 {
|
||||||
if buf.len() == 1 && buf[0] >= 0xF4 {
|
if buf.len() == 1 && buf[0] >= 0xF4 {
|
||||||
let new_active = (buf[0] - 0xF4) as usize + 1;
|
let new_active = (buf[0] - 0xF4) as usize + 1;
|
||||||
if let Some(mut screen) = screens.get_mut(&new_active) {
|
if let Some(mut screen) = self.screens.get_mut(&new_active) {
|
||||||
self.active.set(new_active);
|
self.active = new_active;
|
||||||
screen.redraw();
|
screen.redraw();
|
||||||
}
|
}
|
||||||
Ok(1)
|
Ok(1)
|
||||||
|
@ -157,12 +142,12 @@ impl Scheme for DisplayScheme {
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(new_active) = new_active_opt {
|
if let Some(new_active) = new_active_opt {
|
||||||
if let Some(mut screen) = screens.get_mut(&new_active) {
|
if let Some(mut screen) = self.screens.get_mut(&new_active) {
|
||||||
self.active.set(new_active);
|
self.active = new_active;
|
||||||
screen.redraw();
|
screen.redraw();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if let Some(mut screen) = screens.get_mut(&self.active.get()) {
|
if let Some(mut screen) = self.screens.get_mut(&self.active) {
|
||||||
screen.input(event);
|
screen.input(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,23 +155,22 @@ impl Scheme for DisplayScheme {
|
||||||
|
|
||||||
Ok(events.len() * mem::size_of::<Event>())
|
Ok(events.len() * mem::size_of::<Event>())
|
||||||
}
|
}
|
||||||
} else if let Some(mut screen) = screens.get_mut(&id) {
|
} else if let Some(mut screen) = self.screens.get_mut(&id) {
|
||||||
screen.write(buf, id == self.active.get())
|
screen.write(buf, id == self.active)
|
||||||
} else {
|
} else {
|
||||||
Err(Error::new(EBADF))
|
Err(Error::new(EBADF))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
|
fn seek(&mut self, id: usize, pos: usize, whence: usize) -> Result<usize> {
|
||||||
let mut screens = self.screens.borrow_mut();
|
if let Some(mut screen) = self.screens.get_mut(&id) {
|
||||||
if let Some(mut screen) = screens.get_mut(&id) {
|
|
||||||
screen.seek(pos, whence)
|
screen.seek(pos, whence)
|
||||||
} else {
|
} else {
|
||||||
Err(Error::new(EBADF))
|
Err(Error::new(EBADF))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn close(&self, _id: usize) -> Result<usize> {
|
fn close(&mut self, _id: usize) -> Result<usize> {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,7 +204,7 @@ impl Screen for TextScreen {
|
||||||
Ok(buf.len())
|
Ok(buf.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn seek(&mut self, pos: usize, whence: usize) -> Result<usize> {
|
fn seek(&mut self, _pos: usize, _whence: usize) -> Result<usize> {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue