X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=5ecbb9aefa56560bb19eda738d2da1971ebef903;hb=076d45d0cea0c9c2bac80c47b983d3872e7de470;hp=8103aafb9d80279aea17d6192a85dc52ce566f0f;hpb=9b23dff16cd85461da6f99aa95a79422cffd72f8;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index 8103aafb..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(); @@ -42,32 +43,20 @@ OBClient::OBClient(Window window) #ifdef DEBUG printf("Mapped window: 0x%lx\n" - " title: %s\n" - " icon title: %s\n" - " app name: %s\n" - " class: %s\n" - " position: %d, %d\n" - " size: %d, %d\n" - " desktop: %lu\n" - " group: 0x%lx\n" - " type: %d\n" - " min size %d, %d\n" - " base size %d, %d\n" - " max size %d, %d\n" - " size incr %d, %d\n" - " gravity %d\n" - " wm state %ld\n" - " can be focused: %s\n" - " notify focus: %s\n" - " urgent: %s\n" - " shaped: %s\n" - " modal: %s\n" - " shaded: %s\n" - " iconic: %s\n" - " vert maximized: %s\n" - " horz maximized: %s\n" - " fullscreen: %s\n" - " floating: %s\n", + " title: \t%s\t icon title: \t%s\n" + " app name: \t%s\t\t class: \t%s\n" + " position: \t%d, %d\t\t size: \t%d, %d\n" + " desktop: \t%lu\t\t group: \t0x%lx\n" + " type: \t%d\t\t min size \t%d, %d\n" + " base size \t%d, %d\t\t max size \t%d, %d\n" + " size incr \t%d, %d\t\t gravity \t%d\n" + " wm state \t%ld\t\t can be focused:\t%s\n" + " notify focus: \t%s\t\t urgent: \t%s\n" + " 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" + " requested pos: \t%s\n", _window, _title.c_str(), _icon_title.c_str(), @@ -94,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 } @@ -187,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; } @@ -238,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; @@ -247,15 +261,31 @@ void OBClient::updateNormalHints() _gravity = NorthWestGravity; _inc_x = _inc_y = 1; _base_x = _base_y = 0; + _min_x = _min_y = 0; + _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; @@ -346,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 }