X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Fwidget.cc;h=ca8c527aaa3a8abfe7dc91fcef98252c1a2fa1e6;hb=c2c21e9588c00944dfed4cfc7e48d14570444534;hp=139cb259f3133c72c0541500a25901d0f4feac23;hpb=d8d9b42777ace234f3471918e1210062578f8188;p=chaz%2Fopenbox diff --git a/otk/widget.cc b/otk/widget.cc index 139cb259..ca8c527a 100644 --- a/otk/widget.cc +++ b/otk/widget.cc @@ -8,7 +8,7 @@ #include "display.hh" #include "assassin.hh" #include "screeninfo.hh" - +#include "focuslabel.hh" #include #include @@ -25,19 +25,18 @@ Widget::Widget(Widget *parent, Direction direction) _stretchable_horz(false), _texture(0), _bg_pixmap(0), _bg_pixel(0), _bcolor(0), _bwidth(0), _rect(0, 0, 1, 1), _screen(parent->screen()), _fixed_width(false), _fixed_height(false), - _surface(parent->screen(), _rect.size()), + _surface(0), _event_dispatcher(parent->eventDispatcher()) { assert(parent); parent->addChild(this); create(); _event_dispatcher->registerHandler(_window, this); - setStyle(_style); // let the widget initialize stuff } -Widget::Widget(EventDispatcher *event_dispatcher, Style *style, - Direction direction, Cursor cursor, int bevel_width, - bool override_redirect) +Widget::Widget(EventDispatcher *event_dispatcher, RenderStyle *style, + Direction direction, Cursor cursor, int bevel_width, + bool override_redirect) : EventHandler(), _dirty(false),_focused(false), _parent(0), _style(style), _direction(direction), _cursor(cursor), @@ -45,15 +44,14 @@ Widget::Widget(EventDispatcher *event_dispatcher, Style *style, _grabbed_mouse(false), _grabbed_keyboard(false), _stretchable_vert(false), _stretchable_horz(false), _texture(0), _bg_pixmap(0), _bg_pixel(0), _bcolor(0), _bwidth(0), _rect(0, 0, 1, 1), - _screen(style->getScreen()), _fixed_width(false), _fixed_height(false), - _surface(style->getScreen(), _rect.size()), + _screen(style->screen()), _fixed_width(false), _fixed_height(false), + _surface(0), _event_dispatcher(event_dispatcher) { assert(event_dispatcher); assert(style); create(override_redirect); _event_dispatcher->registerHandler(_window, this); - setStyle(_style); // let the widget initialize stuff } Widget::~Widget() @@ -175,7 +173,7 @@ void Widget::show(bool recursive) if (recursive) { WidgetList::iterator it = _children.begin(), end = _children.end(); for (; it != end; ++it) - (*it)->show(); + (*it)->show(recursive); } XMapWindow(**display, _window); @@ -259,14 +257,17 @@ void Widget::ungrabKeyboard(void) void Widget::render(void) { if (!_texture) return; - printf("RENDER\n"); - _surface = Surface(_screen, _rect.size()); - display->renderControl(_screen)->drawBackground(_surface, *_texture); + Surface *s = _surface; // save the current surface + + _surface = new Surface(_screen, _rect.size()); + display->renderControl(_screen)->drawBackground(*_surface, *_texture); + + renderForeground(); // for inherited types to render onto the _surface - renderForeground(); + XSetWindowBackgroundPixmap(**display, _window, _surface->pixmap()); - XSetWindowBackgroundPixmap(**display, _window, _surface.pixmap()); + delete s; // delete the old surface *after* its pixmap isn't in use anymore } void Widget::adjust(void) @@ -323,7 +324,7 @@ void Widget::adjustHorz(void) if (prev_widget) x = prev_widget->_rect.x() + prev_widget->_rect.width() + _bevel_width; else - x = _rect.x() + _bevel_width; + x = _bevel_width; y = (tallest - tmp->_rect.height()) / 2 + _bevel_width; tmp->move(x, y); @@ -380,7 +381,7 @@ void Widget::adjustVert(void) if (prev_widget) y = prev_widget->_rect.y() + prev_widget->_rect.height() + _bevel_width; else - y = _rect.y() + _bevel_width; + y = _bevel_width; x = (widest - tmp->_rect.width()) / 2 + _bevel_width; tmp->move(x, y); @@ -440,7 +441,7 @@ void Widget::removeChild(Widget *child) _children.erase(it); } -void Widget::setStyle(Style *style) +void Widget::setStyle(RenderStyle *style) { assert(style); _style = style; @@ -463,19 +464,28 @@ void Widget::setEventDispatcher(EventDispatcher *disp) void Widget::exposeHandler(const XExposeEvent &e) { EventHandler::exposeHandler(e); - _dirty = true; - update(); +// XClearArea(**display, _window, e.x, e.y, e.width, e.height, false); } void Widget::configureHandler(const XConfigureEvent &e) { EventHandler::configureHandler(e); + if (_ignore_config) { _ignore_config--; } else { - if (!(e.width == _rect.width() && e.height == _rect.height())) { + int width = e.width; + int height = e.height; + + XEvent ev; + while (XCheckTypedWindowEvent(**display, _window, ConfigureNotify, &ev)) { + width = ev.xconfigure.width; + height = ev.xconfigure.height; + } + + if (!(width == _rect.width() && height == _rect.height())) { _dirty = true; - _rect.setSize(e.width, e.height); + _rect.setSize(width, height); } update(); }