properly handle workspace names, and changes to them.

This commit is contained in:
Dana Jansens 2002-07-14 20:54:03 +00:00
parent c6a826bf66
commit 90dbcb271c
9 changed files with 110 additions and 57 deletions

View file

@ -202,7 +202,7 @@ int Basemenu::insert(BasemenuItem *item, int pos) {
if (pos < 0) { if (pos < 0) {
menuitems.push_back(item); menuitems.push_back(item);
} else { } else {
assert(pos < static_cast<signed>(menuitems.size())); assert(pos <= static_cast<signed>(menuitems.size()));
menuitems.insert((menuitems.begin() + pos), item); menuitems.insert((menuitems.begin() + pos), item);
} }
return menuitems.size(); return menuitems.size();

View file

@ -205,17 +205,19 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
iconmenu = new Iconmenu(this); iconmenu = new Iconmenu(this);
configmenu = new Configmenu(this); configmenu = new Configmenu(this);
Workspace *wkspc = (Workspace *) 0;
if (resource.workspaces != 0) { if (resource.workspaces != 0) {
for (unsigned int i = 0; i < resource.workspaces; ++i) { 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); workspacesList.push_back(wkspc);
workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); workspacemenu->insertWorkspace(wkspc);
workspacemenu->update();
} }
} else { } else {
wkspc = new Workspace(this, workspacesList.size()); Workspace *wkspc = new Workspace(this, workspacesList.size());
workspacesList.push_back(wkspc); workspacesList.push_back(wkspc);
workspacemenu->insert(wkspc->getName(), wkspc->getMenu()); workspacemenu->insertWorkspace(wkspc);
workspacemenu->update();
} }
saveWorkspaceNames(); saveWorkspaceNames();
@ -496,18 +498,14 @@ void BScreen::saveClock24Hour(Bool c) {
void BScreen::saveWorkspaceNames() { void BScreen::saveWorkspaceNames() {
XAtom::StringVect nameList;
unsigned long numnames = (unsigned) -1;
string names; string names;
if (numnames > 0 && for (unsigned int i = 0; i < workspacesList.size(); ++i) {
xatom->getValue(getRootWindow(), XAtom::net_desktop_names, XAtom::utf8, names += workspacesList[i]->getName();
numnames, nameList)) { if (i < workspacesList.size() - 1)
for (unsigned int i = 0; i < nameList.size(); ++i) { names += ',';
if (i > 0) names += ",";
names += nameList[i];
}
} }
config->setValue(screenstr + "workspaceNames", names); config->setValue(screenstr + "workspaceNames", names);
} }
@ -980,9 +978,9 @@ unsigned int BScreen::addWorkspace(void) {
Workspace *wkspc = new Workspace(this, workspacesList.size()); Workspace *wkspc = new Workspace(this, workspacesList.size());
workspacesList.push_back(wkspc); workspacesList.push_back(wkspc);
saveWorkspaces(getWorkspaceCount()); saveWorkspaces(getWorkspaceCount());
saveWorkspaceNames();
workspacemenu->insert(wkspc->getName(), wkspc->getMenu(), workspacemenu->insertWorkspace(wkspc);
wkspc->getID() + 2);
workspacemenu->update(); workspacemenu->update();
toolbar->reconfigure(); toolbar->reconfigure();
@ -1004,13 +1002,14 @@ unsigned int BScreen::removeLastWorkspace(void) {
wkspc->removeAll(); wkspc->removeAll();
workspacemenu->remove(wkspc->getID() + 2); workspacemenu->removeWorkspace(wkspc);
workspacemenu->update(); workspacemenu->update();
workspacesList.pop_back(); workspacesList.pop_back();
delete wkspc; delete wkspc;
saveWorkspaces(getWorkspaceCount()); saveWorkspaces(getWorkspaceCount());
saveWorkspaceNames();
toolbar->reconfigure(); 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) { void BScreen::toggleFocusModel(FocusModel model) {
std::for_each(windowList.begin(), windowList.end(), std::for_each(windowList.begin(), windowList.end(),
std::mem_fun(&BlackboxWindow::ungrabButtons)); std::mem_fun(&BlackboxWindow::ungrabButtons));

View file

@ -344,6 +344,7 @@ public:
void hideGeometry(void); void hideGeometry(void);
void buttonPressEvent(const XButtonEvent *xbutton); void buttonPressEvent(const XButtonEvent *xbutton);
void propertyNotifyEvent(const XPropertyEvent *pe);
void updateNetizenCurrentWorkspace(void); void updateNetizenCurrentWorkspace(void);
void updateNetizenWorkspaceCount(void); void updateNetizenWorkspaceCount(void);

View file

@ -916,13 +916,9 @@ void Toolbar::keyPressEvent(const XKeyEvent *ke) {
blackbox->setFocusedWindow(0); blackbox->setFocusedWindow(0);
} }
Workspace *wkspc = screen->getCurrentWorkspace(); // the toolbar will be reconfigured when the change to the workspace name
wkspc->setName(new_workspace_name); // gets caught in the PropertyNotify event handler
wkspc->getMenu()->hide(); screen->getCurrentWorkspace()->setName(new_workspace_name);
screen->getWorkspacemenu()->changeItemLabel(wkspc->getID() + 2,
wkspc->getName());
screen->getWorkspacemenu()->update();
new_workspace_name.erase(); new_workspace_name.erase();
new_name_pos = 0; new_name_pos = 0;
@ -938,7 +934,6 @@ void Toolbar::keyPressEvent(const XKeyEvent *ke) {
else else
XSetWindowBackgroundPixmap(display, frame.workspace_label, XSetWindowBackgroundPixmap(display, frame.workspace_label,
frame.wlabel); frame.wlabel);
reconfigure();
} else if (! (ks == XK_Shift_L || ks == XK_Shift_R || } else if (! (ks == XK_Shift_L || ks == XK_Shift_R ||
ks == XK_Control_L || ks == XK_Control_R || ks == XK_Control_L || ks == XK_Control_R ||
ks == XK_Caps_Lock || ks == XK_Shift_Lock || ks == XK_Caps_Lock || ks == XK_Shift_Lock ||

View file

@ -70,8 +70,7 @@ Workspace::Workspace(BScreen *scrn, unsigned int i) {
lastfocus = (BlackboxWindow *) 0; lastfocus = (BlackboxWindow *) 0;
setName(""); readName();
fprintf(stderr, "WORKSPACE NAME: %s\n", name.c_str());
} }
@ -420,43 +419,48 @@ void Workspace::setCurrent(void) {
} }
void Workspace::setName(const string& new_name) { void Workspace::readName(void) {
if (! new_name.empty()) {
name = new_name;
} else {
// attempt to get from the _NET_WM_DESKTOP_NAMES property
XAtom::StringVect namesList; XAtom::StringVect namesList;
unsigned long numnames = id + 1; unsigned long numnames = id + 1;
// attempt to get from the _NET_WM_DESKTOP_NAMES property
if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names, if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names,
XAtom::utf8, numnames, namesList) && XAtom::utf8, numnames, namesList) &&
namesList.size() > id) { namesList.size() > id) {
name = namesList[id]; name = namesList[id];
clientmenu->setLabel(name);
clientmenu->update();
} else { } else {
/*
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, string tmp =i18n(WorkspaceSet, WorkspaceDefaultNameFormat,
"Workspace %d"); "Workspace %d");
assert(tmp.length() < 32); assert(tmp.length() < 32);
char default_name[32]; char default_name[32];
sprintf(default_name, tmp.c_str(), id + 1); sprintf(default_name, tmp.c_str(), id + 1);
name = default_name;
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; XAtom::StringVect namesList;
unsigned long numnames = (unsigned) -1; unsigned long numnames = (unsigned) -1;
if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names, if (xatom->getValue(screen->getRootWindow(), XAtom::net_desktop_names,
XAtom::utf8, numnames, namesList) && XAtom::utf8, numnames, namesList) &&
namesList.size() > id) namesList.size() > id)
namesList[id] = name; namesList[id] = new_name;
else else
namesList.push_back(name); namesList.push_back(new_name);
xatom->setValue(screen->getRootWindow(), XAtom::net_desktop_names, xatom->setValue(screen->getRootWindow(), XAtom::net_desktop_names,
XAtom::utf8, namesList); XAtom::utf8, namesList);
clientmenu->setLabel(name);
clientmenu->update();
screen->saveWorkspaceNames();
} }

View file

@ -104,6 +104,7 @@ public:
void lowerWindow(BlackboxWindow *w); void lowerWindow(BlackboxWindow *w);
void reconfigure(void); void reconfigure(void);
void setCurrent(void); void setCurrent(void);
void readName();
void setName(const std::string& new_name); void setName(const std::string& new_name);
}; };

View file

@ -27,6 +27,7 @@
#include "i18n.hh" #include "i18n.hh"
#include "blackbox.hh" #include "blackbox.hh"
#include "Clientmenu.hh"
#include "Screen.hh" #include "Screen.hh"
#include "Toolbar.hh" #include "Toolbar.hh"
#include "Workspacemenu.hh" #include "Workspacemenu.hh"
@ -51,6 +52,8 @@ void Workspacemenu::itemSelected(int button, unsigned int index) {
} else if (index == 1) { } else if (index == 1) {
getScreen()->removeLastWorkspace(); getScreen()->removeLastWorkspace();
} else { } else {
// subtract 2 because the workspace menu has 2 extra items at the top before
// the list of the workspace names
index -= 2; index -= 2;
const Workspace* const wkspc = getScreen()->getCurrentWorkspace(); const Workspace* const wkspc = getScreen()->getCurrentWorkspace();
if (wkspc->getID() != index && index < getScreen()->getWorkspaceCount()) if (wkspc->getID() != index && index < getScreen()->getWorkspaceCount())
@ -59,3 +62,27 @@ void Workspacemenu::itemSelected(int button, unsigned int index) {
if (! (getScreen()->getWorkspacemenu()->isTorn() || isTorn())) if (! (getScreen()->getWorkspacemenu()->isTorn() || isTorn()))
hide(); 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);
}

View file

@ -29,6 +29,7 @@
// forward declaration // forward declaration
class Workspacemenu; class Workspacemenu;
class Toolbar; class Toolbar;
class Workspace;
class Workspacemenu : public Basemenu { class Workspacemenu : public Basemenu {
private: private:
@ -40,6 +41,10 @@ protected:
public: public:
Workspacemenu(BScreen *scrn); Workspacemenu(BScreen *scrn);
void changeWorkspaceLabel(unsigned int index, const std::string& label);
void insertWorkspace(Workspace *wkspc);
void removeWorkspace(Workspace *wkspc);
}; };

View file

@ -462,9 +462,13 @@ void Blackbox::process_event(XEvent *e) {
case PropertyNotify: { case PropertyNotify: {
last_time = e->xproperty.time; last_time = e->xproperty.time;
BlackboxWindow *win = searchWindow(e->xproperty.window); BlackboxWindow *win = (BlackboxWindow *) 0;
if (win) BScreen *screen = (BScreen *) 0;
if ((win = searchWindow(e->xproperty.window)))
win->propertyNotifyEvent(&e->xproperty); win->propertyNotifyEvent(&e->xproperty);
else if ((screen = searchScreen(e->xproperty.window)))
screen->propertyNotifyEvent(&e->xproperty);
break; break;
} }