X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=339aa68b03017bd734fbd7ca54eb3647303b512a;hb=56d7b547ae156e17c8e03ada3b80468f5a0b2605;hp=a945413d35a62b4e25a34ef1879df84a58f40933;hpb=d8de17b58e2fee1414e0970bc372b661abe259a6;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index a945413d..339aa68b 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -51,6 +51,9 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) _grip_right.unmanaged(); _plate.unmanaged(); + _grip_left.setCursor(Openbox::instance->cursors().ll_angle); + _grip_right.setCursor(Openbox::instance->cursors().lr_angle); + _plate.show(); _button_close.setText("X"); @@ -139,9 +142,8 @@ void OBFrame::adjust() cbwidth = _style->getFrameWidth(); } else bwidth = cbwidth = 0; - // inside this function _size is the size EXCLUDING the outer border - // at the end of this function it becomes the size INCLUDING the outer border - _size.left = _size.top = _size.bottom = _size.right = cbwidth; + _innersize.left = _innersize.top = _innersize.bottom = _innersize.right = + cbwidth; width = _client->area().width() + cbwidth * 2; XSetWindowBorderWidth(otk::OBDisplay::display, _plate.getWindow(), cbwidth); @@ -162,7 +164,7 @@ void OBFrame::adjust() width, (_style->getFont().height() + _style->getBevelWidth() * 2)); - _size.top += _titlebar.height() + bwidth; + _innersize.top += _titlebar.height() + bwidth; // set the label size _label.setGeometry(0, _style->getBevelWidth(), @@ -197,8 +199,13 @@ void OBFrame::adjust() // that the ONE LABEL!! // adds an extra sep so that there's a space on either side of the // titlebar.. note: x = sep, below. - _label.setWidth(width - sep * 2 - - (_button_iconify.width() + sep) * (layout.size() - 1)); + int lwidth = width - sep * 2 - + (_button_iconify.width() + sep) * (layout.size() - 1); + // quick sanity check for really small windows. if this is needed, its + // obviously not going to be displayed right... + // XXX: maybe we should make this look better somehow? constraints? + if (lwidth <= 0) lwidth = 1; + _label.setWidth(lwidth); int x = sep; for (int i = 0, len = layout.size(); i < len; ++i) { @@ -232,7 +239,7 @@ void OBFrame::adjust() if (_decorations & OBClient::Decor_Handle) { _handle.setGeometry(-bwidth, - _size.top + _client->area().height() + cbwidth, + _innersize.top + _client->area().height() + cbwidth, width, _style->getHandleWidth()); _grip_left.setGeometry(-bwidth, -bwidth, @@ -247,16 +254,16 @@ void OBFrame::adjust() // the 'buttons size' since theyre all the same _button_iconify.width() * 2, _handle.height()); - _size.bottom += _handle.height() + bwidth; + _innersize.bottom += _handle.height() + bwidth; } // position/size all the windows - resize(_size.left + _size.right + _client->area().width(), - _size.top + _size.bottom + _client->area().height()); + resize(_innersize.left + _innersize.right + _client->area().width(), + _innersize.top + _innersize.bottom + _client->area().height()); - _plate.setGeometry(_size.left - cbwidth, _size.top - cbwidth, + _plate.setGeometry(_innersize.left - cbwidth, _innersize.top - cbwidth, _client->area().width(), _client->area().height()); // map/unmap all the windows @@ -288,15 +295,13 @@ void OBFrame::adjust() else _handle.hide(true); - // inside this function _size is the size EXCLUDING the outer border - // at the end of this function it becomes the size INCLUDING the outer border - _size.left += bwidth; - _size.right += bwidth; - _size.top += bwidth; - _size.bottom += bwidth; - // XXX: more is gunna have to happen here + _size.left = _innersize.left + bwidth; + _size.right = _innersize.right + bwidth; + _size.top = _innersize.top + bwidth; + _size.bottom = _innersize.bottom + bwidth; + adjustShape(); update(); @@ -306,38 +311,40 @@ void OBFrame::adjust() void OBFrame::adjustShape() { #ifdef SHAPE + int bwidth = (_decorations & OBClient::Decor_Border) ? + _style->getBorderWidth() : 0; + if (!_client->shaped()) { // clear the shape on the frame window XShapeCombineMask(otk::OBDisplay::display, getWindow(), ShapeBounding, - _size.left, - _size.top, + _innersize.left, + _innersize.top, None, ShapeSet); } else { // make the frame's shape match the clients XShapeCombineShape(otk::OBDisplay::display, getWindow(), ShapeBounding, - _size.left, - _size.top, + _innersize.left, + _innersize.top, _client->window(), ShapeBounding, ShapeSet); - int num = 0; + int num = 0; XRectangle xrect[2]; - /* - if (decorations & Decor_Titlebar) { - xrect[0].x = xrect[0].y = -frame.border_w; - xrect[0].width = frame.rect.width(); - xrect[0].height = frame.title_h + (frame.border_w * 2); - ++num; + if (_decorations & OBClient::Decor_Titlebar) { + xrect[0].x = _titlebar.getRect().x(); + xrect[0].y = _titlebar.getRect().y(); + xrect[0].width = _titlebar.width() + bwidth * 2; // XXX: this is useless once the widget handles borders! + xrect[0].height = _titlebar.height() + bwidth * 2; + ++num; } - if (decorations & Decor_Handle) { - xrect[1].x = -frame.border_w; - xrect[1].y = frame.rect.height() - frame.margin.bottom + - frame.mwm_border_w - frame.border_w; - xrect[1].width = frame.rect.width(); - xrect[1].height = frame.handle_h + (frame.border_w * 2); - ++num; - }*/ + if (_decorations & OBClient::Decor_Handle) { + xrect[1].x = _handle.getRect().x(); + xrect[1].y = _handle.getRect().y(); + xrect[1].width = _handle.width() + bwidth * 2; // XXX: this is useless once the widget handles borders! + xrect[1].height = _handle.height() + bwidth * 2; + ++num; + } XShapeCombineRectangles(otk::OBDisplay::display, getWindow(), ShapeBounding, 0, 0, xrect, num, @@ -350,16 +357,15 @@ void OBFrame::adjustShape() void OBFrame::grabClient() { - // select the event mask on the frame - //XSelectInput(otk::OBDisplay::display, _window, SubstructureRedirectMask); - // reparent the client to the frame XReparentWindow(otk::OBDisplay::display, _client->window(), _plate.getWindow(), 0, 0); _client->ignore_unmaps++; - // raise the client above the frame - //XRaiseWindow(otk::OBDisplay::display, _client->window()); + // select the event mask on the client's parent + //XSelectInput(otk::OBDisplay::display, _plate.getWindow(), + // SubstructureRedirectMask); + // map the client so it maps when the frame does XMapWindow(otk::OBDisplay::display, _client->window()); @@ -450,4 +456,10 @@ void OBFrame::applyGravity() } +void OBFrame::reverseGravity() +{ + move(_client->area().x() - _size.left, _client->area().y() - _size.top); +} + + }