macOS: add WindowEvent::PointerButton::is_macos_activation_click

Apps need per-click decisions to follow the macOS convention of accepting
first mouse for low-risk actions (selection, scrolling) but rejecting it
for buttons and destructive actions. Motivated by slint-ui/slint#10451.

Always return `true` from `acceptsFirstMouse:`, and tag the resulting
`PointerButton` events with `is_macos_activation_click: true` (on both
the activating left press and its matching release) so the app can
short-circuit the whole gesture with a single check:

    WindowEvent::PointerButton { is_macos_activation_click: true, .. } => return,

Replaces an earlier callback-based design (`accepts_first_mouse` on
`ApplicationHandlerExtMacOS`) that mapped more closely to AppKit but
didn't fit winit's event-driven model and required re-entrancy handling.

Also removes `WindowAttributesMacOS::with_accepts_first_mouse`, which is
now redundant — apps that want to reject activation clicks check the
flag on the per-event instead.
This commit is contained in:
Till Adam
2026-06-18 22:39:35 +02:00
committed by Simon Hausmann
parent 92b643c3f1
commit 6a8a334426
15 changed files with 95 additions and 21 deletions

View File

@@ -187,6 +187,7 @@ impl PointerHandler for WinitState {
state,
position,
button,
is_macos_activation_click: false,
},
window_id,
);

View File

@@ -67,6 +67,7 @@ impl TouchHandler for WinitState {
state: ElementState::Pressed,
position,
button: ButtonSource::Touch { finger_id, force: None },
is_macos_activation_click: false,
},
window_id,
);
@@ -120,6 +121,7 @@ impl TouchHandler for WinitState {
state: ElementState::Released,
position,
button: ButtonSource::Touch { finger_id, force: None },
is_macos_activation_click: false,
},
window_id,
);

View File

@@ -235,6 +235,7 @@ impl Dispatch2<ZwpTabletToolV2, WinitState> for TabletToolData {
button,
data: data.tool_state.clone(),
},
is_macos_activation_click: false,
}
},
TabletEvent::Left => WindowEvent::PointerLeft {