From eb136b9629b61d43c00c3cf105ff170fb8c75ad1 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 28 Jun 2002 01:44:47 +0000 Subject: [PATCH] use the _NET_WM_DESKTOP_NAMES root property --- src/Screen.cc | 67 ++++++++++-------------------------------------- src/Screen.hh | 6 ----- src/Toolbar.cc | 1 - src/Workspace.cc | 38 ++++++++++++++++++++++----- src/Workspace.hh | 1 + 5 files changed, 47 insertions(+), 66 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 567516e7..4716d23a 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -241,7 +241,6 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { } saveWorkspaceNames(); - updateDesktopNames(); updateNetizenWorkspaceCount(); workspacemenu->insert(i18n(IconSet, IconIcons, "Icons"), iconmenu); @@ -254,8 +253,6 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { workspacemenu->setItemSelected(2, True); - removeWorkspaceNames(); // do not need them any longer - toolbar = new Toolbar(this); slit = new Slit(this); @@ -365,10 +362,6 @@ BScreen::~BScreen(void) { } -void BScreen::removeWorkspaceNames(void) { - workspaceNames.clear(); -} - void BScreen::saveSloppyFocus(bool s) { resource.sloppy_focus = s; @@ -515,14 +508,17 @@ void BScreen::saveClock24Hour(Bool c) { 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 @@ void BScreen::load_rc(void) { 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 @@ unsigned int BScreen::addWorkspace(void) { toolbar->reconfigure(); - updateDesktopNames(); updateNetizenWorkspaceCount(); return workspacesList.size(); @@ -1059,8 +1056,6 @@ unsigned int BScreen::removeLastWorkspace(void) { delete wkspc; saveWorkspaces(getWorkspaceCount()); - saveWorkspaceNames(); - updateDesktopNames(); toolbar->reconfigure(); @@ -1440,40 +1435,6 @@ void BScreen::lowerDesktops(void) { } -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(""); -} - - void BScreen::reassociateWindow(BlackboxWindow *w, unsigned int wkspc_id, bool ignore_sticky) { if (! w) return; diff --git a/src/Screen.hh b/src/Screen.hh index e8c8cd7a..72e7dc0a 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -144,8 +144,6 @@ private: typedef std::list StrutList; StrutList strutList; - typedef std::vector WorkspaceNamesList; - WorkspaceNamesList workspaceNames; typedef std::vector WorkspaceList; WorkspaceList workspacesList; @@ -308,12 +306,8 @@ public: 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); diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 9c7c2faf..55beb59d 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -979,7 +979,6 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) { Workspace *wkspc = screen->getCurrentWorkspace(); wkspc->setName(new_workspace_name); - screen->updateDesktopNames(); wkspc->getMenu()->hide(); screen->getWorkspacemenu()->changeItemLabel(wkspc->getID() + 2, diff --git a/src/Workspace.cc b/src/Workspace.cc index 50a9f4fb..309ea950 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -55,10 +55,12 @@ using std::string; #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 @@ Workspace::Workspace(BScreen *scrn, unsigned int i) { 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(); diff --git a/src/Workspace.hh b/src/Workspace.hh index 33f17b3d..31ddace8 100644 --- a/src/Workspace.hh +++ b/src/Workspace.hh @@ -46,6 +46,7 @@ private: BScreen *screen; BlackboxWindow *lastfocus; Clientmenu *clientmenu; + XAtom *xatom; BlackboxWindowList stackingList, windowList; -- 2.45.2