+
+void Screen::setDesktopName(long i, const std::string &name)
+{
+ assert(i >= 0);
+
+ if (i >= _num_desktops) return;
+
+ const otk::Property *property = Openbox::instance->property();
+
+ otk::Property::StringVect newnames = _desktop_names;
+ newnames[i] = name;
+ property->set(_info->rootWindow(), otk::Property::net_desktop_names,
+ otk::Property::utf8, newnames);
+}
+
+
+void Screen::propertyHandler(const XPropertyEvent &e)
+{
+ otk::EventHandler::propertyHandler(e);
+
+ const otk::Property *property = Openbox::instance->property();
+
+ // compress changes to a single property into a single change
+ XEvent ce;
+ while (XCheckTypedEvent(otk::Display::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::Display::display, &ce);
+ break;
+ }
+ }
+
+ if (e.atom == property->atom(otk::Property::net_desktop_names))
+ updateDesktopNames();
+}
+
+
+void Screen::clientMessageHandler(const XClientMessageEvent &e)
+{
+ otk::EventHandler::clientMessageHandler(e);
+
+ if (e.format != 32) return;
+
+ const otk::Property *property = Openbox::instance->property();
+
+ if (e.message_type == property->atom(otk::Property::net_current_desktop)) {
+ changeDesktop(e.data.l[0]);
+ } else if (e.message_type ==
+ property->atom(otk::Property::net_number_of_desktops)) {
+ changeNumDesktops(e.data.l[0]);
+ }
+ // XXX: so many client messages to handle here! ..or not.. they go to clients
+}
+
+
+void Screen::mapRequestHandler(const XMapRequestEvent &e)
+{
+ otk::EventHandler::mapRequestHandler(e);
+
+#ifdef DEBUG
+ printf("MapRequest for 0x%lx\n", e.window);
+#endif // DEBUG
+
+ /*
+ MapRequest events come here even after the window exists instead of going
+ right to the client window, because of how they are sent and their struct
+ layout.
+ */
+ Client *c = Openbox::instance->findClient(e.window);
+
+ if (c) {
+ // send a net_active_window message
+ XEvent ce;
+ ce.xclient.type = ClientMessage;
+ ce.xclient.message_type =
+ Openbox::instance->property()->atom(otk::Property::net_active_window);
+ ce.xclient.display = otk::Display::display;
+ ce.xclient.window = c->window();
+ ce.xclient.format = 32;
+ ce.xclient.data.l[0] = 0l;
+ ce.xclient.data.l[1] = 0l;
+ ce.xclient.data.l[2] = 0l;
+ ce.xclient.data.l[3] = 0l;
+ ce.xclient.data.l[4] = 0l;
+ XSendEvent(otk::Display::display, _info->rootWindow(), false,
+ SubstructureRedirectMask | SubstructureNotifyMask,
+ &ce);
+ } else
+ manageWindow(e.window);
+}