Tooltips would not reappear on the same widget, and the initial
tooltip delay was not used after a tooltip was shown (STR #465) git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@3822 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
35af1c00cc
commit
70dd6151c1
3
CHANGES
3
CHANGES
@ -3,6 +3,9 @@ CHANGES IN FLTK 1.1.5rc3
|
||||
- Documentation updates (STR #505, STR #513)
|
||||
- Updated PNG library source to 1.2.6 + wutil patch.
|
||||
- Updated ZLIB library source to 1.2.1.
|
||||
- Tooltips would not reappear on the same widget, and
|
||||
the initial tooltip delay was not used after a tooltip
|
||||
was shown (STR #465)
|
||||
- Fixed a compile problem with the Linux 2.6 threading
|
||||
support (STR #483)
|
||||
- Fixed problems with 2-byte Xpm files on 64-bit
|
||||
|
@ -1,5 +1,5 @@
|
||||
//
|
||||
// "$Id: Fl_Tooltip.H,v 1.16.2.12 2004/04/11 04:38:54 easysw Exp $"
|
||||
// "$Id: Fl_Tooltip.H,v 1.16.2.13 2004/09/12 20:26:23 easysw Exp $"
|
||||
//
|
||||
// Tooltip header file for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
@ -52,6 +52,11 @@ public:
|
||||
static Fl_Color color() { return (Fl_Color)color_; }
|
||||
static void textcolor(unsigned c) { textcolor_ = c; }
|
||||
static Fl_Color textcolor() { return (Fl_Color)textcolor_; }
|
||||
|
||||
// These should not be public, but Fl_Widget::tooltip() needs them...
|
||||
static void enter_(Fl_Widget* w);
|
||||
static void exit_(Fl_Widget *w);
|
||||
|
||||
private:
|
||||
static float delay_;
|
||||
static float hoverdelay_;
|
||||
@ -66,5 +71,5 @@ private:
|
||||
#endif
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Tooltip.H,v 1.16.2.12 2004/04/11 04:38:54 easysw Exp $".
|
||||
// End of "$Id: Fl_Tooltip.H,v 1.16.2.13 2004/09/12 20:26:23 easysw Exp $".
|
||||
//
|
||||
|
38
src/Fl.cxx
38
src/Fl.cxx
@ -1,5 +1,5 @@
|
||||
//
|
||||
// "$Id: Fl.cxx,v 1.24.2.41.2.67 2004/09/09 21:34:45 matthiaswm Exp $"
|
||||
// "$Id: Fl.cxx,v 1.24.2.41.2.68 2004/09/12 20:26:23 easysw Exp $"
|
||||
//
|
||||
// Main event handling code for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
@ -36,6 +36,10 @@
|
||||
#include <stdlib.h>
|
||||
#include "flstring.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
# include <stdio.h>
|
||||
#endif // DEBUG
|
||||
|
||||
|
||||
//
|
||||
// Globals...
|
||||
@ -482,6 +486,9 @@ void (*Fl_Tooltip::exit)(Fl_Widget *) = nothing;
|
||||
// X says the focus or mouse window have changed.
|
||||
|
||||
void fl_fix_focus() {
|
||||
#ifdef DEBUG
|
||||
puts("fl_fix_focus();");
|
||||
#endif // DEBUG
|
||||
|
||||
if (Fl::grab()) return; // don't do anything while grab is on.
|
||||
|
||||
@ -535,6 +542,10 @@ extern Fl_Widget *fl_selection_requestor; // from Fl_x.cxx
|
||||
// desirable behavior and caused flwm to crash.
|
||||
|
||||
void fl_throw_focus(Fl_Widget *o) {
|
||||
#ifdef DEBUG
|
||||
printf("fl_throw_focus(o=%p)\n", o);
|
||||
#endif // DEBUG
|
||||
|
||||
if (o->contains(Fl::pushed())) Fl::pushed_ = 0;
|
||||
#ifndef WIN32
|
||||
if (o->contains(fl_selection_requestor)) fl_selection_requestor = 0;
|
||||
@ -594,6 +605,10 @@ int Fl::handle(int e, Fl_Window* window)
|
||||
return 1;
|
||||
|
||||
case FL_PUSH:
|
||||
#ifdef DEBUG
|
||||
printf("Fl::handle(e=%d, window=%p);\n", e, window);
|
||||
#endif // DEBUG
|
||||
|
||||
if (grab()) wi = grab();
|
||||
else if (modal() && wi != modal()) return 0;
|
||||
pushed_ = wi;
|
||||
@ -631,7 +646,12 @@ int Fl::handle(int e, Fl_Window* window)
|
||||
if (grab()) wi = grab();
|
||||
{Fl_Widget* pbm = belowmouse();
|
||||
int ret = (wi && send(e, wi, window));
|
||||
if (pbm != belowmouse()) Fl_Tooltip::enter(belowmouse());
|
||||
if (pbm != belowmouse()) {
|
||||
#ifdef DEBUG
|
||||
printf("Fl::handle(e=%d, window=%p);\n", e, window);
|
||||
#endif // DEBUG
|
||||
Fl_Tooltip::enter(belowmouse());
|
||||
}
|
||||
return ret;}
|
||||
|
||||
case FL_RELEASE: {
|
||||
@ -657,6 +677,10 @@ int Fl::handle(int e, Fl_Window* window)
|
||||
return 1;
|
||||
|
||||
case FL_KEYBOARD:
|
||||
#ifdef DEBUG
|
||||
printf("Fl::handle(e=%d, window=%p);\n", e, window);
|
||||
#endif // DEBUG
|
||||
|
||||
Fl_Tooltip::enter((Fl_Widget*)0);
|
||||
|
||||
fl_xfocus = window; // this should not happen! But maybe it does:
|
||||
@ -695,12 +719,20 @@ int Fl::handle(int e, Fl_Window* window)
|
||||
return 0;
|
||||
|
||||
case FL_ENTER:
|
||||
#ifdef DEBUG
|
||||
printf("Fl::handle(e=%d, window=%p);\n", e, window);
|
||||
#endif // DEBUG
|
||||
|
||||
fl_xmousewin = window;
|
||||
fl_fix_focus();
|
||||
Fl_Tooltip::enter(belowmouse());
|
||||
return 1;
|
||||
|
||||
case FL_LEAVE:
|
||||
#ifdef DEBUG
|
||||
printf("Fl::handle(e=%d, window=%p);\n", e, window);
|
||||
#endif // DEBUG
|
||||
|
||||
if (!pushed_) {
|
||||
belowmouse(0);
|
||||
Fl_Tooltip::enter(0);
|
||||
@ -1020,5 +1052,5 @@ void Fl_Window::flush() {
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id: Fl.cxx,v 1.24.2.41.2.67 2004/09/09 21:34:45 matthiaswm Exp $".
|
||||
// End of "$Id: Fl.cxx,v 1.24.2.41.2.68 2004/09/12 20:26:23 easysw Exp $".
|
||||
//
|
||||
|
@ -1,5 +1,5 @@
|
||||
//
|
||||
// "$Id: Fl_Tooltip.cxx,v 1.38.2.29 2004/04/11 04:38:58 easysw Exp $"
|
||||
// "$Id: Fl_Tooltip.cxx,v 1.38.2.30 2004/09/12 20:26:23 easysw Exp $"
|
||||
//
|
||||
// Tooltip source file for the Fast Light Tool Kit (FLTK).
|
||||
//
|
||||
@ -98,12 +98,20 @@ void Fl_TooltipBox::draw() {
|
||||
static char recent_tooltip;
|
||||
|
||||
static void recent_timeout(void*) {
|
||||
#ifdef DEBUG
|
||||
puts("recent_timeout();");
|
||||
#endif // DEBUG
|
||||
|
||||
recent_tooltip = 0;
|
||||
}
|
||||
|
||||
static char recursion;
|
||||
|
||||
static void tooltip_timeout(void*) {
|
||||
#ifdef DEBUG
|
||||
puts("tooltip_timeout();");
|
||||
#endif // DEBUG
|
||||
|
||||
if (recursion) return;
|
||||
recursion = 1;
|
||||
if (!tip || !*tip) {
|
||||
@ -125,12 +133,40 @@ static void tooltip_timeout(void*) {
|
||||
recursion = 0;
|
||||
}
|
||||
|
||||
// If this widget or one of it's parents has a tooltip, enter it. This
|
||||
// will do nothing if this is the current widget (even if the mouse moved
|
||||
// out so an exit() was done and then moved back in). If no tooltip can
|
||||
// be found do Fl_Tooltip::exit_(). If you don't want this behavior (for instance
|
||||
// if you want the tooltip to reappear when the mouse moves back in)
|
||||
// call the fancier enter_area() below.
|
||||
void
|
||||
Fl_Tooltip::enter_(Fl_Widget* w) {
|
||||
#ifdef DEBUG
|
||||
printf("Fl_Tooltip::enter_(w=%p)\n", w);
|
||||
printf(" window=%p\n", window);
|
||||
#endif // DEBUG
|
||||
|
||||
// find the enclosing group with a tooltip:
|
||||
Fl_Widget* tw = w;
|
||||
for (;;) {
|
||||
if (!tw) {exit_(0); return;}
|
||||
if (tw == widget_) return;
|
||||
if (tw->tooltip()) break;
|
||||
tw = tw->parent();
|
||||
}
|
||||
enter_area(w, 0, 0, w->w(), w->h(), tw->tooltip());
|
||||
}
|
||||
|
||||
// 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
|
||||
// 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);
|
||||
#ifdef DEBUG
|
||||
printf("Fl_Tooltip::current(w=%p)\n", w);
|
||||
#endif // DEBUG
|
||||
|
||||
exit_(0);
|
||||
// find the enclosing group with a tooltip:
|
||||
Fl_Widget* tw = w;
|
||||
for (;;) {
|
||||
@ -138,20 +174,20 @@ void Fl_Tooltip::current(Fl_Widget* w) {
|
||||
if (tw->tooltip()) break;
|
||||
tw = tw->parent();
|
||||
}
|
||||
// act just like tt_enter() except we can remember a zero:
|
||||
// act just like Fl_Tooltip::enter_() except we can remember a zero:
|
||||
widget_ = w;
|
||||
}
|
||||
|
||||
// This is called when a widget is destroyed:
|
||||
static void
|
||||
tt_exit(Fl_Widget *w) {
|
||||
// Hide any visible tooltip.
|
||||
void
|
||||
Fl_Tooltip::exit_(Fl_Widget *w) {
|
||||
#ifdef DEBUG
|
||||
printf("tt_exit(w=%p)\n", w);
|
||||
printf(" widget=%p, window=%p\n", Fl_Tooltip::current(), window);
|
||||
printf("Fl_Tooltip::exit_(w=%p)\n", w);
|
||||
printf(" widget=%p, window=%p\n", widget_, window);
|
||||
#endif // DEBUG
|
||||
|
||||
if (!Fl_Tooltip::current()) return;
|
||||
Fl_Tooltip::current(0);
|
||||
if (!widget_) return;
|
||||
widget_ = 0;
|
||||
Fl::remove_timeout(tooltip_timeout);
|
||||
Fl::remove_timeout(recent_timeout);
|
||||
if (window) window->hide();
|
||||
@ -161,26 +197,10 @@ tt_exit(Fl_Widget *w) {
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
tt_enter(Fl_Widget* wp) {
|
||||
#ifdef DEBUG
|
||||
printf("tt_enter(wp=%p)\n", wp);
|
||||
printf(" window=%p\n", window);
|
||||
#endif // DEBUG
|
||||
|
||||
// find the enclosing group with a tooltip:
|
||||
Fl_Widget* w = wp;
|
||||
while (w && !w->tooltip()) {
|
||||
//if (w == window) return; // don't do anything if pointed at tooltip
|
||||
w = w->parent();
|
||||
}
|
||||
if (!w) {
|
||||
Fl_Tooltip::enter_area(0, 0, 0, 0, 0, 0);
|
||||
} else {
|
||||
Fl_Tooltip::enter_area(w,0,0,w->w(), w->h(), w->tooltip());
|
||||
}
|
||||
}
|
||||
|
||||
// Get ready to display a tooltip. The widget and the xywh box inside
|
||||
// it define an area the tooltip is for, this along with the current
|
||||
// mouse position places the tooltip (the mouse is assummed to point
|
||||
// inside or near the box).
|
||||
void
|
||||
Fl_Tooltip::enter_area(Fl_Widget* wid, int x,int y,int w,int h, const char* t)
|
||||
{
|
||||
@ -192,13 +212,11 @@ Fl_Tooltip::enter_area(Fl_Widget* wid, int x,int y,int w,int h, const char* t)
|
||||
|
||||
if (recursion) return;
|
||||
if (!t || !*t || !enabled()) {
|
||||
if (window) window->hide();
|
||||
Fl::remove_timeout(tooltip_timeout);
|
||||
Fl::remove_timeout(recent_timeout);
|
||||
exit_(0);
|
||||
return;
|
||||
}
|
||||
// do nothing if it is the same:
|
||||
if (wid==widget_ && x==X && y==Y && w==W && h==H && t==tip) return;
|
||||
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:
|
||||
@ -212,7 +230,7 @@ Fl_Tooltip::enter_area(Fl_Widget* wid, int x,int y,int w,int h, const char* t)
|
||||
// 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
|
||||
#endif // WIN32
|
||||
tooltip_timeout(0);
|
||||
} else {
|
||||
if (window) window->hide();
|
||||
@ -228,13 +246,13 @@ Fl_Tooltip::enter_area(Fl_Widget* wid, int x,int y,int w,int h, const char* t)
|
||||
void Fl_Widget::tooltip(const char *tt) {
|
||||
static char beenhere = 0;
|
||||
if (!beenhere) {
|
||||
beenhere = 1;
|
||||
Fl_Tooltip::enter = tt_enter;
|
||||
Fl_Tooltip::exit = tt_exit;
|
||||
beenhere = 1;
|
||||
Fl_Tooltip::enter = Fl_Tooltip::enter_;
|
||||
Fl_Tooltip::exit = Fl_Tooltip::exit_;
|
||||
}
|
||||
tooltip_ = tt;
|
||||
}
|
||||
|
||||
//
|
||||
// End of "$Id: Fl_Tooltip.cxx,v 1.38.2.29 2004/04/11 04:38:58 easysw Exp $".
|
||||
// End of "$Id: Fl_Tooltip.cxx,v 1.38.2.30 2004/09/12 20:26:23 easysw Exp $".
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user