Merge branch 'master' into x11_window_size_constraints
This commit is contained in:
commit
7a5e47c446
7 changed files with 222 additions and 223 deletions
|
|
@ -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(())
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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!(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue