draw only when needed

This commit is contained in:
Dana Jansens 2002-12-27 16:29:32 +00:00
parent 5fdd493d0d
commit d222c56543
2 changed files with 66 additions and 59 deletions

View 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());
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);
// 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);
// 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);
// unset the clip region
XSetClipMask(otk::OBDisplay::display, pen.gc(), None);
XSetClipOrigin(otk::OBDisplay::display, pen.gc(), 0, 0);
}
}

View file

@ -72,38 +72,42 @@ void OBLabelWidget::unfocus()
void OBLabelWidget::update()
{
bool draw = _dirty;
OtkWidget::update();
std::string t = _text;
int x = _sidemargin; // x coord for the text
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;
// 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);
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;
// 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);
}
}