mirror of
https://github.com/rust-windowing/winit.git
synced 2026-08-30 05:10:03 -04:00
Add keyboard modifiers to input event
Making applications track modifier keys results in unnecessary work for
consumers, it's error prone, and it turns out to have unavoidable bugs.
For example, alt-tabbing with x11 results in the alt modifier state
getting stuck.
To resolve these problems, this patch adds a Mods value to the keyboard
input event.
Based on this patch: d287fa96e3
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
use cocoa::{self, appkit, foundation};
|
||||
use cocoa::appkit::{NSApplication, NSEvent, NSView, NSWindow};
|
||||
use events::{self, ElementState, Event, MouseButton, TouchPhase, WindowEvent};
|
||||
use events::{self, ElementState, Event, MouseButton, TouchPhase, WindowEvent, Modifiers};
|
||||
use super::window::Window;
|
||||
use std;
|
||||
|
||||
@@ -271,7 +271,7 @@ impl EventsLoop {
|
||||
let vkey = to_virtual_key_code(NSEvent::keyCode(ns_event));
|
||||
let state = ElementState::Pressed;
|
||||
let code = NSEvent::keyCode(ns_event) as u8;
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, vkey);
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, vkey, ModifiersState::default());
|
||||
events.push_back(into_event(window_event));
|
||||
let event = events.pop_front();
|
||||
self.pending_events.lock().unwrap().extend(events.into_iter());
|
||||
@@ -283,7 +283,7 @@ impl EventsLoop {
|
||||
|
||||
let state = ElementState::Released;
|
||||
let code = NSEvent::keyCode(ns_event) as u8;
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, vkey);
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, vkey, ModifiersState::default());
|
||||
Some(into_event(window_event))
|
||||
},
|
||||
|
||||
@@ -298,13 +298,13 @@ impl EventsLoop {
|
||||
if !key_pressed && NSEvent::modifierFlags(event).contains(keymask) {
|
||||
let state = ElementState::Pressed;
|
||||
let code = NSEvent::keyCode(event) as u8;
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, Some(key));
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, Some(key), ModifiersState::default());
|
||||
Some(window_event)
|
||||
|
||||
} else if key_pressed && !NSEvent::modifierFlags(event).contains(keymask) {
|
||||
let state = ElementState::Released;
|
||||
let code = NSEvent::keyCode(event) as u8;
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, Some(key));
|
||||
let window_event = WindowEvent::KeyboardInput(state, code, Some(key), ModifiersState::default());
|
||||
Some(window_event)
|
||||
|
||||
} else {
|
||||
|
||||
@@ -8,6 +8,7 @@ use std::os::windows::ffi::OsStringExt;
|
||||
|
||||
use CursorState;
|
||||
use WindowEvent as Event;
|
||||
use events::ModifersState;
|
||||
use super::event;
|
||||
use super::WindowState;
|
||||
|
||||
@@ -200,7 +201,7 @@ pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT,
|
||||
user32::DefWindowProcW(window, msg, wparam, lparam)
|
||||
} else {
|
||||
let (scancode, vkey) = event::vkeycode_to_element(wparam, lparam);
|
||||
send_event(window, KeyboardInput(Pressed, scancode, vkey));
|
||||
send_event(window, KeyboardInput(Pressed, scancode, vkey, ModifersState::default()));
|
||||
0
|
||||
}
|
||||
},
|
||||
@@ -209,7 +210,7 @@ pub unsafe extern "system" fn callback(window: winapi::HWND, msg: winapi::UINT,
|
||||
use events::WindowEvent::KeyboardInput;
|
||||
use events::ElementState::Released;
|
||||
let (scancode, vkey) = event::vkeycode_to_element(wparam, lparam);
|
||||
send_event(window, KeyboardInput(Released, scancode, vkey));
|
||||
send_event(window, KeyboardInput(Released, scancode, vkey, ModifersState::default()));
|
||||
0
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user