summaryrefslogtreecommitdiff
path: root/src/Fl_Menu_.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Fl_Menu_.cxx')
-rw-r--r--src/Fl_Menu_.cxx24
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 $".
//