Implement grabbing of the mouse pointer for X11

Contains new methods in the Window API that closely mirror the Xlib API. The
methods are left unimplemented for other platforms for now.
This commit is contained in:
Eduard Bopp 2015-01-25 12:06:50 +01:00
parent 63d2cd263e
commit 18f9bc44c9
5 changed files with 70 additions and 0 deletions

View file

@ -42,6 +42,17 @@ pub const Button5: libc::c_uint = 5;
pub const InputOutput: libc::c_uint = 1;
pub const InputOnly: libc::c_uint = 2;
pub const CurrentTime: Time = 0;
pub const GrabModeSync: libc::c_int = 0;
pub const GrabModeAsync: libc::c_int = 1;
pub const GrabSuccess: libc::c_int = 0;
pub const AlreadyGrabbed: libc::c_int = 1;
pub const GrabInvalidTime: libc::c_int = 2;
pub const GrabNotViewable: libc::c_int = 3;
pub const GrabFrozen: libc::c_int = 4;
pub const CWBackPixmap: libc::c_ulong = (1<<0);
pub const CWBackPixel: libc::c_ulong = (1<<1);
pub const CWBorderPixmap: libc::c_ulong = (1<<2);
@ -1470,6 +1481,10 @@ extern "C" {
pub fn XcursorLibraryLoadCursor(dpy: *mut Display, name: *const libc::c_char) -> Cursor;
pub fn XDefineCursor(dby: *mut Display, w: Window, cursor: Cursor);
pub fn XGrabPointer(dpy: *mut Display, w: Window, owner_events: bool, event_mask: libc::c_long,
pointer_mode: libc::c_int, keyboard_mode: libc::c_int, confine_to: Window, cursor: Cursor,
time: Time) -> libc::c_int;
pub fn XUngrabPointer(dpy: *mut Display, time: Time);
}
/*

View file

@ -782,6 +782,33 @@ impl Window {
}
}
pub fn grab_cursor(&self) -> Result<(), String> {
unsafe {
match ffi::XGrabPointer(
self.x.display, self.x.window, false,
ffi::ButtonPressMask | ffi::ButtonReleaseMask | ffi::EnterWindowMask |
ffi::LeaveWindowMask | ffi::PointerMotionMask | ffi::PointerMotionHintMask |
ffi::Button1MotionMask | ffi::Button2MotionMask | ffi::Button3MotionMask |
ffi::Button4MotionMask | ffi::Button5MotionMask | ffi::ButtonMotionMask |
ffi::KeymapStateMask,
ffi::GrabModeAsync, ffi::GrabModeAsync,
self.x.window, 0, ffi::CurrentTime
) {
ffi::GrabSuccess => Ok(()),
ffi::AlreadyGrabbed | ffi::GrabInvalidTime |
ffi::GrabNotViewable | ffi::GrabFrozen
=> Err("cursor could not be grabbed".to_string()),
_ => unreachable!(),
}
}
}
pub fn ungrab_cursor(&self) {
unsafe {
ffi::XUngrabPointer(self.x.display, ffi::CurrentTime);
}
}
pub fn hidpi_factor(&self) -> f32 {
1.0
}