X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbuttonwidget.cc;h=810911be4bfccf30694c943c50600d0d97f6ee04;hb=8cc271604190c5200f34ffc8fee6100759c2fc60;hp=4c1bd908d0d73958bdec7921efc91fd1e3559178;hpb=dd6f90684899e8e26e653af4b2e7e7eab1abf798;p=chaz%2Fopenbox diff --git a/src/buttonwidget.cc b/src/buttonwidget.cc index 4c1bd908..810911be 100644 --- a/src/buttonwidget.cc +++ b/src/buttonwidget.cc @@ -5,16 +5,19 @@ #endif #include "buttonwidget.hh" -#include "otk/gccache.hh" // otk::BPen +#include "client.hh" namespace ob { ButtonWidget::ButtonWidget(otk::Widget *parent, - WidgetBase::WidgetType type) + WidgetBase::WidgetType type, + Client *client) : otk::Widget(parent), WidgetBase(type), + _client(client), _pressed(false), - _button(0) + _button(0), + _state(false) { } @@ -26,6 +29,21 @@ ButtonWidget::~ButtonWidget() void ButtonWidget::setTextures() { + bool p = _pressed; + + switch (type()) { + case Type_AllDesktopsButton: + if (_client->desktop() == (signed)0xffffffff) + p = true; + break; + case Type_MaximizeButton: + if (_client->maxHorz() || _client->maxVert()) + p = true; + break; + default: + break; + } + switch (type()) { case Type_LeftGrip: case Type_RightGrip: @@ -34,11 +52,11 @@ void ButtonWidget::setTextures() else setTexture(_style->gripUnfocusBackground()); break; - case Type_StickyButton: - case Type_CloseButton: + case Type_AllDesktopsButton: case Type_MaximizeButton: + case Type_CloseButton: case Type_IconifyButton: - if (_pressed) { + if (p) { if (_focused) setTexture(_style->buttonPressFocusBackground()); else @@ -66,7 +84,7 @@ void ButtonWidget::setStyle(otk::RenderStyle *style) case Type_RightGrip: setBorderColor(_style->frameBorderColor()); break; - case Type_StickyButton: + case Type_AllDesktopsButton: case Type_CloseButton: case Type_MaximizeButton: case Type_IconifyButton: @@ -79,9 +97,27 @@ void ButtonWidget::setStyle(otk::RenderStyle *style) void ButtonWidget::update() { - printf("ButtonWidget::update()\n"); + switch (type()) { + case Type_AllDesktopsButton: + if ((_client->desktop() == (signed)0xffffffff) != _state) { + _state = !_state; + setTextures(); + } + break; + case Type_MaximizeButton: + if ((_client->maxHorz() || _client->maxVert()) != _state) { + _state = !_state; + setTextures(); + } + break; + default: + break; + } + + otk::Widget::update(); } + void ButtonWidget::renderForeground() { otk::PixmapMask *pm; @@ -92,8 +128,8 @@ void ButtonWidget::renderForeground() if (draw) { switch (type()) { - case Type_StickyButton: - pm = _style->stickyMask(); + case Type_AllDesktopsButton: + pm = _style->alldesktopsMask(); break; case Type_CloseButton: pm = _style->closeMask(); @@ -111,6 +147,7 @@ void ButtonWidget::renderForeground() assert(false); // there's no other button widgets! } + assert(pm->mask); if (pm->mask == None) return; // no mask for the button, leave it empty width = _rect.width(); @@ -119,14 +156,13 @@ void ButtonWidget::renderForeground() _style->buttonUnfocusColor()); // set the clip region + int x = (width - pm->w) / 2, y = (width - pm->h) / 2; XSetClipMask(**otk::display, color->gc(), pm->mask); - XSetClipOrigin(**otk::display, color->gc(), - (width - pm->w)/2, (width - pm->h)/2); + XSetClipOrigin(**otk::display, color->gc(), x, y); // fill in the clipped region - XFillRectangle(**otk::display, _window, color->gc(), - (width - pm->w)/2, (width - pm->h)/2, - (width + pm->w)/2, (width + pm->h)/2); + XFillRectangle(**otk::display, _surface->pixmap(), color->gc(), x, y, + x + pm->w, y + pm->h); // unset the clip region XSetClipMask(**otk::display, color->gc(), None);