X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FBaseDisplay.cc;h=81d3c5c72bb723edb2e1e78d8ac1c2c01a07efdc;hb=d6c02ad70c42f074a4c3d8c433de5bb2c63dea8e;hp=41097628049ea8e38e61ee36f6a918ea6d3abbc3;hpb=44e3582d5e08556c7b1136cfd9a49546cf5fcae0;p=chaz%2Fopenbox diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc index 41097628..81d3c5c7 100644 --- a/src/BaseDisplay.cc +++ b/src/BaseDisplay.cc @@ -48,10 +48,13 @@ # include #endif // HAVE_STDIO_H -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # include +#endif // HAVE_STDLIB_H + +#ifdef HAVE_STRING_H # include -#endif // STDC_HEADERS +#endif // HAVE_STRING_H #ifdef HAVE_UNISTD_H # include @@ -85,9 +88,10 @@ #include "i18n.h" #include "BaseDisplay.h" -#include "LinkedList.h" #include "Timer.h" +#include + // X error handler to handle any and all X errors while the application is // running static Bool internal_error = False; @@ -333,13 +337,9 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) { XSetErrorHandler((XErrorHandler) handleXErrors); - timerList = new LinkedList; - - screenInfoList = new LinkedList; - 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; @@ -387,20 +387,12 @@ 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()) - timerList->remove(0); - - delete timerList; + + if (application_name != NULL) + delete [] application_name; XCloseDisplay(display); } @@ -434,12 +426,13 @@ void BaseDisplay::eventLoop(void) { FD_ZERO(&rfds); FD_SET(xfd, &rfds); - if (timerList->count()) { + if (!timerList.empty()) { gettimeofday(&now, 0); tm.tv_sec = tm.tv_usec = 0l; - BTimer *timer = timerList->first(); + BTimer *timer = timerList.front(); + ASSERT(timer != NULL); tm.tv_sec = timer->getStartTime().tv_sec + timer->getTimeout().tv_sec - now.tv_sec; @@ -469,8 +462,11 @@ void BaseDisplay::eventLoop(void) { // check for timer timeout gettimeofday(&now, 0); - LinkedListIterator it(timerList); - for(BTimer *timer = it.current(); timer; it++, timer = it.current()) { + TimerList::iterator it; + for (it = timerList.begin(); it != timerList.end(); ) { + BTimer *timer = *it; + ++it; // the timer may be removed from the list, so move ahead now + ASSERT(timer != NULL); tm.tv_sec = timer->getStartTime().tv_sec + timer->getTimeout().tv_sec; tm.tv_usec = timer->getStartTime().tv_usec + @@ -483,8 +479,12 @@ void BaseDisplay::eventLoop(void) { timer->fireTimeout(); // restart the current timer so that the start time is updated - if (! timer->doOnce()) timer->start(); - else timer->stop(); + if (! timer->doOnce()) + timer->start(); + else { + timer->stop(); +// delete timer; // USE THIS? + } } } } @@ -518,22 +518,23 @@ void BaseDisplay::ungrab(void) { void BaseDisplay::addTimer(BTimer *timer) { - if (! timer) return; + ASSERT(timer != (BTimer *) 0); - LinkedListIterator it(timerList); - int index = 0; - for (BTimer *tmp = it.current(); tmp; it++, index++, tmp = it.current()) + TimerList::iterator it; + for (it = timerList.begin(); it != timerList.end(); ++it) { + BTimer *tmp = *it; if ((tmp->getTimeout().tv_sec > timer->getTimeout().tv_sec) || ((tmp->getTimeout().tv_sec == timer->getTimeout().tv_sec) && (tmp->getTimeout().tv_usec >= timer->getTimeout().tv_usec))) break; + } - timerList->insert(timer, index); + timerList.insert(it, timer); } void BaseDisplay::removeTimer(BTimer *timer) { - timerList->remove(timer); + timerList.remove(timer); }