From 57fb41c8060eaa2f29b25b08e3813b3dc140f165 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 12 May 2002 09:15:09 +0000 Subject: [PATCH] converted the remaining LinkedLists in Screen to STL objects. --- src/Screen.cc | 154 +++++++++++++++++++++-------------------------- src/Screen.h | 22 ++++--- src/Util.h | 7 +++ src/Window.cc | 2 + src/Workspace.cc | 18 +++--- src/Workspace.h | 2 +- 6 files changed, 101 insertions(+), 104 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 8343474c..73631fbf 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1,3 +1,4 @@ +#include // Screen.cc for Openbox // Copyright (c) 2001 Sean 'Shaleh' Perry // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) @@ -237,10 +238,6 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), XDefineCursor(getBaseDisplay().getXDisplay(), getRootWindow(), openbox.getSessionCursor()); - workspaceNames = new LinkedList; - workspacesList = new LinkedList; - iconList = new LinkedList; - image_control = new BImageControl(openbox, *this, True, openbox.getColorsPerChannel(), openbox.getCacheLife(), openbox.getCacheMax()); @@ -403,13 +400,14 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), Workspace *wkspc = NULL; if (resource.workspaces != 0) { for (int i = 0; i < resource.workspaces; ++i) { - wkspc = new Workspace(*this, workspacesList->count()); - workspacesList->insert(wkspc); + wkspc = new Workspace(*this, workspacesList.size()); + workspacesList.push_back(wkspc); workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); } } else { - wkspc = new Workspace(*this, workspacesList->count()); - workspacesList->insert(wkspc); + setWorkspaceCount(1); + wkspc = new Workspace(*this, workspacesList.size()); + workspacesList.push_back(wkspc); workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); } saveWorkspaceNames(); @@ -418,7 +416,7 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn), iconmenu); workspacemenu->update(); - current_workspace = workspacesList->first(); + current_workspace = workspacesList.front(); workspacemenu->setItemSelected(2, True); toolbar = new Toolbar(*this, config); @@ -504,17 +502,10 @@ BScreen::~BScreen(void) { removeWorkspaceNames(); - while (workspacesList->count()) - delete workspacesList->remove(0); - - while (!rootmenuList.empty()) - rootmenuList.erase(rootmenuList.begin()); - - while (iconList->count()) - delete iconList->remove(0); - - while (!netizenList.empty()) - netizenList.erase(netizenList.begin()); + std::for_each(workspacesList.begin(), workspacesList.end(), + PointerAssassin()); + std::for_each(iconList.begin(), iconList.end(), PointerAssassin()); + std::for_each(netizenList.begin(), netizenList.end(), PointerAssassin()); #ifdef HAVE_STRFTIME if (resource.strftime_format) @@ -533,10 +524,6 @@ BScreen::~BScreen(void) { delete toolbar; delete image_control; - delete workspacesList; - delete workspaceNames; - delete iconList; - if (resource.wstyle.fontset) XFreeFontSet(getBaseDisplay().getXDisplay(), resource.wstyle.fontset); if (resource.mstyle.t_fontset) @@ -1091,6 +1078,7 @@ void BScreen::setStrftimeFormat(const char *f) { } #else // !HAVE_STRFTIME + void BScreen::setDateFormat(int f) { resource.date_format = f; ostrstream s; @@ -1100,6 +1088,7 @@ void BScreen::setDateFormat(int f) { s.rdbuf()->freeze(0); } + void BScreen::setClock24Hour(Bool c) { resource.clock24hour = c; ostrstream s; @@ -1109,6 +1098,7 @@ void BScreen::setClock24Hour(Bool c) { } #endif // HAVE_STRFTIME + void BScreen::setHideToolbar(bool b) { resource.hide_toolbar = b; if (resource.hide_toolbar) @@ -1121,16 +1111,16 @@ void BScreen::setHideToolbar(bool b) { s.rdbuf()->freeze(0); } + void BScreen::saveWorkspaceNames() { ostrstream rc, names; - for (int i = 0; i < resource.workspaces; i++) { - Workspace *w = getWorkspace(i); - if (w != NULL) { - names << w->getName(); - if (i < resource.workspaces-1) - names << ","; - } + wkspList::iterator it; + wkspList::iterator last = workspacesList.end() - 1; + for (it = workspacesList.begin(); it != workspacesList.end(); ++it) { + names << (*it)->getName(); + if (it != last) + names << ","; } names << ends; @@ -1551,14 +1541,14 @@ void BScreen::reconfigure(void) { slit->reconfigure(); #endif // SLIT - LinkedListIterator wit(workspacesList); - for (Workspace *w = wit.current(); w; wit++, w = wit.current()) - w->reconfigure(); + wkspList::iterator wit; + for (wit = workspacesList.begin(); wit != workspacesList.end(); ++wit) + (*wit)->reconfigure(); - LinkedListIterator iit(iconList); - for (OpenboxWindow *bw = iit.current(); bw; iit++, bw = iit.current()) - if (bw->validateClient()) - bw->reconfigure(); + winList::iterator iit; + for (iit = iconList.begin(); iit != iconList.end(); ++iit) + if ((*iit)->validateClient()) + (*iit)->reconfigure(); image_control->timeout(); } @@ -1573,8 +1563,7 @@ void BScreen::rereadMenu(void) { void BScreen::removeWorkspaceNames(void) { - while (workspaceNames->count()) - delete [] workspaceNames->remove(0); + workspaceNames.clear(); } @@ -1898,9 +1887,9 @@ void BScreen::addIcon(OpenboxWindow *w) { if (! w) return; w->setWorkspace(-1); - w->setWindowNumber(iconList->count()); + w->setWindowNumber(iconList.size()); - iconList->insert(w); + iconList.push_back(w); iconmenu->insert((const char **) w->getIconTitle()); iconmenu->update(); @@ -1910,29 +1899,30 @@ void BScreen::addIcon(OpenboxWindow *w) { void BScreen::removeIcon(OpenboxWindow *w) { if (! w) return; - iconList->remove(w->getWindowNumber()); + iconList.remove(w); iconmenu->remove(w->getWindowNumber()); iconmenu->update(); - LinkedListIterator it(iconList); - OpenboxWindow *bw = it.current(); - for (int i = 0; bw; it++, bw = it.current()) - bw->setWindowNumber(i++); + winList::iterator it = iconList.begin(); + for (int i = 0; it != iconList.end(); ++it, ++i) + (*it)->setWindowNumber(i); } OpenboxWindow *BScreen::getIcon(int index) { - if (index >= 0 && index < iconList->count()) - return iconList->find(index); + if (index < 0 || index >= iconList.size()) + return (OpenboxWindow *) 0; - return NULL; + winList::iterator it = iconList.begin(); + for (; index > 0; --index, ++it); // increment to index + return *it; } int BScreen::addWorkspace(void) { - Workspace *wkspc = new Workspace(*this, workspacesList->count()); - workspacesList->insert(wkspc); + Workspace *wkspc = new Workspace(*this, workspacesList.size()); + workspacesList.push_back(wkspc); setWorkspaceCount(workspaceCount()+1); saveWorkspaceNames(); @@ -1944,15 +1934,15 @@ int BScreen::addWorkspace(void) { updateNetizenWorkspaceCount(); - return workspacesList->count(); + return workspacesList.size(); } int BScreen::removeLastWorkspace(void) { - if (workspacesList->count() == 1) + if (workspacesList.size() == 1) return 0; - Workspace *wkspc = workspacesList->last(); + Workspace *wkspc = workspacesList.back(); if (current_workspace->getWorkspaceID() == wkspc->getWorkspaceID()) changeWorkspaceID(current_workspace->getWorkspaceID() - 1); @@ -1962,8 +1952,9 @@ int BScreen::removeLastWorkspace(void) { workspacemenu->remove(wkspc->getWorkspaceID() + 2); workspacemenu->update(); - workspacesList->remove(wkspc); + workspacesList.pop_back(); delete wkspc; + setWorkspaceCount(workspaceCount()-1); saveWorkspaceNames(); @@ -1971,7 +1962,7 @@ int BScreen::removeLastWorkspace(void) { updateNetizenWorkspaceCount(); - return workspacesList->count(); + return workspacesList.size(); } @@ -2015,11 +2006,11 @@ void BScreen::addNetizen(Netizen *n) { n->sendWorkspaceCount(); n->sendCurrentWorkspace(); - LinkedListIterator it(workspacesList); - for (Workspace *w = it.current(); w; it++, w = it.current()) { - for (int i = 0; i < w->getCount(); i++) - n->sendWindowAdd(w->getWindow(i)->getClientWindow(), - w->getWorkspaceID()); + wkspList::iterator it; + for (it = workspacesList.begin(); it != workspacesList.end(); ++it) { + for (int i = 0; i < (*it)->getCount(); i++) + n->sendWindowAdd((*it)->getWindow(i)->getClientWindow(), + (*it)->getWorkspaceID()); } Window f = ((openbox.focusedWindow()) ? @@ -2101,15 +2092,15 @@ void BScreen::updateNetizenConfigNotify(XEvent *e) { void BScreen::raiseWindows(Window *workspace_stack, int num) { Window *session_stack = new - Window[(num + workspacesList->count() + rootmenuList.size() + 13)]; + Window[(num + workspacesList.size() + rootmenuList.size() + 13)]; int i = 0, k = num; XRaiseWindow(getBaseDisplay().getXDisplay(), iconmenu->getWindowID()); *(session_stack + i++) = iconmenu->getWindowID(); - LinkedListIterator wit(workspacesList); - for (Workspace *tmp = wit.current(); tmp; wit++, tmp = wit.current()) - *(session_stack + i++) = tmp->getMenu()->getWindowID(); + wkspList::iterator it; + for (it = workspacesList.begin(); it != workspacesList.end(); ++it) + *(session_stack + i++) = (*it)->getMenu()->getWindowID(); *(session_stack + i++) = workspacemenu->getWindowID(); @@ -2150,19 +2141,14 @@ void BScreen::raiseWindows(Window *workspace_stack, int num) { void BScreen::addWorkspaceName(const char *name) { - workspaceNames->insert(bstrdup(name)); + workspaceNames.push_back(name); } -char* BScreen::getNameOfWorkspace(int id) { - char *name = NULL; - if (id >= 0 && id < workspaceNames->count()) { - char *wkspc_name = workspaceNames->find(id); - - if (wkspc_name) - name = wkspc_name; - } - return name; +const char *BScreen::getNameOfWorkspace(int id) { + if (id < 0 || id >= workspaceNames.size()) + return (const char *) 0; + return workspaceNames[id].c_str(); } @@ -2273,9 +2259,7 @@ void BScreen::raiseFocus(void) { void BScreen::InitMenu(void) { if (rootmenu) { - while (!rootmenuList.empty()) - rootmenuList.erase(rootmenuList.begin()); - + rootmenuList.clear(); while (rootmenu->getCount()) rootmenu->remove(0); } else { @@ -2753,14 +2737,12 @@ void BScreen::shutdown(void) { XSelectInput(getBaseDisplay().getXDisplay(), getRootWindow(), NoEventMask); XSync(getBaseDisplay().getXDisplay(), False); - LinkedListIterator it(workspacesList); - for (Workspace *w = it.current(); w; it++, w = it.current()) - w->shutdown(); + wkspList::iterator it; + for (it = workspacesList.begin(); it != workspacesList.end(); ++it) + (*it)->shutdown(); - while (iconList->count()) { - iconList->first()->restore(); - delete iconList->first(); - } + while (!iconList.empty()) + iconList.front()->restore(); #ifdef SLIT slit->shutdown(); diff --git a/src/Screen.h b/src/Screen.h index d496914b..c59a2e95 100644 --- a/src/Screen.h +++ b/src/Screen.h @@ -40,7 +40,6 @@ #include "BaseDisplay.h" #include "Configmenu.h" #include "Iconmenu.h" -#include "LinkedList.h" #include "Netizen.h" #include "Rootmenu.h" #include "Timer.h" @@ -52,10 +51,14 @@ #endif // SLIT #include "Image.h" #include "Resource.h" +#include "Util.h" #include +#include typedef std::list menuList; typedef std::list netList; +typedef std::vector wkspList; +typedef std::vector wkspNameList; // forward declaration class BScreen; @@ -115,7 +118,7 @@ private: menuList rootmenuList; netList netizenList; - LinkedList *iconList; + winList iconList; // winList is declared in Workspace.h #ifdef SLIT Slit *slit; @@ -128,8 +131,8 @@ private: unsigned int geom_w, geom_h; unsigned long event_mask; - LinkedList *workspaceNames; - LinkedList *workspacesList; + wkspNameList workspaceNames; + wkspList workspacesList; struct resource { WindowStyle wstyle; @@ -193,7 +196,10 @@ public: Rect availableArea() const; - inline Workspace *getWorkspace(int w) { return workspacesList->find(w); } + inline Workspace *getWorkspace(int w) { + ASSERT(w < workspacesList.size()); + return workspacesList[w]; + } inline Workspace *getCurrentWorkspace() { return current_workspace; } inline Workspacemenu *getWorkspacemenu() { return workspacemenu; } @@ -211,8 +217,8 @@ public: inline const int getCurrentWorkspaceID() { return current_workspace->getWorkspaceID(); } - inline const int getWorkspaceCount() { return workspacesList->count(); } - inline const int getIconCount() { return iconList->count(); } + inline const int getWorkspaceCount() { return workspacesList.size(); } + inline const int getIconCount() { return iconList.size(); } inline const Bool &isRootColormapInstalled() const { return root_colormap_installed; } @@ -291,7 +297,7 @@ public: void removeNetizen(Window); void addIcon(OpenboxWindow *); void removeIcon(OpenboxWindow *); - char* getNameOfWorkspace(int); + const char *getNameOfWorkspace(int); void changeWorkspaceID(int); void raiseWindows(Window *, int); void reassociateWindow(OpenboxWindow *, int, Bool); diff --git a/src/Util.h b/src/Util.h index 03b352e1..ad45c403 100644 --- a/src/Util.h +++ b/src/Util.h @@ -29,4 +29,11 @@ # define ASSERT(x) #endif // DEBUG +struct PointerAssassin { + template + inline void operator()(const T ptr) const { + delete ptr; + } +}; + #endif // __Util_hh diff --git a/src/Window.cc b/src/Window.cc index 6222546f..0a02daa1 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -3054,6 +3054,8 @@ void OpenboxWindow::restore(void) { XMapWindow(display, client.window); XFlush(display); + + delete this; } diff --git a/src/Workspace.cc b/src/Workspace.cc index 256ad3da..89ea8e7b 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -71,8 +71,7 @@ Workspace::Workspace(BScreen &scrn, int i) : screen(scrn) { lastfocus = (OpenboxWindow *) 0; name = (char *) 0; - char *tmp = screen.getNameOfWorkspace(id); - setName(tmp); + setName(screen.getNameOfWorkspace(id)); } @@ -297,7 +296,7 @@ void Workspace::setCurrent(void) { } -void Workspace::setName(char *new_name) { +void Workspace::setName(const char *new_name) { if (name) delete [] name; @@ -316,10 +315,8 @@ void Workspace::setName(char *new_name) { void Workspace::shutdown(void) { - while (!_windows.empty()) { + while (!_windows.empty()) _windows[0]->restore(); - delete _windows[0]; - } } static rectList calcSpace(const Rect &win, const rectList &spaces) { @@ -420,7 +417,8 @@ Point *Workspace::bestFitPlacement(const Size &win_size, const Rect &space) { spaces.push_back(space); //initially the entire screen is free //Find Free Spaces - for (winVect::iterator it = _windows.begin(); it != _windows.end(); ++it) + winVect::iterator it; + for (it = _windows.begin(); it != _windows.end(); ++it) spaces = calcSpace((*it)->area().Inflate(screen.getBorderWidth() * 4), spaces); @@ -474,7 +472,8 @@ Point *Workspace::rowSmartPlacement(const Size &win_size, const Rect &space) { spaces.push_back(space); //initially the entire screen is free //Find Free Spaces - for (winVect::iterator it = _windows.begin(); it != _windows.end(); ++it) + winVect::iterator it; + for (it = _windows.begin(); it != _windows.end(); ++it) spaces = calcSpace((*it)->area().Inflate(screen.getBorderWidth() * 4), spaces); //Sort spaces by preference @@ -514,7 +513,8 @@ Point *Workspace::colSmartPlacement(const Size &win_size, const Rect &space) { spaces.push_back(space); //initially the entire screen is free //Find Free Spaces - for (winVect::iterator it = _windows.begin(); it != _windows.end(); ++it) + winVect::iterator it; + for (it = _windows.begin(); it != _windows.end(); ++it) spaces = calcSpace((*it)->area().Inflate(screen.getBorderWidth() * 4), spaces); //Sort spaces by user preference diff --git a/src/Workspace.h b/src/Workspace.h index 7701467b..9b7aba10 100644 --- a/src/Workspace.h +++ b/src/Workspace.h @@ -85,7 +85,7 @@ public: void reconfigure(); void update(); void setCurrent(void); - void setName(char *); + void setName(const char *); void shutdown(void); }; -- 2.39.2