]> Dogcows Code - chaz/openbox/blobdiff - src/buttonwidget.cc
supply the same interface with optional arguments as before. increment callback funct...
[chaz/openbox] / src / buttonwidget.cc
index 4c1bd908d0d73958bdec7921efc91fd1e3559178..810911be4bfccf30694c943c50600d0d97f6ee04 100644 (file)
@@ -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);
This page took 0.028146 seconds and 4 git commands to generate.