From 301adc8bc20dff10093f3c0df44e30acbbddab67 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 4 Dec 2002 13:07:40 +0000 Subject: [PATCH] split up widget and basewidget --- otk/Makefile.am | 3 +- otk/focuswidget.cc | 12 +- otk/widget.cc | 307 ++++----------------------------------------- otk/widget.hh | 106 +--------------- 4 files changed, 33 insertions(+), 395 deletions(-) diff --git a/otk/Makefile.am b/otk/Makefile.am index 3f32a45e..6b1f42c1 100644 --- a/otk/Makefile.am +++ b/otk/Makefile.am @@ -9,7 +9,8 @@ libotk_a_SOURCES= color.cc display.cc font.cc gccache.cc image.cc \ texture.cc timer.cc timerqueuemanager.cc style.cc \ configuration.cc util.cc widget.cc focuswidget.cc \ button.cc eventhandler.cc eventdispatcher.cc \ - label.cc focuslabel.cc application.cc appwidget.cc + label.cc focuslabel.cc application.cc appwidget.cc \ + basewidget.cc MAINTAINERCLEANFILES= Makefile.in diff --git a/otk/focuswidget.cc b/otk/focuswidget.cc index 22a6100b..e956561e 100644 --- a/otk/focuswidget.cc +++ b/otk/focuswidget.cc @@ -29,11 +29,7 @@ void OtkFocusWidget::focus(void) OtkWidget::setTexture(_focus_texture); OtkWidget::update(); - OtkWidget::OtkWidgetList children = OtkWidget::getChildren(); - - OtkWidget::OtkWidgetList::iterator it = children.begin(), - end = children.end(); - + OtkBaseWidgetList::iterator it = _children.begin(), end = _children.end(); OtkFocusWidget *tmp = 0; for (; it != end; ++it) { tmp = dynamic_cast(*it); @@ -50,11 +46,7 @@ void OtkFocusWidget::unfocus(void) OtkWidget::setTexture(_unfocus_texture); OtkWidget::update(); - OtkWidget::OtkWidgetList children = OtkWidget::getChildren(); - - OtkWidget::OtkWidgetList::iterator it = children.begin(), - end = children.end(); - + OtkBaseWidgetList::iterator it = _children.begin(), end = _children.end(); OtkFocusWidget *tmp = 0; for (; it != end; ++it) { tmp = dynamic_cast(*it); diff --git a/otk/widget.cc b/otk/widget.cc index 6423a7af..a859809f 100644 --- a/otk/widget.cc +++ b/otk/widget.cc @@ -5,247 +5,35 @@ #endif // HAVE_CONFIG_H #include "widget.hh" -#include "display.hh" -#include "assassin.hh" -#include "screeninfo.hh" #include -#include namespace otk { OtkWidget::OtkWidget(OtkWidget *parent, Direction direction) - : OtkEventHandler(), - _dirty(false), - _parent(parent), _style(parent->getStyle()), _direction(direction), - _cursor(parent->getCursor()), _bevel_width(parent->getBevelWidth()), - _ignore_config(0), - _visible(false), _focused(false), _grabbed_mouse(false), - _grabbed_keyboard(false), _stretchable_vert(false), - _stretchable_horz(false), _texture(0), _bg_pixmap(0), _bg_pixel(0), - _screen(parent->getScreen()), _fixed_width(false), _fixed_height(false), - _event_dispatcher(parent->getEventDispatcher()), _application(0) + : OtkBaseWidget(parent), + OtkEventHandler(), + _direction(direction), _stretchable_vert(false), _stretchable_horz(false), + _event_dispatcher(parent->getEventDispatcher()) { assert(parent); - parent->addChild(this); - create(); - _event_dispatcher->registerHandler(_window, this); + _event_dispatcher->registerHandler(getWindow(), this); } OtkWidget::OtkWidget(OtkEventDispatcher *event_dispatcher, Style *style, Direction direction, Cursor cursor, int bevel_width) - : OtkEventHandler(), - _dirty(false), - _parent(0), _style(style), _direction(direction), _cursor(cursor), - _bevel_width(bevel_width), _ignore_config(0), _visible(false), - _focused(false), _grabbed_mouse(false), _grabbed_keyboard(false), - _stretchable_vert(false), _stretchable_horz(false), _texture(0), - _bg_pixmap(0), _bg_pixel(0), _screen(style->getScreen()), - _fixed_width(false), _fixed_height(false), - _event_dispatcher(event_dispatcher), _application(0) + : OtkBaseWidget(style, cursor, bevel_width), + OtkEventHandler(), + _direction(direction), _stretchable_vert(false), _stretchable_horz(false), + _event_dispatcher(event_dispatcher) { assert(event_dispatcher); - assert(style); - create(); - _event_dispatcher->registerHandler(_window, this); + _event_dispatcher->registerHandler(getWindow(), this); } OtkWidget::~OtkWidget() { - if (_visible) - hide(); - _event_dispatcher->clearHandler(_window); - - std::for_each(_children.begin(), _children.end(), PointerAssassin()); - - if (_parent) - _parent->removeChild(this); - - XDestroyWindow(otk::OBDisplay::display, _window); -} - -void OtkWidget::create(void) -{ - const ScreenInfo *scr_info = otk::OBDisplay::screenInfo(_screen); - Window p_window = _parent ? _parent->getWindow() : scr_info->getRootWindow(); - - _rect.setRect(0, 0, 1, 1); // just some initial values - - XSetWindowAttributes attrib_create; - unsigned long create_mask = CWBackPixmap | CWBorderPixel | CWEventMask; - - attrib_create.background_pixmap = None; - attrib_create.colormap = scr_info->getColormap(); - attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | ExposureMask | StructureNotifyMask; - - if (_cursor) { - create_mask |= CWCursor; - attrib_create.cursor = _cursor; - } - - _window = XCreateWindow(otk::OBDisplay::display, p_window, _rect.x(), - _rect.y(), _rect.width(), _rect.height(), 0, - scr_info->getDepth(), InputOutput, - scr_info->getVisual(), create_mask, &attrib_create); - _ignore_config++; -} - -void OtkWidget::setWidth(int w) -{ - assert(w > 0); - _fixed_width = true; - setGeometry(_rect.x(), _rect.y(), w, _rect.height()); -} - -void OtkWidget::setHeight(int h) -{ - assert(h > 0); - _fixed_height = true; - setGeometry(_rect.x(), _rect.y(), _rect.width(), h); -} - -void OtkWidget::move(const Point &to) -{ - move(to.x(), to.y()); -} - -void OtkWidget::move(int x, int y) -{ - _rect.setPos(x, y); - XMoveWindow(otk::OBDisplay::display, _window, x, y); - _ignore_config++; -} - -void OtkWidget::resize(const Point &to) -{ - resize(to.x(), to.y()); -} - -void OtkWidget::resize(int w, int h) -{ - assert(w > 0 && h > 0); - _fixed_width = _fixed_height = true; - setGeometry(_rect.x(), _rect.y(), w, h); -} - -void OtkWidget::setGeometry(const Rect &new_geom) -{ - setGeometry(new_geom.x(), new_geom.y(), new_geom.width(), new_geom.height()); -} - -void OtkWidget::setGeometry(const Point &topleft, int width, int height) -{ - setGeometry(topleft.x(), topleft.y(), width, height); -} - -void OtkWidget::setGeometry(int x, int y, int width, int height) -{ - _rect = Rect(x, y, width, height); - _dirty = true; - - XMoveResizeWindow(otk::OBDisplay::display, _window, x, y, width, height); - _ignore_config++; -} - -void OtkWidget::show(bool recursive) -{ - if (_visible) - return; - - // make sure the internal state isn't mangled - if (_dirty) - update(); - - if (recursive) { - OtkWidgetList::iterator it = _children.begin(), end = _children.end(); - for (; it != end; ++it) - (*it)->show(); - } - - XMapWindow(otk::OBDisplay::display, _window); - _visible = true; -} - -void OtkWidget::hide(bool recursive) -{ - if (! _visible) - return; - - if (recursive) { - OtkWidgetList::iterator it = _children.begin(), end = _children.end(); - for (; it != end; ++it) - (*it)->hide(); - } - - XUnmapWindow(otk::OBDisplay::display, _window); - _visible = false; -} - -void OtkWidget::focus(void) -{ - if (! _visible) - return; - - XSetInputFocus(otk::OBDisplay::display, _window, RevertToPointerRoot, - CurrentTime); -} - -bool OtkWidget::grabMouse(void) -{ - Status ret = XGrabPointer(otk::OBDisplay::display, _window, True, - (ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | EnterWindowMask | - LeaveWindowMask | PointerMotionMask), - GrabModeSync, GrabModeAsync, None, None, - CurrentTime); - _grabbed_mouse = (ret == GrabSuccess); - return _grabbed_mouse; -} - -void OtkWidget::ungrabMouse(void) -{ - if (! _grabbed_mouse) - return; - - XUngrabPointer(otk::OBDisplay::display, CurrentTime); - _grabbed_mouse = false; -} - -bool OtkWidget::grabKeyboard(void) -{ - Status ret = XGrabKeyboard(otk::OBDisplay::display, _window, True, - GrabModeSync, GrabModeAsync, CurrentTime); - _grabbed_keyboard = (ret == GrabSuccess); - return _grabbed_keyboard; - -} - -void OtkWidget::ungrabKeyboard(void) -{ - if (! _grabbed_keyboard) - return; - - XUngrabKeyboard(otk::OBDisplay::display, CurrentTime); - _grabbed_keyboard = false; -} - -void OtkWidget::render(void) -{ - if (!_texture) return; - - _bg_pixmap = _texture->render(_rect.width(), _rect.height(), _bg_pixmap); - - if (_bg_pixmap) - XSetWindowBackgroundPixmap(otk::OBDisplay::display, _window, _bg_pixmap); - else { - unsigned int pix = _texture->color().pixel(); - if (pix != _bg_pixel) { - _bg_pixel = pix; - XSetWindowBackground(otk::OBDisplay::display, _window, pix); - } - } } void OtkWidget::adjust(void) @@ -262,14 +50,14 @@ void OtkWidget::adjustHorz(void) return; OtkWidget *tmp; - OtkWidgetList::iterator it, end = _children.end(); + OtkBaseWidgetList::iterator it, end = _children.end(); int tallest = 0; int width = _bevel_width; - OtkWidgetList stretchable; + OtkBaseWidgetList stretchable; for (it = _children.begin(); it != end; ++it) { - tmp = *it; + if (!(tmp = dynamic_cast(*it))) continue; if (tmp->isStretchableVert()) tmp->setHeight(_rect.height() > _bevel_width * 2 ? _rect.height() - _bevel_width * 2 : _bevel_width); @@ -283,7 +71,7 @@ void OtkWidget::adjustHorz(void) } if (stretchable.size() > 0) { - OtkWidgetList::iterator str_it = stretchable.begin(), + OtkBaseWidgetList::iterator str_it = stretchable.begin(), str_end = stretchable.end(); int str_width = _rect.width() - width / stretchable.size(); @@ -296,7 +84,7 @@ void OtkWidget::adjustHorz(void) OtkWidget *prev_widget = 0; for (it = _children.begin(); it != end; ++it) { - tmp = *it; + if (!(tmp = dynamic_cast(*it))) continue; int x, y; if (prev_widget) @@ -319,14 +107,14 @@ void OtkWidget::adjustVert(void) return; OtkWidget *tmp; - OtkWidgetList::iterator it, end = _children.end(); + OtkBaseWidgetList::iterator it, end = _children.end(); int widest = 0; int height = _bevel_width; - OtkWidgetList stretchable; + OtkBaseWidgetList stretchable; for (it = _children.begin(); it != end; ++it) { - tmp = *it; + if (!(tmp = dynamic_cast(*it))) continue; if (tmp->isStretchableHorz()) tmp->setWidth(_rect.width() > _bevel_width * 2 ? _rect.width() - _bevel_width * 2 : _bevel_width); @@ -340,7 +128,7 @@ void OtkWidget::adjustVert(void) } if (stretchable.size() > 0) { - OtkWidgetList::iterator str_it = stretchable.begin(), + OtkBaseWidgetList::iterator str_it = stretchable.begin(), str_end = stretchable.end(); int str_height = _rect.height() - height / stretchable.size(); @@ -353,7 +141,7 @@ void OtkWidget::adjustVert(void) OtkWidget *prev_widget = 0; for (it = _children.begin(); it != end; ++it) { - tmp = *it; + if (!(tmp = dynamic_cast(*it))) continue; int x, y; if (prev_widget) @@ -372,65 +160,24 @@ void OtkWidget::adjustVert(void) void OtkWidget::update(void) { - if (_dirty) { - if (! _unmanaged) + if (_dirty) adjust(); - render(); - XClearWindow(OBDisplay::display, _window); - } - OtkWidgetList::iterator it = _children.begin(), end = _children.end(); - for (; it != end; ++it) - (*it)->update(); - - _dirty = false; + OtkBaseWidget::update(); } void OtkWidget::internalResize(int w, int h) { assert(w > 0 && h > 0); - if (! _fixed_width && ! _fixed_height) +// if (! _fixed_width && ! _fixed_height) resize(w, h); - else if (! _fixed_width) - resize(w, _rect.height()); - else if (! _fixed_height) - resize(_rect.width(), h); -} - -void OtkWidget::addChild(OtkWidget *child, bool front) -{ - assert(child); - if (front) - _children.push_front(child); - else - _children.push_back(child); +// else if (! _fixed_width) +// resize(w, _rect.height()); +// else if (! _fixed_height) +// resize(_rect.width(), h); } -void OtkWidget::removeChild(OtkWidget *child) -{ - assert(child); - OtkWidgetList::iterator it, end = _children.end(); - for (it = _children.begin(); it != end; ++it) { - if ((*it) == child) - break; - } - - if (it != _children.end()) - _children.erase(it); -} - -void OtkWidget::setStyle(Style *style) -{ - assert(style); - _style = style; - _dirty = true; - OtkWidgetList::iterator it, end = _children.end(); - for (it = _children.begin(); it != end; ++it) - (*it)->setStyle(style); -} - - void OtkWidget::setEventDispatcher(OtkEventDispatcher *disp) { if (_event_dispatcher) diff --git a/otk/widget.hh b/otk/widget.hh index 249a4e28..5c008e18 100644 --- a/otk/widget.hh +++ b/otk/widget.hh @@ -1,30 +1,21 @@ #ifndef __widget_hh #define __widget_hh -#include "rect.hh" -#include "point.hh" -#include "texture.hh" -#include "style.hh" +#include "basewidget.hh" #include "eventdispatcher.hh" -#include "application.hh" extern "C" { #include } -#include -#include - namespace otk { -class OtkWidget : public OtkEventHandler { +class OtkWidget : public OtkBaseWidget, public OtkEventHandler { public: enum Direction { Horizontal, Vertical }; - typedef std::list OtkWidgetList; - OtkWidget(OtkWidget *parent, Direction = Horizontal); OtkWidget(OtkEventDispatcher *event_dispatcher, Style *style, Direction direction = Horizontal, Cursor cursor = 0, @@ -37,125 +28,32 @@ public: void exposeHandler(const XExposeEvent &e); void configureHandler(const XConfigureEvent &e); - inline Window getWindow(void) const { return _window; } - inline const OtkWidget *getParent(void) const { return _parent; } - inline const OtkWidgetList &getChildren(void) const { return _children; } - inline unsigned int getScreen(void) const { return _screen; } - inline const Rect &getRect(void) const { return _rect; } - - void move(const Point &to); - void move(int x, int y); - - virtual void setWidth(int); - virtual void setHeight(int); - - virtual int width() const { return _rect.width(); } - virtual int height() const { return _rect.height(); } - - virtual void resize(const Point &to); - virtual void resize(int x, int y); - - virtual void setGeometry(const Rect &new_geom); - virtual void setGeometry(const Point &topleft, int width, int height); - virtual void setGeometry(int x, int y, int width, int height); - - inline bool isVisible(void) const { return _visible; }; - virtual void show(bool recursive = false); - virtual void hide(bool recursive = false); - - inline bool isFocused(void) const { return _focused; }; - virtual void focus(void); - - inline bool hasGrabbedMouse(void) const { return _grabbed_mouse; } - bool grabMouse(void); - void ungrabMouse(void); - - inline bool hasGrabbedKeyboard(void) const { return _grabbed_keyboard; } - bool grabKeyboard(void); - void ungrabKeyboard(void); - - inline BTexture *getTexture(void) const { return _texture; } - virtual void setTexture(BTexture *texture) - { _texture = texture; _dirty = true; } - - virtual void addChild(OtkWidget *child, bool front = false); - virtual void removeChild(OtkWidget *child); - inline bool isStretchableHorz(void) const { return _stretchable_horz; } void setStretchableHorz(bool s_horz = true) { _stretchable_horz = s_horz; } inline bool isStretchableVert(void) const { return _stretchable_vert; } void setStretchableVert(bool s_vert = true) { _stretchable_vert = s_vert; } - inline Cursor getCursor(void) const { return _cursor; } - void setCursor(Cursor cursor) { - _cursor = cursor; - XDefineCursor(OBDisplay::display, _window, _cursor); - } - - inline int getBevelWidth(void) const { return _bevel_width; } - void setBevelWidth(int bevel_width) - { assert(bevel_width > 0); _bevel_width = bevel_width; } - inline Direction getDirection(void) const { return _direction; } void setDirection(Direction dir) { _direction = dir; } - inline Style *getStyle(void) const { return _style; } - virtual void setStyle(Style *style); - inline OtkEventDispatcher *getEventDispatcher(void) { return _event_dispatcher; } void setEventDispatcher(OtkEventDispatcher *disp); - void unmanaged(void) { _unmanaged = true; } - -protected: - - bool _dirty; - private: - void create(void); void adjust(void); void adjustHorz(void); void adjustVert(void); void internalResize(int width, int height); - void render(void); - - Window _window; - - OtkWidget *_parent; - OtkWidgetList _children; - Style *_style; Direction _direction; - Cursor _cursor; - int _bevel_width; - int _ignore_config; - - bool _visible; - bool _focused; - - bool _grabbed_mouse; - bool _grabbed_keyboard; bool _stretchable_vert; bool _stretchable_horz; - BTexture *_texture; - Pixmap _bg_pixmap; - unsigned int _bg_pixel; - - Rect _rect; - unsigned int _screen; - - bool _fixed_width; - bool _fixed_height; - - bool _unmanaged; - OtkEventDispatcher *_event_dispatcher; - OtkApplication *_application; }; } -- 2.45.2