summaryrefslogtreecommitdiff
path: root/src/Fl_Menu.cxx
diff options
context:
space:
mode:
authorFabien Costantini <fabien@onepost.net>2008-12-04 17:33:30 +0000
committerFabien Costantini <fabien@onepost.net>2008-12-04 17:33:30 +0000
commit899184656a08484f2a0afcdf87796a042f1dba63 (patch)
tree4cb4797040c656c50c7583b7f936ea9e145f2bad /src/Fl_Menu.cxx
parent73a2fa5b99fda883323cd53346f564c14060a01d (diff)
STR#2086 related Fixes :
This one was really tough to track, understand: In fact, the problem was comming from the misplacement of the menu window, which itself came from invalid measurement, which itself came from invalid fl_witdh() measurement, but only when fl_gc is not valid because fl_width() relies on Win32 on the call of GetTextExtentPoint32W which can't succeed if the HDC(here fl_gc) is not valid ! Now the fix: A best-effort algorithm has been furthered to supply a valid fltk hdc if we can have one or a screen hdc if no fltk window is found by fl::first_window(). Note that when fl_gc is NULL inside fl_width() call, it can happen that Fl_Window::current() is not null but invalid (already deleted). Finally, in the case of the buggy menu window observed here, this fl_gc was set to NULL just after an Fl_Menu_Window deletion and re-creation in Fl_Menu_Item::pulldown(). Also added a comment to describe the new fl_width() behavior. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6540 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Menu.cxx')
-rw-r--r--src/Fl_Menu.cxx11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/Fl_Menu.cxx b/src/Fl_Menu.cxx
index 68e60fb02..bf6e4b4bf 100644
--- a/src/Fl_Menu.cxx
+++ b/src/Fl_Menu.cxx
@@ -80,7 +80,7 @@ const Fl_Menu_Item* Fl_Menu_Item::next(int n) const {
}
// appearance of current menus are pulled from this parent widget:
-static const Fl_Menu_* button;
+static const Fl_Menu_* button=0;
////////////////////////////////////////////////////////////////
@@ -320,7 +320,8 @@ menuwindow::menuwindow(const Fl_Menu_Item* m, int X, int Y, int Wp, int Hp,
if (t) Wtitle = t->measure(&Htitle, button) + 12;
int W = 0;
if (m) for (; m->text; m = m->next()) {
- int hh; int w1 = m->measure(&hh, button);
+ int hh;
+ int w1 = m->measure(&hh, button);
if (hh+LEADING>itemheight) itemheight = hh+LEADING;
if (m->flags&(FL_SUBMENU|FL_SUBMENU_POINTER)) w1 += 14;
if (w1 > W) W = w1;
@@ -541,7 +542,7 @@ struct menustate {
menuwindow* fakemenu; // kludge for buttons in menubar
int is_inside(int mx, int my);
};
-static menustate* p;
+static menustate* p=0;
// return 1 if the coordinates are inside any of the menuwindows
int menustate::is_inside(int mx, int my) {
@@ -826,7 +827,7 @@ const Fl_Menu_Item* Fl_Menu_Item::pulldown(
if (pp.current_item == oldi) continue;}
// only do rest if item changes:
- delete pp.fakemenu; pp.fakemenu = 0; // turn off "menubar button"
+ if(pp.fakemenu) {delete pp.fakemenu; pp.fakemenu = 0;} // turn off "menubar button"
if (!pp.current_item) { // pointing at nothing
// turn off selection in deepest menu, but don't erase other menus:
@@ -834,7 +835,7 @@ const Fl_Menu_Item* Fl_Menu_Item::pulldown(
continue;
}
- delete pp.fakemenu; pp.fakemenu = 0;
+ if(pp.fakemenu) {delete pp.fakemenu; pp.fakemenu = 0;}
initial_item = 0; // stop the startup code
pp.p[pp.menu_number]->autoscroll(pp.item_number);