summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/BaseDisplay.cc20
-rw-r--r--src/BaseDisplay.h13
-rw-r--r--src/Image.cc50
-rw-r--r--src/Image.h5
4 files changed, 45 insertions, 43 deletions
diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc
index f2ac4c79..37ef4348 100644
--- a/src/BaseDisplay.cc
+++ b/src/BaseDisplay.cc
@@ -91,6 +91,8 @@
#include "LinkedList.h"
#include "Timer.h"
+#include <algorithm>
+
// X error handler to handle any and all X errors while the application is
// running
static Bool internal_error = False;
@@ -338,11 +340,9 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) {
timerList = new LinkedList<BTimer>;
- screenInfoList = new LinkedList<ScreenInfo>;
- for (int i = 0; i < number_of_screens; i++) {
- ScreenInfo *screeninfo = new ScreenInfo(*this, i);
- screenInfoList->insert(screeninfo);
- }
+ screenInfoList.reserve(ScreenCount(display));
+ for (int i = 0; i < number_of_screens; i++)
+ screenInfoList.push_back(new ScreenInfo(*this, i));
#ifndef NOCLOBBER
NumLockMask = ScrollLockMask = 0;
@@ -390,14 +390,8 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) {
BaseDisplay::~BaseDisplay(void) {
- while (screenInfoList->count()) {
- ScreenInfo *si = screenInfoList->first();
-
- screenInfoList->remove(si);
- delete si;
- }
-
- delete screenInfoList;
+ std::for_each(screenInfoList.begin(), screenInfoList.end(),
+ PointerAssassin());
// we don't create the BTimers, we don't delete them
while (timerList->count())
diff --git a/src/BaseDisplay.h b/src/BaseDisplay.h
index 1a44dddc..9386a261 100644
--- a/src/BaseDisplay.h
+++ b/src/BaseDisplay.h
@@ -33,6 +33,8 @@ class ScreenInfo;
#include "LinkedList.h"
#include "Timer.h"
#include "Geometry.h"
+#include "Util.h"
+#include <vector>
#define AttribShaded (1l << 0)
#define AttribMaxHoriz (1l << 1)
@@ -127,7 +129,10 @@ private:
Bool _startup, _shutdown;
Display *display;
- LinkedList<ScreenInfo> *screenInfoList;
+
+ typedef std::vector<ScreenInfo*> ScreenInfoList;
+ ScreenInfoList screenInfoList;
+
LinkedList<BTimer> *timerList;
char *display_name, *application_name;
@@ -270,8 +275,10 @@ public:
#endif // NEWWMSPEC
- inline ScreenInfo *getScreenInfo(int s)
- { return (ScreenInfo *) screenInfoList->find(s); }
+ inline ScreenInfo *getScreenInfo(int s) {
+ ASSERT(s < screenInfoList.size());
+ return screenInfoList[s];
+ }
inline const Bool &hasShapeExtensions(void) const
{ return shape.extensions; }
diff --git a/src/Image.cc b/src/Image.cc
index cd702f6f..884d235f 100644
--- a/src/Image.cc
+++ b/src/Image.cc
@@ -2057,8 +2057,6 @@ BImageControl::BImageControl(BaseDisplay &dpy, ScreenInfo &scrn, Bool _dither,
getVisual()->c_class);
exit(1);
}
-
- cache = new LinkedList<Cache>;
}
@@ -2087,16 +2085,16 @@ BImageControl::~BImageControl(void) {
delete [] colors;
}
- if (cache->count()) {
- int i, n = cache->count();
+ if (!cache.empty()) {
+ int i, n = cache.size();
fprintf(stderr, i18n->getMessage(ImageSet, ImagePixmapRelease,
"BImageContol::~BImageControl: pixmap cache - "
"releasing %d pixmaps\n"), n);
for (i = 0; i < n; i++) {
- Cache *tmp = cache->first();
+ Cache *tmp = cache.front();
XFreePixmap(basedisplay.getXDisplay(), tmp->pixmap);
- cache->remove(tmp);
+ cache.remove(tmp);
delete tmp;
}
@@ -2107,30 +2105,29 @@ BImageControl::~BImageControl(void) {
}
#endif // TIMEDCACHE
}
-
- delete cache;
}
Pixmap BImageControl::searchCache(unsigned int width, unsigned int height,
unsigned long texture,
BColor *c1, BColor *c2) {
- if (cache->count()) {
- LinkedListIterator<Cache> it(cache);
+ if (!cache.empty()) {
- for (Cache *tmp = it.current(); tmp; it++, tmp = it.current()) {
+ CacheList::iterator it;
+ for (it = cache.begin(); it != cache.end(); ++it) {
+ Cache *tmp = *it;
if ((tmp->width == width) && (tmp->height == height) &&
(tmp->texture == texture) && (tmp->pixel1 == c1->getPixel()))
- if (texture & BImage_Gradient) {
- if (tmp->pixel2 == c2->getPixel()) {
- tmp->count++;
- return tmp->pixmap;
- }
- } else {
+ if (texture & BImage_Gradient) {
+ if (tmp->pixel2 == c2->getPixel()) {
tmp->count++;
return tmp->pixmap;
}
+ } else {
+ tmp->count++;
+ return tmp->pixmap;
}
+ }
}
return None;
@@ -2163,9 +2160,9 @@ Pixmap BImageControl::renderImage(unsigned int width, unsigned int height,
else
tmp->pixel2 = 0l;
- cache->insert(tmp);
+ cache.push_back(tmp);
- if ((unsigned) cache->count() > cache_max) {
+ if ((unsigned) cache.size() > cache_max) {
#ifdef DEBUG
fprintf(stderr, i18n->getMessage(ImageSet, ImagePixmapCacheLarge,
"BImageControl::renderImage: cache is large, "
@@ -2184,8 +2181,9 @@ Pixmap BImageControl::renderImage(unsigned int width, unsigned int height,
void BImageControl::removeImage(Pixmap pixmap) {
if (pixmap) {
- LinkedListIterator<Cache> it(cache);
- for (Cache *tmp = it.current(); tmp; it++, tmp = it.current()) {
+ CacheList::iterator it;
+ for (it = cache.begin(); it != cache.end(); ++it) {
+ Cache *tmp = *it;
if (tmp->pixmap == pixmap) {
if (tmp->count) {
tmp->count--;
@@ -2434,12 +2432,14 @@ void BImageControl::parseColor(BColor *color, const char *c) {
void BImageControl::timeout(void) {
- LinkedListIterator<Cache> it(cache);
- for (Cache *tmp = it.current(); tmp; it++, tmp = it.current()) {
+ CacheList::iterator it;
+ for (it = cache.begin(); it != cache.end(); ) {
+ Cache *tmp = *it;
+ ++it; // move on to the next item before this one is removed
if (tmp->count <= 0) {
XFreePixmap(basedisplay.getXDisplay(), tmp->pixmap);
- cache->remove(tmp);
+ cache.remove(tmp);
delete tmp;
- }
+ }
}
}
diff --git a/src/Image.h b/src/Image.h
index b21535bc..5a542c16 100644
--- a/src/Image.h
+++ b/src/Image.h
@@ -26,8 +26,8 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-#include "LinkedList.h"
#include "Timer.h"
+#include <list>
class ScreenInfo;
class BImage;
@@ -186,7 +186,8 @@ private:
unsigned long pixel1, pixel2, texture;
} Cache;
- LinkedList<Cache> *cache;
+ typedef std::list<Cache*> CacheList;
+ CacheList cache;
protected: