X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FBaseDisplay.cc;h=3ee81fb065b957c4c65ec1818a201b506c4a80fc;hb=bbbe226ccc7086721ba5e652fa89e6e8190adb56;hp=37ef43483599be8ac0d187b595eb108b96b4de1b;hpb=eb8a11a5a7b066ada63cc3550f8314f53eaf1a39;p=chaz%2Fopenbox diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc index 37ef4348..3ee81fb0 100644 --- a/src/BaseDisplay.cc +++ b/src/BaseDisplay.cc @@ -88,7 +88,6 @@ #include "i18n.h" #include "BaseDisplay.h" -#include "LinkedList.h" #include "Timer.h" #include @@ -105,8 +104,9 @@ static int handleXErrors(Display *d, XErrorEvent *e) { char errtxt[128]; XGetErrorText(d, e->error_code, errtxt, 128); - fprintf(stderr, i18n->getMessage(BaseDisplaySet, BaseDisplayXError, - "%s: X error: %s(%d) opcodes %d/%d\n resource 0x%lx\n"), + fprintf(stderr, i18n(BaseDisplaySet, BaseDisplayXError, + "%s: X error: %s(%d) opcodes %d/%d\n resource 0x%lx\n" + ), base_display->getApplicationName(), errtxt, e->error_code, e->request_code, e->minor_code, e->resourceid); #endif // DEBUG @@ -121,11 +121,11 @@ static int handleXErrors(Display *d, XErrorEvent *e) { // signal handler to allow for proper and gentle shutdown #ifndef HAVE_SIGACTION -static RETSIGTYPE signalhandler(int sig) { +static RETSIGTYPE signalhandler(int sig) #else // HAVE_SIGACTION -static void signalhandler(int sig) { +static void signalhandler(int sig) #endif // HAVE_SIGACTION - +{ static int re_enter = 0; switch (sig) { @@ -151,22 +151,22 @@ static void signalhandler(int sig) { return; } - fprintf(stderr, i18n->getMessage(BaseDisplaySet, BaseDisplaySignalCaught, - "%s: signal %d caught\n"), - base_display->getApplicationName(), sig); + fprintf(stderr, i18n(BaseDisplaySet, BaseDisplaySignalCaught, + "%s: signal %d caught\n"), + base_display->getApplicationName(), sig); if (! base_display->isStartup() && ! re_enter) { internal_error = True; re_enter = 1; - fprintf(stderr, i18n->getMessage(BaseDisplaySet, BaseDisplayShuttingDown, - "shutting down\n")); + fprintf(stderr, i18n(BaseDisplaySet, BaseDisplayShuttingDown, + "shutting down\n")); base_display->shutdown(); } if (sig != SIGTERM && sig != SIGINT) { - fprintf(stderr, i18n->getMessage(BaseDisplaySet, BaseDisplayAborting, - "aborting... dumping core\n")); + fprintf(stderr, i18n(BaseDisplaySet, BaseDisplayAborting, + "aborting... dumping core\n")); abort(); } @@ -235,18 +235,17 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) { #endif // HAVE_SIGACTION if (! (display = XOpenDisplay(dpy_name))) { - fprintf(stderr, i18n->getMessage(BaseDisplaySet, BaseDisplayXConnectFail, - "BaseDisplay::BaseDisplay: connection to X server failed.\n")); + fprintf(stderr, i18n(BaseDisplaySet, BaseDisplayXConnectFail, + "BaseDisplay::BaseDisplay: connection to X server failed.\n")); ::exit(2); } else if (fcntl(ConnectionNumber(display), F_SETFD, 1) == -1) { fprintf(stderr, - i18n->getMessage(BaseDisplaySet, BaseDisplayCloseOnExecFail, - "BaseDisplay::BaseDisplay: couldn't mark display connection " - "as close-on-exec\n")); + i18n(BaseDisplaySet, BaseDisplayCloseOnExecFail, + "BaseDisplay::BaseDisplay: couldn't mark display connection " + "as close-on-exec\n")); ::exit(2); } - number_of_screens = ScreenCount(display); display_name = XDisplayName(dpy_name); #ifdef SHAPE @@ -338,11 +337,9 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) { XSetErrorHandler((XErrorHandler) handleXErrors); - timerList = new LinkedList; - - screenInfoList.reserve(ScreenCount(display)); - for (int i = 0; i < number_of_screens; i++) - screenInfoList.push_back(new ScreenInfo(*this, i)); + screenInfoList.reserve(numberOfScreens()); + for (unsigned int s = 0; s < numberOfScreens(); s++) + screenInfoList.push_back(new ScreenInfo(*this, s)); #ifndef NOCLOBBER NumLockMask = ScrollLockMask = 0; @@ -360,14 +357,14 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) { // since it doesn't need to be. const KeyCode num_lock_code = XKeysymToKeycode(display, XK_Num_Lock); const KeyCode scroll_lock_code = XKeysymToKeycode(display, XK_Scroll_Lock); - + for (size_t cnt = 0; cnt < size; ++cnt) { if (! modmap->modifiermap[cnt]) continue; if (num_lock_code == modmap->modifiermap[cnt]) - NumLockMask = mask_table[cnt / modmap->max_keypermod]; + NumLockMask = mask_table[cnt / modmap->max_keypermod]; if (scroll_lock_code == modmap->modifiermap[cnt]) - ScrollLockMask = mask_table[cnt / modmap->max_keypermod]; + ScrollLockMask = mask_table[cnt / modmap->max_keypermod]; } } @@ -380,7 +377,7 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) { MaskList[6] = LockMask | ScrollLockMask; MaskList[7] = LockMask | NumLockMask | ScrollLockMask; MaskListLength = sizeof(MaskList) / sizeof(MaskList[0]); - + if (modmap) XFreeModifiermap(const_cast(modmap)); #else NumLockMask = Mod2Mask; @@ -392,13 +389,8 @@ BaseDisplay::BaseDisplay(const char *app_name, char *dpy_name) { BaseDisplay::~BaseDisplay(void) { 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; @@ -418,13 +410,13 @@ void BaseDisplay::eventLoop(void) { if (last_bad_window != None && e.xany.window == last_bad_window) { #ifdef DEBUG - fprintf(stderr, i18n->getMessage(BaseDisplaySet, - BaseDisplayBadWindowRemove, - "BaseDisplay::eventLoop(): removing bad window " - "from event queue\n")); + fprintf(stderr, i18n(BaseDisplaySet, + BaseDisplayBadWindowRemove, + "BaseDisplay::eventLoop(): removing bad window " + "from event queue\n")); #endif // DEBUG } else { - last_bad_window = None; + last_bad_window = None; process_event(&e); } } else { @@ -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(); ++it) { + BTimer *timer = *it; + ASSERT(timer != NULL); + tm.tv_sec = timer->getStartTime().tv_sec + timer->getTimeout().tv_sec; tm.tv_usec = timer->getStartTime().tv_usec + @@ -483,8 +479,16 @@ 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()) { + // reorder + removeTimer(timer); + addTimer(timer); + timer->start(); + } else + timer->stop(); + it = timerList.begin(); // we no longer have any idea if the iterator is + // valid, but what was at the front() is no + // longer. } } } @@ -512,28 +516,28 @@ void BaseDisplay::grab(void) { void BaseDisplay::ungrab(void) { if (! --server_grabs) XUngrabServer(display); - - if (server_grabs < 0) server_grabs = 0; } 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); + ASSERT(timer != (BTimer *) 0); + timerList.remove(timer); } @@ -542,10 +546,10 @@ void BaseDisplay::removeTimer(BTimer *timer) { * the keyboard lock keys, so that they do not cancel out the event. */ void BaseDisplay::grabButton(unsigned int button, unsigned int modifiers, - Window grab_window, Bool owner_events, - unsigned int event_mask, int pointer_mode, - int keybaord_mode, Window confine_to, - Cursor cursor) const + Window grab_window, Bool owner_events, + unsigned int event_mask, int pointer_mode, + int keybaord_mode, Window confine_to, + Cursor cursor) const { #ifndef NOCLOBBER for (size_t cnt = 0; cnt < MaskListLength; ++cnt) @@ -553,9 +557,9 @@ void BaseDisplay::grabButton(unsigned int button, unsigned int modifiers, owner_events, event_mask, pointer_mode, keybaord_mode, confine_to, cursor); #else // NOCLOBBER - XGrabButton(display, button, modifiers, grab_window, - owner_events, event_mask, pointer_mode, keybaord_mode, - confine_to, cursor); + XGrabButton(display, button, modifiers, grab_window, + owner_events, event_mask, pointer_mode, keybaord_mode, + confine_to, cursor); #endif // NOCLOBBER } @@ -564,18 +568,18 @@ void BaseDisplay::grabButton(unsigned int button, unsigned int modifiers, * keyboard lock keys. */ void BaseDisplay::ungrabButton(unsigned int button, unsigned int modifiers, - Window grab_window) const { + Window grab_window) const { #ifndef NOCLOBBER for (size_t cnt = 0; cnt < MaskListLength; ++cnt) XUngrabButton(display, button, modifiers | MaskList[cnt], grab_window); #else // NOCLOBBER - XUngrabButton(display, button, modifiers, grab_window); + XUngrabButton(display, button, modifiers, grab_window); #endif // NOCLOBBER } ScreenInfo::ScreenInfo(BaseDisplay &d, int num) : basedisplay(d), - screen_number(num) +screen_number(num) { root_window = RootWindow(basedisplay.getXDisplay(), screen_number); @@ -612,7 +616,7 @@ ScreenInfo::ScreenInfo(BaseDisplay &d, int num) : basedisplay(d), if (visual) { colormap = XCreateColormap(basedisplay.getXDisplay(), root_window, - visual, AllocNone); + visual, AllocNone); } else { visual = DefaultVisual(basedisplay.getXDisplay(), screen_number); colormap = DefaultColormap(basedisplay.getXDisplay(), screen_number);