DO NOT REPLY TO THIS MESSAGE. INSTEAD, POST ANY RESPONSES TO THE LINK BELOW.
[STR New]
Link: http://www.fltk.org/str.php?L2466
Version: 1.3-feature
Link: http://www.fltk.org/str.php?L2466
Version: 1.3-feature
Index: src/Fl_Tooltip.cxx
===================================================================
--- src/Fl_Tooltip.cxx (revision 7935)
+++ src/Fl_Tooltip.cxx (working copy)
@@ -30,6 +30,7 @@
#include <FL/Fl_Menu_Window.H>
#include <stdio.h>
+#include <string.h> // strdup()
float Fl_Tooltip::delay_ = 1.0f;
float Fl_Tooltip::hoverdelay_ = 0.2f;
@@ -275,16 +276,40 @@
#endif // DEBUG
}
-void Fl_Widget::tooltip(const char *tt) {
+void Fl_Tooltip::set_enter_exit_once_() {
static char beenhere = 0;
if (!beenhere) {
beenhere = 1;
Fl_Tooltip::enter = Fl_Tooltip::enter_;
Fl_Tooltip::exit = Fl_Tooltip::exit_;
}
+}
+
+// Set tooltip (NO copy)
+void Fl_Widget::tooltip(const char *tt) {
+ Fl_Tooltip::set_enter_exit_once_();
+ if (flags() & COPIED_TOOLTIP) {
+ // reassigning a copied tooltip remains the same copied tooltip
+ if (tooltip_ == tt) return;
+ free((void*)(tooltip_)); // free maintained copy
+ clear_flag(COPIED_TOOLTIP); // disable copy flag (WE don't make
copies)
+ }
tooltip_ = tt;
}
+// Set tooltip (make and manage copy)
+void Fl_Widget::copy_tooltip(const char *a) {
+ Fl_Tooltip::set_enter_exit_once_();
+ if (flags() & COPIED_TOOLTIP) free((void *)(tooltip_));
+ if (a) {
+ set_flag(COPIED_TOOLTIP);
+ tooltip_ = strdup(a);
+ } else {
+ clear_flag(COPIED_TOOLTIP);
+ tooltip_ = (char *)0;
+ }
+}
+
//
// End of "$Id$".
//
Index: src/Fl_Widget.cxx
===================================================================
--- src/Fl_Widget.cxx (revision 7935)
+++ src/Fl_Widget.cxx (working copy)
@@ -168,6 +168,7 @@
Fl_Widget::~Fl_Widget() {
Fl::clear_widget_pointer(this);
if (flags() & COPIED_LABEL) free((void *)(label_.value));
+ if (flags() & COPIED_TOOLTIP) free((void *)(tooltip_));
// remove from parent group
if (parent_) parent_->remove(this);
#ifdef DEBUG_DELETE
Index: FL/Fl_Widget.H
===================================================================
--- FL/Fl_Widget.H (revision 7935)
+++ FL/Fl_Widget.H (working copy)
@@ -162,6 +162,7 @@
MODAL = 1<<14, ///< a window blocking input to all other
winows (Fl_Window)
NO_OVERLAY = 1<<15, ///< window not using a hardware overlay
plane (Fl_Menu_Window)
GROUP_RELATIVE = 1<<16, ///< position this idget relative to the
parent group, not to the window
+ COPIED_TOOLTIP = 1<<17, ///< the widget tooltip is internally
copied, its destruction is handled by the widget
// (space for more flags)
USERFLAG3 = 1<<29, ///< reserved for 3rd party extensions
USERFLAG2 = 1<<30, ///< reserved for 3rd party extensions
@@ -533,6 +534,7 @@
/** Gets the current tooltip text.
\return a pointer to the tooltip text or NULL
+ \see tooltip(const char*), copy_tooltip(const char*)
*/
const char *tooltip() const {return tooltip_;}
@@ -540,16 +542,31 @@
Sets a string of text to display in a popup tooltip window when the user
hovers the mouse over the widget. The string is <I>not</I> copied, so
make sure any formatted string is stored in a static, global,
- or allocated buffer.
+ or allocated buffer. If you want a copy made and managed for you,
+ use the copy_tooltip() method, which will manage the tooltip string
+ automatically.
If no tooltip is set, the tooltip of the parent is inherited. Setting a
tooltip for a group and setting no tooltip for a child will show the
group's tooltip instead. To avoid this behavior, you can set the child's
tooltip to an empty string ("").
\param[in] t new tooltip
+ \see copy_tooltip(const char*), tooltip(void)
*/
void tooltip(const char *t);
+ /** Sets the current tooltip text.
+ Unlike tooltip(), this method allocates a copy of the tooltip
+ string instead of using the original string pointer.
+
+ The internal copy will automatically be freed whenever you assign
+ a new label or when the widget is destroyed.
+
+ \param[in] text The tooltip's text
+ \see tooltip(const char*), tooltip(void)
+ */
+ void copy_tooltip(const char *t);
+
/** Gets the current callback function for the widget.
Each widget has a single callback.
\return current callback
Index: FL/Fl_Tooltip.H
===================================================================
--- FL/Fl_Tooltip.H (revision 7935)
+++ FL/Fl_Tooltip.H (working copy)
@@ -92,8 +92,10 @@
// fabien: made it private with only a friend function access
private:
friend void Fl_Widget::tooltip(const char *);
+ friend void Fl_Widget::copy_tooltip(const char *);
static void enter_(Fl_Widget* w);
static void exit_(Fl_Widget *w);
+ static void set_enter_exit_once_();
private:
static float delay_; //!< delay before a tooltip is shown
_______________________________________________
fltk-dev mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-dev