]> Dogcows Code - chaz/openbox/blob - src/client.hh
add XXX to a comment that deserves it
[chaz/openbox] / src / client.hh
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 #ifndef __client_hh
3 #define __client_hh
4
5 extern "C" {
6 #include <X11/Xlib.h>
7 }
8
9 #include <string>
10
11 #include "otk/strut.hh"
12 #include "otk/rect.hh"
13
14 namespace ob {
15
16 class OBClient {
17 public:
18 enum Max { Max_None,
19 Max_Horz,
20 Max_Vert,
21 Max_Full };
22
23 enum WindowType { Type_Desktop,
24 Type_Dock,
25 Type_Toolbar,
26 Type_Menu,
27 Type_Utility,
28 Type_Splash,
29 Type_Dialog,
30 Type_Normal };
31
32 enum MwmFlags { MwmFlag_Functions = 1 << 0,
33 MwmFlag_Decorations = 1 << 1 };
34
35 enum MwmFunctions { MwmFunc_All = 1 << 0,
36 MwmFunc_Resize = 1 << 1,
37 MwmFunc_Move = 1 << 2,
38 MwmFunc_Iconify = 1 << 3,
39 MwmFunc_Maximize = 1 << 4
40 //MwmFunc_Close = 1 << 5
41 };
42
43 enum MemDecorations { MwmDecor_All = 1 << 0,
44 MwmDecor_Border = 1 << 1,
45 MwmDecor_Handle = 1 << 2,
46 MwmDecor_Title = 1 << 3,
47 //MwmDecor_Menu = 1 << 4,
48 MwmDecor_Iconify = 1 << 5,
49 MwmDecor_Maximize = 1 << 6 };
50
51 // the things the user can do to the client window
52 enum Function { Func_Resize = 1 << 0,
53 Func_Move = 1 << 1,
54 Func_Iconify = 1 << 2,
55 Func_Maximize = 1 << 3,
56 Func_Close = 1 << 4 };
57 typedef unsigned char FunctionFlags;
58
59 // the decorations the client window wants to be displayed on it
60 enum Decoration { Decor_Titlebar = 1 << 0,
61 Decor_Handle = 1 << 1,
62 Decor_Border = 1 << 2,
63 Decor_Iconify = 1 << 3,
64 Decor_Maximize = 1 << 4,
65 Decor_Close = 1 << 5 };
66 typedef unsigned char DecorationFlags;
67
68 // this structure only contains 3 elements... the Motif 2.0 structure
69 // contains 5... we only need the first 3... so that is all we will define
70 typedef struct MwmHints {
71 static const unsigned int elements = 3;
72 unsigned long flags;
73 unsigned long functions;
74 unsigned long decorations;
75 };
76
77 enum StateAction { State_Remove = 0, // _NET_WM_STATE_REMOVE
78 State_Add, // _NET_WM_STATE_ADD
79 State_Toggle // _NET_WM_STATE_TOGGLE
80 };
81
82 private:
83 //! The actual window that this class is wrapping up
84 Window _window;
85
86 //! The id of the group the window belongs to
87 Window _group;
88
89 // XXX: transient_for, transients
90
91 //! The desktop on which the window resides (0xffffffff for all desktops)
92 unsigned long _desktop;
93
94 //! Normal window title
95 std::string _title; // XXX: Have to keep track if this string is Utf8 or not
96 //! Window title when iconifiged
97 std::string _icon_title;
98
99 //! The application that created the window
100 std::string _app_name;
101 //! The class of the window, can used for grouping
102 std::string _app_class;
103
104 //! The type of window (what its function is)
105 WindowType _type;
106
107 //! Position and size of the window (relative to the root window)
108 otk::Rect _area;
109
110 //! Width of the border on the window.
111 /*!
112 The window manager will set this to 0 while the window is being managed,
113 but needs to restore it afterwards, so it is saved here.
114 */
115 int _border_width;
116
117 // size bounds
118 // if min > max, then the window is not resizable
119 int _min_x, _min_y; // minumum size
120 int _max_x, _max_y; // maximum size
121 int _inc_x, _inc_y; // resize increments
122 int _base_x, _base_y; // base size
123
124 //! Where to place the decorated window in relation to the undecorated window
125 int _gravity;
126
127 //! The state of the window, one of WithdrawnState, IconicState, or
128 //! NormalState
129 long _wmstate;
130
131 //! Was the window's position requested by the application? if not, we should
132 //! place the window ourselves when it first appears
133 bool _positioned;
134
135 //! Can the window receive input focus?
136 bool _can_focus;
137 //! Urgency flag
138 bool _urgent;
139 //! Notify the window when it receives focus?
140 bool _focus_notify;
141
142 //! The window uses shape extension to be non-rectangular?
143 bool _shaped;
144
145 //! The window is modal, so it must be processed before any windows it is
146 //! related to can be focused
147 bool _modal;
148 //! Only the window's titlebar is displayed
149 bool _shaded;
150 //! The window is iconified
151 bool _iconic;
152 //! The window is maximized to fill the screen vertically
153 bool _max_vert;
154 //! The window is maximized to fill the screen horizontally
155 bool _max_horz;
156 //! The window is a 'fullscreen' window, and should be on top of all others
157 bool _fullscreen;
158 //! The window should be on top of other windows of the same type
159 bool _floating;
160
161 //! A bitmask of values in the OBClient::Decoration enum
162 /*!
163 The values in the variable are the decorations that the client wants to be
164 displayed around it.
165 */
166 DecorationFlags _decorations;
167
168 //! A bitmask of values in the OBClient::Function enum
169 /*!
170 The values in the variable specify the ways in which the user is allowed to
171 modify this window.
172 */
173 FunctionFlags _functions;
174
175 void getDesktop();
176 void getType();
177 void getMwmHints();
178 void getArea();
179 void getState();
180 void getShaped();
181
182 void setWMState(long state);
183 void setDesktop(long desktop);
184 void setState(StateAction action, long data1, long data2);
185
186 void updateProtocols();
187 void updateNormalHints();
188 void updateWMHints();
189 // XXX: updateTransientFor();
190 void updateTitle();
191 void updateClass();
192
193 public:
194 OBClient(Window window);
195 virtual ~OBClient();
196
197 inline Window window() const { return _window; }
198
199 inline WindowType type() const { return _type; }
200 inline unsigned long desktop() const { return _desktop; }
201 inline const std::string &title() const { return _title; }
202 inline const std::string &iconTitle() const { return _title; }
203 inline const std::string &appName() const { return _app_name; }
204 inline const std::string &appClass() const { return _app_class; }
205 inline bool canFocus() const { return _can_focus; }
206 inline bool urgent() const { return _urgent; }
207 inline bool focusNotify() const { return _focus_notify; }
208 inline bool shaped() const { return _shaped; }
209 inline int gravity() const { return _gravity; }
210 inline bool positionRequested() const { return _positioned; }
211 inline DecorationFlags decorations() const { return _decorations; }
212 inline FunctionFlags funtions() const { return _functions; }
213
214 // states
215 inline bool modal() const { return _modal; }
216 inline bool shaded() const { return _shaded; }
217 inline bool iconic() const { return _iconic; }
218 inline bool maxVert() const { return _max_vert; }
219 inline bool maxHorz() const { return _max_horz; }
220 inline bool fullscreen() const { return _fullscreen; }
221 inline bool floating() const { return _floating; }
222
223 inline int borderWidth() const { return _border_width; }
224 inline int minX() const { return _min_x; }
225 inline int minY() const { return _min_y; }
226 inline int maxX() const { return _max_x; }
227 inline int maxY() const { return _max_y; }
228 inline int incrementX() const { return _inc_x; }
229 inline int incrementY() const { return _inc_y; }
230 inline int baseX() const { return _base_x; }
231 inline int baseY() const { return _base_y; }
232
233 inline const otk::Rect &area() const { return _area; }
234
235 void update(const XPropertyEvent &e);
236 void update(const XClientMessageEvent &e);
237
238 void setArea(const otk::Rect &area);
239 };
240
241 }
242
243 #endif // __client_hh
This page took 0.047241 seconds and 4 git commands to generate.