summaryrefslogtreecommitdiffstats
path: root/rsnix/src/cursor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rsnix/src/cursor.rs')
-rw-r--r--rsnix/src/cursor.rs19
1 files changed, 17 insertions, 2 deletions
diff --git a/rsnix/src/cursor.rs b/rsnix/src/cursor.rs
index 31b919e..b986b23 100644
--- a/rsnix/src/cursor.rs
+++ b/rsnix/src/cursor.rs
@@ -49,14 +49,29 @@ fn forward_target() -> Option<usize> {
49} 49}
50 50
51fn task_main() { 51fn task_main() {
52 let mut prev_buttons: u8 = 0;
52 loop { 53 loop {
53 while let Some(ev) = crate::usb::poll_mouse() 54 while let Some(ev) = crate::usb::poll_mouse()
54 .or_else(crate::ehci::poll_mouse) 55 .or_else(crate::ehci::poll_mouse)
55 .or_else(crate::uhci::poll_mouse) 56 .or_else(crate::uhci::poll_mouse)
56 .or_else(crate::ps2::try_poll_mouse) 57 .or_else(crate::ps2::try_poll_mouse)
57 { 58 {
58 crate::gop::cursor_move(ev.dx, ev.dy); 59 let (cx, cy) = crate::gop::cursor_move(ev.dx, ev.dy);
59 crate::gop::cursor_set_buttons(btn_bits(&ev)); 60 let buttons = btn_bits(&ev);
61 crate::gop::cursor_set_buttons(buttons);
62 // Left-button edge detection → press/release.
63 let kind = if buttons & 1 != 0 && prev_buttons & 1 == 0 {
64 crate::ps2::MouseKind::Press
65 } else if buttons & 1 == 0 && prev_buttons & 1 != 0 {
66 crate::ps2::MouseKind::Release
67 } else {
68 crate::ps2::MouseKind::Move
69 };
70 prev_buttons = buttons;
71 // Route to the window manager (focus + deliver to the focused
72 // window with window-relative coordinates).
73 crate::wm::route_mouse(cx as i32, cy as i32, buttons, kind);
74 // Legacy single-target debug routing (`mouse <id>`).
60 if let Some(id) = forward_target() 75 if let Some(id) = forward_target()
61 && crate::sched::send(id, TaskMsg::Mouse(ev)).is_err() 76 && crate::sched::send(id, TaskMsg::Mouse(ev)).is_err()
62 { 77 {