properly handle workspace names, and changes to them.
This commit is contained in:
parent
c6a826bf66
commit
90dbcb271c
9 changed files with 110 additions and 57 deletions
|
@ -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();
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 ||
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset the property with the new name
|
setName(default_name); // save this into the _NET_WM_DESKTOP_NAMES property
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue