X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=5ecbb9aefa56560bb19eda738d2da1971ebef903;hb=076d45d0cea0c9c2bac80c47b983d3872e7de470;hp=2279e57fff0a3ce68fb052c05f296c0cd2246c9d;hpb=116c95b887f0dfcdaa0670565979143ec33ced47;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index 2279e57f..5ecbb9ae 100644 --- a/src/client.cc +++ b/src/client.cc @@ -34,6 +34,7 @@ OBClient::OBClient(Window window) getState(); getShaped(); + updateProtocols(); updateNormalHints(); updateWMHints(); // XXX: updateTransientFor(); @@ -54,7 +55,8 @@ OBClient::OBClient(Window window) " shaped: \t%s\t\t modal: \t%s\n" " shaded: \t%s\t\t iconic: \t%s\n" " vert maximized:\t%s\t\t horz maximized:\t%s\n" - " fullscreen: \t%s\t\t floating: \t%s\n", + " fullscreen: \t%s\t\t floating: \t%s\n" + " requested pos: \t%s\n", _window, _title.c_str(), _icon_title.c_str(), @@ -81,7 +83,8 @@ OBClient::OBClient(Window window) _max_vert ? "yes" : "no", _max_horz ? "yes" : "no", _fullscreen ? "yes" : "no", - _floating ? "yes" : "no"); + _floating ? "yes" : "no", + _positioned ? "yes" : "no"); #endif } @@ -174,6 +177,7 @@ void OBClient::getArea() assert(XGetWindowAttributes(otk::OBDisplay::display, _window, &wattrib)); _area.setRect(wattrib.x, wattrib.y, wattrib.width, wattrib.height); + _border_width = wattrib.border_width; } @@ -225,6 +229,29 @@ void OBClient::getShaped() } +void OBClient::updateProtocols() { + const otk::OBProperty *property = Openbox::instance->property(); + + Atom *proto; + int num_return = 0; + + _focus_notify = false; + + if (XGetWMProtocols(otk::OBDisplay::display, _window, &proto, &num_return)) { + for (int i = 0; i < num_return; ++i) { + if (proto[i] == property->atom(otk::OBProperty::wm_delete_window)) { + // XXX: do shit with this! let the window close, and show a close + // button + } else if (proto[i] == property->atom(otk::OBProperty::wm_take_focus)) + // if this protocol is requested, then the window will be notified + // by the window manager whenever it receives focus + _focus_notify = true; + } + XFree(proto); + } +} + + void OBClient::updateNormalHints() { XSizeHints size; @@ -235,24 +262,30 @@ void OBClient::updateNormalHints() _inc_x = _inc_y = 1; _base_x = _base_y = 0; _min_x = _min_y = 0; - _max_x = _max_y = (unsigned) -1; + _max_x = _max_y = INT_MAX; // get the hints from the window if (XGetWMNormalHints(otk::OBDisplay::display, _window, &size, &ret)) { + _positioned = (size.flags & (PPosition|USPosition)); + if (size.flags & PWinGravity) _gravity = size.win_gravity; + if (size.flags & PMinSize) { _min_x = size.min_width; _min_y = size.min_height; } + if (size.flags & PMaxSize) { _max_x = size.max_width; _max_y = size.max_height; } + if (size.flags & PBaseSize) { _base_x = size.base_width; _base_y = size.base_height; } + if (size.flags & PResizeInc) { _inc_x = size.width_inc; _inc_y = size.height_inc; @@ -343,7 +376,10 @@ void OBClient::update(const XPropertyEvent &e) updateTitle(); else if (e.atom == property->atom(otk::OBProperty::wm_class)) updateClass(); + else if (e.atom == property->atom(otk::OBProperty::wm_protocols)) + updateProtocols(); // XXX: transient for hint + // XXX: strut hint }