diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/cocoa/mod.rs | 37 | ||||
| -rw-r--r-- | src/api/win32/event.rs | 72 | ||||
| -rw-r--r-- | src/api/x11/events.rs | 2 | ||||
| -rw-r--r-- | src/api/x11/window.rs | 53 | 
4 files changed, 101 insertions, 63 deletions
diff --git a/src/api/cocoa/mod.rs b/src/api/cocoa/mod.rs index db3f749..e935805 100644 --- a/src/api/cocoa/mod.rs +++ b/src/api/cocoa/mod.rs @@ -79,11 +79,12 @@ struct WindowDelegate {  impl WindowDelegate {      /// Get the delegate class, initiailizing it neccessary      fn class() -> *const Class { +        use std::os::raw::c_void;          use std::sync::{Once, ONCE_INIT};          extern fn window_should_close(this: &Object, _: Sel, _: id) -> BOOL {              unsafe { -                let state: *mut libc::c_void = *this.get_ivar("glutinState"); +                let state: *mut c_void = *this.get_ivar("glutinState");                  let state = state as *mut DelegateState;                  (*state).pending_events.lock().unwrap().push_back(Closed);              } @@ -92,7 +93,7 @@ impl WindowDelegate {          extern fn window_did_resize(this: &Object, _: Sel, _: id) {              unsafe { -                let state: *mut libc::c_void = *this.get_ivar("glutinState"); +                let state: *mut c_void = *this.get_ivar("glutinState");                  let state = &mut *(state as *mut DelegateState);                  let _: () = msg_send![*state.context, update]; @@ -111,7 +112,7 @@ impl WindowDelegate {                  // TODO: center the cursor if the window had mouse grab when it                  // lost focus -                let state: *mut libc::c_void = *this.get_ivar("glutinState"); +                let state: *mut c_void = *this.get_ivar("glutinState");                  let state = state as *mut DelegateState;                  (*state).pending_events.lock().unwrap().push_back(Focused(true));              } @@ -119,7 +120,7 @@ impl WindowDelegate {          extern fn window_did_resign_key(this: &Object, _: Sel, _: id) {              unsafe { -                let state: *mut libc::c_void = *this.get_ivar("glutinState"); +                let state: *mut c_void = *this.get_ivar("glutinState");                  let state = state as *mut DelegateState;                  (*state).pending_events.lock().unwrap().push_back(Focused(false));              } @@ -131,7 +132,7 @@ impl WindowDelegate {          INIT.call_once(|| unsafe {              // Create new NSWindowDelegate              let superclass = Class::get("NSObject").unwrap(); -            let mut decl = ClassDecl::new(superclass, "GlutinWindowDelegate").unwrap(); +            let mut decl = ClassDecl::new("GlutinWindowDelegate", superclass).unwrap();              // Add callback methods              decl.add_method(sel!(windowShouldClose:), @@ -145,7 +146,7 @@ impl WindowDelegate {                  window_did_resign_key as extern fn(&Object, Sel, id));              // Store internal state as user data -            decl.add_ivar::<*mut libc::c_void>("glutinState"); +            decl.add_ivar::<*mut c_void>("glutinState");              delegate_class = decl.register();          }); @@ -162,7 +163,7 @@ impl WindowDelegate {          unsafe {              let delegate = IdRef::new(msg_send![WindowDelegate::class(), new]); -            (&mut **delegate).set_ivar("glutinState", state_ptr as *mut libc::c_void); +            (&mut **delegate).set_ivar("glutinState", state_ptr as *mut ::std::os::raw::c_void);              let _: () = msg_send![*state.window, setDelegate:*delegate];              WindowDelegate { state: state, _this: delegate } @@ -224,12 +225,16 @@ impl<'a> Iterator for PollEventsIterator<'a> {          let event: Option<Event>;          unsafe { +            let pool = NSAutoreleasePool::new(nil); +              let nsevent = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(                  NSAnyEventMask.bits() | NSEventMaskPressure.bits(),                  NSDate::distantPast(nil),                  NSDefaultRunLoopMode,                  YES);              event = NSEventToEvent(self.window, nsevent); + +            let _: () = msg_send![pool, release];          }          event      } @@ -249,12 +254,16 @@ impl<'a> Iterator for WaitEventsIterator<'a> {          let event: Option<Event>;          unsafe { +            let pool = NSAutoreleasePool::new(nil); +              let nsevent = NSApp().nextEventMatchingMask_untilDate_inMode_dequeue_(                  NSAnyEventMask.bits() | NSEventMaskPressure.bits(),                  NSDate::distantFuture(nil),                  NSDefaultRunLoopMode,                  YES);              event = NSEventToEvent(self.window, nsevent); + +            let _: () = msg_send![pool, release];          }          if event.is_none() { @@ -404,7 +413,9 @@ impl Window {              let masks = if screen.is_some() || attrs.transparent {                  // Fullscreen or transparent window -                NSBorderlessWindowMask as NSUInteger +                NSBorderlessWindowMask as NSUInteger | +                NSResizableWindowMask as NSUInteger | +                NSTitledWindowMask as NSUInteger              } else if attrs.decorations {                  // Classic opaque window with titlebar                  NSClosableWindowMask as NSUInteger | @@ -663,8 +674,8 @@ impl Window {          let sel = Sel::register(cursor_name);          let cls = Class::get("NSCursor").unwrap();          unsafe { -            use objc::MessageArguments; -            let cursor: id = ().send(cls as *const _ as id, sel); +            use objc::Message; +            let cursor: id = cls.send_message(sel, ()).unwrap();              let _: () = msg_send![cursor, set];          }      } @@ -747,7 +758,11 @@ impl GlContext for Window {      #[inline]      fn swap_buffers(&self) -> Result<(), ContextError> { -        unsafe { self.context.flushBuffer(); } +        unsafe {  +            let pool = NSAutoreleasePool::new(nil); +            self.context.flushBuffer(); +            let _: () = msg_send![pool, release]; +        }          Ok(())      } diff --git a/src/api/win32/event.rs b/src/api/win32/event.rs index ad4598a..a4de750 100644 --- a/src/api/win32/event.rs +++ b/src/api/win32/event.rs @@ -42,7 +42,7 @@ pub fn vkeycode_to_element(wparam: winapi::WPARAM, lparam: winapi::LPARAM) -> (S          winapi::VK_KANJI => Some(VirtualKeyCode::Kanji),          winapi::VK_ESCAPE => Some(VirtualKeyCode::Escape),          winapi::VK_CONVERT => Some(VirtualKeyCode::Convert), -        //winapi::VK_NONCONVERT => Some(VirtualKeyCode::Nonconvert), +        winapi::VK_NONCONVERT => Some(VirtualKeyCode::NoConvert),          //winapi::VK_ACCEPT => Some(VirtualKeyCode::Accept),          //winapi::VK_MODECHANGE => Some(VirtualKeyCode::Modechange),          winapi::VK_SPACE => Some(VirtualKeyCode::Space), @@ -143,44 +143,38 @@ pub fn vkeycode_to_element(wparam: winapi::WPARAM, lparam: winapi::LPARAM) -> (S          winapi::VK_F24 => Some(VirtualKeyCode::F24),*/          winapi::VK_NUMLOCK => Some(VirtualKeyCode::Numlock),          winapi::VK_SCROLL => Some(VirtualKeyCode::Scroll), -        /*winapi::VK_LSHIFT => Some(VirtualKeyCode::Lshift), -        winapi::VK_RSHIFT => Some(VirtualKeyCode::Rshift), -        winapi::VK_LCONTROL => Some(VirtualKeyCode::Lcontrol), -        winapi::VK_RCONTROL => Some(VirtualKeyCode::Rcontrol), -        winapi::VK_LMENU => Some(VirtualKeyCode::Lmenu), -        winapi::VK_RMENU => Some(VirtualKeyCode::Rmenu), -        winapi::VK_BROWSER_BACK => Some(VirtualKeyCode::Browser_back), -        winapi::VK_BROWSER_FORWARD => Some(VirtualKeyCode::Browser_forward), -        winapi::VK_BROWSER_REFRESH => Some(VirtualKeyCode::Browser_refresh), -        winapi::VK_BROWSER_STOP => Some(VirtualKeyCode::Browser_stop), -        winapi::VK_BROWSER_SEARCH => Some(VirtualKeyCode::Browser_search), -        winapi::VK_BROWSER_FAVORITES => Some(VirtualKeyCode::Browser_favorites), -        winapi::VK_BROWSER_HOME => Some(VirtualKeyCode::Browser_home), -        winapi::VK_VOLUME_MUTE => Some(VirtualKeyCode::Volume_mute), -        winapi::VK_VOLUME_DOWN => Some(VirtualKeyCode::Volume_down), -        winapi::VK_VOLUME_UP => Some(VirtualKeyCode::Volume_up), -        winapi::VK_MEDIA_NEXT_TRACK => Some(VirtualKeyCode::Media_next_track), -        winapi::VK_MEDIA_PREV_TRACK => Some(VirtualKeyCode::Media_prev_track), -        winapi::VK_MEDIA_STOP => Some(VirtualKeyCode::Media_stop), -        winapi::VK_MEDIA_PLAY_PAUSE => Some(VirtualKeyCode::Media_play_pause), -        winapi::VK_LAUNCH_MAIL => Some(VirtualKeyCode::Launch_mail), -        winapi::VK_LAUNCH_MEDIA_SELECT => Some(VirtualKeyCode::Launch_media_select), -        winapi::VK_LAUNCH_APP1 => Some(VirtualKeyCode::Launch_app1), -        winapi::VK_LAUNCH_APP2 => Some(VirtualKeyCode::Launch_app2), -        winapi::VK_OEM_1 => Some(VirtualKeyCode::Oem_1), -        winapi::VK_OEM_PLUS => Some(VirtualKeyCode::Oem_plus), -        winapi::VK_OEM_COMMA => Some(VirtualKeyCode::Oem_comma), -        winapi::VK_OEM_MINUS => Some(VirtualKeyCode::Oem_minus), -        winapi::VK_OEM_PERIOD => Some(VirtualKeyCode::Oem_period), -        winapi::VK_OEM_2 => Some(VirtualKeyCode::Oem_2), -        winapi::VK_OEM_3 => Some(VirtualKeyCode::Oem_3), -        winapi::VK_OEM_4 => Some(VirtualKeyCode::Oem_4), -        winapi::VK_OEM_5 => Some(VirtualKeyCode::Oem_5), -        winapi::VK_OEM_6 => Some(VirtualKeyCode::Oem_6), -        winapi::VK_OEM_7 => Some(VirtualKeyCode::Oem_7), -        winapi::VK_OEM_8 => Some(VirtualKeyCode::Oem_8), -        winapi::VK_OEM_102 => Some(VirtualKeyCode::Oem_102), -        winapi::VK_PROCESSKEY => Some(VirtualKeyCode::Processkey), +        winapi::VK_BROWSER_BACK => Some(VirtualKeyCode::NavigateBackward), +        winapi::VK_BROWSER_FORWARD => Some(VirtualKeyCode::NavigateForward), +        winapi::VK_BROWSER_REFRESH => Some(VirtualKeyCode::WebRefresh), +        winapi::VK_BROWSER_STOP => Some(VirtualKeyCode::WebStop), +        winapi::VK_BROWSER_SEARCH => Some(VirtualKeyCode::WebSearch), +        winapi::VK_BROWSER_FAVORITES => Some(VirtualKeyCode::WebFavorites), +        winapi::VK_BROWSER_HOME => Some(VirtualKeyCode::WebHome), +        winapi::VK_VOLUME_MUTE => Some(VirtualKeyCode::Mute), +        winapi::VK_VOLUME_DOWN => Some(VirtualKeyCode::VolumeDown), +        winapi::VK_VOLUME_UP => Some(VirtualKeyCode::VolumeUp), +        winapi::VK_MEDIA_NEXT_TRACK => Some(VirtualKeyCode::NextTrack), +        winapi::VK_MEDIA_PREV_TRACK => Some(VirtualKeyCode::PrevTrack), +        winapi::VK_MEDIA_STOP => Some(VirtualKeyCode::MediaStop), +        winapi::VK_MEDIA_PLAY_PAUSE => Some(VirtualKeyCode::PlayPause), +        winapi::VK_LAUNCH_MAIL => Some(VirtualKeyCode::Mail), +        winapi::VK_LAUNCH_MEDIA_SELECT => Some(VirtualKeyCode::MediaSelect), +        /*winapi::VK_LAUNCH_APP1 => Some(VirtualKeyCode::Launch_app1), +        winapi::VK_LAUNCH_APP2 => Some(VirtualKeyCode::Launch_app2),*/ +	winapi::VK_OEM_PLUS => Some(VirtualKeyCode::Equals), +        winapi::VK_OEM_COMMA => Some(VirtualKeyCode::Comma), +        winapi::VK_OEM_MINUS => Some(VirtualKeyCode::Minus), +        winapi::VK_OEM_PERIOD => Some(VirtualKeyCode::Period), +        /*winapi::VK_OEM_1 => Some(VirtualKeyCode::Oem_1), +        winapi::VK_OEM_2 => Some(VirtualKeyCode::Oem_2),  +        winapi::VK_OEM_3 => Some(VirtualKeyCode::Oem_3),  +        winapi::VK_OEM_4 => Some(VirtualKeyCode::Oem_4),  +        winapi::VK_OEM_5 => Some(VirtualKeyCode::Oem_5),  +        winapi::VK_OEM_6 => Some(VirtualKeyCode::Oem_6),  +        winapi::VK_OEM_7 => Some(VirtualKeyCode::Oem_7),  +        winapi::VK_OEM_8 => Some(VirtualKeyCode::Oem_8), */ +        winapi::VK_OEM_102 => Some(VirtualKeyCode::OEM102), +        /*winapi::VK_PROCESSKEY => Some(VirtualKeyCode::Processkey),          winapi::VK_PACKET => Some(VirtualKeyCode::Packet),          winapi::VK_ATTN => Some(VirtualKeyCode::Attn),          winapi::VK_CRSEL => Some(VirtualKeyCode::Crsel), diff --git a/src/api/x11/events.rs b/src/api/x11/events.rs index 408a3ec..1c6668c 100644 --- a/src/api/x11/events.rs +++ b/src/api/x11/events.rs @@ -997,6 +997,8 @@ pub fn keycode_to_element(scancode: libc::c_uint) -> Option<VirtualKeyCode> {          //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      })  } diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index 86d6c92..aeb7efe 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -867,29 +867,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 | @@ -908,11 +940,6 @@ impl Window {                      }                  }              }, - -            // Nothing needs to change -            (Grab, Grab) | (Normal, Normal) => Ok(()), - -            _ => unimplemented!(),          }      }  | 
