X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=7a99f9a06e20652e2612eae73c81c4f3d88094e6;hb=dd7af2419a4e59f8048e74db775a1673b27bc708;hp=4f466b46d26edbaf053bfc0cae138102cc36e701;hpb=b8653c3ab8ee785fc0605a960ac83afb97ac7edf;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index 4f466b46..7a99f9a0 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -13,6 +13,8 @@ extern "C" { #include "openbox.hh" #include "frame.hh" #include "client.hh" +#include "python.hh" +#include "bindings.hh" #include "otk/display.hh" #include @@ -22,7 +24,7 @@ namespace ob { const long OBFrame::event_mask; OBFrame::OBFrame(OBClient *client, otk::Style *style) - : otk::OtkWidget(Openbox::instance, style), + : otk::OtkWidget(Openbox::instance, style, Horizontal, 0, 1, true), OBWidget(Type_Frame), _client(client), _screen(otk::OBDisplay::screenInfo(client->screen())), @@ -41,8 +43,8 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) assert(client); assert(style); - XSelectInput(otk::OBDisplay::display, window(), OBFrame::event_mask); - + XSelectInput(otk::OBDisplay::display, _window, OBFrame::event_mask); + _grip_left.setCursor(Openbox::instance->cursors().ll_angle); _grip_right.setCursor(Openbox::instance->cursors().lr_angle); @@ -103,7 +105,6 @@ void OBFrame::focus() { otk::OtkWidget::focus(); update(); - _handle.update(); } @@ -124,11 +125,13 @@ void OBFrame::adjustSize() { // XXX: only if not overridden or something!!! MORE LOGIC HERE!! _decorations = _client->decorations(); - _decorations = 0xffffffff; - + + // true/false for whether to show each element of the titlebar + bool tit_i = false, tit_m = false, tit_s = false, tit_c = false; int width; // the width of the client and its border int bwidth; // width to make borders int cbwidth; // width of the inner client border + int butsize=0; // width and height of the titlebar buttons const int bevel = _style->getBevelWidth(); if (_decorations & OBClient::Decor_Border) { @@ -159,37 +162,78 @@ void OBFrame::adjustSize() // set the label size _label.setGeometry(0, bevel, width, _style->getFont()->height()); // set the buttons sizes + butsize = _label.height() - 2; if (_decorations & OBClient::Decor_Iconify) - _button_iconify.setGeometry(0, bevel + 1, - _label.height() - 2, - _label.height() - 2); + _button_iconify.setGeometry(0, bevel + 1, butsize, butsize); if (_decorations & OBClient::Decor_Maximize) - _button_max.setGeometry(0, bevel + 1, - _label.height() - 2, - _label.height() - 2); + _button_max.setGeometry(0, bevel + 1, butsize, butsize); if (_decorations & OBClient::Decor_Sticky) - _button_stick.setGeometry(0, bevel + 1, - _label.height() - 2, - _label.height() - 2); + _button_stick.setGeometry(0, bevel + 1, butsize, butsize); if (_decorations & OBClient::Decor_Close) - _button_close.setGeometry(0, bevel + 1, - _label.height() - 2, - _label.height() - 2); + _button_close.setGeometry(0, bevel + 1, butsize, butsize); // separation between titlebar elements 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 - // possible letter, all of the letters are valid, and L exists somewhere in - // the string! + std::string layout; + if (!python_get_string("titlebar_layout", &layout)) + layout = "ILMC"; + // this code ensures that the string only has one of each possible + // letter, all of the letters are valid, and L exists somewhere in the + // string! + bool tit_l = false; + + for (std::string::size_type i = 0; i < layout.size(); ++i) { + switch (layout[i]) { + case 'i': + case 'I': + if (!tit_i && (_decorations & OBClient::Decor_Iconify)) { + tit_i = true; + continue; + } + break; + case 'l': + case 'L': + if (!tit_l) { + tit_l = true; + continue; + } + break; + case 'm': + case 'M': + if (!tit_m && (_decorations & OBClient::Decor_Maximize)) { + tit_m = true; + continue; + } + break; + case 's': + case 'S': + if (!tit_s && (_decorations & OBClient::Decor_Sticky)) { + tit_s = true; + continue; + } + break; + case 'c': + case 'C': + if (!tit_c && (_decorations & OBClient::Decor_Close)) { + tit_c = true; + continue; + } + break; + } + // if we get here then we don't want the letter, kill it + layout.erase(i--, 1); + } + if (!tit_l) + layout.append(1, 'L'); + // the size of the label. this ASSUMES the layout has only buttons other // that the ONE LABEL!! // adds an extra sep so that there's a space on either side of the // titlebar.. note: x = sep, below. int lwidth = width - sep * 2 - - (_button_iconify.width() + sep) * (layout.size() - 1); + (butsize + 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? @@ -197,24 +241,29 @@ void OBFrame::adjustSize() _label.setWidth(lwidth); int x = sep; - for (int i = 0, len = layout.size(); i < len; ++i) { + for (std::string::size_type i = 0, len = layout.size(); i < len; ++i) { switch (layout[i]) { + case 'i': case 'I': _button_iconify.move(x, _button_iconify.rect().y()); x += _button_iconify.width(); break; + case 'l': case 'L': _label.move(x, _label.rect().y()); x += _label.width(); break; + case 'm': case 'M': _button_max.move(x, _button_max.rect().y()); x += _button_max.width(); break; + case 's': case 'S': _button_stick.move(x, _button_stick.rect().y()); x += _button_stick.width(); break; + case 'c': case 'C': _button_close.move(x, _button_close.rect().y()); x += _button_close.width(); @@ -234,14 +283,14 @@ void OBFrame::adjustSize() -bwidth, // XXX: get a Point class in otk and use that for // the 'buttons size' since theyre all the same - _button_iconify.width() * 2, + butsize * 2, _handle.height()); _grip_right.setGeometry(((_handle.rect().right() + 1) - - _button_iconify.width() * 2), + butsize * 2), -bwidth, // XXX: get a Point class in otk and use that for // the 'buttons size' since theyre all the same - _button_iconify.width() * 2, + butsize * 2, _handle.height()); _innersize.bottom += _handle.height() + bwidth; } @@ -249,8 +298,12 @@ void OBFrame::adjustSize() // position/size all the windows - resize(_innersize.left + _innersize.right + _client->area().width(), - _innersize.top + _innersize.bottom + _client->area().height()); + if (_client->shaded()) + resize(_innersize.left + _innersize.right + _client->area().width(), + _titlebar.height()); + else + resize(_innersize.left + _innersize.right + _client->area().width(), + _innersize.top + _innersize.bottom + _client->area().height()); _plate.setGeometry(_innersize.left - cbwidth, _innersize.top - cbwidth, _client->area().width(), _client->area().height()); @@ -258,19 +311,19 @@ void OBFrame::adjustSize() // map/unmap all the windows if (_decorations & OBClient::Decor_Titlebar) { _label.show(); - if (_decorations & OBClient::Decor_Iconify) + if (tit_i) _button_iconify.show(); else _button_iconify.hide(); - if (_decorations & OBClient::Decor_Maximize) + if (tit_m) _button_max.show(); else _button_max.hide(); - if (_decorations & OBClient::Decor_Sticky) + if (tit_s) _button_stick.show(); else _button_stick.hide(); - if (_decorations & OBClient::Decor_Close) + if (tit_c) _button_close.show(); else _button_close.hide();