if (pos < 0) {
menuitems.push_back(item);
} else {
- assert(pos < static_cast<signed>(menuitems.size()));
+ assert(pos <= static_cast<signed>(menuitems.size()));
menuitems.insert((menuitems.begin() + pos), item);
}
return menuitems.size();
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();
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);
}
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();
wkspc->removeAll();
- workspacemenu->remove(wkspc->getID() + 2);
+ workspacemenu->removeWorkspace(wkspc);
workspacemenu->update();
workspacesList.pop_back();
delete wkspc;
saveWorkspaces(getWorkspaceCount());
+ saveWorkspaceNames();
toolbar->reconfigure();
}
+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));
void hideGeometry(void);
void buttonPressEvent(const XButtonEvent *xbutton);
+ void propertyNotifyEvent(const XPropertyEvent *pe);
void updateNetizenCurrentWorkspace(void);
void updateNetizenWorkspaceCount(void);
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;
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 ||
lastfocus = (BlackboxWindow *) 0;
- setName("");
- fprintf(stderr, "WORKSPACE NAME: %s\n", name.c_str());
+ readName();
}
}
-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();
}
void lowerWindow(BlackboxWindow *w);
void reconfigure(void);
void setCurrent(void);
+ void readName();
void setName(const std::string& new_name);
};
#include "i18n.hh"
#include "blackbox.hh"
+#include "Clientmenu.hh"
#include "Screen.hh"
#include "Toolbar.hh"
#include "Workspacemenu.hh"
} 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())
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);
+}
// forward declaration
class Workspacemenu;
class Toolbar;
+class Workspace;
class Workspacemenu : public Basemenu {
private:
public:
Workspacemenu(BScreen *scrn);
+
+ void changeWorkspaceLabel(unsigned int index, const std::string& label);
+ void insertWorkspace(Workspace *wkspc);
+ void removeWorkspace(Workspace *wkspc);
};
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;
}