use the _NET_WM_DESKTOP_NAMES root property
@@ -241,7 +241,6 @@ workspacemenu->insert(wkspc->getName(), wkspc->getMenu());
} saveWorkspaceNames(); - updateDesktopNames(); updateNetizenWorkspaceCount(); workspacemenu->insert(i18n(IconSet, IconIcons, "Icons"), iconmenu);@@ -253,8 +252,6 @@ xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
XAtom::cardinal, 0); //first workspace workspacemenu->setItemSelected(2, True); - - removeWorkspaceNames(); // do not need them any longer toolbar = new Toolbar(this);@@ -365,10 +362,6 @@ XFreeGC(blackbox->getXDisplay(), opGC);
} -void BScreen::removeWorkspaceNames(void) { - workspaceNames.clear(); -} - void BScreen::saveSloppyFocus(bool s) { resource.sloppy_focus = s;@@ -515,14 +508,17 @@ #endif // HAVE_STRFTIME
void BScreen::saveWorkspaceNames() { + XAtom::StringVect nameList; + unsigned long numnames = (unsigned) -1; string names; - WorkspaceList::iterator it = workspacesList.begin(); - const WorkspaceList::iterator last = workspacesList.end() - 1; - const WorkspaceList::iterator end = workspacesList.end(); - for (; it != end; ++it) { - names += (*it)->getName(); - if (it != last) - names += ','; + + if (numnames > 0 && + xatom->getValue(getRootWindow(), XAtom::net_desktop_names, XAtom::utf8, + numnames, nameList)) { + for (unsigned int i = 0; i < nameList.size(); ++i) { + if (i > 0) names += ","; + names += nameList[i]; + } } config->setValue(screenstr + "workspaceNames", names); }@@ -606,17 +602,20 @@ resource.col_direction = BottomTop;
else resource.col_direction = TopBottom; + XAtom::StringVect workspaceNames; if (config->getValue(screenstr + "workspaceNames", s)) { string::const_iterator it = s.begin(), end = s.end(); while(1) { string::const_iterator tmp = it; // current string.begin() it = std::find(tmp, end, ','); // look for comma between tmp and end - addWorkspaceName(string(tmp, it)); // s[tmp:it] + workspaceNames.push_back(string(tmp, it)); // s[tmp:it] if (it == end) break; ++it; } } + xatom->setValue(getRootWindow(), XAtom::net_desktop_names, XAtom::utf8, + workspaceNames); resource.sloppy_focus = true; resource.auto_raise = false;@@ -1026,7 +1025,6 @@ unsigned int BScreen::addWorkspace(void) {
Workspace *wkspc = new Workspace(this, workspacesList.size()); workspacesList.push_back(wkspc); saveWorkspaces(getWorkspaceCount()); - saveWorkspaceNames(); workspacemenu->insert(wkspc->getName(), wkspc->getMenu(), wkspc->getID() + 2);@@ -1034,7 +1032,6 @@ workspacemenu->update();
toolbar->reconfigure(); - updateDesktopNames(); updateNetizenWorkspaceCount(); return workspacesList.size();@@ -1059,8 +1056,6 @@ workspacesList.pop_back();
delete wkspc; saveWorkspaces(getWorkspaceCount()); - saveWorkspaceNames(); - updateDesktopNames(); toolbar->reconfigure();@@ -1437,40 +1432,6 @@ XLowerWindow(blackbox->getXDisplay(), desktopWindowList[0]);
if (desktopWindowList.size() > 1) XRestackWindows(blackbox->getXDisplay(), &desktopWindowList[0], desktopWindowList.size()); -} - - -void BScreen::addWorkspaceName(const string& name) { - workspaceNames.push_back(name); - updateDesktopNames(); -} - - -void BScreen::updateDesktopNames(){ - XAtom::StringVect names; - - WorkspaceList::iterator it = workspacesList.begin(); - const WorkspaceList::iterator end = workspacesList.end(); - for (; it != end; ++it) - names.push_back((*it)->getName()); - - xatom->setValue(getRootWindow(), XAtom::net_desktop_names, - XAtom::utf8, names); -} - - -/* - * I would love to kill this function and the accompanying workspaceNames - * list. However, we have a chicken and egg situation. The names are read - * in during load_rc() which happens before the workspaces are created. - * The current solution is to read the names into a list, then use the list - * later for constructing the workspaces. It is only used during initial - * BScreen creation. - */ -const string BScreen::getNameOfWorkspace(unsigned int id) { - if (id < workspaceNames.size()) - return workspaceNames[id]; - return string(""); }
@@ -144,8 +144,6 @@ Rect usableArea;
typedef std::list<Strut*> StrutList; StrutList strutList; - typedef std::vector<std::string> WorkspaceNamesList; - WorkspaceNamesList workspaceNames; typedef std::vector<Workspace*> WorkspaceList; WorkspaceList workspacesList;@@ -308,12 +306,8 @@ void removeStrut(Strut *strut);
unsigned int addWorkspace(void); unsigned int removeLastWorkspace(void); - void removeWorkspaceNames(void); - void addWorkspaceName(const std::string& name); - const std::string getNameOfWorkspace(unsigned int id); void changeWorkspaceID(unsigned int id); void saveWorkspaceNames(void); - void updateDesktopNames(void); void addNetizen(Netizen *n); void removeNetizen(Window w);
@@ -979,7 +979,6 @@ }
Workspace *wkspc = screen->getCurrentWorkspace(); wkspc->setName(new_workspace_name); - screen->updateDesktopNames(); wkspc->getMenu()->hide(); screen->getWorkspacemenu()->changeItemLabel(wkspc->getID() + 2,
@@ -55,10 +55,12 @@ #include "Util.hh"
#include "Window.hh" #include "Workspace.hh" #include "Windowmenu.hh" +#include "XAtom.hh" Workspace::Workspace(BScreen *scrn, unsigned int i) { screen = scrn; + xatom = screen->getBlackbox()->getXAtom(); cascade_x = cascade_y = 32;@@ -68,7 +70,7 @@ clientmenu = new Clientmenu(this);
lastfocus = (BlackboxWindow *) 0; - setName(screen->getNameOfWorkspace(id)); + setName(""); }@@ -395,6 +397,7 @@ bool Workspace::isLastWindow(const BlackboxWindow* const w) const {
return (w == windowList.back()); } + void Workspace::setCurrent(void) { screen->changeWorkspaceID(id); }@@ -404,12 +407,35 @@ void Workspace::setName(const string& new_name) {
if (! new_name.empty()) { name = new_name; } else { - string tmp =i18n(WorkspaceSet, WorkspaceDefaultNameFormat, "Workspace %d"); - assert(tmp.length() < 32); - char default_name[32]; - sprintf(default_name, tmp.c_str(), id + 1); - name = default_name; + // attempt to get from the _NET_WM_DESKTOP_NAMES property + XAtom::StringVect namesList; + unsigned long numnames = id + 1; + if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names, + XAtom::utf8, numnames, namesList) && + namesList.size() > id) { + name = namesList[id]; + } else { + string tmp =i18n(WorkspaceSet, WorkspaceDefaultNameFormat, + "Workspace %d"); + assert(tmp.length() < 32); + char default_name[32]; + sprintf(default_name, tmp.c_str(), id + 1); + name = default_name; + } } + + // reset the property with the new name + XAtom::StringVect namesList; + unsigned long numnames = (unsigned) -1; + if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names, + XAtom::utf8, numnames, namesList)) { + if (namesList.size() > id) + namesList[id] = name; + else + namesList.push_back(name); + } + xatom->setValue(screen->getRootWindow(), XAtom::net_desktop_names, + XAtom::utf8, namesList); clientmenu->setLabel(name); clientmenu->update();
@@ -46,6 +46,7 @@ private:
BScreen *screen; BlackboxWindow *lastfocus; Clientmenu *clientmenu; + XAtom *xatom; BlackboxWindowList stackingList, windowList;