From 433c5b956ee83e2a1c3be67e5333db90c9c3cb8a Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 28 Jul 2014 13:25:28 +0200 Subject: Implement CursorPositionChanged event for X11 --- src/x11/ffi.rs | 22 +++++++++++++++++++++- src/x11/mod.rs | 8 +++++++- 2 files changed, 28 insertions(+), 2 deletions(-) (limited to 'src/x11') diff --git a/src/x11/ffi.rs b/src/x11/ffi.rs index 5caabc5..c021867 100644 --- a/src/x11/ffi.rs +++ b/src/x11/ffi.rs @@ -18,6 +18,7 @@ pub type GLXPixmap = XID; pub type GLXWindow = XID; pub type Pixmap = XID; pub type Status = libc::c_int; // TODO: not sure +pub type Time = libc::c_ulong; pub type Visual = (); // TODO: not sure pub type VisualID = libc::c_ulong; // TODO: not sure pub type Window = XID; @@ -241,7 +242,7 @@ pub struct XClientMessageEvent { pub l: [libc::c_long, ..5], } -#[reprc(C)] +#[repr(C)] pub struct XResizeRequestEvent { pub type_: libc::c_int, pub serial: libc::c_ulong, @@ -252,6 +253,25 @@ pub struct XResizeRequestEvent { pub height: libc::c_int, } +#[repr(C)] +pub struct XMotionEvent { + pub type_: libc::c_int, + pub serial: libc::c_ulong, + pub send_event: Bool, + pub display: *mut Display, + pub window: Window, + pub root: Window, + pub subwindow: Window, + pub time: Time, + pub x: libc::c_int, + pub y: libc::c_int, + pub x_root: libc::c_int, + pub y_root: libc::c_int, + pub state: libc::c_uint, + pub is_hint: libc::c_char, + pub same_screen: Bool, +} + #[link(name = "GL")] #[link(name = "X11")] extern "C" { diff --git a/src/x11/mod.rs b/src/x11/mod.rs index 3f17ca4..9f773f4 100644 --- a/src/x11/mod.rs +++ b/src/x11/mod.rs @@ -61,7 +61,7 @@ impl Window { let mut swa: ffi::XSetWindowAttributes = unsafe { mem::zeroed() }; swa.colormap = cmap; swa.event_mask = ffi::ExposureMask | ffi::ResizeRedirectMask | - ffi::VisibilityChangeMask | ffi::KeyPressMask; + ffi::VisibilityChangeMask | ffi::KeyPressMask | ffi::PointerMotionMask; swa }; @@ -168,6 +168,12 @@ impl Window { events.push(SizeChanged(rs_event.width as uint, rs_event.height as uint)); }, + ffi::MotionNotify => { + use CursorPositionChanged; + let event: &ffi::XMotionEvent = unsafe { mem::transmute(&xev) }; + events.push(CursorPositionChanged(event.x as uint, event.y as uint)); + }, + _ => () } -- cgit v1.2.3