From: Dana Jansens Date: Sun, 14 Jul 2002 20:54:03 +0000 (+0000) Subject: properly handle workspace names, and changes to them. X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=90dbcb271c5e6d7ca73c19a519b93885b833db0a;p=chaz%2Fopenbox properly handle workspace names, and changes to them. --- diff --git a/src/Basemenu.cc b/src/Basemenu.cc index 8feb7372..775d49a8 100644 --- a/src/Basemenu.cc +++ b/src/Basemenu.cc @@ -202,7 +202,7 @@ int Basemenu::insert(BasemenuItem *item, int pos) { if (pos < 0) { menuitems.push_back(item); } else { - assert(pos < static_cast(menuitems.size())); + assert(pos <= static_cast(menuitems.size())); menuitems.insert((menuitems.begin() + pos), item); } return menuitems.size(); diff --git a/src/Screen.cc b/src/Screen.cc index 0186e97b..c2f52cb9 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -205,17 +205,19 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) { iconmenu = new Iconmenu(this); configmenu = new Configmenu(this); - Workspace *wkspc = (Workspace *) 0; if (resource.workspaces != 0) { for (unsigned int i = 0; i < resource.workspaces; ++i) { - wkspc = new Workspace(this, workspacesList.size()); + Workspace *wkspc = new Workspace(this, workspacesList.size()); workspacesList.push_back(wkspc); - workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); + workspacemenu->insertWorkspace(wkspc); + workspacemenu->update(); + } } else { - wkspc = new Workspace(this, workspacesList.size()); + Workspace *wkspc = new Workspace(this, workspacesList.size()); workspacesList.push_back(wkspc); - workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); + workspacemenu->insertWorkspace(wkspc); + workspacemenu->update(); } saveWorkspaceNames(); @@ -496,18 +498,14 @@ void BScreen::saveClock24Hour(Bool c) { void BScreen::saveWorkspaceNames() { - XAtom::StringVect nameList; - unsigned long numnames = (unsigned) -1; string 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]; - } + for (unsigned int i = 0; i < workspacesList.size(); ++i) { + names += workspacesList[i]->getName(); + if (i < workspacesList.size() - 1) + names += ','; } + config->setValue(screenstr + "workspaceNames", names); } @@ -980,9 +978,9 @@ 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); + workspacemenu->insertWorkspace(wkspc); workspacemenu->update(); toolbar->reconfigure(); @@ -1004,13 +1002,14 @@ unsigned int BScreen::removeLastWorkspace(void) { wkspc->removeAll(); - workspacemenu->remove(wkspc->getID() + 2); + workspacemenu->removeWorkspace(wkspc); workspacemenu->update(); workspacesList.pop_back(); delete wkspc; saveWorkspaces(getWorkspaceCount()); + saveWorkspaceNames(); toolbar->reconfigure(); @@ -2118,6 +2117,23 @@ void BScreen::buttonPressEvent(const XButtonEvent *xbutton) { } +void BScreen::propertyNotifyEvent(const XPropertyEvent *pe) { + if (pe->atom == xatom->getAtom(XAtom::net_desktop_names)) { + // _NET_WM_DESKTOP_NAMES + fprintf(stderr, "UPDATING WORKSPACE NAMES\n"); + WorkspaceList::iterator it = workspacesList.begin(); + const WorkspaceList::iterator end = workspacesList.end(); + for (; it != end; ++it) { + (*it)->readName(); // re-read its name from the window property + workspacemenu->changeWorkspaceLabel((*it)->getID(), (*it)->getName()); + } + workspacemenu->update(); + toolbar->reconfigure(); + saveWorkspaceNames(); + } +} + + void BScreen::toggleFocusModel(FocusModel model) { std::for_each(windowList.begin(), windowList.end(), std::mem_fun(&BlackboxWindow::ungrabButtons)); diff --git a/src/Screen.hh b/src/Screen.hh index d2175ce4..37946b99 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -344,6 +344,7 @@ public: void hideGeometry(void); void buttonPressEvent(const XButtonEvent *xbutton); + void propertyNotifyEvent(const XPropertyEvent *pe); void updateNetizenCurrentWorkspace(void); void updateNetizenWorkspaceCount(void); diff --git a/src/Toolbar.cc b/src/Toolbar.cc index a2c3442b..a1a6e118 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -916,13 +916,9 @@ void Toolbar::keyPressEvent(const XKeyEvent *ke) { blackbox->setFocusedWindow(0); } - Workspace *wkspc = screen->getCurrentWorkspace(); - wkspc->setName(new_workspace_name); - wkspc->getMenu()->hide(); - - screen->getWorkspacemenu()->changeItemLabel(wkspc->getID() + 2, - wkspc->getName()); - screen->getWorkspacemenu()->update(); + // the toolbar will be reconfigured when the change to the workspace name + // gets caught in the PropertyNotify event handler + screen->getCurrentWorkspace()->setName(new_workspace_name); new_workspace_name.erase(); new_name_pos = 0; @@ -938,7 +934,6 @@ void Toolbar::keyPressEvent(const XKeyEvent *ke) { else XSetWindowBackgroundPixmap(display, frame.workspace_label, frame.wlabel); - reconfigure(); } else if (! (ks == XK_Shift_L || ks == XK_Shift_R || ks == XK_Control_L || ks == XK_Control_R || ks == XK_Caps_Lock || ks == XK_Shift_Lock || diff --git a/src/Workspace.cc b/src/Workspace.cc index 65f323f1..88280a1d 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -70,8 +70,7 @@ Workspace::Workspace(BScreen *scrn, unsigned int i) { lastfocus = (BlackboxWindow *) 0; - setName(""); - fprintf(stderr, "WORKSPACE NAME: %s\n", name.c_str()); + readName(); } @@ -420,43 +419,48 @@ void Workspace::setCurrent(void) { } -void Workspace::setName(const string& new_name) { - if (! new_name.empty()) { - name = new_name; +void Workspace::readName(void) { + XAtom::StringVect namesList; + unsigned long numnames = id + 1; + + // attempt to get from the _NET_WM_DESKTOP_NAMES property + if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names, + XAtom::utf8, numnames, namesList) && + namesList.size() > id) { + name = namesList[id]; + + clientmenu->setLabel(name); + clientmenu->update(); } else { - // 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; - } + /* + Use a default name. This doesn't actually change the class. That will + happen after the setName changes the root property, and that change + makes its way back to this function. + */ + string tmp =i18n(WorkspaceSet, WorkspaceDefaultNameFormat, + "Workspace %d"); + assert(tmp.length() < 32); + char default_name[32]; + sprintf(default_name, tmp.c_str(), id + 1); + + setName(default_name); // save this into the _NET_WM_DESKTOP_NAMES property } - - // reset the property with the new name +} + + +void Workspace::setName(const string& new_name) { + // set the _NET_WM_DESKTOP_NAMES 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) && namesList.size() > id) - namesList[id] = name; + namesList[id] = new_name; else - namesList.push_back(name); + namesList.push_back(new_name); xatom->setValue(screen->getRootWindow(), XAtom::net_desktop_names, XAtom::utf8, namesList); - - clientmenu->setLabel(name); - clientmenu->update(); - screen->saveWorkspaceNames(); } diff --git a/src/Workspace.hh b/src/Workspace.hh index 0916dce7..fcf46630 100644 --- a/src/Workspace.hh +++ b/src/Workspace.hh @@ -104,6 +104,7 @@ public: void lowerWindow(BlackboxWindow *w); void reconfigure(void); void setCurrent(void); + void readName(); void setName(const std::string& new_name); }; diff --git a/src/Workspacemenu.cc b/src/Workspacemenu.cc index a63251ab..2ba73e23 100644 --- a/src/Workspacemenu.cc +++ b/src/Workspacemenu.cc @@ -27,6 +27,7 @@ #include "i18n.hh" #include "blackbox.hh" +#include "Clientmenu.hh" #include "Screen.hh" #include "Toolbar.hh" #include "Workspacemenu.hh" @@ -51,6 +52,8 @@ void Workspacemenu::itemSelected(int button, unsigned int index) { } else if (index == 1) { getScreen()->removeLastWorkspace(); } else { + // subtract 2 because the workspace menu has 2 extra items at the top before + // the list of the workspace names index -= 2; const Workspace* const wkspc = getScreen()->getCurrentWorkspace(); if (wkspc->getID() != index && index < getScreen()->getWorkspaceCount()) @@ -59,3 +62,27 @@ void Workspacemenu::itemSelected(int button, unsigned int index) { if (! (getScreen()->getWorkspacemenu()->isTorn() || isTorn())) hide(); } + + +void Workspacemenu::changeWorkspaceLabel(unsigned int index, + const std::string& label) { + // add 2 because the workspace menu has 2 extra items at the top before the + // list of the workspace names + changeItemLabel(index + 2, label); +} + + +void Workspacemenu::insertWorkspace(Workspace *wkspc) { + assert(wkspc); + // add 2 because the workspace menu has 2 extra items at the top before the + // list of the workspace names + insert(wkspc->getName(), wkspc->getMenu(), wkspc->getID() + 2); +} + + +void Workspacemenu::removeWorkspace(Workspace *wkspc) { + assert(wkspc); + // add 2 because the workspace menu has 2 extra items at the top before the + // list of the workspace names + remove(wkspc->getID() + 2); +} diff --git a/src/Workspacemenu.hh b/src/Workspacemenu.hh index 28052a9f..15269844 100644 --- a/src/Workspacemenu.hh +++ b/src/Workspacemenu.hh @@ -29,6 +29,7 @@ // forward declaration class Workspacemenu; class Toolbar; +class Workspace; class Workspacemenu : public Basemenu { private: @@ -40,6 +41,10 @@ protected: public: Workspacemenu(BScreen *scrn); + + void changeWorkspaceLabel(unsigned int index, const std::string& label); + void insertWorkspace(Workspace *wkspc); + void removeWorkspace(Workspace *wkspc); }; diff --git a/src/blackbox.cc b/src/blackbox.cc index ae3b5ead..3ec32d52 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -462,9 +462,13 @@ void Blackbox::process_event(XEvent *e) { case PropertyNotify: { last_time = e->xproperty.time; - BlackboxWindow *win = searchWindow(e->xproperty.window); - if (win) + BlackboxWindow *win = (BlackboxWindow *) 0; + BScreen *screen = (BScreen *) 0; + + if ((win = searchWindow(e->xproperty.window))) win->propertyNotifyEvent(&e->xproperty); + else if ((screen = searchScreen(e->xproperty.window))) + screen->propertyNotifyEvent(&e->xproperty); break; }