]> Dogcows Code - chaz/openbox/blobdiff - src/Screen.cc
fix for changing window buttons order. destroy them properly when they no longer...
[chaz/openbox] / src / Screen.cc
index 29a7a69d5f95309793913084a9de53b85a38078c..75f8459af4adf49487dcf6dd9681bb6e959f9ada 100644 (file)
 #include <strstream>
 #include <string>
 #include <algorithm>
-using namespace std;
+#include <functional>
+using std::ends;
 
 static Bool running = True;
 
@@ -216,11 +217,15 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn),
   resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font =
     resource.wstyle.font = NULL;
   resource.root_command = NULL;
+#ifdef    HAVE_STRFTIME
+  resource.strftime_format = NULL;
+#endif // HAVE_STRFTIME
 
 #ifdef   SLIT
   slit = NULL;
 #endif // SLIT
   toolbar = NULL;
+  current_workspace = (Workspace *) 0;
 
 #ifdef    HAVE_GETPID
   pid_t bpid = getpid();
@@ -234,10 +239,6 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn),
   XDefineCursor(getBaseDisplay().getXDisplay(), getRootWindow(),
                 openbox.getSessionCursor());
 
-  workspaceNames = new LinkedList<char>;
-  workspacesList = new LinkedList<Workspace>;
-  iconList = new LinkedList<OpenboxWindow>;
-
   image_control =
     new BImageControl(openbox, *this, True, openbox.getColorsPerChannel(),
                       openbox.getCacheLife(), openbox.getCacheMax());
@@ -400,13 +401,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();
@@ -415,7 +417,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);
@@ -482,9 +484,6 @@ BScreen::BScreen(Openbox &ob, int scrn, Resource &conf) : ScreenInfo(ob, scrn),
     }
   }
 
-  XSetInputFocus(getBaseDisplay().getXDisplay(),
-                 PointerRoot, None, CurrentTime);
-
   XFree(children);
   XFlush(getBaseDisplay().getXDisplay());
 }
@@ -501,17 +500,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)
@@ -530,10 +522,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)
@@ -925,7 +913,7 @@ XFontSet BScreen::createFontSet(const char *fontname) {
 
 void BScreen::setSloppyFocus(bool b) {
   resource.sloppy_focus = b;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".focusModel" << ends;
   config.setValue(s.str(),
                   (resource.sloppy_focus ?
@@ -937,7 +925,7 @@ void BScreen::setSloppyFocus(bool b) {
 
 void BScreen::setAutoRaise(bool a) {
   resource.auto_raise = a;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".focusModel" << ends;
   config.setValue(s.str(),
                   (resource.sloppy_focus ?
@@ -949,7 +937,7 @@ void BScreen::setAutoRaise(bool a) {
 
 void BScreen::setImageDither(bool d, bool reconfig) {
   image_control->setDither(d);
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".imageDither" << ends;
   config.setValue(s.str(), imageDither());
   if (reconfig)
@@ -960,7 +948,7 @@ void BScreen::setImageDither(bool d, bool reconfig) {
 
 void BScreen::setOpaqueMove(bool o) {
   resource.opaque_move = o;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".opaqueMove" << ends;
   config.setValue(s.str(), resource.opaque_move);
   s.rdbuf()->freeze(0);
@@ -969,7 +957,7 @@ void BScreen::setOpaqueMove(bool o) {
 
 void BScreen::setFullMax(bool f) {
   resource.full_max = f;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".fullMaximization" << ends;
   config.setValue(s.str(), resource.full_max);
   s.rdbuf()->freeze(0);
@@ -978,7 +966,7 @@ void BScreen::setFullMax(bool f) {
 
 void BScreen::setFocusNew(bool f) {
   resource.focus_new = f;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".focusNewWindows" << ends;
   config.setValue(s.str(), resource.focus_new);
   s.rdbuf()->freeze(0);
@@ -987,7 +975,7 @@ void BScreen::setFocusNew(bool f) {
 
 void BScreen::setFocusLast(bool f) {
   resource.focus_last = f;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".focusLastWindow" << ends;
   config.setValue(s.str(), resource.focus_last);
   s.rdbuf()->freeze(0);
@@ -996,7 +984,7 @@ void BScreen::setFocusLast(bool f) {
 
 void BScreen::setWindowZones(int z) {
   resource.zones = z;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".windowZones" << ends;
   config.setValue(s.str(), resource.zones);
   s.rdbuf()->freeze(0);
@@ -1005,7 +993,7 @@ void BScreen::setWindowZones(int z) {
 
 void BScreen::setWorkspaceCount(int w) {
   resource.workspaces = w;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".workspaces" << ends;
   config.setValue(s.str(), resource.workspaces);
   s.rdbuf()->freeze(0);
@@ -1014,7 +1002,7 @@ void BScreen::setWorkspaceCount(int w) {
 
 void BScreen::setPlacementPolicy(int p) {
   resource.placement_policy = p;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".windowPlacement" << ends;
   const char *placement;
   switch (resource.placement_policy) {
@@ -1033,7 +1021,7 @@ void BScreen::setPlacementPolicy(int p) {
 
 void BScreen::setEdgeSnapThreshold(int t) {
   resource.edge_snap_threshold = t;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".edgeSnapThreshold" << ends;
   config.setValue(s.str(), resource.edge_snap_threshold);
   s.rdbuf()->freeze(0);
@@ -1042,7 +1030,7 @@ void BScreen::setEdgeSnapThreshold(int t) {
 
 void BScreen::setRowPlacementDirection(int d) {
   resource.row_direction = d;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".rowPlacementDirection" << ends;
   config.setValue(s.str(),
                   resource.row_direction == LeftRight ?
@@ -1053,7 +1041,7 @@ void BScreen::setRowPlacementDirection(int d) {
 
 void BScreen::setColPlacementDirection(int d) {
   resource.col_direction = d;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".colPlacementDirection" << ends;
   config.setValue(s.str(),
                   resource.col_direction == TopBottom ?
@@ -1081,53 +1069,56 @@ void BScreen::setStrftimeFormat(const char *f) {
     delete [] resource.strftime_format;
 
   resource.strftime_format = bstrdup(f);
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".strftimeFormat" << ends;
   config.setValue(s.str(), resource.strftime_format);
   s.rdbuf()->freeze(0);
 }
 
 #else // !HAVE_STRFTIME
+
 void BScreen::setDateFormat(int f) {
   resource.date_format = f;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".dateFormat" << ends;
   config.setValue(s.str(), resource.date_format == B_EuropeanDate ?
                   "European" : "American");
   s.rdbuf()->freeze(0);
 }
 
+
 void BScreen::setClock24Hour(Bool c) {
   resource.clock24hour = c;
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".clockFormat" << ends;
   config.setValue(s.str(), resource.clock24hour ? 24 : 12);
   s.rdbuf()->freeze(0);
 }
 #endif // HAVE_STRFTIME
 
+
 void BScreen::setHideToolbar(bool b) {
   resource.hide_toolbar = b;
   if (resource.hide_toolbar)
     getToolbar()->unMapToolbar();
   else
     getToolbar()->mapToolbar();
-  ostrstream s;
+  std::ostrstream s;
   s << "session.screen" << getScreenNumber() << ".hideToolbar" << ends;
   config.setValue(s.str(), resource.hide_toolbar ? "True" : "False");
   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 << ",";
-    }
+  std::ostrstream rc, 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;
 
@@ -1162,11 +1153,16 @@ void BScreen::save() {
   setClock24Hour(resource.clock24hour);
 #endif // HAVE_STRFTIME
   setHideToolbar(resource.hide_toolbar);
+    
+  toolbar->save();
+#ifdef    SLIT
+  slit->save();
+#endif // SLIT
 }
 
 
 void BScreen::load() {
-  ostrstream rscreen, rname, rclass;
+  std::ostrstream rscreen, rname, rclass;
   std::string s;
   bool b;
   long l;
@@ -1252,9 +1248,9 @@ void BScreen::load() {
   rname << rscreen.str() << "workspaceNames" << ends;
   rclass << rscreen.str() << "WorkspaceNames" << ends;
   if (config.getValue(rname.str(), rclass.str(), s)) {
-    string::const_iterator it = s.begin(), end = s.end();
+    std::string::const_iterator it = s.begin(), end = s.end();
     while(1) {
-      string::const_iterator tmp = it;// current string.begin()
+      std::string::const_iterator tmp = it;// current string.begin()
       it = std::find(tmp, end, ',');       // look for comma between tmp and end
       std::string name(tmp, it);           // name = s[tmp:it]
       addWorkspaceName(name.c_str());
@@ -1548,14 +1544,12 @@ void BScreen::reconfigure(void) {
   slit->reconfigure();
 #endif // SLIT
 
-  LinkedListIterator<Workspace> wit(workspacesList);
-  for (Workspace *w = wit.current(); w; wit++, w = wit.current())
-    w->reconfigure();
+  std::for_each(workspacesList.begin(), workspacesList.end(),
+                std::mem_fun(&Workspace::reconfigure));
 
-  LinkedListIterator<OpenboxWindow> iit(iconList);
-  for (OpenboxWindow *bw = iit.current(); bw; iit++, bw = iit.current())
-    if (bw->validateClient())
-      bw->reconfigure();
+  for (winList::iterator it = iconList.begin(); it != iconList.end(); ++it)
+    if ((*it)->validateClient())
+      (*it)->reconfigure();
 
   image_control->timeout();
 }
@@ -1570,8 +1564,7 @@ void BScreen::rereadMenu(void) {
 
 
 void BScreen::removeWorkspaceNames(void) {
-  while (workspaceNames->count())
-    delete [] workspaceNames->remove(0);
+  workspaceNames.clear();
 }
 
 
@@ -1895,9 +1888,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();
@@ -1907,29 +1900,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<OpenboxWindow> 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();
 
@@ -1941,15 +1935,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);
@@ -1959,8 +1953,9 @@ int BScreen::removeLastWorkspace(void) {
   workspacemenu->remove(wkspc->getWorkspaceID() + 2);
   workspacemenu->update();
 
-  workspacesList->remove(wkspc);
+  workspacesList.pop_back();
   delete wkspc;
+  
   setWorkspaceCount(workspaceCount()-1);
   saveWorkspaceNames();
 
@@ -1968,7 +1963,7 @@ int BScreen::removeLastWorkspace(void) {
 
   updateNetizenWorkspaceCount();
 
-  return workspacesList->count();
+  return workspacesList.size();
 }
 
 
@@ -2012,11 +2007,11 @@ void BScreen::addNetizen(Netizen *n) {
   n->sendWorkspaceCount();
   n->sendCurrentWorkspace();
 
-  LinkedListIterator<Workspace> 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()) ?
@@ -2061,6 +2056,7 @@ void BScreen::updateNetizenWindowFocus(void) {
     (*it)->sendWindowFocus(f);
 }
 
+
 void BScreen::updateNetizenWindowAdd(Window w, unsigned long p) {
   netList::iterator it;
   for (it = netizenList.begin(); it != netizenList.end(); ++it)
@@ -2098,15 +2094,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<Workspace> 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();
 
@@ -2147,19 +2143,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();
 }
 
 
@@ -2270,9 +2261,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 {
@@ -2750,14 +2739,11 @@ void BScreen::shutdown(void) {
   XSelectInput(getBaseDisplay().getXDisplay(), getRootWindow(), NoEventMask);
   XSync(getBaseDisplay().getXDisplay(), False);
 
-  LinkedListIterator<Workspace> it(workspacesList);
-  for (Workspace *w = it.current(); w; it++, w = it.current())
-    w->shutdown();
+  std::for_each(workspacesList.begin(), workspacesList.end(),
+                std::mem_fun(&Workspace::shutdown));
 
-  while (iconList->count()) {
-    iconList->first()->restore();
-    delete iconList->first();
-  }
+  while (!iconList.empty())
+    iconList.front()->restore();
 
 #ifdef    SLIT
   slit->shutdown();
This page took 0.03491 seconds and 4 git commands to generate.