aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gtk/PlatGTK.cxx30
-rw-r--r--include/Platform.h7
-rw-r--r--win32/PlatWin.cxx24
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) {