From 848056fcf691f9d1a969f09a184dd96da8abcd2d Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Sat, 9 Nov 2019 17:55:26 +0100 Subject: [PATCH] Add ModifiersChanged event for macOS This implements the macOS portion of #1124. --- src/event.rs | 1 - src/platform_impl/macos/view.rs | 37 ++++++++++++++++----------------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/event.rs b/src/event.rs index d55489087ea..ce8d0eb2a76 100644 --- a/src/event.rs +++ b/src/event.rs @@ -135,7 +135,6 @@ pub enum WindowEvent { }, /// Keyboard modifiers have changed - #[doc(hidden)] ModifiersChanged { modifiers: ModifiersState }, /// The cursor has moved on the window. diff --git a/src/platform_impl/macos/view.rs b/src/platform_impl/macos/view.rs index d7c9edc66aa..16190db1929 100644 --- a/src/platform_impl/macos/view.rs +++ b/src/platform_impl/macos/view.rs @@ -18,8 +18,8 @@ use objc::{ use crate::{ event::{ - DeviceEvent, ElementState, Event, KeyboardInput, MouseButton, MouseScrollDelta, TouchPhase, - VirtualKeyCode, WindowEvent, + DeviceEvent, ElementState, Event, KeyboardInput, ModifiersState, MouseButton, + MouseScrollDelta, TouchPhase, VirtualKeyCode, WindowEvent, }, platform_impl::platform::{ app_state::AppState, @@ -35,21 +35,13 @@ use crate::{ window::WindowId, }; -#[derive(Default)] -struct Modifiers { - shift_pressed: bool, - ctrl_pressed: bool, - win_pressed: bool, - alt_pressed: bool, -} - struct ViewState { ns_window: id, pub cursor: Arc>, ime_spot: Option<(f64, f64)>, raw_characters: Option, is_key_down: bool, - modifiers: Modifiers, + modifiers: ModifiersState, } pub fn new_view(ns_window: id) -> (IdRef, Weak>) { @@ -634,36 +626,36 @@ extern "C" fn flags_changed(this: &Object, _sel: Sel, event: id) { if let Some(window_event) = modifier_event( event, NSEventModifierFlags::NSShiftKeyMask, - state.modifiers.shift_pressed, + state.modifiers.shift, ) { - state.modifiers.shift_pressed = !state.modifiers.shift_pressed; + state.modifiers.shift = !state.modifiers.shift; events.push_back(window_event); } if let Some(window_event) = modifier_event( event, NSEventModifierFlags::NSControlKeyMask, - state.modifiers.ctrl_pressed, + state.modifiers.ctrl, ) { - state.modifiers.ctrl_pressed = !state.modifiers.ctrl_pressed; + state.modifiers.ctrl = !state.modifiers.ctrl; events.push_back(window_event); } if let Some(window_event) = modifier_event( event, NSEventModifierFlags::NSCommandKeyMask, - state.modifiers.win_pressed, + state.modifiers.logo, ) { - state.modifiers.win_pressed = !state.modifiers.win_pressed; + state.modifiers.logo = !state.modifiers.logo; events.push_back(window_event); } if let Some(window_event) = modifier_event( event, NSEventModifierFlags::NSAlternateKeyMask, - state.modifiers.alt_pressed, + state.modifiers.alt, ) { - state.modifiers.alt_pressed = !state.modifiers.alt_pressed; + state.modifiers.alt = !state.modifiers.alt; events.push_back(window_event); } @@ -673,6 +665,13 @@ extern "C" fn flags_changed(this: &Object, _sel: Sel, event: id) { event, }); } + + AppState::queue_event(Event::WindowEvent { + window_id: WindowId(get_window_id(state.ns_window)), + event: WindowEvent::ModifiersChanged { + modifiers: state.modifiers, + }, + }); } trace!("Completed `flagsChanged`"); }