src/rootwindow.cc (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- #ifdef HAVE_CONFIG_H # include "../config.h" #endif #include "rootwindow.hh" #include "openbox.hh" #include "otk/display.hh" namespace ob { OBRootWindow::OBRootWindow(int screen) : _info(otk::OBDisplay::screenInfo(screen)) { updateDesktopNames(); Openbox::instance->registerHandler(_info->getRootWindow(), this); } OBRootWindow::~OBRootWindow() { } void OBRootWindow::updateDesktopNames() { const int numWorkspaces = 1; // XXX: change this to the number of workspaces! const otk::OBProperty *property = Openbox::instance->property(); unsigned long num = (unsigned) -1; if (!property->get(_info->getRootWindow(), otk::OBProperty::net_desktop_names, otk::OBProperty::utf8, &num, &_names)) _names.clear(); for (int i = 0; i < numWorkspaces; ++i) if (i <= static_cast<int>(_names.size())) _names.push_back("Unnamed workspace"); } void OBRootWindow::propertyHandler(const XPropertyEvent &e) { otk::OtkEventHandler::propertyHandler(e); const otk::OBProperty *property = Openbox::instance->property(); // 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(); } void OBRootWindow::clientMessageHandler(const XClientMessageEvent &e) { otk::OtkEventHandler::clientMessageHandler(e); if (e.format != 32) return; //const otk::OBProperty *property = Openbox::instance->property(); // XXX: so many client messages to handle here! } void OBRootWindow::setDesktopName(int i, const std::string &name) { const int numWorkspaces = 1; // XXX: change this to the number of workspaces! assert(i >= 0); assert(i < numWorkspaces); const otk::OBProperty *property = Openbox::instance->property(); otk::OBProperty::StringVect newnames = _names; newnames[i] = name; property->set(_info->getRootWindow(), otk::OBProperty::net_desktop_names, otk::OBProperty::utf8, newnames); } } |