Merge remote-tracking branch 'glutin/master' into merge-glutin
Conflicts: Cargo.toml build.rs src/api/caca/mod.rs src/api/cocoa/mod.rs src/api/egl/ffi.rs src/api/egl/mod.rs src/api/glx/mod.rs src/api/osmesa/mod.rs
This commit is contained in:
commit
d216d6b052
16 changed files with 165 additions and 103 deletions
|
|
@ -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
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ impl XInputEventHandler {
|
|||
} else {
|
||||
-1.0
|
||||
};
|
||||
Some(MouseWheel(LineDelta(0.0, delta)))
|
||||
Some(MouseWheel(LineDelta(0.0, delta), TouchPhase::Moved))
|
||||
} else {
|
||||
// emulated button event from a touch/smooth-scroll
|
||||
// event. Ignore these events and handle scrolling
|
||||
|
|
@ -235,7 +235,8 @@ impl XInputEventHandler {
|
|||
}
|
||||
|
||||
if scroll_delta.0.abs() > 0.0 || scroll_delta.1.abs() > 0.0 {
|
||||
Some(MouseWheel(LineDelta(scroll_delta.0 as f32, scroll_delta.1 as f32)))
|
||||
Some(MouseWheel(LineDelta(scroll_delta.0 as f32, scroll_delta.1 as f32),
|
||||
TouchPhase::Moved))
|
||||
} else {
|
||||
let new_cursor_pos = (event_data.event_x, event_data.event_y);
|
||||
if new_cursor_pos != self.current_state.cursor_pos {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"))]
|
||||
#![cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd"))]
|
||||
|
||||
pub use self::monitor::{MonitorId, get_available_monitors, get_primary_monitor};
|
||||
pub use self::window::{Window, XWindow, PollEventsIterator, WaitEventsIterator, WindowProxy};
|
||||
|
|
|
|||
|
|
@ -314,7 +314,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")))
|
||||
|
|
@ -743,29 +743,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 |
|
||||
|
|
@ -784,11 +816,6 @@ impl Window {
|
|||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Nothing needs to change
|
||||
(Grab, Grab) | (Normal, Normal) => Ok(()),
|
||||
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue