diff options
-rw-r--r-- | gtk/PlatGTK.cxx | 30 | ||||
-rw-r--r-- | include/Platform.h | 7 | ||||
-rw-r--r-- | win32/PlatWin.cxx | 24 |
3 files changed, 48 insertions, 13 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index bf3504f8b..f776a2c19 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -192,10 +192,14 @@ Palette::Palette() { allowRealization = false; allocatedPalette = 0; allocatedLen = 0; + size = 100; + entries = new ColourPair[size]; } Palette::~Palette() { Release(); + delete []entries; + entries = 0; } void Palette::Release() { @@ -203,6 +207,9 @@ void Palette::Release() { delete [](reinterpret_cast<GdkColor *>(allocatedPalette)); allocatedPalette = 0; allocatedLen = 0; + delete []entries; + size = 100; + entries = new ColourPair[size]; } // This method either adds a colour to the list of wanted colours (want==true) @@ -210,18 +217,27 @@ void Palette::Release() { // This is one method to make it easier to keep the code for wanting and retrieving in sync. void Palette::WantFind(ColourPair &cp, bool want) { if (want) { - for (int i = 0; i < used; i++) { + for (int i=0; i < used; i++) { if (entries[i].desired == cp.desired) return; } - if (used < numEntries) { - entries[used].desired = cp.desired; - entries[used].allocated.Set(cp.desired.AsLong()); - used++; + if (used >= size) { + int sizeNew = size * 2; + ColourPair *entriesNew = new ColourPair[sizeNew]; + for (int j=0; j<size; j++) { + entriesNew[j] = entries[j]; + } + delete []entries; + entries = entriesNew; + size = sizeNew; } + + entries[used].desired = cp.desired; + entries[used].allocated.Set(cp.desired.AsLong()); + used++; } else { - for (int i = 0; i < used; i++) { + for (int i=0; i < used; i++) { if (entries[i].desired == cp.desired) { cp.allocated = entries[i].allocated; return; @@ -2367,7 +2383,7 @@ void Menu::Show(Point pt, Window &) { pt.y = screenHeight - requisition.height; } #if GTK_MAJOR_VERSION >= 2 - gtk_item_factory_popup(factory, pt.x - 4, pt.y - 4, 3, + gtk_item_factory_popup(factory, pt.x - 4, pt.y - 4, 3, gtk_get_current_event_time()); #else gtk_item_factory_popup(factory, pt.x - 4, pt.y - 4, 3, 0); diff --git a/include/Platform.h b/include/Platform.h index 9ff15013c..395ebf83d 100644 --- a/include/Platform.h +++ b/include/Platform.h @@ -236,12 +236,15 @@ class Window; // Forward declaration for Palette */ class Palette { int used; - enum {numEntries = 100}; - ColourPair entries[numEntries]; + int size; + ColourPair *entries; #if PLAT_GTK void *allocatedPalette; // GdkColor * int allocatedLen; #endif + // Private so Palette objects can not be copied + Palette(const Palette &) {} + Palette &operator=(const Palette &) { return *this; } public: #if PLAT_WIN void *hpal; diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 4ad7e5cab..f9b05fce6 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -85,10 +85,14 @@ Palette::Palette() { used = 0; allowRealization = false; hpal = 0; + size = 100; + entries = new ColourPair[size]; } Palette::~Palette() { Release(); + delete []entries; + entries = 0; } void Palette::Release() { @@ -96,6 +100,9 @@ void Palette::Release() { if (hpal) ::DeleteObject(hpal); hpal = 0; + delete []entries; + size = 100; + entries = new ColourPair[size]; } /** @@ -110,11 +117,20 @@ void Palette::WantFind(ColourPair &cp, bool want) { return; } - if (used < numEntries) { - entries[used].desired = cp.desired; - entries[used].allocated.Set(cp.desired.AsLong()); - used++; + if (used >= size) { + int sizeNew = size * 2; + ColourPair *entriesNew = new ColourPair[sizeNew]; + for (int j=0; j<size; j++) { + entriesNew[j] = entries[j]; + } + delete []entries; + entries = entriesNew; + size = sizeNew; } + + entries[used].desired = cp.desired; + entries[used].allocated.Set(cp.desired.AsLong()); + used++; } else { for (int i=0; i < used; i++) { if (entries[i].desired == cp.desired) { |