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, Fl_Widget);
39
40pub type WidgetTrackerPtr = *mut fltk_sys::fl::Fl_Widget_Tracker;
42
43pub type WidgetTrackerWrapper = std::rc::Rc<WidgetTrackerPtr>;
45
46#[derive(Debug, Clone)]
48pub struct WidgetTracker {
49 inner: WidgetTrackerWrapper,
50}
51
52#[cfg(not(feature = "single-threaded"))]
53unsafe impl Send for WidgetTracker {}
54
55#[cfg(not(feature = "single-threaded"))]
56unsafe impl Sync for WidgetTracker {}
57
58impl Drop for WidgetTracker {
59 fn drop(&mut self) {
60 if WidgetTrackerWrapper::strong_count(&self.inner) == 1 {
61 unsafe {
62 fltk_sys::fl::Fl_Widget_Tracker_delete(*self.inner);
63 }
64 }
65 }
66}
67
68impl WidgetTracker {
69 pub fn new(w: *mut Fl_Widget) -> Self {
71 let ptr = unsafe { fltk_sys::fl::Fl_Widget_Tracker_new(w as _) };
72 assert!(!ptr.is_null());
73 Self {
74 inner: WidgetTrackerWrapper::new(ptr),
75 }
76 }
77
78 pub fn deleted(&self) -> bool {
80 unsafe { fltk_sys::fl::Fl_Widget_Tracker_deleted(*self.inner) != 0 }
81 }
82
83 pub fn widget(&self) -> *mut Fl_Widget {
85 let w = unsafe { fltk_sys::fl::Fl_Widget_Tracker_widget(*self.inner) };
86 assert!(!w.is_null());
87 w as _
88 }
89}