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 libc;
|
||||||
use std::{mem, ptr};
|
use std::{mem, ptr};
|
||||||
|
use std::cell::Cell;
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
use super::ffi;
|
use super::ffi;
|
||||||
use sync::one::{Once, ONCE_INIT};
|
use sync::one::{Once, ONCE_INIT};
|
||||||
|
@ -31,6 +32,7 @@ pub struct Window {
|
||||||
xf86_desk_mode: *mut ffi::XF86VidModeModeInfo,
|
xf86_desk_mode: *mut ffi::XF86VidModeModeInfo,
|
||||||
screen_id: libc::c_int,
|
screen_id: libc::c_int,
|
||||||
is_fullscreen: bool,
|
is_fullscreen: bool,
|
||||||
|
current_modifiers: Cell<KeyModifiers>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
|
@ -256,6 +258,7 @@ impl Window {
|
||||||
xf86_desk_mode: xf86_desk_mode,
|
xf86_desk_mode: xf86_desk_mode,
|
||||||
screen_id: screen_id,
|
screen_id: screen_id,
|
||||||
is_fullscreen: builder.monitor.is_some(),
|
is_fullscreen: builder.monitor.is_some(),
|
||||||
|
current_modifiers: Cell::new(KeyModifiers::empty()),
|
||||||
};
|
};
|
||||||
|
|
||||||
// calling glViewport
|
// calling glViewport
|
||||||
|
@ -377,7 +380,10 @@ impl Window {
|
||||||
},
|
},
|
||||||
|
|
||||||
ffi::KeyPress | ffi::KeyRelease => {
|
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) };
|
let event: &mut ffi::XKeyEvent = unsafe { mem::transmute(&xev) };
|
||||||
|
|
||||||
if event.type_ == ffi::KeyPress {
|
if event.type_ == ffi::KeyPress {
|
||||||
|
@ -408,10 +414,32 @@ impl Window {
|
||||||
ffi::XKeycodeToKeysym(self.display, event.keycode as ffi::KeyCode, 0)
|
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);
|
let vkey = events::keycode_to_element(keysym as libc::c_uint);
|
||||||
|
|
||||||
events.push(KeyboardInput(state, event.keycode as u8,
|
events.push(KeyboardInput(state, event.keycode as u8,
|
||||||
vkey, KeyModifiers::empty()));
|
vkey, self.current_modifiers.get()));
|
||||||
//
|
//
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue