X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=4e30a1f528e93dfe15ffc1354684045ace8836e2;hb=9e4d1bbabcabef13b740dd7201e35c3314abfbee;hp=339aa68b03017bd734fbd7ca54eb3647303b512a;hpb=fa05dc56ea0bf29100efd2cb4399d8f4818f73e7;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index 339aa68b..4e30a1f5 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -16,29 +16,33 @@ extern "C" { #include "otk/display.hh" #include -#include // TEMP namespace ob { +const long OBFrame::event_mask; + OBFrame::OBFrame(OBClient *client, otk::Style *style) : otk::OtkWidget(Openbox::instance, style), + OBWidget(Type_Frame), _client(client), _screen(otk::OBDisplay::screenInfo(client->screen())), - _plate(this), - _titlebar(this), - _button_close(&_titlebar), - _button_iconify(&_titlebar), - _button_max(&_titlebar), - _button_stick(&_titlebar), - _label(&_titlebar), - _handle(this), - _grip_left(&_handle), - _grip_right(&_handle), + _plate(this, OBWidget::Type_Plate), + _titlebar(this, OBWidget::Type_Titlebar), + _button_close(&_titlebar, OBWidget::Type_CloseButton), + _button_iconify(&_titlebar, OBWidget::Type_IconifyButton), + _button_max(&_titlebar, OBWidget::Type_MaximizeButton), + _button_stick(&_titlebar, OBWidget::Type_StickyButton), + _label(&_titlebar, OBWidget::Type_Label), + _handle(this, OBWidget::Type_Handle), + _grip_left(&_handle, OBWidget::Type_LeftGrip), + _grip_right(&_handle, OBWidget::Type_RightGrip), _decorations(client->decorations()) { assert(client); assert(style); + XSelectInput(otk::OBDisplay::display, window(), OBFrame::event_mask); + unmanaged(); _titlebar.unmanaged(); _button_close.unmanaged(); @@ -54,8 +58,6 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) _grip_left.setCursor(Openbox::instance->cursors().ll_angle); _grip_right.setCursor(Openbox::instance->cursors().lr_angle); - _plate.show(); - _button_close.setText("X"); _button_iconify.setText("I"); _button_max.setText("M"); @@ -65,6 +67,10 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) _style = 0; setStyle(style); + //XXX: uncomment me unfocus(); // stuff starts out focused in otk + + _plate.show(); // the other stuff is shown based on decor settings + grabClient(); } @@ -80,54 +86,31 @@ void OBFrame::setStyle(otk::Style *style) assert(style); otk::OtkWidget::setStyle(style); - // set the grips' textures - _grip_left.setTexture(style->getGripFocus()); - _grip_left.setUnfocusTexture(style->getGripUnfocus()); - _grip_left.setPressedFocusTexture(style->getGripFocus()); - _grip_left.setPressedUnfocusTexture(style->getGripUnfocus()); - _grip_right.setTexture(style->getGripFocus()); - _grip_right.setUnfocusTexture(style->getGripUnfocus()); - _grip_right.setPressedFocusTexture(style->getGripFocus()); - _grip_right.setPressedUnfocusTexture(style->getGripUnfocus()); - - _titlebar.setTexture(style->getTitleFocus()); - _titlebar.setUnfocusTexture(style->getTitleUnfocus()); - _handle.setTexture(style->getHandleFocus()); - _handle.setUnfocusTexture(style->getHandleUnfocus()); - + // if a style was previously set, then 'replace' is true, cause we're // replacing a style bool replace = (_style); if (replace) { // XXX: do shit here whatever - // XXX: save the position based on gravity } _style = style; // XXX: change when focus changes! - XSetWindowBorder(otk::OBDisplay::display, _plate.getWindow(), - _style->getFrameFocus()->color().pixel()); - - XSetWindowBorder(otk::OBDisplay::display, getWindow(), - _style->getBorderColor()->pixel()); - XSetWindowBorder(otk::OBDisplay::display, _titlebar.getWindow(), + XSetWindowBorder(otk::OBDisplay::display, window(), _style->getBorderColor()->pixel()); - XSetWindowBorder(otk::OBDisplay::display, _grip_left.getWindow(), - _style->getBorderColor()->pixel()); - XSetWindowBorder(otk::OBDisplay::display, _grip_right.getWindow(), - _style->getBorderColor()->pixel()); - XSetWindowBorder(otk::OBDisplay::display, _handle.getWindow(), - _style->getBorderColor()->pixel()); - + // if !replace, then adjust() will get called after the client is grabbed! - if (replace) - adjust(); // size/position everything + if (replace) { + // size/position everything + adjustSize(); + adjustPosition(); + } } -void OBFrame::adjust() +void OBFrame::adjustSize() { // XXX: only if not overridden or something!!! MORE LOGIC HERE!! _decorations = _client->decorations(); @@ -146,17 +129,14 @@ void OBFrame::adjust() cbwidth; width = _client->area().width() + cbwidth * 2; - XSetWindowBorderWidth(otk::OBDisplay::display, _plate.getWindow(), cbwidth); - - XSetWindowBorderWidth(otk::OBDisplay::display, getWindow(), bwidth); - XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar.getWindow(), - bwidth); - XSetWindowBorderWidth(otk::OBDisplay::display, _grip_left.getWindow(), - bwidth); - XSetWindowBorderWidth(otk::OBDisplay::display, _grip_right.getWindow(), - bwidth); - XSetWindowBorderWidth(otk::OBDisplay::display, _handle.getWindow(), bwidth); + _plate.setBorderWidth(cbwidth); + setBorderWidth(bwidth); + _titlebar.setBorderWidth(bwidth); + _grip_left.setBorderWidth(bwidth); + _grip_right.setBorderWidth(bwidth); + _handle.setBorderWidth(bwidth); + if (_decorations & OBClient::Decor_Titlebar) { // set the titlebar size _titlebar.setGeometry(-bwidth, @@ -211,23 +191,23 @@ void OBFrame::adjust() for (int i = 0, len = layout.size(); i < len; ++i) { switch (layout[i]) { case 'I': - _button_iconify.move(x, _button_iconify.getRect().y()); + _button_iconify.move(x, _button_iconify.rect().y()); x += _button_iconify.width(); break; case 'L': - _label.move(x, _label.getRect().y()); + _label.move(x, _label.rect().y()); x += _label.width(); break; case 'M': - _button_max.move(x, _button_max.getRect().y()); + _button_max.move(x, _button_max.rect().y()); x += _button_max.width(); break; case 'S': - _button_stick.move(x, _button_stick.getRect().y()); + _button_stick.move(x, _button_stick.rect().y()); x += _button_stick.width(); break; case 'C': - _button_close.move(x, _button_close.getRect().y()); + _button_close.move(x, _button_close.rect().y()); x += _button_close.width(); break; default: @@ -247,7 +227,7 @@ void OBFrame::adjust() // the 'buttons size' since theyre all the same _button_iconify.width() * 2, _handle.height()); - _grip_right.setGeometry(((_handle.getRect().right() + 1) - + _grip_right.setGeometry(((_handle.rect().right() + 1) - _button_iconify.width() * 2), -bwidth, // XXX: get a Point class in otk and use that for @@ -308,6 +288,14 @@ void OBFrame::adjust() } +void OBFrame::adjustPosition() +{ + int x, y; + clientGravity(x, y); + move(x, y); +} + + void OBFrame::adjustShape() { #ifdef SHAPE @@ -316,13 +304,13 @@ void OBFrame::adjustShape() if (!_client->shaped()) { // clear the shape on the frame window - XShapeCombineMask(otk::OBDisplay::display, getWindow(), ShapeBounding, + XShapeCombineMask(otk::OBDisplay::display, window(), ShapeBounding, _innersize.left, _innersize.top, None, ShapeSet); } else { // make the frame's shape match the clients - XShapeCombineShape(otk::OBDisplay::display, getWindow(), ShapeBounding, + XShapeCombineShape(otk::OBDisplay::display, window(), ShapeBounding, _innersize.left, _innersize.top, _client->window(), ShapeBounding, ShapeSet); @@ -331,22 +319,22 @@ void OBFrame::adjustShape() XRectangle xrect[2]; if (_decorations & OBClient::Decor_Titlebar) { - xrect[0].x = _titlebar.getRect().x(); - xrect[0].y = _titlebar.getRect().y(); + xrect[0].x = _titlebar.rect().x(); + xrect[0].y = _titlebar.rect().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 & OBClient::Decor_Handle) { - xrect[1].x = _handle.getRect().x(); - xrect[1].y = _handle.getRect().y(); + xrect[1].x = _handle.rect().x(); + xrect[1].y = _handle.rect().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(), + XShapeCombineRectangles(otk::OBDisplay::display, window(), ShapeBounding, 0, 0, xrect, num, ShapeUnion, Unsorted); } @@ -359,18 +347,18 @@ void OBFrame::grabClient() // reparent the client to the frame XReparentWindow(otk::OBDisplay::display, _client->window(), - _plate.getWindow(), 0, 0); + _plate.window(), 0, 0); _client->ignore_unmaps++; - // select the event mask on the client's parent - //XSelectInput(otk::OBDisplay::display, _plate.getWindow(), - // SubstructureRedirectMask); + // select the event mask on the client's parent (to receive config req's) + XSelectInput(otk::OBDisplay::display, _plate.window(), + SubstructureRedirectMask); // map the client so it maps when the frame does XMapWindow(otk::OBDisplay::display, _client->window()); - adjust(); - applyGravity(); + adjustSize(); + adjustPosition(); } @@ -386,7 +374,7 @@ void OBFrame::releaseClient(bool remap) // according to the ICCCM - if the client doesn't reparent to // root, then we have to do it for them XReparentWindow(otk::OBDisplay::display, _client->window(), - _screen->getRootWindow(), + _screen->rootWindow(), _client->area().x(), _client->area().y()); } @@ -396,69 +384,115 @@ void OBFrame::releaseClient(bool remap) } -void OBFrame::applyGravity() +void OBFrame::clientGravity(int &x, int &y) { - int x, y; - // apply horizontal window gravity + x = _client->area().x(); + y = _client->area().y(); + + // horizontal 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; + x -= (_size.left + _size.right) / 2; break; case NorthEastGravity: case SouthEastGravity: case EastGravity: - x = _client->area().x() - _size.left - _size.right + 2; + x -= _size.left + _size.right; break; case ForgetGravity: case StaticGravity: - x = _client->area().x() - _size.left; + x -= _size.left; break; } - // apply vertical window gravity + // vertical 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; + y -= (_size.top + _size.bottom) / 2; break; case SouthWestGravity: case SouthEastGravity: case SouthGravity: - y = _client->area().y() - _size.top - _size.bottom + 2; + y -= _size.top + _size.bottom; break; case ForgetGravity: case StaticGravity: - y = _client->area().y() - _size.top; + y -= _size.top; break; } - move(x, y); } -void OBFrame::reverseGravity() +void OBFrame::frameGravity(int &x, int &y) { - move(_client->area().x() - _size.left, _client->area().y() - _size.top); + x = rect().x(); + y = rect().y(); + + // horizontal + switch (_client->gravity()) { + default: + case NorthWestGravity: + case WestGravity: + case SouthWestGravity: + break; + case NorthGravity: + case CenterGravity: + case SouthGravity: + x += (_size.left + _size.right) / 2; + break; + case NorthEastGravity: + case EastGravity: + case SouthEastGravity: + x += _size.left + _size.right; + break; + case StaticGravity: + case ForgetGravity: + x += _size.left; + break; + } + + // vertical + switch (_client->gravity()) { + default: + case NorthWestGravity: + case WestGravity: + case SouthWestGravity: + break; + case NorthGravity: + case CenterGravity: + case SouthGravity: + y += (_size.top + _size.bottom) / 2; + break; + case NorthEastGravity: + case EastGravity: + case SouthEastGravity: + y += _size.top + _size.bottom; + break; + case StaticGravity: + case ForgetGravity: + y += _size.top; + break; + } }