X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=339aa68b03017bd734fbd7ca54eb3647303b512a;hb=56d7b547ae156e17c8e03ada3b80468f5a0b2605;hp=c8d47882373c97da6fbb6f98ef651cfa2a19f5d2;hpb=0089719c806599a405c2def0e1e84a0ac99d9937;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index c8d47882..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"); @@ -130,7 +133,7 @@ void OBFrame::adjust() _decorations = _client->decorations(); _decorations = 0xffffffff; - int width; // the width of the whole frame + int width; // the width of the client and its border int bwidth; // width to make borders int cbwidth; // width of the inner client border @@ -139,7 +142,8 @@ void OBFrame::adjust() cbwidth = _style->getFrameWidth(); } else bwidth = cbwidth = 0; - _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); @@ -160,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(), @@ -195,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) { @@ -230,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, @@ -245,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,6 +297,11 @@ void OBFrame::adjust() // 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(); @@ -297,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, @@ -341,20 +357,20 @@ 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()); - + adjust(); + applyGravity(); } @@ -380,47 +396,70 @@ void OBFrame::releaseClient(bool remap) } -Window OBFrame::createChild(Window parent, Cursor cursor) +void OBFrame::applyGravity() { - XSetWindowAttributes attrib_create; - unsigned long create_mask = CWBackPixmap | CWBorderPixel | CWEventMask; - - attrib_create.background_pixmap = None; - attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | ExposureMask; - - if (cursor) { - create_mask |= CWCursor; - attrib_create.cursor = cursor; + int x, y; + // apply horizontal window gravity + switch (_client->gravity()) { + default: + case NorthWestGravity: + case SouthWestGravity: + case WestGravity: + x = _client->area().x(); + break; + + case NorthGravity: + case SouthGravity: + case CenterGravity: + x = _client->area().x() - (_size.left + _size.right) / 2; + break; + + case NorthEastGravity: + case SouthEastGravity: + case EastGravity: + x = _client->area().x() - _size.left - _size.right + 2; + break; + + case ForgetGravity: + case StaticGravity: + x = _client->area().x() - _size.left; + break; } - Window w = XCreateWindow(otk::OBDisplay::display, parent, 0, 0, 1, 1, 0, - _screen->getDepth(), InputOutput, - _screen->getVisual(), create_mask, &attrib_create); - return w; + // apply vertical window gravity + switch (_client->gravity()) { + default: + case NorthWestGravity: + case NorthEastGravity: + case NorthGravity: + y = _client->area().y(); + break; + + case CenterGravity: + case EastGravity: + case WestGravity: + y = _client->area().y() - (_size.top + _size.bottom) / 2; + break; + + case SouthWestGravity: + case SouthEastGravity: + case SouthGravity: + y = _client->area().y() - _size.top - _size.bottom + 2; + break; + + case ForgetGravity: + case StaticGravity: + y = _client->area().y() - _size.top; + break; + } + move(x, y); } -Window OBFrame::createFrame() +void OBFrame::reverseGravity() { - XSetWindowAttributes attrib_create; - unsigned long create_mask = CWBackPixmap | CWBorderPixel | CWColormap | - CWOverrideRedirect | CWEventMask; - - attrib_create.background_pixmap = None; - attrib_create.colormap = _screen->getColormap(); - attrib_create.override_redirect = True; - attrib_create.event_mask = EnterWindowMask | LeaveWindowMask | ButtonPress; - /* - We catch button presses because other wise they get passed down to the - root window, which will then cause root menus to show when you click the - window's frame. - */ - - return XCreateWindow(otk::OBDisplay::display, _screen->getRootWindow(), - 0, 0, 1, 1, 0, - _screen->getDepth(), InputOutput, _screen->getVisual(), - create_mask, &attrib_create); + move(_client->area().x() - _size.left, _client->area().y() - _size.top); } + }