all repos — openbox @ eb136b9629b61d43c00c3cf105ff170fb8c75ad1

openbox fork - make it a bit more like ryudo

use the _NET_WM_DESKTOP_NAMES root property
Dana Jansens danakj@orodu.net
commit

eb136b9629b61d43c00c3cf105ff170fb8c75ad1

parent

e9f582ae978c5c1b6f2dea9bd9466f37fcb0564c

5 files changed, 47 insertions(+), 66 deletions(-)

jump to
M src/Screen.ccsrc/Screen.cc

@@ -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(""); }
M src/Screen.hhsrc/Screen.hh

@@ -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);
M src/Toolbar.ccsrc/Toolbar.cc

@@ -979,7 +979,6 @@ }

Workspace *wkspc = screen->getCurrentWorkspace(); wkspc->setName(new_workspace_name); - screen->updateDesktopNames(); wkspc->getMenu()->hide(); screen->getWorkspacemenu()->changeItemLabel(wkspc->getID() + 2,
M src/Workspace.ccsrc/Workspace.cc

@@ -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();
M src/Workspace.hhsrc/Workspace.hh

@@ -46,6 +46,7 @@ private:

BScreen *screen; BlackboxWindow *lastfocus; Clientmenu *clientmenu; + XAtom *xatom; BlackboxWindowList stackingList, windowList;