mirror of
https://github.com/servo/servo.git
synced 2025-06-25 09:34:32 +01:00
Move keyboard handling to another task
This commit is contained in:
parent
ddb3e0ee50
commit
a661d59e90
1 changed files with 45 additions and 8 deletions
|
@ -1,9 +1,10 @@
|
||||||
import libc::c_double;
|
import libc::c_double;
|
||||||
|
import azure::*;
|
||||||
import azure::bindgen::*;
|
import azure::bindgen::*;
|
||||||
import azure::cairo;
|
import azure::cairo;
|
||||||
import azure::cairo::bindgen::*;
|
import azure::cairo::bindgen::*;
|
||||||
|
|
||||||
fn on_osmain(f: fn~()) {
|
fn on_osmain<T: send>(f: fn~(comm::port<T>)) -> comm::chan<T> {
|
||||||
let builder = task::builder();
|
let builder = task::builder();
|
||||||
let opts = {
|
let opts = {
|
||||||
sched: some({
|
sched: some({
|
||||||
|
@ -13,22 +14,32 @@ fn on_osmain(f: fn~()) {
|
||||||
with task::get_opts(builder)
|
with task::get_opts(builder)
|
||||||
};
|
};
|
||||||
task::set_opts(builder, opts);
|
task::set_opts(builder, opts);
|
||||||
task::run(builder, f);
|
ret task::run_listener(builder, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum osmain_msg {
|
||||||
|
get_draw_target(comm::chan<AzDrawTargetRef>),
|
||||||
|
add_key_handler(comm::chan<()>),
|
||||||
|
draw(AzDrawTargetRef, comm::chan<()>),
|
||||||
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
on_osmain {||
|
// The platform event handler thread
|
||||||
|
let osmain_ch = on_osmain::<osmain_msg> {|po|
|
||||||
|
let mut key_handlers = [];
|
||||||
|
|
||||||
sdl::init([
|
sdl::init([
|
||||||
sdl::init_video
|
sdl::init_video
|
||||||
]);
|
]);
|
||||||
let screen = sdl::video::set_video_mode(
|
let screen = sdl::video::set_video_mode(
|
||||||
320, 200, 32,
|
800, 600, 32,
|
||||||
[sdl::video::swsurface],
|
[sdl::video::swsurface],
|
||||||
[sdl::video::doublebuf]);
|
[sdl::video::doublebuf]);
|
||||||
assert !screen.is_null();
|
assert !screen.is_null();
|
||||||
let sdl_surf = sdl::video::create_rgb_surface(
|
let sdl_surf = sdl::video::create_rgb_surface(
|
||||||
[sdl::video::swsurface],
|
[sdl::video::swsurface],
|
||||||
320, 200, 32,
|
800, 600, 32,
|
||||||
0x00FF0000u32,
|
0x00FF0000u32,
|
||||||
0x0000FF00u32,
|
0x0000FF00u32,
|
||||||
0x000000FFu32,
|
0x000000FFu32,
|
||||||
|
@ -74,18 +85,44 @@ fn main() {
|
||||||
screen, ptr::null());
|
screen, ptr::null());
|
||||||
sdl::video::lock_surface(sdl_surf);
|
sdl::video::lock_surface(sdl_surf);
|
||||||
sdl::video::flip(screen);
|
sdl::video::flip(screen);
|
||||||
let mut mustbreak = false;
|
|
||||||
sdl::event::poll_event {|event|
|
sdl::event::poll_event {|event|
|
||||||
alt event {
|
alt event {
|
||||||
sdl::event::keyup_event(_) { mustbreak = true; }
|
sdl::event::keydown_event(_) {
|
||||||
|
key_handlers.iter {|key_ch|
|
||||||
|
comm::send(key_ch, ())
|
||||||
|
}
|
||||||
|
}
|
||||||
_ { }
|
_ { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if mustbreak { break }
|
|
||||||
|
// Handle messages
|
||||||
|
if comm::peek(po) {
|
||||||
|
alt check comm::recv(po) {
|
||||||
|
add_key_handler(key_ch) {
|
||||||
|
key_handlers += [key_ch];
|
||||||
|
}
|
||||||
|
exit { break; }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
AzReleaseDrawTarget(azure_target);
|
AzReleaseDrawTarget(azure_target);
|
||||||
cairo_surface_destroy(cairo_surf);
|
cairo_surface_destroy(cairo_surf);
|
||||||
sdl::video::unlock_surface(sdl_surf);
|
sdl::video::unlock_surface(sdl_surf);
|
||||||
sdl::quit();
|
sdl::quit();
|
||||||
|
};
|
||||||
|
|
||||||
|
// The keyboard handler
|
||||||
|
task::spawn {||
|
||||||
|
let key_po = comm::port();
|
||||||
|
comm::send(osmain_ch, add_key_handler(comm::chan(key_po)));
|
||||||
|
loop {
|
||||||
|
alt comm::recv(key_po) {
|
||||||
|
_ {
|
||||||
|
comm::send(osmain_ch, exit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue