X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbuttonwidget.cc;h=810911be4bfccf30694c943c50600d0d97f6ee04;hb=fc4885a3f4c2a023a6e64cce62fc5cde1667f2e9;hp=867cc5be1c797d9fc2b8780c88f1ce415d224eff;hpb=83727b8e6404f7e00e7369c39da8779dfb85ae09;p=chaz%2Fopenbox diff --git a/src/buttonwidget.cc b/src/buttonwidget.cc index 867cc5be..810911be 100644 --- a/src/buttonwidget.cc +++ b/src/buttonwidget.cc @@ -5,52 +5,211 @@ #endif #include "buttonwidget.hh" +#include "client.hh" namespace ob { -OBButtonWidget::OBButtonWidget(otk::OtkWidget *parent, - OBWidget::WidgetType type) - : otk::OtkButton(parent), - OBWidget(type) +ButtonWidget::ButtonWidget(otk::Widget *parent, + WidgetBase::WidgetType type, + Client *client) + : otk::Widget(parent), + WidgetBase(type), + _client(client), + _pressed(false), + _button(0), + _state(false) { } -OBButtonWidget::~OBButtonWidget() +ButtonWidget::~ButtonWidget() { } -void OBButtonWidget::setStyle(otk::Style *style) +void ButtonWidget::setTextures() { - otk::OtkButton::setStyle(style); + 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: + if (_focused) + setTexture(_style->gripFocusBackground()); + else + setTexture(_style->gripUnfocusBackground()); + break; + case Type_AllDesktopsButton: + case Type_MaximizeButton: + case Type_CloseButton: + case Type_IconifyButton: + if (p) { + if (_focused) + setTexture(_style->buttonPressFocusBackground()); + else + setTexture(_style->buttonPressUnfocusBackground()); + } else { + if (_focused) + setTexture(_style->buttonUnpressFocusBackground()); + else + setTexture(_style->buttonUnpressUnfocusBackground()); + } + break; + default: + assert(false); // there's no other button widgets! + } +} + + +void ButtonWidget::setStyle(otk::RenderStyle *style) +{ + otk::Widget::setStyle(style); + setTextures(); switch (type()) { case Type_LeftGrip: case Type_RightGrip: - setTexture(style->getGripFocus()); - setUnfocusTexture(style->getGripUnfocus()); - setPressedFocusTexture(style->getGripFocus()); - setPressedUnfocusTexture(style->getGripUnfocus()); - setTexture(style->getGripFocus()); - setUnfocusTexture(style->getGripUnfocus()); - setPressedFocusTexture(style->getGripFocus()); - setPressedUnfocusTexture(style->getGripUnfocus()); - setBorderColor(_style->getBorderColor()); - setUnfocusBorderColor(style->getBorderColor()); + setBorderColor(_style->frameBorderColor()); + break; + case Type_AllDesktopsButton: + case Type_CloseButton: + case Type_MaximizeButton: + case Type_IconifyButton: + break; + default: + assert(false); // there's no other button widgets! + } +} + + +void ButtonWidget::update() +{ + 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 OBButtonWidget::adjust() +void ButtonWidget::renderForeground() { - otk::OtkButton::adjust(); + otk::PixmapMask *pm; + int width; + bool draw = _dirty; - // XXX: adjust shit + otk::Widget::renderForeground(); + + if (draw) { + switch (type()) { + case Type_AllDesktopsButton: + pm = _style->alldesktopsMask(); + break; + case Type_CloseButton: + pm = _style->closeMask(); + break; + case Type_MaximizeButton: + pm = _style->maximizeMask(); + break; + case Type_IconifyButton: + pm = _style->iconifyMask(); + break; + case Type_LeftGrip: + case Type_RightGrip: + return; // no drawing + default: + 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(); + + otk::RenderColor *color = (_focused ? _style->buttonFocusColor() : + _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(), x, y); + + // fill in the clipped region + 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); + XSetClipOrigin(**otk::display, color->gc(), 0, 0); + } } +void ButtonWidget::adjust() +{ + // nothing to adjust. no children. +} + + +void ButtonWidget::focus() +{ + otk::Widget::focus(); + setTextures(); +} + + +void ButtonWidget::unfocus() +{ + otk::Widget::unfocus(); + setTextures(); +} + + +void ButtonWidget::buttonPressHandler(const XButtonEvent &e) +{ + otk::Widget::buttonPressHandler(e); + if (_button) return; + _button = e.button; + _pressed = true; + setTextures(); + update(); +} + + +void ButtonWidget::buttonReleaseHandler(const XButtonEvent &e) +{ + otk::Widget::buttonPressHandler(e); + if (e.button != _button) return; + _button = 0; + _pressed = false; + setTextures(); + update(); +} + }