Skip to content

Commit f58a9d4

Browse files
authored
Add back and forward mouse buttons (#381)
1 parent 4910569 commit f58a9d4

8 files changed

Lines changed: 82 additions & 6 deletions

File tree

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ pub enum MouseButton {
9393
Middle,
9494
/// Right mouse button
9595
Right,
96+
/// Back mouse button
97+
Back,
98+
/// Forward mouse button
99+
Forward,
96100
}
97101

98102
/// The different modes that can be used to decide how mouse coordinates should be handled

src/native/macosx/OSXWindowFrameView.m

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,30 @@ - (void)rightMouseUp:(NSEvent*)event {
375375

376376
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
377377

378+
- (void)otherMouseDown:(NSEvent*)event {
379+
(void)event;
380+
OSXWindow* window = (OSXWindow*)[self window];
381+
382+
NSInteger button = [event buttonNumber];
383+
if (button == 3 || button == 4) {
384+
window->shared_data->mouse_state[button] = 1;
385+
}
386+
}
387+
388+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
389+
390+
- (void)otherMouseUp:(NSEvent*)event {
391+
(void)event;
392+
OSXWindow* window = (OSXWindow*)[self window];
393+
394+
NSInteger button = [event buttonNumber];
395+
if (button == 3 || button == 4) {
396+
window->shared_data->mouse_state[button] = 0;
397+
}
398+
}
399+
400+
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
401+
378402
- (void)scrollWheel:(NSEvent *)event {
379403
OSXWindow* window = (OSXWindow*)[self window];
380404
window->shared_data->scroll_x = [event deltaX];

src/os/macos/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,8 @@ impl Window {
462462
MouseButton::Left => self.shared_data.state[0] > 0,
463463
MouseButton::Middle => self.shared_data.state[1] > 0,
464464
MouseButton::Right => self.shared_data.state[2] > 0,
465+
MouseButton::Back => self.shared_data.state[3] > 0,
466+
MouseButton::Forward => self.shared_data.state[4] > 0,
465467
}
466468
}
467469

src/os/posix/wayland.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ const KEY_XKB_OFFSET: u32 = 8;
5353
const KEY_MOUSE_BTN1: u32 = 272;
5454
const KEY_MOUSE_BTN2: u32 = 273;
5555
const KEY_MOUSE_BTN3: u32 = 274;
56+
const KEY_MOUSE_BTN8: u32 = 275;
57+
const KEY_MOUSE_BTN9: u32 = 276;
5658

5759
type ToplevelResolution = Rc<RefCell<Option<(i32, i32)>>>;
5860
type ToplevelClosed = Rc<RefCell<bool>>;
@@ -621,6 +623,8 @@ impl Window {
621623
MouseButton::Left => self.buttons[0],
622624
MouseButton::Right => self.buttons[1],
623625
MouseButton::Middle => self.buttons[2],
626+
MouseButton::Back => self.buttons[3],
627+
MouseButton::Forward => self.buttons[4],
624628
}
625629
}
626630

@@ -892,10 +896,14 @@ impl Window {
892896
KEY_MOUSE_BTN2 => self.buttons[1] = pressed,
893897
// Middle mouse button
894898
KEY_MOUSE_BTN3 => self.buttons[2] = pressed,
895-
_ => {
899+
// Back mouse button
900+
KEY_MOUSE_BTN8 => self.buttons[3] = pressed,
901+
// Forward mouse button
902+
KEY_MOUSE_BTN9 => self.buttons[4] = pressed,
903+
_ => (
896904
// TODO: handle more mouse buttons (see: linux/input-event-codes.h from
897905
// the Linux kernel)
898-
}
906+
),
899907
}
900908

901909
if self.pointer_visibility {

src/os/posix/x11.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ use x11_dl::{
2727
},
2828
};
2929

30-
// NOTE: the x11-dl crate does not define Button6 or Button7
30+
// NOTE: the x11-dl crate does not define Button6, Button7, Button8, and Button9
3131
const Button6: c_uint = xlib::Button5 + 1;
3232
const Button7: c_uint = xlib::Button5 + 2;
33+
const Button8: c_uint = xlib::Button5 + 3;
34+
const Button9: c_uint = xlib::Button5 + 4;
3335

3436
#[repr(C)]
3537
struct MwmHints {
@@ -272,7 +274,7 @@ pub struct Window {
272274
mouse_y: f32,
273275
scroll_x: f32,
274276
scroll_y: f32,
275-
buttons: [u8; 3],
277+
buttons: [u8; 5],
276278
prev_cursor: CursorStyle,
277279
active: bool,
278280

@@ -490,7 +492,7 @@ impl Window {
490492
scroll_y: 0.0,
491493
bg_color: 0,
492494
scale_mode: opts.scale_mode,
493-
buttons: [0, 0, 0],
495+
buttons: [0, 0, 0, 0, 0],
494496
prev_cursor: CursorStyle::Arrow,
495497
should_close: false,
496498
active: false,
@@ -734,6 +736,8 @@ impl Window {
734736
MouseButton::Left => self.buttons[0] > 0,
735737
MouseButton::Middle => self.buttons[1] > 0,
736738
MouseButton::Right => self.buttons[2] > 0,
739+
MouseButton::Back => self.buttons[3] > 0,
740+
MouseButton::Forward => self.buttons[4] > 0,
737741
}
738742
}
739743

@@ -1181,6 +1185,16 @@ impl Window {
11811185
return;
11821186
}
11831187

1188+
Button8 => {
1189+
self.buttons[3] = if is_down { 1 } else { 0 };
1190+
return;
1191+
}
1192+
1193+
Button9 => {
1194+
self.buttons[4] = if is_down { 1 } else { 0 };
1195+
return;
1196+
}
1197+
11841198
_ => {}
11851199
}
11861200

src/os/redox/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ impl Window {
153153
MouseButton::Left => self.mouse_state.0,
154154
MouseButton::Middle => self.mouse_state.1,
155155
MouseButton::Right => self.mouse_state.2,
156+
MouseButton::Back => unimplemented!("Back button is not supported"),
157+
MouseButton::Forward => unimplemented!("Forward button is not supported"),
156158
}
157159
}
158160

src/os/wasm/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ struct MouseState {
3939
left_button: Cell<bool>,
4040
right_button: Cell<bool>,
4141
middle_button: Cell<bool>,
42+
back_button: Cell<bool>,
43+
forward_button: Cell<bool>,
4244
}
4345

4446
struct Context2D {
@@ -117,6 +119,8 @@ impl Window {
117119
left_button: Cell::new(false),
118120
right_button: Cell::new(false),
119121
middle_button: Cell::new(false),
122+
back_button: Cell::new(false),
123+
forward_button: Cell::new(false),
120124
};
121125
let mouse_state = Rc::new(mouse_struct);
122126
{
@@ -149,6 +153,8 @@ impl Window {
149153
0 => mouse_state.left_button.set(true),
150154
1 => mouse_state.middle_button.set(true),
151155
2 => mouse_state.right_button.set(true),
156+
3 => mouse_state.back_button.set(true),
157+
4 => mouse_state.forward_button.set(true),
152158
_ => (),
153159
}
154160
}) as Box<dyn FnMut(_)>);
@@ -177,6 +183,8 @@ impl Window {
177183
0 => mouse_state.left_button.set(false),
178184
1 => mouse_state.middle_button.set(false),
179185
2 => mouse_state.right_button.set(false),
186+
3 => mouse_state.back_button.set(false),
187+
4 => mouse_state.forward_button.set(false),
180188
_ => (),
181189
}
182190
}) as Box<dyn FnMut(_)>);
@@ -361,6 +369,8 @@ impl Window {
361369
MouseButton::Left => self.mouse_state.left_button.get(),
362370
MouseButton::Middle => self.mouse_state.middle_button.get(),
363371
MouseButton::Right => self.mouse_state.right_button.get(),
372+
MouseButton::Back => self.mouse_state.back_button.get(),
373+
MouseButton::Forward => self.mouse_state.forward_button.get(),
364374
}
365375
}
366376

src/os/windows/mod.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ use winapi::{
2727
fileapi::GetFullPathNameW,
2828
libloaderapi, wingdi,
2929
winuser::{
30-
self, ICON_BIG, ICON_SMALL, IMAGE_ICON, LR_DEFAULTSIZE, LR_LOADFROMFILE, WM_SETICON,
30+
self, GET_XBUTTON_WPARAM, ICON_BIG, ICON_SMALL, IMAGE_ICON, LR_DEFAULTSIZE,
31+
LR_LOADFROMFILE, WM_SETICON,
3132
},
3233
},
3334
};
@@ -274,6 +275,15 @@ unsafe extern "system" fn wnd_proc(
274275
winuser::WM_RBUTTONDOWN => wnd.mouse.state[2] = true,
275276
winuser::WM_RBUTTONUP => wnd.mouse.state[2] = false,
276277

278+
winuser::WM_XBUTTONDOWN => {
279+
let button = GET_XBUTTON_WPARAM(wparam); // XBUTTON1 or XBUTTON2
280+
wnd.mouse.state[2 + button as usize] = true;
281+
}
282+
winuser::WM_XBUTTONUP => {
283+
let button = GET_XBUTTON_WPARAM(wparam); // XBUTTON1 or XBUTTON2
284+
wnd.mouse.state[2 + button as usize] = false;
285+
}
286+
277287
winuser::WM_CLOSE => {
278288
wnd.is_open = false;
279289
}
@@ -836,6 +846,8 @@ impl Window {
836846
MouseButton::Left => self.mouse.state[0],
837847
MouseButton::Middle => self.mouse.state[1],
838848
MouseButton::Right => self.mouse.state[2],
849+
MouseButton::Back => self.mouse.state[3],
850+
MouseButton::Forward => self.mouse.state[4],
839851
}
840852
}
841853

0 commit comments

Comments
 (0)