From 1de66e4efbd428e5cefa422e6c771e225cab1829 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sat, 27 Feb 2016 15:29:06 +0530 Subject: Add support for navigation keys --- src/api/x11/events.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/api/x11') diff --git a/src/api/x11/events.rs b/src/api/x11/events.rs index 408a3ec..d497319 100644 --- a/src/api/x11/events.rs +++ b/src/api/x11/events.rs @@ -3,6 +3,7 @@ use super::ffi; use VirtualKeyCode; pub fn keycode_to_element(scancode: libc::c_uint) -> Option { + println!("{:?}", scancode); Some(match scancode { ffi::XK_BackSpace => events::VirtualKeyCode::Back, ffi::XK_Tab => events::VirtualKeyCode::Tab, @@ -997,6 +998,8 @@ pub fn keycode_to_element(scancode: libc::c_uint) -> Option { //ffi::XK_hebrew_taw => events::VirtualKeyCode::Hebrew_taw, //ffi::XK_hebrew_taf => events::VirtualKeyCode::Hebrew_taf, //ffi::XK_Hebrew_switch => events::VirtualKeyCode::Hebrew_switch, + ffi::XF86XK_Back => VirtualKeyCode::NavigateBackward, + ffi::XF86XK_Forward => VirtualKeyCode::NavigateForward, _ => return None }) } -- cgit v1.2.3 From 267221af3e239c79a2617c46ba3f1259663c29f7 Mon Sep 17 00:00:00 2001 From: Thinkofname Date: Mon, 21 Mar 2016 18:42:54 +0000 Subject: Implement CursorState::Hide for x11 --- src/api/x11/window.rs | 55 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 14 deletions(-) (limited to 'src/api/x11') diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index 8cae2be..b4019e4 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -339,7 +339,7 @@ impl Window { let m = (0 .. mode_num).map(|i| { let m: ffi::XF86VidModeModeInfo = ptr::read(*modes.offset(i as isize) as *const _); m }).find(|m| m.hdisplay >= dimensions.0 as u16 && m.vdisplay >= dimensions.1 as u16); - + match m { Some(m) => Some(m), None => return Err(OsError(format!("Could not find a suitable graphics mode"))) @@ -845,29 +845,61 @@ impl Window { self.x.display.check_errors().expect("Failed to call XcursorLibraryLoadCursor"); (self.x.display.xlib.XDefineCursor)(self.x.display.display, self.x.window, xcursor); (self.x.display.xlib.XFlush)(self.x.display.display); + (self.x.display.xlib.XFreeCursor)(self.x.display.display, xcursor); self.x.display.check_errors().expect("Failed to call XDefineCursor"); } } pub fn set_cursor_state(&self, state: CursorState) -> Result<(), String> { - use CursorState::{ Grab, Normal }; + use CursorState::{ Grab, Normal, Hide }; let mut cursor_state = self.cursor_state.lock().unwrap(); - match (state, *cursor_state) { - (Normal, Grab) => { + (Normal, Normal) | (Hide, Hide) | (Grab, Grab) => return Ok(()), + _ => {}, + } + + match *cursor_state { + Grab => { unsafe { (self.x.display.xlib.XUngrabPointer)(self.x.display.display, ffi::CurrentTime); self.x.display.check_errors().expect("Failed to call XUngrabPointer"); - *cursor_state = Normal; - Ok(()) } }, - - (Grab, Normal) => { + Normal => {}, + Hide => { unsafe { - *cursor_state = Grab; + let xcursor = (self.x.display.xlib.XCreateFontCursor)(self.x.display.display, 68/*XC_left_ptr*/); + self.x.display.check_errors().expect("Failed to call XCreateFontCursor"); + (self.x.display.xlib.XDefineCursor)(self.x.display.display, self.x.window, xcursor); + self.x.display.check_errors().expect("Failed to call XDefineCursor"); + (self.x.display.xlib.XFlush)(self.x.display.display); + (self.x.display.xlib.XFreeCursor)(self.x.display.display, xcursor); + } + }, + } + *cursor_state = state; + match state { + Normal => Ok(()), + Hide => { + let data = &[0, 0, 0, 0, 0, 0, 0, 0]; + unsafe { + let mut black = ffi::XColor { + red: 0, green: 0, blue: 0, + pad: 0, pixel: 0, flags: 0, + }; + let bitmap = (self.x.display.xlib.XCreateBitmapFromData)(self.x.display.display, self.x.window, data.as_ptr(), 8, 8); + let cursor = (self.x.display.xlib.XCreatePixmapCursor)(self.x.display.display, bitmap, bitmap, &mut black, &mut black, 0, 0); + (self.x.display.xlib.XDefineCursor)(self.x.display.display, self.x.window, cursor); + self.x.display.check_errors().expect("Failed to call XDefineCursor"); + (self.x.display.xlib.XFreeCursor)(self.x.display.display, cursor); + (self.x.display.xlib.XFreePixmap)(self.x.display.display, bitmap); + } + Ok(()) + }, + Grab => { + unsafe { match (self.x.display.xlib.XGrabPointer)( self.x.display.display, self.x.window, ffi::False, (ffi::ButtonPressMask | ffi::ButtonReleaseMask | ffi::EnterWindowMask | @@ -886,11 +918,6 @@ impl Window { } } }, - - // Nothing needs to change - (Grab, Grab) | (Normal, Normal) => Ok(()), - - _ => unimplemented!(), } } -- cgit v1.2.3 From 5c4bfe1379836ca034b610f8246a1f6a621ee2e2 Mon Sep 17 00:00:00 2001 From: Thinkofname Date: Mon, 21 Mar 2016 18:49:00 +0000 Subject: Remove a debug print added in 1de66e4ef --- src/api/x11/events.rs | 1 - 1 file changed, 1 deletion(-) (limited to 'src/api/x11') diff --git a/src/api/x11/events.rs b/src/api/x11/events.rs index d497319..1c6668c 100644 --- a/src/api/x11/events.rs +++ b/src/api/x11/events.rs @@ -3,7 +3,6 @@ use super::ffi; use VirtualKeyCode; pub fn keycode_to_element(scancode: libc::c_uint) -> Option { - println!("{:?}", scancode); Some(match scancode { ffi::XK_BackSpace => events::VirtualKeyCode::Back, ffi::XK_Tab => events::VirtualKeyCode::Tab, -- cgit v1.2.3