+ Status ret = XGrabPointer(**display, _window, True,
+ (ButtonPressMask | ButtonReleaseMask |
+ ButtonMotionMask | EnterWindowMask |
+ LeaveWindowMask | PointerMotionMask),
+ GrabModeSync, GrabModeAsync, None, None,
+ CurrentTime);
+ _grabbed_mouse = (ret == GrabSuccess);
+ return _grabbed_mouse;
+}
+
+void Widget::ungrabMouse(void)
+{
+ if (! _grabbed_mouse)
+ return;
+
+ XUngrabPointer(**display, CurrentTime);
+ _grabbed_mouse = false;
+}
+
+bool Widget::grabKeyboard(void)
+{
+ Status ret = XGrabKeyboard(**display, _window, True,
+ GrabModeSync, GrabModeAsync, CurrentTime);
+ _grabbed_keyboard = (ret == GrabSuccess);
+ return _grabbed_keyboard;
+
+}
+
+void Widget::ungrabKeyboard(void)
+{
+ if (! _grabbed_keyboard)
+ return;
+
+ XUngrabKeyboard(**display, CurrentTime);
+ _grabbed_keyboard = false;
+}
+
+void Widget::render(void)
+{
+ if (!_texture) return;
+
+ _bg_pixmap = _texture->render(_rect.width(), _rect.height(), _bg_pixmap);
+
+ if (_bg_pixmap) {
+ XSetWindowBackgroundPixmap(**display, _window, _bg_pixmap);
+ _bg_pixel = None;
+ } else {
+ unsigned int pix = _texture->color().pixel();
+ if (pix != _bg_pixel) {
+ _bg_pixel = pix;
+ XSetWindowBackground(**display, _window, pix);
+ }
+ }
+}
+
+void Widget::adjust(void)
+{
+ if (_direction == Horizontal)
+ adjustHorz();
+ else
+ adjustVert();
+}
+
+void Widget::adjustHorz(void)
+{
+ if (_children.size() == 0)