diff options
| author | Glenn Watson <gw@intuitionlibrary.com> | 2014-10-27 14:55:36 +1000 | 
|---|---|---|
| committer | Glenn Watson <gw@intuitionlibrary.com> | 2014-10-27 14:57:19 +1000 | 
| commit | e19dd83925b062d15422a318f727ddef6042023e (patch) | |
| tree | 75845d4f65de32f96b20456c879c589cbc32e6a6 | |
| parent | 41d7118a424513e658279df877eafd4421e10dc3 (diff) | |
| download | glutin-e19dd83925b062d15422a318f727ddef6042023e.tar.gz glutin-e19dd83925b062d15422a318f727ddef6042023e.zip  | |
Add support for keyboard modifiers on x11.
| -rw-r--r-- | src/x11/window/mod.rs | 34 | 
1 files changed, 31 insertions, 3 deletions
diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index 99cbf9d..0a1359b 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -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 { @@ -255,6 +257,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 @@ -375,7 +378,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 { @@ -406,10 +412,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()));                      //                  },  | 
