+ const otk::OBProperty *property = Openbox::instance->property();
+
+ // these values should not be persisted across a window unmapping/mapping
+ property->erase(_window, otk::OBProperty::net_wm_desktop);
+ property->erase(_window, otk::OBProperty::net_wm_state);
+}
+
+
+void OBClient::getDesktop()
+{
+ const otk::OBProperty *property = Openbox::instance->property();
+
+ // defaults to the current desktop
+ _desktop = 0; // XXX: change this to the current desktop!
+
+ property->get(_window, otk::OBProperty::net_wm_desktop,
+ otk::OBProperty::Atom_Cardinal,
+ &_desktop);
+}
+
+
+void OBClient::getType()
+{
+ const otk::OBProperty *property = Openbox::instance->property();
+
+ _type = (WindowType) -1;
+
+ unsigned long *val;
+ unsigned long num = (unsigned) -1;
+ if (property->get(_window, otk::OBProperty::net_wm_window_type,
+ otk::OBProperty::Atom_Atom,
+ &num, &val)) {
+ // use the first value that we know about in the array
+ for (unsigned long i = 0; i < num; ++i) {
+ if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_desktop))
+ _type = Type_Desktop;
+ else if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_dock))
+ _type = Type_Dock;
+ else if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_toolbar))
+ _type = Type_Toolbar;
+ else if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_menu))
+ _type = Type_Menu;
+ else if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_utility))
+ _type = Type_Utility;
+ else if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_splash))
+ _type = Type_Splash;
+ else if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_dialog))
+ _type = Type_Dialog;
+ else if (val[i] ==
+ property->atom(otk::OBProperty::net_wm_window_type_normal))
+ _type = Type_Normal;
+// else if (val[i] ==
+// property->atom(otk::OBProperty::kde_net_wm_window_type_override))
+// mwm_decorations = 0; // prevent this window from getting any decor
+ // XXX: make this work again
+ }
+ delete val;
+ }
+
+ if (_type == (WindowType) -1) {
+ /*
+ * the window type hint was not set, which means we either classify ourself
+ * as a normal window or a dialog, depending on if we are a transient.
+ */
+ // XXX: make this code work!
+ //if (isTransient())
+ // _type = Type_Dialog;
+ //else
+ _type = Type_Normal;
+ }
+}
+
+
+void OBClient::getArea()
+{
+ XWindowAttributes wattrib;
+ assert(XGetWindowAttributes(otk::OBDisplay::display, _window, &wattrib));
+
+ _area.setRect(wattrib.x, wattrib.y, wattrib.width, wattrib.height);
+}
+
+
+void OBClient::getState()
+{
+ const otk::OBProperty *property = Openbox::instance->property();
+
+ _modal = _shaded = _max_horz = _max_vert = _fullscreen = _floating = false;
+
+ unsigned long *state;
+ unsigned long num = (unsigned) -1;
+
+ if (property->get(_window, otk::OBProperty::net_wm_state,
+ otk::OBProperty::Atom_Atom, &num, &state)) {
+ for (unsigned long i = 0; i < num; ++i) {
+ if (state[i] == property->atom(otk::OBProperty::net_wm_state_modal))
+ _modal = true;
+ else if (state[i] ==
+ property->atom(otk::OBProperty::net_wm_state_shaded))
+ _shaded = true;
+ else if (state[i] ==
+ property->atom(otk::OBProperty::net_wm_state_fullscreen))
+ _fullscreen = true;
+ else if (state[i] ==
+ property->atom(otk::OBProperty::net_wm_state_maximized_vert))
+ _max_vert = true;
+ else if (state[i] ==
+ property->atom(otk::OBProperty::net_wm_state_maximized_horz))
+ _max_horz = true;
+ }
+
+ delete [] state;
+ }
+}
+
+
+void OBClient::getShaped()
+{
+ _shaped = false;
+#ifdef SHAPE
+ if (otk::OBDisplay::shape()) {
+ int foo;
+ unsigned int ufoo;
+
+ XShapeQueryExtents(otk::OBDisplay::display, client.window, &_shaped, &foo,
+ &foo, &ufoo, &ufoo, &foo, &foo, &foo, &ufoo, &ufoo);
+ }
+#endif // SHAPE