From 2f4bf6114fa9b743bd611803fdc91e7f60ed4acf Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 8 Sep 2019 18:25:29 +0200 Subject: [PATCH 1/4] update gir submodules --- gir | 2 +- gir-files | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gir b/gir index b869768..9e3cb65 160000 --- a/gir +++ b/gir @@ -1 +1 @@ -Subproject commit b869768f610d25948efaf5d53f7a29b129aac922 +Subproject commit 9e3cb656ca2b12b1535480eb038b152433700640 diff --git a/gir-files b/gir-files index cae49a8..f7e3c51 160000 --- a/gir-files +++ b/gir-files @@ -1 +1 @@ -Subproject commit cae49a8c0abede80c3f8321b27147bfa3d4801e9 +Subproject commit f7e3c5172236b466a44aae78adee05006793eb9e From 9f454f9f6cdf42ad145b592d1757cbed347d0237 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 8 Sep 2019 18:56:41 +0200 Subject: [PATCH 2/4] Add TimeCoord --- src/lib.rs | 2 + src/time_coord.rs | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/time_coord.rs diff --git a/src/lib.rs b/src/lib.rs index 5869570..b41022f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -83,6 +83,7 @@ mod keys; mod rectangle; mod rgba; mod screen; +mod time_coord; mod visual; mod window; @@ -143,6 +144,7 @@ pub use functions::*; pub use geometry::Geometry; pub use rectangle::Rectangle; pub use rgba::{RgbaParseError, RGBA}; +pub use time_coord::TimeCoord; pub use window::WindowAttr; #[allow(non_camel_case_types)] diff --git a/src/time_coord.rs b/src/time_coord.rs new file mode 100644 index 0000000..e523fc6 --- /dev/null +++ b/src/time_coord.rs @@ -0,0 +1,95 @@ +// 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 + +use gdk_sys; +use glib; +use glib::translate::*; +use glib_sys; +use glib_sys::gconstpointer; +use gobject_sys; +use std::convert::{AsRef, From}; +use std::mem; + +#[derive(Clone)] +#[repr(C)] +pub struct TimeCoord { + pub time: u32, + pub axes: [f64; gdk_sys::GDK_MAX_TIMECOORD_AXES as usize], +} + +#[doc(hidden)] +impl Uninitialized for TimeCoord { + #[inline] + unsafe fn uninitialized() -> Self { + mem::zeroed() + } +} + +#[doc(hidden)] +impl<'a> ToGlibPtr<'a, *const gdk_sys::GdkTimeCoord> for TimeCoord { + type Storage = &'a Self; + + #[inline] + fn to_glib_none(&'a self) -> Stash<'a, *const gdk_sys::GdkTimeCoord, Self> { + let ptr: *const TimeCoord = &*self; + Stash(ptr as *const gdk_sys::GdkTimeCoord, self) + } +} + +#[doc(hidden)] +impl<'a> ToGlibPtrMut<'a, *mut gdk_sys::GdkTimeCoord> for TimeCoord { + type Storage = &'a mut Self; + + #[inline] + fn to_glib_none_mut(&'a mut self) -> StashMut<'a, *mut gdk_sys::GdkTimeCoord, Self> { + let ptr: *mut TimeCoord = &mut *self; + StashMut(ptr as *mut gdk_sys::GdkTimeCoord, self) + } +} + +#[doc(hidden)] +impl FromGlibPtrNone<*const gdk_sys::GdkTimeCoord> for TimeCoord { + unsafe fn from_glib_none(ptr: *const gdk_sys::GdkTimeCoord) -> Self { + *(ptr as *const TimeCoord) + } +} + +#[doc(hidden)] +impl FromGlibPtrNone<*mut gdk_sys::GdkTimeCoord> for TimeCoord { + unsafe fn from_glib_none(ptr: *mut gdk_sys::GdkTimeCoord) -> Self { + *(ptr as *mut TimeCoord) + } +} + +#[doc(hidden)] +impl FromGlibPtrBorrow<*const gdk_sys::GdkTimeCoord> for TimeCoord { + unsafe fn from_glib_borrow(ptr: *const gdk_sys::GdkTimeCoord) -> Self { + *(ptr as *const TimeCoord) + } +} + +#[doc(hidden)] +impl FromGlibPtrBorrow<*mut gdk_sys::GdkTimeCoord> for TimeCoord { + unsafe fn from_glib_borrow(ptr: *mut gdk_sys::GdkTimeCoord) -> Self { + *(ptr as *mut TimeCoord) + } +} + +#[doc(hidden)] +impl FromGlibPtrFull<*mut gdk_sys::GdkTimeCoord> for TimeCoord { + unsafe fn from_glib_full(ptr: *mut gdk_sys::GdkTimeCoord) -> Self { + let time_coord = *(ptr as *mut TimeCoord); + glib_sys::g_free(ptr as *mut _); + time_coord + } +} + +#[doc(hidden)] +impl FromGlibPtrFull<*const gdk_sys::GdkTimeCoord> for TimeCoord { + unsafe fn from_glib_full(ptr: *const gdk_sys::GdkTimeCoord) -> Self { + let time_coord = *(ptr as *const TimeCoord); + glib_sys::g_free(ptr as *mut _); + time_coord + } +} From b056ef4fdcfbdd86251a768ffcf760bb8f7ce6e3 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 8 Sep 2019 18:56:45 +0200 Subject: [PATCH 3/4] regen --- Gir.toml | 4 ++++ src/auto/device.rs | 35 ++++++++++++++++++++++++++++------- src/auto/versions.txt | 4 ++-- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Gir.toml b/Gir.toml index 2539f9b..ab31a1e 100644 --- a/Gir.toml +++ b/Gir.toml @@ -96,6 +96,7 @@ manual = [ "Gdk.Geometry", "Gdk.Rectangle", "Gdk.RGBA", + "Gdk.TimeCoord", "GdkPixbuf.Pixbuf", "Gio.AppLaunchContext", "Gio.Icon", @@ -205,6 +206,9 @@ status = "generate" name = "get_display" [object.function.return] nullable = false + [[object.function]] + name = "free_history" + ignore = true # useless function [[object.property]] name = "tool" version = "3.22" diff --git a/src/auto/device.rs b/src/auto/device.rs index 424b9a2..1723281 100644 --- a/src/auto/device.rs +++ b/src/auto/device.rs @@ -37,6 +37,7 @@ use ModifierType; use Screen; #[cfg(any(feature = "v3_20", feature = "dox"))] use Seat; +use TimeCoord; use Window; glib_wrapper! { @@ -90,9 +91,33 @@ impl Device { unsafe { from_glib(gdk_sys::gdk_device_get_has_cursor(self.to_glib_none().0)) } } - //pub fn get_history>(&self, window: &P, start: u32, stop: u32, events: /*Ignored*/Vec) -> Option { - // unsafe { TODO: call gdk_sys:gdk_device_get_history() } - //} + pub fn get_history>( + &self, + window: &P, + start: u32, + stop: u32, + ) -> Option> { + unsafe { + let mut events = ptr::null_mut(); + let mut n_events = mem::MaybeUninit::uninit(); + let ret = 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 { + Some(FromGlibContainer::from_glib_full_num( + events, + n_events.assume_init() as usize, + )) + } else { + None + } + } + } pub fn get_key(&self, index_: u32) -> Option<(u32, ModifierType)> { unsafe { @@ -409,10 +434,6 @@ impl Device { } } - //pub fn free_history(events: /*Ignored*/&[&TimeCoord]) { - // unsafe { TODO: call gdk_sys:gdk_device_free_history() } - //} - #[cfg_attr(feature = "v3_16", deprecated)] pub fn grab_info_libgtk_only(display: &Display, device: &Device) -> Option<(Window, bool)> { skip_assert_initialized!(); diff --git a/src/auto/versions.txt b/src/auto/versions.txt index 162b782..0084e21 100644 --- a/src/auto/versions.txt +++ b/src/auto/versions.txt @@ -1,2 +1,2 @@ -Generated by gir (https://github.com/gtk-rs/gir @ b869768) -from gir-files (https://github.com/gtk-rs/gir-files @ cae49a8) +Generated by gir (https://github.com/gtk-rs/gir @ 9e3cb65) +from gir-files (https://github.com/gtk-rs/gir-files @ f7e3c51) From 12c02168a882c1ce1e0bb6248084d1024d26f20a Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 10 Sep 2019 20:54:23 +0200 Subject: [PATCH 4/4] Fixup --- Gir.toml | 5 ++++- src/auto/device.rs | 29 -------------------------- src/device.rs | 36 ++++++++++++++++++++++++++++++++ src/time_coord.rs | 52 +++++++++++++++++++++++++++++++++++++--------- 4 files changed, 82 insertions(+), 40 deletions(-) diff --git a/Gir.toml b/Gir.toml index ab31a1e..24d4554 100644 --- a/Gir.toml +++ b/Gir.toml @@ -208,7 +208,10 @@ status = "generate" nullable = false [[object.function]] name = "free_history" - ignore = true # useless function + ignore = true # cannot be used as is + [[object.function]] + name = "get_history" + ignore = true # need to call "free_history" function by hand [[object.property]] name = "tool" version = "3.22" diff --git a/src/auto/device.rs b/src/auto/device.rs index 1723281..36aa161 100644 --- a/src/auto/device.rs +++ b/src/auto/device.rs @@ -37,7 +37,6 @@ use ModifierType; use Screen; #[cfg(any(feature = "v3_20", feature = "dox"))] use Seat; -use TimeCoord; use Window; glib_wrapper! { @@ -91,34 +90,6 @@ impl Device { unsafe { from_glib(gdk_sys::gdk_device_get_has_cursor(self.to_glib_none().0)) } } - pub fn get_history>( - &self, - window: &P, - start: u32, - stop: u32, - ) -> Option> { - unsafe { - let mut events = ptr::null_mut(); - let mut n_events = mem::MaybeUninit::uninit(); - let ret = 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 { - Some(FromGlibContainer::from_glib_full_num( - events, - n_events.assume_init() as usize, - )) - } else { - None - } - } - } - pub fn get_key(&self, index_: u32) -> Option<(u32, ModifierType)> { unsafe { let mut keyval = mem::MaybeUninit::uninit(); diff --git a/src/device.rs b/src/device.rs index d1c91b0..c1f10f1 100644 --- a/src/device.rs +++ b/src/device.rs @@ -3,9 +3,15 @@ // Licensed under the MIT license, see the LICENSE file or 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 { pub fn get_axis(&self, axes: &mut [f64], use_: AxisUse, value: &mut f64) -> bool { @@ -18,4 +24,34 @@ impl Device { )) } } + + pub fn get_history>( + &self, + window: &P, + start: u32, + stop: u32, + ) -> Option> { + 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 None; + } + 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 _); + Some(r_events) + } + } } diff --git a/src/time_coord.rs b/src/time_coord.rs index e523fc6..72caf60 100644 --- a/src/time_coord.rs +++ b/src/time_coord.rs @@ -3,12 +3,8 @@ // Licensed under the MIT license, see the LICENSE file or use gdk_sys; -use glib; use glib::translate::*; use glib_sys; -use glib_sys::gconstpointer; -use gobject_sys; -use std::convert::{AsRef, From}; use std::mem; #[derive(Clone)] @@ -51,35 +47,35 @@ impl<'a> ToGlibPtrMut<'a, *mut gdk_sys::GdkTimeCoord> for TimeCoord { #[doc(hidden)] impl FromGlibPtrNone<*const gdk_sys::GdkTimeCoord> for TimeCoord { unsafe fn from_glib_none(ptr: *const gdk_sys::GdkTimeCoord) -> Self { - *(ptr as *const TimeCoord) + (*(ptr as *const TimeCoord)).clone() } } #[doc(hidden)] impl FromGlibPtrNone<*mut gdk_sys::GdkTimeCoord> for TimeCoord { unsafe fn from_glib_none(ptr: *mut gdk_sys::GdkTimeCoord) -> Self { - *(ptr as *mut TimeCoord) + (*(ptr as *mut TimeCoord)).clone() } } #[doc(hidden)] impl FromGlibPtrBorrow<*const gdk_sys::GdkTimeCoord> for TimeCoord { unsafe fn from_glib_borrow(ptr: *const gdk_sys::GdkTimeCoord) -> Self { - *(ptr as *const TimeCoord) + (*(ptr as *const TimeCoord)).clone() } } #[doc(hidden)] impl FromGlibPtrBorrow<*mut gdk_sys::GdkTimeCoord> for TimeCoord { unsafe fn from_glib_borrow(ptr: *mut gdk_sys::GdkTimeCoord) -> Self { - *(ptr as *mut TimeCoord) + (*(ptr as *mut TimeCoord)).clone() } } #[doc(hidden)] impl FromGlibPtrFull<*mut gdk_sys::GdkTimeCoord> for TimeCoord { unsafe fn from_glib_full(ptr: *mut gdk_sys::GdkTimeCoord) -> Self { - let time_coord = *(ptr as *mut TimeCoord); + let time_coord = (*(ptr as *mut TimeCoord)).clone(); glib_sys::g_free(ptr as *mut _); time_coord } @@ -88,8 +84,44 @@ impl FromGlibPtrFull<*mut gdk_sys::GdkTimeCoord> for TimeCoord { #[doc(hidden)] impl FromGlibPtrFull<*const gdk_sys::GdkTimeCoord> for TimeCoord { unsafe fn from_glib_full(ptr: *const gdk_sys::GdkTimeCoord) -> Self { - let time_coord = *(ptr as *const TimeCoord); + let time_coord = (*(ptr as *const TimeCoord)).clone(); glib_sys::g_free(ptr as *mut _); time_coord } } + +impl FromGlibContainerAsVec for TimeCoord { + unsafe fn from_glib_none_num_as_vec(ptr: *mut gdk_sys::GdkTimeCoord, num: usize) -> Vec { + if num == 0 || ptr.is_null() { + return Vec::new(); + } + + let mut res = Vec::with_capacity(num); + for i in 0..num { + res.push((*(ptr.offset(i as isize) as *mut TimeCoord)).clone()); + } + res + } + + unsafe fn from_glib_container_num_as_vec( + ptr: *mut gdk_sys::GdkTimeCoord, + num: usize, + ) -> Vec { + let res = FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, num); + glib_sys::g_free(ptr as *mut _); + res + } + + unsafe fn from_glib_full_num_as_vec(ptr: *mut gdk_sys::GdkTimeCoord, num: usize) -> Vec { + if num == 0 || ptr.is_null() { + return Vec::new(); + } + + let mut res = Vec::with_capacity(num); + for i in 0..num { + res.push((*(ptr.offset(i as isize) as *mut TimeCoord)).clone()); + } + glib_sys::g_free(ptr as *mut _); + res + } +}