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

Reply via email to