mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-23 22:01:31 +11:00
Merge pull request #77 from glennw/x11-modifiers
Add support for keyboard modifiers on x11.
This commit is contained in:
commit
32eba16994
|
@ -1,6 +1,7 @@
|
|||
use {Event, WindowBuilder};
|
||||
use {Event, WindowBuilder, KeyModifiers};
|
||||
use libc;
|
||||
use std::{mem, ptr};
|
||||
use std::cell::Cell;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use super::ffi;
|
||||
use sync::one::{Once, ONCE_INIT};
|
||||
|
@ -31,6 +32,7 @@ pub struct Window {
|
|||
xf86_desk_mode: *mut ffi::XF86VidModeModeInfo,
|
||||
screen_id: libc::c_int,
|
||||
is_fullscreen: bool,
|
||||
current_modifiers: Cell<KeyModifiers>,
|
||||
}
|
||||
|
||||
impl Window {
|
||||
|
@ -256,6 +258,7 @@ impl Window {
|
|||
xf86_desk_mode: xf86_desk_mode,
|
||||
screen_id: screen_id,
|
||||
is_fullscreen: builder.monitor.is_some(),
|
||||
current_modifiers: Cell::new(KeyModifiers::empty()),
|
||||
};
|
||||
|
||||
// calling glViewport
|
||||
|
@ -377,7 +380,10 @@ impl Window {
|
|||
},
|
||||
|
||||
ffi::KeyPress | ffi::KeyRelease => {
|
||||
use {KeyboardInput, Pressed, Released, ReceivedCharacter, KeyModifiers};
|
||||
use {KeyboardInput, Pressed, Released, ReceivedCharacter};
|
||||
use {LEFT_CONTROL_MODIFIER, RIGHT_CONTROL_MODIFIER};
|
||||
use {LEFT_SHIFT_MODIFIER, RIGHT_SHIFT_MODIFIER};
|
||||
use {LEFT_ALT_MODIFIER, RIGHT_ALT_MODIFIER, CAPS_LOCK_MODIFIER};
|
||||
let event: &mut ffi::XKeyEvent = unsafe { mem::transmute(&xev) };
|
||||
|
||||
if event.type_ == ffi::KeyPress {
|
||||
|
@ -408,10 +414,32 @@ impl Window {
|
|||
ffi::XKeycodeToKeysym(self.display, event.keycode as ffi::KeyCode, 0)
|
||||
};
|
||||
|
||||
let modifier_flag = match keysym as u32 {
|
||||
ffi::XK_Shift_L => Some(LEFT_SHIFT_MODIFIER),
|
||||
ffi::XK_Shift_R => Some(RIGHT_SHIFT_MODIFIER),
|
||||
ffi::XK_Control_L => Some(LEFT_CONTROL_MODIFIER),
|
||||
ffi::XK_Control_R => Some(RIGHT_CONTROL_MODIFIER),
|
||||
ffi::XK_Caps_Lock => Some(CAPS_LOCK_MODIFIER),
|
||||
ffi::XK_Meta_L => Some(LEFT_ALT_MODIFIER),
|
||||
ffi::XK_Meta_R => Some(RIGHT_ALT_MODIFIER),
|
||||
_ => None,
|
||||
};
|
||||
match modifier_flag {
|
||||
Some(flag) => {
|
||||
let mut current_modifiers = self.current_modifiers.get();
|
||||
match state {
|
||||
Pressed => current_modifiers.insert(flag),
|
||||
Released => current_modifiers.remove(flag),
|
||||
}
|
||||
self.current_modifiers.set(current_modifiers);
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
|
||||
let vkey = events::keycode_to_element(keysym as libc::c_uint);
|
||||
|
||||
events.push(KeyboardInput(state, event.keycode as u8,
|
||||
vkey, KeyModifiers::empty()));
|
||||
vkey, self.current_modifiers.get()));
|
||||
//
|
||||
},
|
||||
|
||||
|
|
Loading…
Reference in a new issue