draw only when needed
authorDana Jansens <danakj@orodu.net>
Fri, 27 Dec 2002 16:29:32 +0000 (16:29 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 27 Dec 2002 16:29:32 +0000 (16:29 +0000)
src/buttonwidget.cc
src/labelwidget.cc

index efb98e7..390e594 100644 (file)
@@ -81,49 +81,52 @@ void OBButtonWidget::update()
 {
   otk::PixmapMask *pm;
   int width;
+  bool draw = _dirty;
 
   otk::OtkWidget::update();
 
-  switch (type()) {
-  case Type_StickyButton:
-    pm = _style->getStickyButtonMask();
-    break;
-  case Type_CloseButton:
-    pm = _style->getCloseButtonMask();
-    break;
-  case Type_MaximizeButton:
-    pm = _style->getMaximizeButtonMask();
-    break;
-  case Type_IconifyButton:
-    pm = _style->getIconifyButtonMask();
-    break;
-  case Type_LeftGrip:
-  case Type_RightGrip:
-    return; // no drawing
-  default:
-    assert(false); // there's no other button widgets!
-  }
+  if (draw) {
+    switch (type()) {
+    case Type_StickyButton:
+      pm = _style->getStickyButtonMask();
+      break;
+    case Type_CloseButton:
+      pm = _style->getCloseButtonMask();
+      break;
+    case Type_MaximizeButton:
+      pm = _style->getMaximizeButtonMask();
+      break;
+    case Type_IconifyButton:
+      pm = _style->getIconifyButtonMask();
+      break;
+    case Type_LeftGrip:
+    case Type_RightGrip:
+      return; // no drawing
+    default:
+      assert(false); // there's no other button widgets!
+    }
 
-  if (pm->mask == None) return; // no mask for the button, leave it empty
+    if (pm->mask == None) return; // no mask for the button, leave it empty
 
-  width = _rect.width();
+    width = _rect.width();
   
-  otk::BPen pen(_focused ? *_style->getButtonPicFocus() :
-                           *_style->getButtonPicUnfocus());
-
-  // set the clip region
-  XSetClipMask(otk::OBDisplay::display, pen.gc(), pm->mask);
-  XSetClipOrigin(otk::OBDisplay::display, pen.gc(),
-                 (width - pm->w)/2, (width - pm->h)/2);
-
-  // fill in the clipped region
-  XFillRectangle(otk::OBDisplay::display, _window, pen.gc(),
-                 (width - pm->w)/2, (width - pm->h)/2,
-                 (width + pm->w)/2, (width + pm->h)/2);
-
-  // unset the clip region
-  XSetClipMask(otk::OBDisplay::display, pen.gc(), None);
-  XSetClipOrigin(otk::OBDisplay::display, pen.gc(), 0, 0);
+    otk::BPen pen(_focused ? *_style->getButtonPicFocus() :
+                  *_style->getButtonPicUnfocus());
+
+    // set the clip region
+    XSetClipMask(otk::OBDisplay::display, pen.gc(), pm->mask);
+    XSetClipOrigin(otk::OBDisplay::display, pen.gc(),
+                   (width - pm->w)/2, (width - pm->h)/2);
+
+    // fill in the clipped region
+    XFillRectangle(otk::OBDisplay::display, _window, pen.gc(),
+                   (width - pm->w)/2, (width - pm->h)/2,
+                   (width + pm->w)/2, (width + pm->h)/2);
+
+    // unset the clip region
+    XSetClipMask(otk::OBDisplay::display, pen.gc(), None);
+    XSetClipOrigin(otk::OBDisplay::display, pen.gc(), 0, 0);
+  }
 }
 
 
index 491dead..f00f738 100644 (file)
@@ -72,38 +72,42 @@ void OBLabelWidget::unfocus()
 
 void OBLabelWidget::update()
 {
-  OtkWidget::update();
+  bool draw = _dirty;
 
-  std::string t = _text;
-  int x = _sidemargin;    // x coord for the text
+  OtkWidget::update();
 
-  // find a string that will fit inside the area for text
-  int max_length = width() - _sidemargin * 2;
-  if (max_length <= 0) {
-    t = ""; // can't fit anything
-  } else {
-    size_t text_len = t.size();
-    int length;
+  if (draw) {
+    std::string t = _text;
+    int x = _sidemargin;    // x coord for the text
+
+    // find a string that will fit inside the area for text
+    int max_length = width() - _sidemargin * 2;
+    if (max_length <= 0) {
+      t = ""; // can't fit anything
+    } else {
+      size_t text_len = t.size();
+      int length;
       
-    do {
-      t.resize(text_len);
-      length = _font->measureString(t);
-    } while (length > max_length && text_len-- > 0);
-
-    // justify the text
-    switch (_justify) {
-    case otk::Style::RightJustify:
-      x += max_length - length;
-      break;
-    case otk::Style::CenterJustify:
-      x += (max_length - length) / 2;
-      break;
-    case otk::Style::LeftJustify:
-      break;
+      do {
+        t.resize(text_len);
+        length = _font->measureString(t);
+      } while (length > max_length && text_len-- > 0);
+
+      // justify the text
+      switch (_justify) {
+      case otk::Style::RightJustify:
+        x += max_length - length;
+        break;
+      case otk::Style::CenterJustify:
+        x += (max_length - length) / 2;
+        break;
+      case otk::Style::LeftJustify:
+        break;
+      }
     }
-  }
 
-  _font->drawString(_xftdraw, x, 0, *_text_color, t);
+    _font->drawString(_xftdraw, x, 0, *_text_color, t);
+  }
 }