Merge pull request #77 from glennw/x11-modifiers

Add support for keyboard modifiers on x11.
This commit is contained in:
tomaka 2014-10-27 07:20:00 +01:00
commit 32eba16994

View file

@ -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()));
// //
}, },