Removed extra \\c from the Doxygen documentation.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6771 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher
2009-04-19 12:47:36 +00:00
parent b1ba38da60
commit 03ec459eb0
3 changed files with 82 additions and 82 deletions
+16 -16
View File
@@ -852,29 +852,29 @@ public:
These functions support deletion of widgets inside callbacks. These functions support deletion of widgets inside callbacks.
\c Fl::delete_widget() should be called when deleting widgets Fl::delete_widget() should be called when deleting widgets
or complete widget trees (\c Fl_Group, \c Fl_Window, ...) inside or complete widget trees (Fl_Group, Fl_Window, ...) inside
callbacks. callbacks.
The other functions are intended for internal use. The preferred The other functions are intended for internal use. The preferred
way to use them is by using the helper class \c Fl_Widget_Tracker. way to use them is by using the helper class Fl_Widget_Tracker.
The following is to show how it works ... The following is to show how it works ...
There are three groups of related methods: There are three groups of related methods:
-# scheduled widget deletion -# scheduled widget deletion
- \c Fl::delete_widget() schedules widgets for deletion - Fl::delete_widget() schedules widgets for deletion
- \c Fl::do_widget_deletion() deletes all scheduled widgets - Fl::do_widget_deletion() deletes all scheduled widgets
-# widget watch list ("smart pointers") -# widget watch list ("smart pointers")
- \c Fl::watch_widget_pointer() adds a widget pointer to the watch list - Fl::watch_widget_pointer() adds a widget pointer to the watch list
- \c Fl::release_widget_pointer() removes a widget pointer from the watch list - Fl::release_widget_pointer() removes a widget pointer from the watch list
- \c Fl::clear_widget_pointer() clears a widget pointer \e in the watch list - Fl::clear_widget_pointer() clears a widget pointer \e in the watch list
-# the class Fl_Widget_Tracker: -# the class Fl_Widget_Tracker:
- the constructor calls \c Fl::watch_widget_pointer() - the constructor calls Fl::watch_widget_pointer()
- the destructor calls \c Fl::release_widget_pointer() - the destructor calls Fl::release_widget_pointer()
- the access methods can be used to test, if a widget has been deleted - the access methods can be used to test, if a widget has been deleted
\see \c Fl_Widget_Tracker. \see Fl_Widget_Tracker.
@{ */ @{ */
// Widget deletion: // Widget deletion:
@@ -937,11 +937,11 @@ public:
/** /**
This class should be used to control safe widget deletion. This class should be used to control safe widget deletion.
You can use an \c Fl_Widget_Tracker object to watch another widget, if you You can use an Fl_Widget_Tracker object to watch another widget, if you
need to know, if this widget has been deleted during a callback. need to know, if this widget has been deleted during a callback.
This simplifies the use of the "safe widget deletion" methods This simplifies the use of the "safe widget deletion" methods
\c Fl::watch_widget_pointer() and \c Fl::release_widget_pointer() and Fl::watch_widget_pointer() and Fl::release_widget_pointer() and
makes their use more reliable, because the destructor autmatically makes their use more reliable, because the destructor autmatically
releases the widget pointer from the widget watch list. releases the widget pointer from the widget watch list.
@@ -950,7 +950,7 @@ public:
scope is left. This ensures that no stale widget pointers are scope is left. This ensures that no stale widget pointers are
left in the widget watch list (see example below). left in the widget watch list (see example below).
You can also create \c Fl_Widget_Tracker objects with \c new, but then it You can also create Fl_Widget_Tracker objects with \c new, but then it
is your responsibility to delete the object (and thus remove the is your responsibility to delete the object (and thus remove the
widget pointer from the watch list) when it is not needed any more. widget pointer from the watch list) when it is not needed any more.
@@ -997,7 +997,7 @@ public:
<tt> if (wp.widget() == 0) // ...</tt> <tt> if (wp.widget() == 0) // ...</tt>
where \p wp is an \c Fl_Widget_Tracker object. where \p wp is an Fl_Widget_Tracker object.
*/ */
int deleted() {return wp_ == 0;} int deleted() {return wp_ == 0;}
@@ -1008,7 +1008,7 @@ public:
<tt> if (wp.widget() != 0) // ...</tt> <tt> if (wp.widget() != 0) // ...</tt>
where \p wp is an \c Fl_Widget_Tracker object. where \p wp is an Fl_Widget_Tracker object.
*/ */
int exists() {return wp_ != 0;} int exists() {return wp_ != 0;}
+31 -31
View File
@@ -52,15 +52,15 @@
/** /**
This class provides a low-overhead text input field. This class provides a low-overhead text input field.
This is a virtual base class below \c Fl_Input. It has all This is a virtual base class below Fl_Input. It has all
the same interfaces, but lacks the \c handle() and the same interfaces, but lacks the handle() and
\c draw() method. You may want to subclass it if you are draw() method. You may want to subclass it if you are
one of those people who likes to change how the editing keys one of those people who likes to change how the editing keys
work. It may also be useful for adding scrollbars work. It may also be useful for adding scrollbars
to the input field. to the input field.
This can act like any of the subclasses of \c Fl_Input, by This can act like any of the subclasses of Fl_Input, by
setting \c type() to one of the following values: setting type() to one of the following values:
\code \code
#define FL_NORMAL_INPUT 0 #define FL_NORMAL_INPUT 0
@@ -77,7 +77,7 @@
#define FL_MULTILINE_OUTPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_READONLY | FL_INPUT_WRAP) #define FL_MULTILINE_OUTPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_READONLY | FL_INPUT_WRAP)
\endcode \endcode
\see \c Fl_Text_Display, \c Fl_Text_Editor for more powerful text handling widgets \see Fl_Text_Display, Fl_Text_Editor for more powerful text handling widgets
*/ */
class FL_EXPORT Fl_Input_ : public Fl_Widget { class FL_EXPORT Fl_Input_ : public Fl_Widget {
@@ -220,8 +220,8 @@ public:
to the internal buffer and is valid only until the next event is to the internal buffer and is valid only until the next event is
handled. handled.
\return pointer to an internal buffer - do not \c free() this \return pointer to an internal buffer - do not free() this
\see \c Fl_Input_::value(const char*) \see Fl_Input_::value(const char*)
*/ */
const char* value() const {return value_;} const char* value() const {return value_;}
@@ -238,7 +238,7 @@ public:
char index(int i) const {return value_[i];} char index(int i) const {return value_[i];}
/** /**
Returns the number of bytes in \c value(). Returns the number of bytes in value().
This may be greater than <tt>strlen(value())</tt> if there are This may be greater than <tt>strlen(value())</tt> if there are
\c nul characters in the text. \c nul characters in the text.
@@ -249,7 +249,7 @@ public:
/** Sets the width and height of this widget. /** Sets the width and height of this widget.
\param [in] W, H new width and height \param [in] W, H new width and height
\see \c Fl_Widget::size(int, int) */ \see Fl_Widget::size(int, int) */
void size(int W, int H) { Fl_Widget::size(W, H); } void size(int W, int H) { Fl_Widget::size(W, H); }
/** Gets the maximum length of the input field. /** Gets the maximum length of the input field.
@@ -262,7 +262,7 @@ public:
/** Gets the position of the text cursor. /** Gets the position of the text cursor.
\return the cursor position as an index \return the cursor position as an index
\see \c position(int, int) \see position(int, int)
*/ */
int position() const {return position_;} int position() const {return position_;}
@@ -274,18 +274,18 @@ public:
int position(int p, int m); int position(int p, int m);
/** Set the cursor position and mark. /** Set the cursor position and mark.
\c position(n) is the same as <tt>position(n, n)</tt>. position(n) is the same as <tt>position(n, n)</tt>.
\param p new index for cursor and mark \param p new index for cursor and mark
\return \c 0 if no positions changed \return 0 if no positions changed
\see \c position(int, int), \c position(), \c mark(int) \see position(int, int), position(), mark(int)
*/ */
int position(int p) {return position(p, p);} int position(int p) {return position(p, p);}
/** Sets the current selection mark. /** Sets the current selection mark.
\c mark(n) is the same as <tt>position(position(),n)</tt>. mark(n) is the same as <tt>position(position(),n)</tt>.
\param m new index of the mark \param m new index of the mark
\return \c 0 if the mark did not change \return 0 if the mark did not change
\see \c position(), \c position(int, int) */ \see position(), position(int, int) */
int mark(int m) {return position(position(), m);} int mark(int m) {return position(position(), m);}
/* Deletes text from b to e and inserts the new string text. */ /* Deletes text from b to e and inserts the new string text. */
@@ -296,10 +296,10 @@ public:
This function deletes the currently selected text This function deletes the currently selected text
\e without storing it in the clipboard. To use the clipboard, \e without storing it in the clipboard. To use the clipboard,
you may call \c copy() first or \c copy_cuts() after you may call copy() first or copy_cuts() after
this call. this call.
\return \c 0 if no data was copied \return 0 if no data was copied
*/ */
int cut() {return replace(position(), mark(), 0);} int cut() {return replace(position(), mark(), 0);}
@@ -308,12 +308,12 @@ public:
This function deletes the currently selected text This function deletes the currently selected text
\e without storing it in the clipboard. To use the clipboard, \e without storing it in the clipboard. To use the clipboard,
you may call \c copy() first or \c copy_cuts() after you may call copy() first or copy_cuts() after
this call. this call.
\param n number of bytes rounded to full characters and clamped to the buffer. \param n number of bytes rounded to full characters and clamped to the buffer.
A negative number will cut characters to the left of the cursor. A negative number will cut characters to the left of the cursor.
\return \c 0 if no data was copied \return 0 if no data was copied
*/ */
int cut(int n) {return replace(position(), position()+n, 0);} int cut(int n) {return replace(position(), position()+n, 0);}
@@ -322,11 +322,11 @@ public:
This function deletes the currently selected text This function deletes the currently selected text
\e without storing it in the clipboard. To use the clipboard, \e without storing it in the clipboard. To use the clipboard,
you may call \c copy() first or \c copy_cuts() after you may call copy() first or copy_cuts() after
this call. this call.
\param a, b range of bytes rounded to full characters and clamped to the buffer \param a, b range of bytes rounded to full characters and clamped to the buffer
\return \c 0 if no data was copied \return 0 if no data was copied
*/ */
int cut(int a, int b) {return replace(a, b, 0);} int cut(int a, int b) {return replace(a, b, 0);}
@@ -334,12 +334,12 @@ public:
Inserts text at the cursor position. Inserts text at the cursor position.
This function inserts the string in \p t at the cursor This function inserts the string in \p t at the cursor
\c position() and moves the new position and mark to position() and moves the new position and mark to
the end of the inserted text. the end of the inserted text.
\param [in] t text that will be inserted \param [in] t text that will be inserted
\param [in] l length of text, or \c 0 if the string is terminated by \c NUL. \param [in] l length of text, or 0 if the string is terminated by \c nul.
\return \c 0 if no text was inserted \return 0 if no text was inserted
*/ */
int insert(const char* t, int l=0){return replace(position_, mark_, t, l);} int insert(const char* t, int l=0){return replace(position_, mark_, t, l);}
@@ -366,7 +366,7 @@ public:
void shortcut(int s) {shortcut_ = s;} void shortcut(int s) {shortcut_ = s;}
/** Gets the font of the text in the input field. /** Gets the font of the text in the input field.
\return the current \c Fl_Font index */ \return the current Fl_Font index */
Fl_Font textfont() const {return textfont_;} Fl_Font textfont() const {return textfont_;}
/** Sets the font of the text in the input field. /** Sets the font of the text in the input field.
@@ -385,13 +385,13 @@ public:
/** Gets the color of the text in the input field. /** Gets the color of the text in the input field.
\return the text color \return the text color
\see \c textcolor(unsigned) */ \see textcolor(unsigned) */
Fl_Color textcolor() const {return (Fl_Color)textcolor_;} Fl_Color textcolor() const {return (Fl_Color)textcolor_;}
/** Sets the color of the text in the input field. /** Sets the color of the text in the input field.
The text color defaults to \c FL_FOREGROUND_COLOR. The text color defaults to \c FL_FOREGROUND_COLOR.
\param [in] n new text color \param [in] n new text color
\see \c textcolor() */ \see textcolor() */
void textcolor(unsigned n) {textcolor_ = n;} void textcolor(unsigned n) {textcolor_ = n;}
/** Gets the color of the cursor. /** Gets the color of the cursor.
@@ -408,7 +408,7 @@ public:
int input_type() const {return type() & FL_INPUT_TYPE; } int input_type() const {return type() & FL_INPUT_TYPE; }
/** Sets the input field type. /** Sets the input field type.
A \c redraw() is required to reformat the input field. A redraw() is required to reformat the input field.
\param [in] t new input type */ \param [in] t new input type */
void input_type(int t) { type((uchar)(t | readonly())); } void input_type(int t) { type((uchar)(t | readonly())); }
@@ -417,7 +417,7 @@ public:
int readonly() const { return type() & FL_INPUT_READONLY; } int readonly() const { return type() & FL_INPUT_READONLY; }
/** Sets the read-only state of the input field. /** Sets the read-only state of the input field.
\param [in] b if \p b is \c 0, the text in this widget can be edited by the user */ \param [in] b if \p b is 0, the text in this widget can be edited by the user */
void readonly(int b) { if (b) type((uchar)(type() | FL_INPUT_READONLY)); void readonly(int b) { if (b) type((uchar)(type() | FL_INPUT_READONLY));
else type((uchar)(type() & ~FL_INPUT_READONLY)); } else type((uchar)(type() & ~FL_INPUT_READONLY)); }
+35 -35
View File
@@ -113,7 +113,7 @@ const char* Fl_Input_::expand(const char* p, char* buf) const {
\param [in] p pointer to the start of the original string \param [in] p pointer to the start of the original string
\param [in] e pointer to the end of the original string \param [in] e pointer to the end of the original string
\param [in] buf pointer to the buffer as returned by \c expand() \param [in] buf pointer to the buffer as returned by expand()
\return width of string in pixels \return width of string in pixels
*/ */
double Fl_Input_::expandpos( double Fl_Input_::expandpos(
@@ -207,7 +207,7 @@ void Fl_Input_::setfont() const {
Draw the text in the passed bounding box. Draw the text in the passed bounding box.
If <tt>damage() & FL_DAMAGE_ALL</tt> is true, this assumes the If <tt>damage() & FL_DAMAGE_ALL</tt> is true, this assumes the
area has already been erased to \c color(). Otherwise it does area has already been erased to color(). Otherwise it does
minimal update and erases the area itself. minimal update and erases the area itself.
\param X, Y, W, H area that must be redrawn \param X, Y, W, H area that must be redrawn
@@ -574,15 +574,15 @@ void Fl_Input_::handle_mouse(int X, int Y, int /*W*/, int /*H*/, int drag) {
\e position is where the cursor is. The \e position is where the cursor is. The
\e mark is the other end of the selected text. If they \e mark is the other end of the selected text. If they
are equal then there is no selection. Changing this does not are equal then there is no selection. Changing this does not
affect the clipboard (use \c copy() to do that). affect the clipboard (use copy() to do that).
Changing these values causes a \c redraw(). The new Changing these values causes a redraw(). The new
values are bounds checked. values are bounds checked.
\param p index for the cursor position \param p index for the cursor position
\param m index for the mark \param m index for the mark
\return \c 0 if no positions changed \return 0 if no positions changed
\see \c position(int), \c position(), \c mark(int) \see position(int), position(), mark(int)
*/ */
int Fl_Input_::position(int p, int m) { int Fl_Input_::position(int p, int m) {
int is_same = 0; int is_same = 0;
@@ -666,15 +666,15 @@ int Fl_Input_::up_down_position(int i, int keepmark) {
/** /**
Put the current selection into the clipboard. Put the current selection into the clipboard.
This function copies the current selection between \c mark() and This function copies the current selection between mark() and
\c position() into the specified clipboard. This does not position() into the specified clipboard. This does not
replace the old clipboard contents if \c position() and replace the old clipboard contents if position() and
\c mark() are equal. Clipboard 0 maps to the current text mark() are equal. Clipboard 0 maps to the current text
selection and clipboard 1 maps to the cut/paste clipboard. selection and clipboard 1 maps to the cut/paste clipboard.
\param clipboard the clipboard destionation \c 0 or \c 1 \param clipboard the clipboard destionation 0 or 1
\return \c 0 if no text is selected, \c 1 if the selection was copied \return 0 if no text is selected, 1 if the selection was copied
\see \c Fl::copy(const char *, int, int) \see Fl::copy(const char *, int, int)
*/ */
int Fl_Input_::copy(int clipboard) { int Fl_Input_::copy(int clipboard) {
int b = position(); int b = position();
@@ -716,30 +716,30 @@ static void undobuffersize(int n) {
All changes to the text buffer go through this function. All changes to the text buffer go through this function.
It deletes the region between \p a and \p b (either one may be less or It deletes the region between \p a and \p b (either one may be less or
equal to the other), and then inserts the string \p text equal to the other), and then inserts the string \p text
at that point and moves the \c mark() and at that point and moves the mark() and
\c position() to the end of the insertion. Does the callback if position() to the end of the insertion. Does the callback if
<tt>when() & FL_WHEN_CHANGED</tt> and there is a change. <tt>when() & FL_WHEN_CHANGED</tt> and there is a change.
Set \p b and \p e equal to not delete Set \p b and \p e equal to not delete
anything. Set insert to \c NULL to not insert anything. Set insert to \c NULL to not insert
anything. anything.
\p ilen must be zero or \c strlen(insert), this \p ilen must be zero or strlen(insert), this
saves a tiny bit of time if you happen to already know the saves a tiny bit of time if you happen to already know the
length of the insertion, or can be used to insert a portion of a length of the insertion, or can be used to insert a portion of a
string or a string containing \c nul's. string or a string containing <tt>nul</tt>'s.
\p b and \p e are clamped to the \p b and \p e are clamped to the
<tt>0..size()</tt> range, so it is safe to pass any values. <tt>0..size()</tt> range, so it is safe to pass any values.
\c cut() and \c insert() are just inline cut() and insert() are just inline
functions that call \c replace(). functions that call replace().
\param [in] b beginning index of text to be deleted \param [in] b beginning index of text to be deleted
\param [in] e ending index of text to be deleted and insertion position \param [in] e ending index of text to be deleted and insertion position
\param [in] text string that will be inserted \param [in] text string that will be inserted
\param [in] ilen length of \p text or \c 0 for \c nul terminated strings \param [in] ilen length of \p text or 0 for \c nul terminated strings
\return \c 0 if nothing changed \return 0 if nothing changed
*/ */
int Fl_Input_::replace(int b, int e, const char* text, int ilen) { int Fl_Input_::replace(int b, int e, const char* text, int ilen) {
int ul, om, op; int ul, om, op;
@@ -839,7 +839,7 @@ int Fl_Input_::replace(int b, int e, const char* text, int ilen) {
/** /**
Undo previous changes to the text buffer. Undo previous changes to the text buffer.
This call undoes a number of previous calls to \c replace(). This call undoes a number of previous calls to replace().
\return non-zero if any change was made. \return non-zero if any change was made.
*/ */
@@ -890,8 +890,8 @@ int Fl_Input_::undo() {
information to the clipboard. This function implemnts information to the clipboard. This function implemnts
the \c ^K shortcut key. the \c ^K shortcut key.
\return \c 0 if the operation did not change the clipboard \return 0 if the operation did not change the clipboard
\see \c copy(int), \c cut() \see copy(int), cut()
*/ */
int Fl_Input_::copy_cuts() { int Fl_Input_::copy_cuts() {
// put the yank buffer into the X clipboard // put the yank buffer into the X clipboard
@@ -901,7 +901,7 @@ int Fl_Input_::copy_cuts() {
} }
/** \internal /** \internal
Check the \c when() field and do a callback if indicated. Check the when() field and do a callback if indicated.
*/ */
void Fl_Input_::maybe_do_callback() { void Fl_Input_::maybe_do_callback() {
if (changed() || (when()&FL_WHEN_NOT_CHANGED)) { if (changed() || (when()&FL_WHEN_NOT_CHANGED)) {
@@ -1032,10 +1032,10 @@ int Fl_Input_::handletext(int event, int X, int Y, int W, int H) {
/*------------------------------*/ /*------------------------------*/
/** /**
Creates a new \c Fl_Input_ widget. Creates a new Fl_Input_ widget.
This function created a new \c Fl_Input_ widget and adds it to the curren This function created a new Fl_Input_ widget and adds it to the curren
\c Fl_Group. The \c value() is set the \c NULL. Fl_Group. The value() is set the \c NULL.
The default boxtype is \c FL_DOWN_BOX. The default boxtype is \c FL_DOWN_BOX.
\param X, Y, W, H the dimensions of the new widget \param X, Y, W, H the dimensions of the new widget
@@ -1109,7 +1109,7 @@ void Fl_Input_::put_in_buffer(int len) {
great deal of time and memory if your program is rapidly great deal of time and memory if your program is rapidly
changing the values of text fields, but this will only work if changing the values of text fields, but this will only work if
the passed string remains unchanged until either the the passed string remains unchanged until either the
\c Fl_Input is destroyed or \c value() is called again. Fl_Input is destroyed or value() is called again.
You can use the \p len parameter to directly set the length You can use the \p len parameter to directly set the length
if you know it already or want to put \c nul characters in the text. if you know it already or want to put \c nul characters in the text.
@@ -1157,7 +1157,7 @@ int Fl_Input_::static_value(const char* str, int len) {
great deal of time and memory if your program is rapidly great deal of time and memory if your program is rapidly
changing the values of text fields, but this will only work if changing the values of text fields, but this will only work if
the passed string remains unchanged until either the the passed string remains unchanged until either the
\c Fl_Input is destroyed or \c value() is called again. Fl_Input is destroyed or value() is called again.
\param [in] str the new text \param [in] str the new text
\return non-zero if the new value is different than the current one \return non-zero if the new value is different than the current one
@@ -1171,7 +1171,7 @@ int Fl_Input_::static_value(const char* str) {
This function changes the text and sets the mark and the This function changes the text and sets the mark and the
point to the end of it. The string is copied to the internal point to the end of it. The string is copied to the internal
buffer. Passing \c NULL is the same as \c "". buffer. Passing \c NULL is the same as "".
You can use the \p length parameter to directly set the length You can use the \p length parameter to directly set the length
if you know it already or want to put \c nul characters in the text. if you know it already or want to put \c nul characters in the text.
@@ -1179,7 +1179,7 @@ int Fl_Input_::static_value(const char* str) {
\param [in] str the new text \param [in] str the new text
\param [in] len the length of the new text \param [in] len the length of the new text
\return non-zero if the new value is different than the current one \return non-zero if the new value is different than the current one
\see \c Fl_Input_::value(const char* str), \c Fl_Input_::value() \see Fl_Input_::value(const char* str), Fl_Input_::value()
*/ */
int Fl_Input_::value(const char* str, int len) { int Fl_Input_::value(const char* str, int len) {
int r = static_value(str, len); int r = static_value(str, len);
@@ -1196,7 +1196,7 @@ int Fl_Input_::value(const char* str, int len) {
\param [in] str the new text \param [in] str the new text
\return non-zero if the new value is different than the current one \return non-zero if the new value is different than the current one
\see \c Fl_Input_::value(const char* str, int len), \c Fl_Input_::value() \see Fl_Input_::value(const char* str, int len), Fl_Input_::value()
*/ */
int Fl_Input_::value(const char* str) { int Fl_Input_::value(const char* str) {
return value(str, str ? strlen(str) : 0); return value(str, str ? strlen(str) : 0);
@@ -1206,7 +1206,7 @@ int Fl_Input_::value(const char* str) {
Change the size of the widget. Change the size of the widget.
This call updates the text layout so that the cursor is visible. This call updates the text layout so that the cursor is visible.
\param [in] X, Y, W, H new size of the widget \param [in] X, Y, W, H new size of the widget
\see \c Fl_Widget::resize(int, int, int, int) \see Fl_Widget::resize(int, int, int, int)
*/ */
void Fl_Input_::resize(int X, int Y, int W, int H) { void Fl_Input_::resize(int X, int Y, int W, int H) {
if (W != w()) xscroll_ = 0; if (W != w()) xscroll_ = 0;
@@ -1218,7 +1218,7 @@ void Fl_Input_::resize(int X, int Y, int W, int H) {
Destroys the widget. Destroys the widget.
The destructor clears all allocated buffers and removes the widget The destructor clears all allocated buffers and removes the widget
from the parent \c Fl_Group. from the parent Fl_Group.
*/ */
Fl_Input_::~Fl_Input_() { Fl_Input_::~Fl_Input_() {
if (undowidget == this) undowidget = 0; if (undowidget == this) undowidget = 0;