all repos — openbox @ 684405eec8553918b62e334bffe29eb4712ec95c

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
#ifndef __widget_hh
#define __widget_hh

#include "rect.hh"
#include "point.hh"
#include "texture.hh"
#include "style.hh"
#include "eventdispatcher.hh"
#include "display.hh"

extern "C" {
#include <assert.h>
}

#include <string>
#include <list>

namespace otk {

class OtkWidget : public OtkEventHandler {

public:

  enum Direction { Horizontal, Vertical };

  typedef std::list<OtkWidget *> OtkWidgetList;

  OtkWidget(otk::OtkWidget *parent, Direction = Horizontal);
  OtkWidget(otk::OtkEventDispatcher *event_dispatcher, otk::Style *style,
            Direction direction = Horizontal, Cursor cursor = 0,
            int bevel_width = 1, bool override_redirect = false);

  virtual ~OtkWidget();

  virtual void update(void);

  void exposeHandler(const XExposeEvent &e);
  void configureHandler(const XConfigureEvent &e);

  inline Window window(void) const { return _window; }
  inline const otk::OtkWidget *parent(void) const { return _parent; }
  inline const OtkWidgetList &children(void) const { return _children; }
  inline unsigned int screen(void) const { return _screen; }
  inline const otk::Rect &rect(void) const { return _rect; }

  void move(const otk::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 otk::Point &to);
  virtual void resize(int x, int y);

  virtual void setGeometry(const otk::Rect &new_geom);
  virtual void setGeometry(const otk::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 otk::BTexture *texture(void) const { return _texture; }
  virtual void setTexture(otk::BTexture *texture)
    { _texture = texture; _dirty = true; }

  inline const otk::BColor *borderColor(void) const { return _bcolor; }
  virtual void setBorderColor(const otk::BColor *color) {
    assert(color); _bcolor = color;
    XSetWindowBorder(OBDisplay::display, _window, color->pixel());
  }

  inline int borderWidth(void) const { return _bwidth; }
  void setBorderWidth(int width) {
    _bwidth = width;
    XSetWindowBorderWidth(otk::OBDisplay::display, _window, width);
  }

  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 cursor(void) const { return _cursor; }
  void setCursor(Cursor cursor) {
    _cursor = cursor;
    XDefineCursor(OBDisplay::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 otk::Style *style(void) const { return _style; }
  virtual void setStyle(otk::Style *style);

  inline otk::OtkEventDispatcher *eventDispatcher(void)
  { return _event_dispatcher; }
  void setEventDispatcher(otk::OtkEventDispatcher *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);

  Window _window;

  OtkWidget *_parent;
  OtkWidgetList _children;

  Style *_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;

  BTexture *_texture;
  Pixmap _bg_pixmap;
  unsigned int _bg_pixel;

  const BColor *_bcolor;
  unsigned int _bwidth;

  Rect _rect;
  unsigned int _screen;

  bool _fixed_width;
  bool _fixed_height;

  OtkEventDispatcher *_event_dispatcher;
};

}

#endif // __widget_hh