+ 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;
+ int width;
+ bool draw = _dirty;
+
+ 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);
+ }