#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)
{
}
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:
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
case Type_RightGrip:
setBorderColor(_style->frameBorderColor());
break;
- case Type_StickyButton:
+ case Type_AllDesktopsButton:
case Type_CloseButton:
case Type_MaximizeButton:
case Type_IconifyButton:
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;
if (draw) {
switch (type()) {
- case Type_StickyButton:
- pm = _style->stickyMask();
+ case Type_AllDesktopsButton:
+ pm = _style->alldesktopsMask();
break;
case Type_CloseButton:
pm = _style->closeMask();
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();
_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);