X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=a945413d35a62b4e25a34ef1879df84a58f40933;hb=d8de17b58e2fee1414e0970bc372b661abe259a6;hp=40b9b9c635c7f1e57784ade090cda3b28db7397a;hpb=a77f0fb344978bb4dafd2ad4639f3de3e090bf7b;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index 40b9b9c6..a945413d 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -56,7 +56,7 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) _button_close.setText("X"); _button_iconify.setText("I"); _button_max.setText("M"); - _button_stick.setText("C"); + _button_stick.setText("S"); _label.setText(_client->title()); _style = 0; @@ -77,12 +77,21 @@ void OBFrame::setStyle(otk::Style *style) assert(style); otk::OtkWidget::setStyle(style); - // don't let grips change textures when they are pressed - _grip_left.setPressedFocusTexture(_grip_left.getTexture()); - _grip_left.setPressedUnfocusTexture(_grip_left.getUnfocusTexture()); - _grip_right.setPressedFocusTexture(_grip_right.getTexture()); - _grip_right.setPressedUnfocusTexture(_grip_right.getUnfocusTexture()); - + // 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); @@ -121,21 +130,20 @@ void OBFrame::adjust() _decorations = _client->decorations(); _decorations = 0xffffffff; - int width; // the width of the client window and the border around it + int width; // the width of the client and its border int bwidth; // width to make borders int cbwidth; // width of the inner client border if (_decorations & OBClient::Decor_Border) { bwidth = _style->getBorderWidth(); cbwidth = _style->getFrameWidth(); - _size.left = _size.top = _size.bottom = _size.right = - _style->getFrameWidth(); - width = _client->area().width() + _style->getFrameWidth() * 2; - } else { + } else bwidth = cbwidth = 0; - _size.left = _size.top = _size.bottom = _size.right = 0; - width = _client->area().width(); - } + // 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; + width = _client->area().width() + cbwidth * 2; + XSetWindowBorderWidth(otk::OBDisplay::display, _plate.getWindow(), cbwidth); XSetWindowBorderWidth(otk::OBDisplay::display, getWindow(), bwidth); @@ -189,9 +197,8 @@ 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(_label.width() - - ((_button_iconify.width() + sep) * - (layout.size() - 1) + sep * 2)); + _label.setWidth(width - sep * 2 - + (_button_iconify.width() + sep) * (layout.size() - 1)); int x = sep; for (int i = 0, len = layout.size(); i < len; ++i) { @@ -225,8 +232,7 @@ void OBFrame::adjust() if (_decorations & OBClient::Decor_Handle) { _handle.setGeometry(-bwidth, - _size.top + _client->area().height() + - _style->getFrameWidth(), + _size.top + _client->area().height() + cbwidth, width, _style->getHandleWidth()); _grip_left.setGeometry(-bwidth, -bwidth, @@ -250,8 +256,8 @@ void OBFrame::adjust() resize(_size.left + _size.right + _client->area().width(), _size.top + _size.bottom + _client->area().height()); - _plate.setGeometry(_size.left, _size.top, _client->area().width(), - _client->area().height()); + _plate.setGeometry(_size.left - cbwidth, _size.top - cbwidth, + _client->area().width(), _client->area().height()); // map/unmap all the windows if (_decorations & OBClient::Decor_Titlebar) { @@ -282,6 +288,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 adjustShape(); @@ -349,8 +362,9 @@ void OBFrame::grabClient() //XRaiseWindow(otk::OBDisplay::display, _client->window()); // map the client so it maps when the frame does XMapWindow(otk::OBDisplay::display, _client->window()); - + adjust(); + applyGravity(); } @@ -376,47 +390,64 @@ 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() -{ - 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); -} - }