X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Fwidget.hh;h=698e856bd2bf838282bb20bb9547fdeb6c02ac7a;hb=2c977ae7ffe1e287264989669d2cfd2eb499d4ee;hp=207de86c790e794046c41c8496761c3010aac039;hpb=c187fbdf60956f3bf6392bfd132ba960e43ef4ec;p=chaz%2Fopenbox diff --git a/otk/widget.hh b/otk/widget.hh index 207de86c..698e856b 100644 --- a/otk/widget.hh +++ b/otk/widget.hh @@ -1,55 +1,175 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- #ifndef __widget_hh #define __widget_hh -#include "basewidget.hh" +#include "rect.hh" +#include "point.hh" +#include "rendertexture.hh" +#include "renderstyle.hh" +#include "eventdispatcher.hh" +#include "display.hh" +#include "surface.hh" extern "C" { #include } +#include +#include + namespace otk { -class OtkWidget : public OtkBaseWidget { +class Widget : public EventHandler { public: enum Direction { Horizontal, Vertical }; - OtkWidget(OtkWidget *parent, Direction = Horizontal); - OtkWidget(OtkEventDispatcher *event_dispatcher, Style *style, - Direction direction = Horizontal, Cursor cursor = 0, - int bevel_width = 1); + typedef std::list WidgetList; + + Widget(Widget *parent, Direction = Horizontal); + Widget(EventDispatcher *event_dispatcher, RenderStyle *style, + Direction direction = Horizontal, Cursor cursor = 0, + int bevel_width = 1, bool override_redirect = false); - virtual ~OtkWidget(); + virtual ~Widget(); virtual void update(void); + void exposeHandler(const XExposeEvent &e); + void configureHandler(const XConfigureEvent &e); + + inline Window window(void) const { return _window; } + inline const Widget *parent(void) const { return _parent; } + inline const WidgetList &children(void) const { return _children; } + inline unsigned int screen(void) const { return _screen; } + inline const Rect &rect(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); + virtual void unfocus(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 RenderTexture *texture(void) const { return _texture; } + virtual void setTexture(RenderTexture *texture) + { _texture = texture; _dirty = true; } + + inline const RenderColor *borderColor(void) const { return _bcolor; } + virtual void setBorderColor(const RenderColor *color) { + assert(color); _bcolor = color; + XSetWindowBorder(**display, _window, color->pixel()); + } + + inline int borderWidth(void) const { return _bwidth; } + void setBorderWidth(int width) { + _bwidth = width; + XSetWindowBorderWidth(**display, _window, width); + } + + virtual void addChild(Widget *child, bool front = false); + virtual void removeChild(Widget *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 Direction getDirection(void) const { return _direction; } + inline Cursor cursor(void) const { return _cursor; } + void setCursor(Cursor cursor) { + _cursor = cursor; + XDefineCursor(**display, _window, _cursor); + } + + inline int bevelWidth(void) const { return _bevel_width; } + void setBevelWidth(int bevel_width) + { assert(bevel_width > 0); _bevel_width = bevel_width; } + + inline Direction direction(void) const { return _direction; } void setDirection(Direction dir) { _direction = dir; } - inline OtkEventDispatcher *getEventDispatcher(void) - { return _event_dispatcher; } - void setEventDispatcher(OtkEventDispatcher *disp); + inline RenderStyle *style(void) const { return _style; } + virtual void setStyle(RenderStyle *style); + + inline EventDispatcher *eventDispatcher(void) + { return _event_dispatcher; } + void setEventDispatcher(EventDispatcher *disp); + +protected: + + bool _dirty; + bool _focused; + + virtual void adjust(void); + virtual void create(bool override_redirect = false); + virtual void adjustHorz(void); + virtual void adjustVert(void); + virtual void internalResize(int width, int height); + virtual void render(void); + virtual void renderForeground() {} // for overriding -private: + Window _window; - void adjust(void); - void adjustHorz(void); - void adjustVert(void); - void internalResize(int width, int height); + Widget *_parent; + WidgetList _children; + RenderStyle *_style; Direction _direction; + Cursor _cursor; + int _bevel_width; + int _ignore_config; + + bool _visible; + + bool _grabbed_mouse; + bool _grabbed_keyboard; bool _stretchable_vert; bool _stretchable_horz; - OtkEventDispatcher *_event_dispatcher; + RenderTexture *_texture; + Pixmap _bg_pixmap; + unsigned int _bg_pixel; + + const RenderColor *_bcolor; + unsigned int _bwidth; + + Rect _rect; + unsigned int _screen; + + bool _fixed_width; + bool _fixed_height; + + Surface *_surface; + + EventDispatcher *_event_dispatcher; }; }