diff --git a/CHANGES b/CHANGES index e63770090..b6d315665 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,9 @@ CHANGES IN FLTK 1.1.2 - - MacOS windows were resizable, even when size_range would - not allow for resizing. + - Back-ported some FLTK 2.0 tooltip changes to eliminate + erroneous tooltip display. + - MacOS windows were resizable, even when size_range + would not allow for resizing. - Fl_Text_Editor now supports Shift+Delete, Ctrl+Insert, and Shift+Insert for cut, copy, and paste, respectively. diff --git a/FL/Enumerations.H b/FL/Enumerations.H index 1e93d9064..ffb67d46f 100644 --- a/FL/Enumerations.H +++ b/FL/Enumerations.H @@ -1,5 +1,5 @@ // -// "$Id: Enumerations.H,v 1.18.2.14.2.28 2002/10/24 12:53:40 easysw Exp $" +// "$Id: Enumerations.H,v 1.18.2.14.2.29 2002/10/29 19:45:08 easysw Exp $" // // Enumerations for the Fast Light Tool Kit (FLTK). // @@ -145,6 +145,8 @@ enum Fl_When { // Fl_Widget::when(): #define FL_BUTTON1 0x01000000 #define FL_BUTTON2 0x02000000 #define FL_BUTTON3 0x04000000 +#define FL_BUTTONS 0x7f000000 // All possible buttons +#define FL_BUTTON(n) (0x00800000<<(n)) enum Fl_Boxtype { // boxtypes (if you change these you must fix fl_boxtype.C): FL_NO_BOX = 0, FL_FLAT_BOX, @@ -406,5 +408,5 @@ enum Fl_Damage { #endif // -// End of "$Id: Enumerations.H,v 1.18.2.14.2.28 2002/10/24 12:53:40 easysw Exp $". +// End of "$Id: Enumerations.H,v 1.18.2.14.2.29 2002/10/29 19:45:08 easysw Exp $". // diff --git a/FL/Fl_Tooltip.H b/FL/Fl_Tooltip.H index 5328dc510..b1512d151 100644 --- a/FL/Fl_Tooltip.H +++ b/FL/Fl_Tooltip.H @@ -1,5 +1,5 @@ // -// "$Id: Fl_Tooltip.H,v 1.16.2.8 2002/05/13 05:05:11 spitzak Exp $" +// "$Id: Fl_Tooltip.H,v 1.16.2.9 2002/10/29 19:45:09 easysw Exp $" // // Tooltip header file for the Fast Light Tool Kit (FLTK). // @@ -39,6 +39,8 @@ public: static void (*enter)(Fl_Widget* w); static void enter_area(Fl_Widget* w, int X, int Y, int W, int H, const char* tip); static void (*exit)(Fl_Widget *w); + static Fl_Widget* current() {return widget_;} + static void current(Fl_Widget*); static int font() { return font_; } static int size() { return size_; } @@ -55,10 +57,11 @@ private: static unsigned textcolor_; static int font_; static int size_; + static Fl_Widget* widget_; }; #endif // -// End of "$Id: Fl_Tooltip.H,v 1.16.2.8 2002/05/13 05:05:11 spitzak Exp $". +// End of "$Id: Fl_Tooltip.H,v 1.16.2.9 2002/10/29 19:45:09 easysw Exp $". // diff --git a/src/Fl.cxx b/src/Fl.cxx index 2180fd4da..f2742a473 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl.cxx,v 1.24.2.41.2.55 2002/10/22 17:39:11 easysw Exp $" +// "$Id: Fl.cxx,v 1.24.2.41.2.56 2002/10/29 19:45:09 easysw Exp $" // // Main event handling code for the Fast Light Tool Kit (FLTK). // @@ -533,6 +533,7 @@ void fl_throw_focus(Fl_Widget *o) { if (o->contains(Fl::belowmouse())) Fl::belowmouse_ = 0; if (o->contains(Fl::focus())) Fl::focus_ = 0; if (o == fl_xfocus) fl_xfocus = 0; + if (o == Fl_Tooltip::current()) Fl_Tooltip::current(0); if (o == fl_xmousewin) fl_xmousewin = 0; Fl_Tooltip::exit(o); fl_fix_focus(); @@ -579,10 +580,10 @@ int Fl::handle(int e, Fl_Window* window) return 1; case FL_PUSH: - Fl_Tooltip::enter((Fl_Widget*)0); if (grab()) wi = grab(); else if (modal() && wi != modal()) return 0; pushed_ = wi; + Fl_Tooltip::current(wi); if (send(e, wi, window)) return 1; // raise windows that are clicked on: window->show(); @@ -686,6 +687,10 @@ int Fl::handle(int e, Fl_Window* window) return 1; case FL_LEAVE: + if (!pushed_) { + belowmouse(0); + Fl_Tooltip::enter(0); + } if (window == fl_xmousewin) {fl_xmousewin = 0; fl_fix_focus();} return 1; @@ -790,9 +795,6 @@ void Fl_Window::hide() { Fl::first_window()->show(); #endif delete ip; - - // Hide any visible tooltips... - //Fl_Tooltip::enter(0); } Fl_Window::~Fl_Window() { @@ -967,5 +969,5 @@ void Fl_Window::flush() { } // -// End of "$Id: Fl.cxx,v 1.24.2.41.2.55 2002/10/22 17:39:11 easysw Exp $". +// End of "$Id: Fl.cxx,v 1.24.2.41.2.56 2002/10/29 19:45:09 easysw Exp $". // diff --git a/src/Fl_Tooltip.cxx b/src/Fl_Tooltip.cxx index f5209aa9d..214c66760 100644 --- a/src/Fl_Tooltip.cxx +++ b/src/Fl_Tooltip.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_Tooltip.cxx,v 1.38.2.24 2002/08/09 03:17:30 easysw Exp $" +// "$Id: Fl_Tooltip.cxx,v 1.38.2.25 2002/10/29 19:45:10 easysw Exp $" // // Tooltip source file for the Fast Light Tool Kit (FLTK). // @@ -55,7 +55,7 @@ public: } }; -static Fl_Widget* widget; +Fl_Widget* Fl_Tooltip::widget_ = 0; static Fl_TooltipBox *window = 0; static int X,Y,W,H; @@ -70,7 +70,7 @@ void Fl_TooltipBox::layout() { int ox = Fl::event_x_root(); //int ox = X+W/2; int oy = Y + H+2; - for (Fl_Widget* p = widget; p; p = p->window()) { + for (Fl_Widget* p = Fl_Tooltip::current(); p; p = p->window()) { //ox += p->x(); oy += p->y(); } @@ -105,28 +105,57 @@ static char recursion; static void tooltip_timeout(void*) { if (recursion) return; recursion = 1; - if (!tip || !*tip) return; - //if (Fl::grab()) return; - if (!window) window = new Fl_TooltipBox; - // this cast bypasses the normal Fl_Window label() code: - ((Fl_Widget*)window)->label(tip); - window->layout(); - window->redraw(); -// printf("tooltip_timeout: Showing window %p with tooltip \"%s\"...\n", -// window, tip ? tip : "(null)"); - window->show(); + if (!tip || !*tip) { + if (window) window->hide(); + } else { + //if (Fl::grab()) return; + if (!window) window = new Fl_TooltipBox; + // this cast bypasses the normal Fl_Window label() code: + ((Fl_Widget*)window)->label(tip); + window->layout(); + window->redraw(); +// printf("tooltip_timeout: Showing window %p with tooltip \"%s\"...\n", +// window, tip ? tip : "(null)"); + window->show(); + } + Fl::remove_timeout(recent_timeout); recent_tooltip = 1; recursion = 0; } +// Acts as though enter(widget) was done but does not pop up a +// tooltip. This is useful to prevent a tooltip from reappearing when +// a modal overlapping window is deleted. Fltk does this automatically +// when you click the mouse button. +void Fl_Tooltip::current(Fl_Widget* w) { + enter(0); + // find the enclosing group with a tooltip: + Fl_Widget* tw = w; + for (;;) { + if (!tw) return; + if (tw->tooltip()) break; + tw = tw->parent(); + } + // act just like tt_enter() except we can remember a zero: + widget_ = w; +} + // This is called when a widget is destroyed: static void tt_exit(Fl_Widget *w) { // printf("tt_exit(w=%p)\n", w); // printf(" widget=%p, window=%p\n", widget, window); - if (w && w == widget) Fl_Tooltip::enter_area(0,0,0,0,0,0); + if (!Fl_Tooltip::current()) return; + Fl_Tooltip::current(0); + Fl::remove_timeout(tooltip_timeout); + Fl::remove_timeout(recent_timeout); + if (window) window->hide(); + if (recent_tooltip) { + if (Fl::event_state() & FL_BUTTONS) recent_tooltip = 0; + else Fl::add_timeout(.2f, recent_timeout); + } } static void @@ -154,38 +183,29 @@ Fl_Tooltip::enter_area(Fl_Widget* wid, int x,int y,int w,int h, const char* t) // printf(" recursion=%d, window=%p\n", recursion, window); if (recursion) return; - if (t && *t && enabled()) { // there is a tooltip - // do nothing if it is the same: - if (wid==widget && x==X && y==Y && w==W && h==H && t==tip) return; - Fl::remove_timeout(tooltip_timeout); - Fl::remove_timeout(recent_timeout); - // remember it: - widget = wid; X = x; Y = y; W = w; H = h; tip = t; - if (recent_tooltip || Fl_Tooltip::delay() < .1) { - // switch directly from a previous tooltip to the new one: -#ifdef WIN32 - // possible fix for the Windows titlebar, it seems to want the - // window to be destroyed, moving it messes up the parenting: - if (window) window->hide(); -#endif - tooltip_timeout(0); - } else { - if (window) window->hide(); - Fl::add_timeout(Fl_Tooltip::delay(), tooltip_timeout); - } - } else { // no tooltip - if (!tip) return; - Fl::remove_timeout(tooltip_timeout); - Fl::remove_timeout(recent_timeout); - tip = 0; - widget = 0; + if (!t || !*t || !enabled()) { if (window) window->hide(); - if (recent_tooltip) { - if (Fl::event_state() & 0x7f00000 /*FL_BUTTONS*/) - recent_tooltip = 0; - else - Fl::add_timeout(.2, recent_timeout); - } + Fl::remove_timeout(tooltip_timeout); + Fl::remove_timeout(recent_timeout); + return; + } + // do nothing if it is the same: + if (wid==widget_ && x==X && y==Y && w==W && h==H && t==tip) return; + Fl::remove_timeout(tooltip_timeout); + Fl::remove_timeout(recent_timeout); + // remember it: + widget_ = wid; X = x; Y = y; W = w; H = h; tip = t; + // popup the tooltip immediately if it was recently up: + if (recent_tooltip || Fl_Tooltip::delay() < .1) { +#ifdef WIN32 + // possible fix for the Windows titlebar, it seems to want the + // window to be destroyed, moving it messes up the parenting: + if (window) window->hide(); +#endif + tooltip_timeout(0); + } else { + if (window) window->hide(); + Fl::add_timeout(Fl_Tooltip::delay(), tooltip_timeout); } // printf(" tip=\"%s\", window->shown()=%d\n", tip ? tip : "(null)", @@ -203,5 +223,5 @@ void Fl_Widget::tooltip(const char *tt) { } // -// End of "$Id: Fl_Tooltip.cxx,v 1.38.2.24 2002/08/09 03:17:30 easysw Exp $". +// End of "$Id: Fl_Tooltip.cxx,v 1.38.2.25 2002/10/29 19:45:10 easysw Exp $". //