diff --git a/source/tycho/interfaces.rs b/source/tycho/interfaces.rs index 4f19ce2..ed0dc3e 100644 --- a/source/tycho/interfaces.rs +++ b/source/tycho/interfaces.rs @@ -3,6 +3,7 @@ use cairo_sys::*; use gdk_pixbuf_sys::*; use gdk_sys::*; +use glib_sys::*; use gobject_sys::*; use gtk_sys::*; use maraiah::{c_str, @@ -175,6 +176,64 @@ impl Refc<'_, T> pub fn own(p: *mut T) -> Self {unsafe {g_object_ref(p as _);} Self::new(p)} } +impl ListD +{ + pub fn new(head: *mut GList) -> Self {Self{head, iter: head}} +} + +impl Iterator for ListD +{ + type Item = gpointer; + + fn next(&mut self) -> Option { + if self.iter != ffi::null_mut() { + let obj = unsafe { + let obj = (*self.iter).data; + self.iter = (*self.iter).next; + obj + }; + + Some(obj) + } else { + None + } + } +} + +impl Drop for ListD +{ + fn drop(&mut self) {unsafe {g_list_free(self.head);}} +} + +impl ListS +{ + pub fn new(head: *mut GSList) -> Self {Self{head, iter: head}} +} + +impl Iterator for ListS +{ + type Item = gpointer; + + fn next(&mut self) -> Option { + if self.iter != ffi::null_mut() { + let obj = unsafe { + let obj = (*self.iter).data; + self.iter = (*self.iter).next; + obj + }; + + Some(obj) + } else { + None + } + } +} + +impl Drop for ListS +{ + fn drop(&mut self) {unsafe {g_slist_free(self.head);}} +} + /// An image for a `CrDrawArea`. pub struct CrImage(pub *const GdkPixbuf); @@ -203,4 +262,18 @@ pub struct Refc<'a, T> l: PhantomData<&'a *mut T>, } +/// A GList wrapper. +pub struct ListD +{ + head: *mut GList, + iter: *mut GList, +} + +/// A GSList wrapper. +pub struct ListS +{ + head: *mut GSList, + iter: *mut GSList, +} + // EOF