aboutsummaryrefslogtreecommitdiffstats
path: root/src/x11
diff options
context:
space:
mode:
authorEduard Bopp <eduard.bopp@aepsil0n.de>2015-01-25 12:06:50 +0100
committerEduard Bopp <eduard.bopp@aepsil0n.de>2015-03-25 13:10:55 +0100
commit18f9bc44c9c71d6d368a9e9255c1288b85ae509a (patch)
treed12e82662ab3ceeabdc689a6c13eea180e7de384 /src/x11
parent63d2cd263ee3e68118213ae5b8ba1326fc3ee03e (diff)
downloadglutin-18f9bc44c9c71d6d368a9e9255c1288b85ae509a.tar.gz
glutin-18f9bc44c9c71d6d368a9e9255c1288b85ae509a.zip
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.
Diffstat (limited to 'src/x11')
-rw-r--r--src/x11/ffi.rs15
-rw-r--r--src/x11/window/mod.rs27
2 files changed, 42 insertions, 0 deletions
diff --git a/src/x11/ffi.rs b/src/x11/ffi.rs
index 1d91cab..e33ea24 100644
--- a/src/x11/ffi.rs
+++ b/src/x11/ffi.rs
@@ -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);
}
/*
diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs
index 385a913..d576150 100644
--- a/src/x11/window/mod.rs
+++ b/src/x11/window/mod.rs
@@ -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
}