added mouse hold support (#48)
This adds support for the escape codes generated in rxvt and xterm format by holding a button and moving the mouse around.
This commit is contained in:
parent
98a4ccce4b
commit
5ebda9866f
|
@ -9,20 +9,24 @@ fn main() {
|
||||||
let stdin = stdin();
|
let stdin = stdin();
|
||||||
let mut stdout = MouseTerminal::from(stdout().into_raw_mode().unwrap());
|
let mut stdout = MouseTerminal::from(stdout().into_raw_mode().unwrap());
|
||||||
|
|
||||||
write!(stdout, "{}{}q to exit. Type stuff, use alt, click around...", termion::clear::All, termion::cursor::Goto(1, 1)).unwrap();
|
writeln!(stdout,
|
||||||
|
"{}{}q to exit. Type stuff, use alt, click around...",
|
||||||
|
termion::clear::All,
|
||||||
|
termion::cursor::Goto(1, 1))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let mut x = 1;
|
let mut x = 5;
|
||||||
let mut y = 1;
|
let mut y = 5;
|
||||||
|
|
||||||
for c in stdin.events() {
|
for c in stdin.events() {
|
||||||
let evt = c.unwrap();
|
let evt = c.unwrap();
|
||||||
writeln!(stdout, "{:?}{}{}", evt, termion::cursor::Goto(5, 5), termion::clear::CurrentLine).unwrap();
|
|
||||||
match evt {
|
match evt {
|
||||||
Event::Key(Key::Char('q')) => break,
|
Event::Key(Key::Char('q')) => break,
|
||||||
Event::Mouse(me) => {
|
Event::Mouse(me) => {
|
||||||
match me {
|
match me {
|
||||||
MouseEvent::Press(_, a, b) |
|
MouseEvent::Press(_, a, b) |
|
||||||
MouseEvent::Release(a, b) => {
|
MouseEvent::Release(a, b) |
|
||||||
|
MouseEvent::Hold(a, b) => {
|
||||||
x = a;
|
x = a;
|
||||||
y = b;
|
y = b;
|
||||||
}
|
}
|
||||||
|
@ -30,7 +34,13 @@ fn main() {
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
writeln!(stdout, "{:?}{}", evt, termion::cursor::Goto(x, y)).unwrap();
|
write!(stdout,
|
||||||
|
"{}{} {:?}{}",
|
||||||
|
termion::clear::All,
|
||||||
|
termion::cursor::Goto(x, y),
|
||||||
|
evt,
|
||||||
|
termion::cursor::Goto(x, y))
|
||||||
|
.unwrap();
|
||||||
stdout.flush().unwrap();
|
stdout.flush().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
35
src/event.rs
35
src/event.rs
|
@ -26,6 +26,10 @@ pub enum MouseEvent {
|
||||||
///
|
///
|
||||||
/// The coordinates are one-based.
|
/// The coordinates are one-based.
|
||||||
Release(u16, u16),
|
Release(u16, u16),
|
||||||
|
/// A mouse button is held over the given coordinates.
|
||||||
|
///
|
||||||
|
/// The coordinates are one-based.
|
||||||
|
Hold(u16, u16),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A mouse button.
|
/// A mouse button.
|
||||||
|
@ -159,20 +163,28 @@ where I: Iterator<Item = Result<u8, Error>>
|
||||||
let cx = nums.next().unwrap().parse::<u16>().unwrap();
|
let cx = nums.next().unwrap().parse::<u16>().unwrap();
|
||||||
let cy = nums.next().unwrap().parse::<u16>().unwrap();
|
let cy = nums.next().unwrap().parse::<u16>().unwrap();
|
||||||
|
|
||||||
let button = match cb {
|
let event = match cb {
|
||||||
0 => MouseButton::Left,
|
0...2 | 64...65 => {
|
||||||
1 => MouseButton::Middle,
|
let button = match cb {
|
||||||
2 => MouseButton::Right,
|
0 => MouseButton::Left,
|
||||||
64 => MouseButton::WheelUp,
|
1 => MouseButton::Middle,
|
||||||
65 => MouseButton::WheelDown,
|
2 => MouseButton::Right,
|
||||||
|
64 => MouseButton::WheelUp,
|
||||||
|
65 => MouseButton::WheelDown,
|
||||||
|
_ => return error,
|
||||||
|
};
|
||||||
|
match c {
|
||||||
|
b'M' => MouseEvent::Press(button, cx, cy),
|
||||||
|
b'm' => MouseEvent::Release(cx, cy),
|
||||||
|
_ => return error,
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
32 => MouseEvent::Hold(cx, cy),
|
||||||
_ => return error,
|
_ => return error,
|
||||||
};
|
};
|
||||||
Event::Mouse(match c {
|
|
||||||
b'M' => MouseEvent::Press(button, cx, cy),
|
|
||||||
b'm' => MouseEvent::Release(cx, cy),
|
|
||||||
_ => return error,
|
|
||||||
|
|
||||||
})
|
Event::Mouse(event)
|
||||||
}
|
}
|
||||||
Some(Ok(c @ b'0'...b'9')) => {
|
Some(Ok(c @ b'0'...b'9')) => {
|
||||||
// Numbered escape code.
|
// Numbered escape code.
|
||||||
|
@ -203,6 +215,7 @@ where I: Iterator<Item = Result<u8, Error>>
|
||||||
33 => MouseEvent::Press(MouseButton::Middle, cx, cy),
|
33 => MouseEvent::Press(MouseButton::Middle, cx, cy),
|
||||||
34 => MouseEvent::Press(MouseButton::Right, cx, cy),
|
34 => MouseEvent::Press(MouseButton::Right, cx, cy),
|
||||||
35 => MouseEvent::Release(cx, cy),
|
35 => MouseEvent::Release(cx, cy),
|
||||||
|
64 => MouseEvent::Hold(cx, cy),
|
||||||
96 |
|
96 |
|
||||||
97 => MouseEvent::Press(MouseButton::WheelUp, cx, cy),
|
97 => MouseEvent::Press(MouseButton::WheelUp, cx, cy),
|
||||||
_ => return error,
|
_ => return error,
|
||||||
|
|
Loading…
Reference in New Issue