X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Frootwindow.cc;h=81b19ee16495e66e1c7b5964a3a4a376ea86daae;hb=fdb4e652f7b196eacc4f942d403910400087ce2a;hp=412312574d9f8905ad9119ed37be2c0b7b0708fa;hpb=dca0c9f5a308e115ec308cdc8ca7987ff4fc0479;p=chaz%2Fopenbox diff --git a/src/rootwindow.cc b/src/rootwindow.cc index 41231257..81b19ee1 100644 --- a/src/rootwindow.cc +++ b/src/rootwindow.cc @@ -6,16 +6,19 @@ #include "rootwindow.hh" #include "openbox.hh" +#include "screen.hh" +#include "client.hh" #include "otk/display.hh" namespace ob { OBRootWindow::OBRootWindow(int screen) - : _info(otk::OBDisplay::screenInfo(screen)) + : OBWidget(OBWidget::Type_Root), + _info(otk::OBDisplay::screenInfo(screen)) { updateDesktopNames(); - Openbox::instance->registerHandler(_info->getRootWindow(), this); + Openbox::instance->registerHandler(_info->rootWindow(), this); } @@ -32,13 +35,12 @@ void OBRootWindow::updateDesktopNames() unsigned long num = (unsigned) -1; - if (!property->get(_info->getRootWindow(), + if (!property->get(_info->rootWindow(), otk::OBProperty::net_desktop_names, otk::OBProperty::utf8, &num, &_names)) _names.clear(); - for (int i = 0; i < numWorkspaces; ++i) - if (i <= static_cast(_names.size())) - _names.push_back("Unnamed workspace"); + while ((signed)_names.size() < numWorkspaces) + _names.push_back("Unnamed"); } @@ -48,7 +50,18 @@ void OBRootWindow::propertyHandler(const XPropertyEvent &e) const otk::OBProperty *property = Openbox::instance->property(); - if (e.atom == property->atom(otk::OBProperty::net_desktop_names)) + // compress changes to a single property into a single change + XEvent ce; + while (XCheckTypedEvent(otk::OBDisplay::display, e.type, &ce)) { + // XXX: it would be nice to compress ALL changes to a property, not just + // changes in a row without other props between. + if (ce.xproperty.atom != e.atom) { + XPutBackEvent(otk::OBDisplay::display, &ce); + break; + } + } + + if (e.atom == property->atom(otk::OBProperty::net_desktop_names)) updateDesktopNames(); } @@ -61,10 +74,18 @@ void OBRootWindow::clientMessageHandler(const XClientMessageEvent &e) //const otk::OBProperty *property = Openbox::instance->property(); - // XXX: so many client messages to handle here! + // XXX: so many client messages to handle here! ..or not.. they go to clients } +void OBRootWindow::setDesktopNames(const otk::OBProperty::StringVect &names) +{ + _names = names; + const otk::OBProperty *property = Openbox::instance->property(); + property->set(_info->rootWindow(), otk::OBProperty::net_desktop_names, + otk::OBProperty::utf8, names); +} + void OBRootWindow::setDesktopName(int i, const std::string &name) { const int numWorkspaces = 1; // XXX: change this to the number of workspaces! @@ -75,9 +96,20 @@ void OBRootWindow::setDesktopName(int i, const std::string &name) otk::OBProperty::StringVect newnames = _names; newnames[i] = name; - property->set(_info->getRootWindow(), otk::OBProperty::net_desktop_names, + property->set(_info->rootWindow(), otk::OBProperty::net_desktop_names, otk::OBProperty::utf8, newnames); } +void OBRootWindow::mapRequestHandler(const XMapRequestEvent &e) +{ + otk::OtkEventHandler::mapRequestHandler(e); + +#ifdef DEBUG + printf("MapRequest for 0x%lx\n", e.window); +#endif // DEBUG + + Openbox::instance->screen(_info->screen())->manageWindow(e.window); +} + }