From d222c565432a146313fe4673b67c517b6d649182 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 27 Dec 2002 16:29:32 +0000 Subject: [PATCH] draw only when needed --- src/buttonwidget.cc | 77 +++++++++++++++++++++++---------------------- src/labelwidget.cc | 58 ++++++++++++++++++---------------- 2 files changed, 71 insertions(+), 64 deletions(-) diff --git a/src/buttonwidget.cc b/src/buttonwidget.cc index efb98e76..390e5948 100644 --- a/src/buttonwidget.cc +++ b/src/buttonwidget.cc @@ -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); + } } diff --git a/src/labelwidget.cc b/src/labelwidget.cc index 491deadc..f00f738b 100644 --- a/src/labelwidget.cc +++ b/src/labelwidget.cc @@ -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); + } } -- 2.45.2