X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=4f466b46d26edbaf053bfc0cae138102cc36e701;hb=b8653c3ab8ee785fc0605a960ac83afb97ac7edf;hp=979d9575ee2ea2ad81cf3436d9bb2d2230fce826;hpb=25d1e3538be5719b238f7e62a949c409fef2af66;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index 979d9575..4f466b46 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -23,6 +23,7 @@ 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, OBWidget::Type_Plate), @@ -40,33 +41,17 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) assert(client); assert(style); - XSelectInput(otk::OBDisplay::display, getWindow(), OBFrame::event_mask); + XSelectInput(otk::OBDisplay::display, window(), OBFrame::event_mask); - unmanaged(); - _titlebar.unmanaged(); - _button_close.unmanaged(); - _button_iconify.unmanaged(); - _button_max.unmanaged(); - _button_stick.unmanaged(); - _label.unmanaged(); - _handle.unmanaged(); - _grip_left.unmanaged(); - _grip_right.unmanaged(); - _plate.unmanaged(); - _grip_left.setCursor(Openbox::instance->cursors().ll_angle); _grip_right.setCursor(Openbox::instance->cursors().lr_angle); - _button_close.setText("X"); - _button_iconify.setText("I"); - _button_max.setText("M"); - _button_stick.setText("S"); _label.setText(_client->title()); _style = 0; setStyle(style); - //XXX: uncomment me unfocus(); // stuff starts out focused in otk + otk::OtkWidget::unfocus(); // stuff starts out appearing focused in otk _plate.show(); // the other stuff is shown based on decor settings @@ -80,6 +65,13 @@ OBFrame::~OBFrame() } +void OBFrame::setTitle(const std::string &text) +{ + _label.setText(text); + _label.update(); +} + + void OBFrame::setStyle(otk::Style *style) { assert(style); @@ -96,9 +88,7 @@ void OBFrame::setStyle(otk::Style *style) _style = style; - // XXX: change when focus changes! - XSetWindowBorder(otk::OBDisplay::display, getWindow(), - _style->getBorderColor()->pixel()); + setBorderColor(_style->getBorderColor()); // if !replace, then adjust() will get called after the client is grabbed! if (replace) { @@ -109,6 +99,27 @@ void OBFrame::setStyle(otk::Style *style) } +void OBFrame::focus() +{ + otk::OtkWidget::focus(); + update(); + _handle.update(); +} + + +void OBFrame::unfocus() +{ + otk::OtkWidget::unfocus(); + update(); +} + + +void OBFrame::adjust() +{ + // the party all happens in adjustSize +} + + void OBFrame::adjustSize() { // XXX: only if not overridden or something!!! MORE LOGIC HERE!! @@ -118,6 +129,7 @@ void OBFrame::adjustSize() int width; // the width of the client and its border int bwidth; // width to make borders int cbwidth; // width of the inner client border + const int bevel = _style->getBevelWidth(); if (_decorations & OBClient::Decor_Border) { bwidth = _style->getBorderWidth(); @@ -141,33 +153,31 @@ void OBFrame::adjustSize() _titlebar.setGeometry(-bwidth, -bwidth, width, - (_style->getFont().height() + - _style->getBevelWidth() * 2)); + _style->getFont()->height() + bevel * 2); _innersize.top += _titlebar.height() + bwidth; // set the label size - _label.setGeometry(0, _style->getBevelWidth(), - width, _style->getFont().height()); + _label.setGeometry(0, bevel, width, _style->getFont()->height()); // set the buttons sizes if (_decorations & OBClient::Decor_Iconify) - _button_iconify.setGeometry(0, _style->getBevelWidth() + 1, + _button_iconify.setGeometry(0, bevel + 1, _label.height() - 2, _label.height() - 2); if (_decorations & OBClient::Decor_Maximize) - _button_max.setGeometry(0, _style->getBevelWidth() + 1, + _button_max.setGeometry(0, bevel + 1, _label.height() - 2, _label.height() - 2); if (_decorations & OBClient::Decor_Sticky) - _button_stick.setGeometry(0, _style->getBevelWidth() + 1, + _button_stick.setGeometry(0, bevel + 1, _label.height() - 2, _label.height() - 2); if (_decorations & OBClient::Decor_Close) - _button_close.setGeometry(0, _style->getBevelWidth() + 1, + _button_close.setGeometry(0, bevel + 1, _label.height() - 2, _label.height() - 2); // separation between titlebar elements - const int sep = _style->getBevelWidth() + 1; + const int sep = bevel + 1; std::string layout = "SLIMC"; // XXX: get this from somewhere // XXX: it is REQUIRED that by this point, the string only has one of each @@ -190,23 +200,23 @@ void OBFrame::adjustSize() 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: @@ -226,7 +236,7 @@ void OBFrame::adjustSize() // 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 @@ -274,8 +284,6 @@ void OBFrame::adjustSize() else _handle.hide(true); - // XXX: more is gunna have to happen here - _size.left = _innersize.left + bwidth; _size.right = _innersize.right + bwidth; _size.top = _innersize.top + bwidth; @@ -303,13 +311,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); @@ -318,22 +326,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); } @@ -346,11 +354,11 @@ 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 (to receive config req's) - XSelectInput(otk::OBDisplay::display, _plate.getWindow(), + XSelectInput(otk::OBDisplay::display, _plate.window(), SubstructureRedirectMask); // map the client so it maps when the frame does @@ -373,7 +381,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()); } @@ -444,8 +452,8 @@ void OBFrame::clientGravity(int &x, int &y) void OBFrame::frameGravity(int &x, int &y) { - x = getRect().x(); - y = getRect().y(); + x = rect().x(); + y = rect().y(); // horizontal switch (_client->gravity()) {