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) { | 
