all repos — openbox @ d2df40965bbf042e062b65d6adc12bc158d503eb

openbox fork - make it a bit more like ryudo

otk/widget.hh (raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#ifndef __widget_hh
#define __widget_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 <assert.h>
}

#include <string>
#include <list>

namespace otk {

class Widget : public EventHandler {

public:

  enum Direction { Horizontal, Vertical };

  typedef std::list<Widget *> 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 ~Widget();

  virtual void update();

  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 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 RenderStyle *style(void) const { return _style; }
  virtual void setStyle(RenderStyle *style);

  inline long eventMask(void) const { return _event_mask; }
  void setEventMask(long e);

  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

  Window _window;

  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;

  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;

  long _event_mask;

  Surface *_surface;

  EventDispatcher *_event_dispatcher;
};

}

#endif // __widget_hh