summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-06-28 01:44:47 +0000
committerDana Jansens <danakj@orodu.net>2002-06-28 01:44:47 +0000
commiteb136b9629b61d43c00c3cf105ff170fb8c75ad1 (patch)
tree40b64c16cd1618dcdffeafb60b90289d73c4cd9a
parente9f582ae978c5c1b6f2dea9bd9466f37fcb0564c (diff)
use the _NET_WM_DESKTOP_NAMES root property
-rw-r--r--src/Screen.cc67
-rw-r--r--src/Screen.hh6
-rw-r--r--src/Toolbar.cc1
-rw-r--r--src/Workspace.cc38
-rw-r--r--src/Workspace.hh1
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<Strut*> StrutList;
StrutList strutList;
- typedef std::vector<std::string> WorkspaceNamesList;
- WorkspaceNamesList workspaceNames;
typedef std::vector<Workspace*> 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;