diff options
Diffstat (limited to 'src/Fl_Menu_.cxx')
| -rw-r--r-- | src/Fl_Menu_.cxx | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/Fl_Menu_.cxx b/src/Fl_Menu_.cxx index 875eef964..0a608e07e 100644 --- a/src/Fl_Menu_.cxx +++ b/src/Fl_Menu_.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_Menu_.cxx,v 1.7.2.2 1999/04/08 19:13:02 carl Exp $" +// "$Id: Fl_Menu_.cxx,v 1.7.2.3 1999/04/19 07:01:23 bill Exp $" // // Common menu code for the Fast Light Tool Kit (FLTK). // @@ -113,16 +113,13 @@ void Fl_Menu_::menu(const Fl_Menu_Item* m) { } void Fl_Menu_::copy(const Fl_Menu_Item* m, void* user_data) { - int i, s = m->size(), n=s; - for (i=0; n; n>>=1, i++); - n = 1 << i; + int n = m->size(); Fl_Menu_Item* newMenu = new Fl_Menu_Item[n]; - memcpy(newMenu, m, s*sizeof(Fl_Menu_Item)); - memset(newMenu+s, 0, (n-s)*sizeof(Fl_Menu_Item)); + memcpy(newMenu, m, n*sizeof(Fl_Menu_Item)); menu(newMenu); - alloc = 1; // make destructor free it + alloc = 1; // make destructor free array, but not strings // for convienence, provide way to change all the user data pointers: - if (user_data) for (; s--;) { + if (user_data) for (; n--;) { if (newMenu->callback_) newMenu->user_data_ = user_data; newMenu++; } @@ -132,11 +129,18 @@ Fl_Menu_::~Fl_Menu_() { clear(); } +// Fl_Menu::add() uses this to indicate the owner of the dynamically- +// expanding array. We must not free this array: +Fl_Menu_* fl_menu_array_owner = 0; + void Fl_Menu_::clear() { if (alloc) { if (alloc>1) for (int i = size(); i--;) if (menu_[i].text) free((void*)menu_[i].text); - delete[] menu_; + if (this == fl_menu_array_owner) + fl_menu_array_owner = 0; + else + delete[] menu_; menu_ = 0; value_ = 0; alloc = 0; @@ -144,5 +148,5 @@ void Fl_Menu_::clear() { } // -// End of "$Id: Fl_Menu_.cxx,v 1.7.2.2 1999/04/08 19:13:02 carl Exp $". +// End of "$Id: Fl_Menu_.cxx,v 1.7.2.3 1999/04/19 07:01:23 bill Exp $". // |
