Skip to content

Commit b6c2045

Browse files
committed
appkit: update DeviceEvent::Button to DeviceEvent::PointerButton
1 parent c4feebb commit b6c2045

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

winit-appkit/src/app.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ use objc2::runtime::{Imp, Sel};
99
use objc2::sel;
1010
use objc2_app_kit::{NSApplication, NSEvent, NSEventModifierFlags, NSEventType};
1111
use objc2_foundation::MainThreadMarker;
12-
use winit_core::event::{DeviceEvent, ElementState};
12+
use winit_core::event::{DeviceButtonSource, DeviceEvent, ElementState};
1313

1414
use super::app_state::AppState;
15+
use super::event::button_number_to_mouse_button;
1516

1617
type SendEvent = extern "C-unwind" fn(&NSApplication, Sel, &NSEvent);
1718

@@ -117,19 +118,23 @@ fn maybe_dispatch_device_event(app_state: &Rc<AppState>, event: &NSEvent) {
117118
}
118119
},
119120
NSEventType::LeftMouseDown | NSEventType::RightMouseDown | NSEventType::OtherMouseDown => {
120-
let button = event.buttonNumber() as u32;
121+
let button_number = event.buttonNumber();
122+
let source = DeviceButtonSource::Mouse(button_number_to_mouse_button(button_number));
121123
app_state.maybe_queue_with_handler(move |app, event_loop| {
122-
app.device_event(event_loop, None, DeviceEvent::Button {
123-
button,
124+
app.device_event(event_loop, None, DeviceEvent::PointerButton {
125+
button: source,
126+
button_id: button_number as u32,
124127
state: ElementState::Pressed,
125128
});
126129
});
127130
},
128131
NSEventType::LeftMouseUp | NSEventType::RightMouseUp | NSEventType::OtherMouseUp => {
129-
let button = event.buttonNumber() as u32;
132+
let button_number = event.buttonNumber();
133+
let source = DeviceButtonSource::Mouse(button_number_to_mouse_button(button_number));
130134
app_state.maybe_queue_with_handler(move |app, event_loop| {
131-
app.device_event(event_loop, None, DeviceEvent::Button {
132-
button,
135+
app.device_event(event_loop, None, DeviceEvent::PointerButton {
136+
button: source,
137+
button_id: button_number as u32,
133138
state: ElementState::Released,
134139
});
135140
});

winit-appkit/src/event.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use dispatch2::run_on_main;
44
use objc2::rc::Retained;
55
use objc2_app_kit::{NSEvent, NSEventModifierFlags, NSEventSubtype, NSEventType};
66
use objc2_core_foundation::{CFData, CFRetained};
7-
use objc2_foundation::NSPoint;
7+
use objc2_foundation::{NSInteger, NSPoint};
88
use smol_str::SmolStr;
9-
use winit_core::event::{ElementState, KeyEvent, Modifiers};
9+
use winit_core::event::{ElementState, KeyEvent, Modifiers, MouseButton};
1010
use winit_core::keyboard::{
1111
Key, KeyCode, KeyLocation, ModifiersKeys, ModifiersState, NamedKey, NativeKey, NativeKeyCode,
1212
PhysicalKey,
@@ -272,6 +272,22 @@ pub fn code_to_location(key: PhysicalKey) -> KeyLocation {
272272
}
273273
}
274274

275+
pub fn button_number_to_mouse_button(button_number: NSInteger) -> MouseButton {
276+
// The buttonNumber property only makes sense for the mouse events:
277+
// NSLeftMouse.../NSRightMouse.../NSOtherMouse...
278+
// For other events, it's always set to 0.
279+
// MacOS only defines the left, right and middle buttons, 3..=31 are left as generic buttons,
280+
// but 3 and 4 are very commonly used as Back and Forward by hardware vendors and applications.
281+
match button_number {
282+
0 => MouseButton::Left,
283+
1 => MouseButton::Right,
284+
2 => MouseButton::Middle,
285+
3 => MouseButton::Back,
286+
4 => MouseButton::Forward,
287+
n => MouseButton::Other(n as u16),
288+
}
289+
}
290+
275291
// While F1-F20 have scancodes we can match on, we have to check against UTF-16
276292
// constants for the rest.
277293
// https://developer.apple.com/documentation/appkit/1535851-function-key_unicodes?preferredLanguage=occ

winit-appkit/src/view.rs

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ use objc2_foundation::{
1818
NSNotFound, NSObject, NSPoint, NSRange, NSRect, NSSize, NSString, NSUInteger,
1919
};
2020
use winit_core::event::{
21-
DeviceEvent, ElementState, Ime, KeyEvent, Modifiers, MouseButton, MouseScrollDelta,
22-
PointerKind, PointerSource, TouchPhase, WindowEvent,
21+
DeviceEvent, ElementState, Ime, KeyEvent, Modifiers, MouseScrollDelta, PointerKind,
22+
PointerSource, TouchPhase, WindowEvent,
2323
};
2424
use winit_core::keyboard::{Key, KeyCode, KeyLocation, ModifiersState, NamedKey};
2525
use winit_core::window::ImeCapabilities;
2626

2727
use super::app_state::AppState;
2828
use super::cursor::{default_cursor, invisible_cursor};
2929
use super::event::{
30-
code_to_key, code_to_location, create_key_event, event_mods, lalt_pressed, ralt_pressed,
31-
scancode_to_physicalkey,
30+
button_number_to_mouse_button, code_to_key, code_to_location, create_key_event, event_mods,
31+
lalt_pressed, ralt_pressed, scancode_to_physicalkey,
3232
};
3333
use super::window::window_id;
3434
use crate::OptionAsAlt;
@@ -1041,7 +1041,7 @@ impl WinitView {
10411041

10421042
fn mouse_click(&self, event: &NSEvent, button_state: ElementState) {
10431043
let position = self.mouse_view_point(event).to_physical(self.scale_factor());
1044-
let button = mouse_button(event);
1044+
let button = button_number_to_mouse_button(event.buttonNumber());
10451045

10461046
self.update_modifiers(event, false);
10471047

@@ -1088,23 +1088,6 @@ impl WinitView {
10881088
}
10891089
}
10901090

1091-
/// Get the mouse button from the NSEvent.
1092-
fn mouse_button(event: &NSEvent) -> MouseButton {
1093-
// The buttonNumber property only makes sense for the mouse events:
1094-
// NSLeftMouse.../NSRightMouse.../NSOtherMouse...
1095-
// For the other events, it's always set to 0.
1096-
// MacOS only defines the left, right and middle buttons, 3..=31 are left as generic buttons,
1097-
// but 3 and 4 are very commonly used as Back and Forward by hardware vendors and applications.
1098-
match event.buttonNumber() {
1099-
0 => MouseButton::Left,
1100-
1 => MouseButton::Right,
1101-
2 => MouseButton::Middle,
1102-
3 => MouseButton::Back,
1103-
4 => MouseButton::Forward,
1104-
n => MouseButton::Other(n as u16),
1105-
}
1106-
}
1107-
11081091
// NOTE: to get option as alt working we need to rewrite events
11091092
// we're getting from the operating system, which makes it
11101093
// impossible to provide such events as extra in `KeyEvent`.

0 commit comments

Comments
 (0)