+void Widget::render(void)
+{
+ if (!_texture) return;
+
+ Surface *s = _surface; // save the current surface
+
+ _surface = new Surface(_screen, _rect.size());
+ display->renderControl(_screen)->drawBackground(*_surface, *_texture);
+
+ renderForeground(); // for inherited types to render onto the _surface
+
+ XSetWindowBackgroundPixmap(**display, _window, _surface->pixmap());
+
+ delete s; // delete the old surface *after* its pixmap isn't in use anymore
+}
+
+void Widget::adjust(void)
+{
+ if (_direction == Horizontal)
+ adjustHorz();
+ else
+ adjustVert();
+}
+
+void Widget::adjustHorz(void)
+{
+ if (_children.size() == 0)
+ return;
+
+ Widget *tmp;
+ WidgetList::iterator it, end = _children.end();
+
+ int tallest = 0;
+ int width = _bevel_width;
+ WidgetList stretchable;
+
+ for (it = _children.begin(); it != end; ++it) {
+ tmp = *it;
+ if (tmp->isStretchableVert())
+ tmp->setHeight(_rect.height() > _bevel_width * 2 ?
+ _rect.height() - _bevel_width * 2 : _bevel_width);
+ if (tmp->isStretchableHorz())
+ stretchable.push_back(tmp);
+ else
+ width += tmp->_rect.width() + _bevel_width;
+
+ if (tmp->_rect.height() > tallest)
+ tallest = tmp->_rect.height();
+ }
+
+ if (stretchable.size() > 0) {
+ WidgetList::iterator str_it = stretchable.begin(),
+ str_end = stretchable.end();
+
+ int str_width = _rect.width() - width / stretchable.size();
+
+ for (; str_it != str_end; ++str_it)
+ (*str_it)->setWidth(str_width > _bevel_width ? str_width - _bevel_width
+ : _bevel_width);
+ }
+
+ Widget *prev_widget = 0;
+
+ for (it = _children.begin(); it != end; ++it) {
+ tmp = *it;
+ int x, y;
+
+ if (prev_widget)
+ x = prev_widget->_rect.x() + prev_widget->_rect.width() + _bevel_width;
+ else
+ x = _bevel_width;
+ y = (tallest - tmp->_rect.height()) / 2 + _bevel_width;
+
+ tmp->move(x, y);
+
+ prev_widget = tmp;
+ }
+ internalResize(width, tallest + _bevel_width * 2);
+}
+
+void Widget::adjustVert(void)