1use crate::prelude::*;
8use crate::utils::FlString;
9use fltk_sys::widget::*;
10use std::ffi::{CStr, CString};
11
12#[derive(Debug)]
31pub struct Widget {
32 inner: crate::widget::WidgetTracker,
33 is_derived: bool,
34}
35
36crate::macros::widget::impl_widget_ext!(Widget, Fl_Widget);
37crate::macros::widget::impl_widget_base!(Widget, Fl_Widget);
38crate::macros::widget::impl_widget_default!(Widget);
39
40pub type WidgetTrackerPtr = *mut fltk_sys::fl::Fl_Widget_Tracker;
42
43#[doc(hidden)]
45pub type WidgetTrackerWrapper = std::rc::Rc<WidgetTrackerPtr>;
46
47#[derive(Debug, Clone)]
49pub struct WidgetTracker {
50 inner: WidgetTrackerWrapper,
51}
52
53#[cfg(not(feature = "single-threaded"))]
54unsafe impl Send for WidgetTracker {}
55
56#[cfg(not(feature = "single-threaded"))]
57unsafe impl Sync for WidgetTracker {}
58
59impl Drop for WidgetTracker {
60 fn drop(&mut self) {
61 if WidgetTrackerWrapper::strong_count(&self.inner) == 1 {
62 unsafe {
63 fltk_sys::fl::Fl_Widget_Tracker_delete(*self.inner);
64 }
65 }
66 }
67}
68
69impl WidgetTracker {
70 pub fn new(w: *mut Fl_Widget) -> Self {
72 let ptr = unsafe { fltk_sys::fl::Fl_Widget_Tracker_new(w as _) };
73 assert!(!ptr.is_null());
74 Self {
75 inner: WidgetTrackerWrapper::new(ptr),
76 }
77 }
78
79 pub fn deleted(&self) -> bool {
81 unsafe { fltk_sys::fl::Fl_Widget_Tracker_deleted(*self.inner) != 0 }
82 }
83
84 pub fn widget(&self) -> *mut Fl_Widget {
86 let w = unsafe { fltk_sys::fl::Fl_Widget_Tracker_widget(*self.inner) };
87 assert!(!w.is_null());
88 w as _
89 }
90}