X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=otk%2Fwidget.cc;h=9f574ee930ba022a57ea333b3bdce1beb9ff58f2;hb=cfd8f9a65848c5e7b0514999581512069a4f98f6;hp=c49f199af29eab89ebcfcecfc8dc81860362c1af;hpb=6bcfd5d2183f216f339d61672885524a90612ff7;p=chaz%2Fopenbox diff --git a/otk/widget.cc b/otk/widget.cc index c49f199a..9f574ee9 100644 --- a/otk/widget.cc +++ b/otk/widget.cc @@ -23,8 +23,10 @@ Widget::Widget(Widget *parent, Direction direction) _visible(false), _grabbed_mouse(false), _grabbed_keyboard(false), _stretchable_vert(false), _stretchable_horz(false), _texture(0), _bg_pixmap(0), _bg_pixel(0), - _bcolor(0), _bwidth(0), _screen(parent->screen()), _fixed_width(false), - _fixed_height(false), _event_dispatcher(parent->eventDispatcher()) + _bcolor(0), _bwidth(0), _rect(0, 0, 1, 1), _screen(parent->screen()), + _fixed_width(false), _fixed_height(false), + _surface(parent->screen(), _rect.size()), + _event_dispatcher(parent->eventDispatcher()) { assert(parent); parent->addChild(this); @@ -42,8 +44,9 @@ Widget::Widget(EventDispatcher *event_dispatcher, Style *style, _bevel_width(bevel_width), _ignore_config(0), _visible(false), _grabbed_mouse(false), _grabbed_keyboard(false), _stretchable_vert(false), _stretchable_horz(false), _texture(0), - _bg_pixmap(0), _bg_pixel(0), _bcolor(0), _bwidth(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()), _event_dispatcher(event_dispatcher) { assert(event_dispatcher); @@ -153,6 +156,8 @@ void Widget::setGeometry(int x, int y, int width, int height) _rect = Rect(x, y, width, height); _dirty = true; + // don't use an XMoveResizeWindow here, because it doesn't seem to move + // windows with StaticGravity? This works, that didn't. XResizeWindow(**display, _window, width, height); XMoveWindow(**display, _window, x, y); _ignore_config+=2; @@ -254,19 +259,14 @@ void Widget::ungrabKeyboard(void) void Widget::render(void) { if (!_texture) return; + printf("RENDER\n"); - _bg_pixmap = _texture->render(_rect.width(), _rect.height(), _bg_pixmap); + _surface = Surface(_screen, _rect.size()); + display->renderControl(_screen)->drawBackground(_surface, *_texture); - if (_bg_pixmap) { - XSetWindowBackgroundPixmap(**display, _window, _bg_pixmap); - _bg_pixel = None; - } else { - unsigned int pix = _texture->color().pixel(); - if (pix != _bg_pixel) { - _bg_pixel = pix; - XSetWindowBackground(**display, _window, pix); - } - } + renderForeground(); + + XSetWindowBackgroundPixmap(**display, _window, _surface.pixmap()); } void Widget::adjust(void) @@ -463,8 +463,7 @@ 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)