all repos — openbox @ a4c8a839a3decc54e515fd110710195eca23fd2b

openbox fork - make it a bit more like ryudo

layout fixes, give widgets a default texture, etc.
Dana Jansens danakj@orodu.net
commit

a4c8a839a3decc54e515fd110710195eca23fd2b

parent

c26e5ea7519b02d7b83261faefeec657bb65c4a4

6 files changed, 88 insertions(+), 32 deletions(-)

jump to
M otk/appwidget.ccotk/appwidget.cc

@@ -30,26 +30,18 @@ AppWidget::~AppWidget()

{ } -void AppWidget::render() -{ - XSetWindowBackground(**display, window(), - RenderStyle::style(screen())-> - titlebarUnfocusBackground()->color().pixel()); - Widget::render(); -} - void AppWidget::show() { - Widget::show(true); - + if (!visible()) _application->_appwidget_count++; + Widget::show(true); } void AppWidget::hide() { + if (visible()) + _application->_appwidget_count--; Widget::hide(); - - _application->_appwidget_count--; } void AppWidget::clientMessageHandler(const XClientMessageEvent &e)
M otk/appwidget.hhotk/appwidget.hh

@@ -14,8 +14,6 @@ public:

AppWidget(Application *app, Direction direction = Horizontal, int bevel = 0); virtual ~AppWidget(); - virtual void render(); - virtual void show(); virtual void hide();
M otk/label.ccotk/label.cc

@@ -55,7 +55,14 @@ // parse it into multiple lines

std::string::size_type p = 0; while (p != std::string::npos) { std::string::size_type p2 = s.find('\n', p); - _parsedtext.push_back(s.substr(p, (p2==std::string::npos?p2:p2-p))); + std::string s(s.substr(p, (p2==std::string::npos?p2:p2-p))); + + // turn tabs into spaces (multiples of 8) + std::string::size_type t; + while ((t = s.find('\t')) != std::string::npos) + s.replace(t, 1, std::string(8 - t % 8, ' ')); + + _parsedtext.push_back(s); _parsedtext.back().setUtf8(utf); p = (p2==std::string::npos?p2:p2+1); }
M otk/label.hhotk/label.hh

@@ -17,7 +17,7 @@ public:

Label(Widget *parent); virtual ~Label(); - inline const ustring& getText(void) const { return _text; } + inline const ustring& text(void) const { return _text; } void setText(const ustring &text); virtual inline bool isHighlighted() const { return _highlight; }
M otk/widget.ccotk/widget.cc

@@ -37,6 +37,7 @@ _ignore_config(0)

{ createWindow(overrideredir); _dispatcher->registerHandler(_window, this); + styleChanged(*RenderStyle::style(_screen)); } Widget::Widget(Widget *parent, Direction direction, int bevel)

@@ -63,6 +64,7 @@ createWindow(false);

parent->addChild(this); if (parent->visible()) parent->layout(); _dispatcher->registerHandler(_window, this); + styleChanged(*RenderStyle::style(_screen)); } Widget::~Widget()

@@ -86,6 +88,10 @@ }

} if (!_visible) { _visible = true; + if (_parent) _parent->calcDefaultSizes(); + else { + resize(_min_size); + } XMapWindow(**display, _window); update(); }

@@ -96,7 +102,10 @@ {

if (_visible) { _visible = false; XUnmapWindow(**display, _window); - if (_parent) _parent->layout(); + if (_parent) { + _parent->calcDefaultSizes(); + _parent->layout(); + } } }

@@ -110,9 +119,10 @@ void Widget::update()

{ if (!_visible) return; _dirty = true; - if (parent()) - parent()->layout(); // relay-out us and our siblings - else { + if (_parent) { + _parent->calcDefaultSizes(); + _parent->layout(); // relay-out us and our siblings + } else { render(); layout(); }

@@ -121,8 +131,8 @@

void Widget::moveresize(const Rect &r) { int w, h; - w = std::min(std::max(r.width(), minSize().width()), maxSize().width()); - h = std::min(std::max(r.height(), minSize().height()), maxSize().height()); + w = std::max(std::min(r.width(), maxSize().width()), minSize().width()); + h = std::max(std::min(r.height(), maxSize().height()), minSize().height()); if (r.x() == area().x() && r.y() == area().y() && w == area().width() && h == area().height()) {

@@ -140,9 +150,15 @@ assert(w > 0);

assert(h > 0); assert(_borderwidth >= 0); _dirty = true; - XMoveResizeWindow(**display, _window, x, y, - w - _borderwidth * 2, - h - _borderwidth * 2); + if (!(x == _area.x() && y == _area.y())) { + if (!(w == _area.width() && h == _area.height())) + XMoveResizeWindow(**display, _window, x, y, + w - _borderwidth * 2, + h - _borderwidth * 2); + else + XMoveWindow(**display, _window, x, y); + } else + XResizeWindow(**display, _window, w - _borderwidth*2, h - _borderwidth*2); _ignore_config++; _area = Rect(x, y, w, h);

@@ -183,6 +199,48 @@ mask,

&attrib); assert(_window != None); ++_ignore_config; +} + +void Widget::calcDefaultSizes() +{ + std::list<Widget*>::const_iterator it, end = _children.end(); + int min_biggest = 0, max_biggest = 0; + int min_sum = _bevel + _borderwidth * 2; + int max_sum = _bevel + _borderwidth * 2; + bool fullmax = false; + + for (it = _children.begin(); it != end; ++it) { + const otk::Size &min = (*it)->minSize(); + const otk::Size &max = (*it)->maxSize(); + if (_direction == Horizontal) { + if (min.height() > min_biggest) min_biggest = min.height(); + if (max.height() > max_biggest) max_biggest = max.height(); + min_sum += _bevel + min.width(); + if (max.width() == INT_MAX) + fullmax = true; + else if (!fullmax) + max_sum += _bevel + max.width(); + } else { + if (min.width() > min_biggest) min_biggest = min.width(); + if (max.width() > max_biggest) max_biggest = max.width(); + min_sum += _bevel + min.height(); + if (max.height() == INT_MAX) + fullmax = true; + else if (!fullmax) + max_sum += _bevel + max.height(); + } + } + if (_direction == Horizontal) { + _min_size = otk::Size(min_sum, min_biggest + (_bevel + _borderwidth) * 2); + _max_size = otk::Size((fullmax ? INT_MAX : + max_sum + (_bevel + _borderwidth) * 2), + max_biggest); + } else { + _min_size = otk::Size(min_biggest, min_sum + (_bevel + _borderwidth) * 2); + _max_size = otk::Size(max_biggest, (fullmax ? INT_MAX : max_sum + + (_bevel + _borderwidth) * 2)); + } + update(); } void Widget::setBorderWidth(int w)

@@ -427,11 +485,7 @@ }

void Widget::render() { - if (!_dirty) return; - if (!_texture) { - XSetWindowBackgroundPixmap(**display, _window, ParentRelative); - return; - } + if (!_texture || !_dirty) return; if (_borderwidth * 2 > _area.width() || _borderwidth * 2 > _area.height()) return; // no surface to draw on

@@ -458,6 +512,11 @@ {

std::list<Widget*>::iterator it, end = _children.end(); for (it = _children.begin(); it != end; ++it) (*it)->render(); +} + +void Widget::styleChanged(const RenderStyle &style) +{ + _texture = style.titlebarUnfocusBackground(); } void Widget::exposeHandler(const XExposeEvent &e)
M otk/widget.hhotk/widget.hh

@@ -77,7 +77,7 @@ const std::list<Widget*>& children() const { return _children; }

virtual void exposeHandler(const XExposeEvent &e); virtual void configureHandler(const XConfigureEvent &e); - virtual void styleChanged(const RenderStyle &) {} + virtual void styleChanged(const RenderStyle &style); protected: virtual void addChild(Widget *w) { assert(w); _children.push_back(w); }

@@ -85,7 +85,7 @@ virtual void removeChild(Widget *w) { assert(w); _children.remove(w); }

//! Find the default min/max sizes for the widget. Useful after the in-use //! style has changed. - virtual void calcDefaultSizes() {}; + virtual void calcDefaultSizes(); virtual void setMinSize(const Size &s);