From 18378aaba1a552c0d4b9386f60f900c658914754 Mon Sep 17 00:00:00 2001 From: Marius Nita Date: Sun, 10 Nov 2002 13:33:34 +0000 Subject: [PATCH] initial commit --- otk/widget.cc | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++ otk/widget.hh | 93 ++++++++++++++++++++++++++ 2 files changed, 275 insertions(+) create mode 100644 otk/widget.cc create mode 100644 otk/widget.hh diff --git a/otk/widget.cc b/otk/widget.cc new file mode 100644 index 00000000..ea88a429 --- /dev/null +++ b/otk/widget.cc @@ -0,0 +1,182 @@ +#include "widget.hh" +#include "display.hh" +#include "assassin.hh" +#include "screeninfo.hh" + +namespace otk { + +OtkWidget::OtkWidget(OtkWidget *parent) + : _parent(parent), _visible(false), _focused(false), _grabbed_mouse(false), + _grabbed_keyboard(false), _stretchable_vert(false), + _stretchable_horz(false), _texture(NULL), _screen(parent->getScreen()), + _cursor(parent->getCursor()) +{ + parent->addChild(this); + create(); +} + +OtkWidget::OtkWidget(unsigned int screen, Cursor cursor = 0) + : _parent(NULL), _visible(false), _focused(false), _grabbed_mouse(false), + _grabbed_keyboard(false), _stretchable_vert(false), + _stretchable_horz(false), _texture(NULL), _screen(screen), + _cursor(cursor) +{ + create(); +} + +OtkWidget::~OtkWidget() +{ + if (_visible) + hide(); + + 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(10, 10, 20, 20); + + 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; + + 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); +} + +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); +} + +void OtkWidget::resize(const Point &to) +{ + resize(to.x(), to.y()); +} + +void OtkWidget::resize(int x, int y) +{ + assert(x >= _rect.x() && y >= _rect.y()); + + _rect.setWidth(x - _rect.x()); + _rect.setHeight(y - _rect.y()); +} + +void OtkWidget::setGeometry(const Rect &new_geom) +{ + setGeometry(new_geom.x(), new_geom.y(), new_geom.height(), new_geom.width()); +} + +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); + XMoveResizeWindow(otk::OBDisplay::display, _window, x, y, width, height); +} + +void OtkWidget::show(void) +{ + if (_visible) + return; + + OtkWidgetList::iterator it = _children.begin(), end = _children.end(); + for (; it != end; ++it) + (*it)->show(); + + XMapWindow(otk::OBDisplay::display, _window); + _visible = true; +} + +void OtkWidget::hide(void) +{ + if (! _visible) + return; + + 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); +} + +void OtkWidget::blur(void) +{ + // ? +} + +bool OtkWidget::grabMouse(void) +{ + return true; +} + +void OtkWidget::ungrabMouse(void) +{ + +} + +bool OtkWidget::grabKeyboard(void) +{ + return true; +} + +void OtkWidget::ungrabKeyboard(void) +{ + +} + +void OtkWidget::setTexture(BTexture *texture) +{ + texture = texture; +} + +void OtkWidget::addChild(OtkWidget *child) +{ + child = child; +} + +void OtkWidget::removeChild(OtkWidget *child) +{ + child = child; +} + +} diff --git a/otk/widget.hh b/otk/widget.hh new file mode 100644 index 00000000..bee3ef82 --- /dev/null +++ b/otk/widget.hh @@ -0,0 +1,93 @@ +#include +#include + +#include "rect.hh" +#include "point.hh" +#include "texture.hh" + +namespace otk { + +class OtkWidget { + +public: + + typedef std::list OtkWidgetList; + + OtkWidget(OtkWidget *parent); + OtkWidget(unsigned int screen, Cursor); + + virtual ~OtkWidget(); + + 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 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(void); + virtual void hide(void); + + inline bool isFocused(void) const { return _focused; }; + virtual void focus(void); + virtual void blur(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 const BTexture *getTexture(void) const { return _texture; } + virtual void setTexture(BTexture *texture); + + virtual void addChild(OtkWidget *child); + virtual void removeChild(OtkWidget *child); + + inline bool getStretchableHorz(void) const { return _stretchable_horz; } + void setStretchableHorz(bool s_horz) { _stretchable_horz = s_horz; } + + inline bool getStretchableVert(void) const { return _stretchable_vert; } + void setStretchableVert(bool s_vert) { _stretchable_vert = s_vert; } + + inline Cursor getCursor(void) const { return _cursor; } + +private: + + void create(void); + + Window _window; + + OtkWidget *_parent; + OtkWidgetList _children; + + bool _visible; + bool _focused; + + bool _grabbed_mouse; + bool _grabbed_keyboard; + + bool _stretchable_vert; + bool _stretchable_horz; + + BTexture *_texture; + + Rect _rect; + unsigned int _screen; + + Cursor _cursor; +}; + +} -- 2.39.2