1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
// Copyright 2013-2015, The Gtk-rs Project Developers. // See the COPYRIGHT file at the top-level directory of this distribution. // Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT> use gdk_sys; use glib::object::IsA; use glib::translate::*; use AxisUse; use Device; use TimeCoord; use Window; use std::mem; use std::ptr; impl Device { /// Interprets an array of double as axis values for a given device, /// and locates the value in the array for a given axis use. /// ## `axes` /// pointer to an array of axes /// ## `use_` /// the use to look for /// ## `value` /// location to store the found value. /// /// # Returns /// /// `true` if the given axis use was found, otherwise `false` pub fn get_axis(&self, axes: &mut [f64], use_: AxisUse, value: &mut f64) -> bool { unsafe { from_glib(gdk_sys::gdk_device_get_axis( self.to_glib_none().0, axes.as_mut_ptr(), use_.to_glib(), value, )) } } /// Obtains the motion history for a pointer device; given a starting and /// ending timestamp, return all events in the motion history for /// the device in the given range of time. Some windowing systems /// do not support motion history, in which case, `false` will /// be returned. (This is not distinguishable from the case where /// motion history is supported and no events were found.) /// /// Note that there is also `WindowExt::set_event_compression` to get /// more motion events delivered directly, independent of the windowing /// system. /// ## `window` /// the window with respect to which which the event coordinates will be reported /// ## `start` /// starting timestamp for range of events to return /// ## `stop` /// ending timestamp for the range of events to return /// ## `events` /// /// location to store a newly-allocated array of `TimeCoord`, or /// `None` /// ## `n_events` /// location to store the length of /// `events`, or `None` /// /// # Returns /// /// `true` if the windowing system supports motion history and /// at least one event was found. pub fn get_history<P: IsA<Window>>(&self, window: &P, start: u32, stop: u32) -> Vec<TimeCoord> { unsafe { let mut events = ptr::null_mut(); let mut n_events = mem::MaybeUninit::uninit(); let ret: bool = from_glib(gdk_sys::gdk_device_get_history( self.to_glib_none().0, window.as_ref().to_glib_none().0, start, stop, &mut events, n_events.as_mut_ptr(), )); if !ret { return Vec::new(); } let n_events = n_events.assume_init() as usize; let mut r_events = Vec::with_capacity(n_events); for i in 0..n_events { r_events.push((*(events.offset(i as isize) as *mut TimeCoord)).clone()); } gdk_sys::gdk_device_free_history(events, n_events as _); r_events } } }