don't deref null
[blackbox.git] / lib / EWMH.hh
blob19d5f544bff050cf3ed6c79ab9a1c99487800e3a
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 // EWMH.hh for Blackbox - an X11 Window manager
3 // Copyright (c) 2001 - 2005 Sean 'Shaleh' Perry <shaleh@debian.org>
4 // Copyright (c) 1997 - 2000, 2002 - 2005
5 // Bradley T Hughes <bhughes at trolltech.com>
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a
8 // copy of this software and associated documentation files (the "Software"),
9 // to deal in the Software without restriction, including without limitation
10 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 // and/or sell copies of the Software, and to permit persons to whom the
12 // Software is furnished to do so, subject to the following conditions:
14 // The above copyright notice and this permission notice shall be included in
15 // all copies or substantial portions of the Software.
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 // DEALINGS IN THE SOFTWARE.
25 #ifndef __EWMH_hh
26 #define __EWMH_hh
28 #include "Display.hh"
29 #include "Unicode.hh"
30 #include "Util.hh"
32 #include <string>
33 #include <vector>
35 namespace bt {
37 class EWMH: public NoCopy {
38 public:
39 explicit EWMH(const Display &_display);
41 typedef std::vector<Atom> AtomList;
42 typedef std::vector<Window> WindowList;
44 struct Strut {
45 unsigned int left, right, top, bottom;
46 inline Strut(void)
47 : left(0), right(0), top(0), bottom(0)
48 { }
51 struct StrutPartial {
52 unsigned int left, right, top, bottom;
53 unsigned int left_start, left_end;
54 unsigned int right_start, right_end;
55 unsigned int top_start, top_end;
56 unsigned int bottom_start, bottom_end;
57 inline StrutPartial(void)
58 : left(0u), right(0u), top(0u), bottom(0u),
59 left_start(0u), left_end(0u),
60 right_start(0u), right_end(0u),
61 top_start(0u), top_end(0u),
62 bottom_start(0u), bottom_end(0u)
63 { }
66 inline Atom utf8String(void) const
67 { return utf8_string; }
69 // root window properties
70 inline Atom supported(void) const
71 { return net_supported; }
72 inline Atom clientList(void) const
73 { return net_client_list; }
74 inline Atom clientListStacking(void) const
75 { return net_client_list_stacking; }
76 inline Atom numberOfDesktops(void) const
77 { return net_number_of_desktops; }
78 inline Atom desktopGeometry(void) const
79 { return net_desktop_geometry; }
80 inline Atom desktopViewport(void) const
81 { return net_desktop_viewport; }
82 inline Atom currentDesktop(void) const
83 { return net_current_desktop; }
84 inline Atom desktopNames(void) const
85 { return net_desktop_names; }
86 inline Atom activeWindow(void) const
87 { return net_active_window; }
88 inline Atom workarea(void) const
89 { return net_workarea; }
90 inline Atom supportingWMCheck(void) const
91 { return net_supporting_wm_check; }
92 inline Atom virtualRoots(void) const
93 { return net_virtual_roots; }
94 inline Atom desktopLayout(void) const
95 { return net_desktop_layout; }
96 inline Atom showingDesktop(void) const
97 { return net_showing_desktop; }
99 void setSupported(Window target, Atom atoms[], unsigned int count) const;
100 bool readSupported(Window target, AtomList& atoms) const;
101 void setClientList(Window target, WindowList& windows) const;
102 bool readClientList(Window target, WindowList& windows) const;
103 void setClientListStacking(Window target, WindowList& windows) const;
104 bool readClientListStacking(Window target, WindowList& windows) const;
105 void setNumberOfDesktops(Window target, unsigned int count) const;
106 bool readNumberOfDesktops(Window target, unsigned int* number) const;
107 void setDesktopGeometry(Window target,
108 unsigned int width, unsigned int height) const;
109 bool readDesktopGeometry(Window target,
110 unsigned int* width, unsigned int* height) const;
111 void setDesktopViewport(Window target, int x, int y) const;
112 bool readDesktopViewport(Window target, int *x, int *y) const;
113 void setCurrentDesktop(Window target, unsigned int number) const;
114 bool readCurrentDesktop(Window target, unsigned int* number) const;
115 void setDesktopNames(Window target,
116 const std::vector<bt::ustring> &names) const;
117 bool readDesktopNames(Window target,
118 std::vector<bt::ustring> &names) const;
119 void setActiveWindow(Window target, Window data) const;
120 void setWorkarea(Window target, unsigned long workareas[],
121 unsigned int count) const;
122 void setSupportingWMCheck(Window target, Window data) const;
123 bool readSupportingWMCheck(Window target, Window* window) const;
124 void setVirtualRoots(Window target, WindowList &windows) const;
125 bool readVirtualRoots(Window target, WindowList &windows) const;
126 // void setDesktopLayout(Window target, ...) const;
127 // void readDesktopLayout(Window target, ...) const;
129 // other root messages
130 inline Atom closeWindow(void) const
131 { return net_close_window; }
132 inline Atom moveresizeWindow(void) const
133 { return net_moveresize_window; }
134 inline Atom wmMoveResize(void) const
135 { return net_wm_moveresize; }
136 inline Atom restackWindow(void) const
137 { return net_restack_window; }
138 inline Atom requestFrameExtents(void) const
139 { return net_request_frame_extents; }
141 // application properties
142 inline Atom wmName(void) const
143 { return net_wm_name; }
144 inline Atom wmVisibleName(void) const
145 { return net_wm_visible_name; }
146 inline Atom wmIconName(void) const
147 { return net_wm_icon_name; }
148 inline Atom wmVisibleIconName(void) const
149 { return net_wm_visible_icon_name; }
150 inline Atom wmDesktop(void) const
151 { return net_wm_desktop; }
152 inline Atom wmWindowType(void) const
153 { return net_wm_window_type; }
154 inline Atom wmWindowTypeDesktop(void) const
155 { return net_wm_window_type_desktop; }
156 inline Atom wmWindowTypeDock(void) const
157 { return net_wm_window_type_dock; }
158 inline Atom wmWindowTypeToolbar(void) const
159 { return net_wm_window_type_toolbar; }
160 inline Atom wmWindowTypeMenu(void) const
161 { return net_wm_window_type_menu; }
162 inline Atom wmWindowTypeUtility(void) const
163 { return net_wm_window_type_utility; }
164 inline Atom wmWindowTypeSplash(void) const
165 { return net_wm_window_type_splash; }
166 inline Atom wmWindowTypeDialog(void) const
167 { return net_wm_window_type_dialog; }
168 inline Atom wmWindowTypeNormal(void) const
169 { return net_wm_window_type_normal; }
170 inline Atom wmState(void) const
171 { return net_wm_state; }
172 inline Atom wmStateModal(void) const
173 { return net_wm_state_modal; }
174 inline Atom wmStateSticky(void) const
175 { return net_wm_state_sticky; }
176 inline Atom wmStateMaximizedVert(void) const
177 { return net_wm_state_maximized_vert; }
178 inline Atom wmStateMaximizedHorz(void) const
179 { return net_wm_state_maximized_horz; }
180 inline Atom wmStateShaded(void) const
181 { return net_wm_state_shaded; }
182 inline Atom wmStateSkipTaskbar(void) const
183 { return net_wm_state_skip_taskbar; }
184 inline Atom wmStateSkipPager(void) const
185 { return net_wm_state_skip_pager; }
186 inline Atom wmStateHidden(void) const
187 { return net_wm_state_hidden; }
188 inline Atom wmStateFullscreen(void) const
189 { return net_wm_state_fullscreen; }
190 inline Atom wmStateAbove(void) const
191 { return net_wm_state_above; }
192 inline Atom wmStateBelow(void) const
193 { return net_wm_state_below; }
194 inline Atom wmStateDemandsAttention(void) const
195 { return net_wm_state_demands_attention; }
196 inline Atom wmStateRemove(void) const
197 { return 0; }
198 inline Atom wmStateAdd(void) const
199 { return 1; }
200 inline Atom wmStateToggle(void) const
201 { return 2; }
202 inline Atom wmAllowedActions(void) const
203 { return net_wm_allowed_actions; }
204 inline Atom wmActionMove(void) const
205 { return net_wm_action_move; }
206 inline Atom wmActionResize(void) const
207 { return net_wm_action_resize; }
208 inline Atom wmActionMinimize(void) const
209 { return net_wm_action_minimize; }
210 inline Atom wmActionShade(void) const
211 { return net_wm_action_shade; }
212 inline Atom wmActionStick(void) const
213 { return net_wm_action_stick; }
214 inline Atom wmActionMaximizeHorz(void) const
215 { return net_wm_action_maximize_horz; }
216 inline Atom wmActionMaximizeVert(void) const
217 { return net_wm_action_maximize_vert; }
218 inline Atom wmActionFullscreen(void) const
219 { return net_wm_action_fullscreen; }
220 inline Atom wmActionChangeDesktop(void) const
221 { return net_wm_action_change_desktop; }
222 inline Atom wmActionClose(void) const
223 { return net_wm_action_close; }
224 inline Atom wmStrut(void) const
225 { return net_wm_strut; }
226 inline Atom wmStrutPartial(void) const
227 { return net_wm_strut_partial; }
228 inline Atom wmIconGeometry(void) const
229 { return net_wm_icon_geometry; }
230 inline Atom wmIcon(void) const
231 { return net_wm_icon; }
232 inline Atom wmPid(void) const
233 { return net_wm_pid; }
234 inline Atom wmHandledIcons(void) const
235 { return net_wm_handled_icons; }
236 inline Atom wmUserTime(void) const
237 { return net_wm_user_time; }
239 void setWMName(Window target, const bt::ustring &name) const;
240 bool readWMName(Window target, bt::ustring &name) const;
241 void setWMVisibleName(Window target, const bt::ustring &name) const;
242 bool readWMIconName(Window target, bt::ustring &name) const;
243 void setWMVisibleIconName(Window target, const bt::ustring &name) const;
244 void setWMDesktop(Window target, unsigned int desktop) const;
245 bool readWMDesktop(Window target, unsigned int& desktop) const;
246 bool readWMWindowType(Window target, AtomList& types) const;
247 void setWMState(Window target, AtomList& atoms) const;
248 bool readWMState(Window target, AtomList& states) const;
249 void setWMAllowedActions(Window target, AtomList& atoms) const;
250 bool readWMStrut(Window target, Strut* strut) const;
251 bool readWMStrutPartial(Window target, StrutPartial* strut) const;
252 bool readWMIconGeometry(Window target, int &x, int &y,
253 unsigned int &width, unsigned int &height) const;
254 // bool readWMIcon(Window target, ...) const;
255 bool readWMPid(Window target, unsigned int &pid) const;
256 // bool readWMHandledIcons(Window target, ...) const;
257 bool readWMUserTime(Window target, Time &user_time) const;
258 // void readFrameExtents(Window target, ...) const;
260 // Window Manager Protocols
261 inline Atom wmPing(void) const
262 { return net_wm_ping; }
263 inline Atom wmSyncRequest(void) const
264 { return net_wm_sync_request; }
266 // utility
267 void removeProperty(Window target, Atom atom) const;
268 bool isSupportedWMWindowType(Atom atom) const;
270 void setProperty(Window target, Atom type, Atom property,
271 const unsigned char *data, unsigned long count) const;
273 bool getProperty(Window target, Atom type, Atom property,
274 unsigned char** data) const;
275 bool getListProperty(Window target, Atom type, Atom property,
276 unsigned char** data, unsigned long* count) const;
278 private:
279 const Display &display;
280 Atom utf8_string,
281 net_supported,
282 net_client_list,
283 net_client_list_stacking,
284 net_number_of_desktops,
285 net_desktop_geometry,
286 net_desktop_viewport,
287 net_current_desktop,
288 net_desktop_names,
289 net_active_window,
290 net_workarea,
291 net_supporting_wm_check,
292 net_virtual_roots,
293 net_desktop_layout,
294 net_showing_desktop,
295 net_close_window,
296 net_moveresize_window,
297 net_wm_moveresize,
298 net_restack_window,
299 net_request_frame_extents,
300 net_wm_name,
301 net_wm_visible_name,
302 net_wm_icon_name,
303 net_wm_visible_icon_name,
304 net_wm_desktop,
305 net_wm_window_type,
306 net_wm_window_type_desktop,
307 net_wm_window_type_dock,
308 net_wm_window_type_toolbar,
309 net_wm_window_type_menu,
310 net_wm_window_type_utility,
311 net_wm_window_type_splash,
312 net_wm_window_type_dialog,
313 net_wm_window_type_normal,
314 net_wm_state,
315 net_wm_state_modal,
316 net_wm_state_sticky,
317 net_wm_state_maximized_vert,
318 net_wm_state_maximized_horz,
319 net_wm_state_shaded,
320 net_wm_state_skip_taskbar,
321 net_wm_state_skip_pager,
322 net_wm_state_hidden,
323 net_wm_state_fullscreen,
324 net_wm_state_above,
325 net_wm_state_below,
326 net_wm_state_demands_attention,
327 net_wm_state_remove,
328 net_wm_state_add,
329 net_wm_state_toggle,
330 net_wm_allowed_actions,
331 net_wm_action_move,
332 net_wm_action_resize,
333 net_wm_action_minimize,
334 net_wm_action_shade,
335 net_wm_action_stick,
336 net_wm_action_maximize_horz,
337 net_wm_action_maximize_vert,
338 net_wm_action_fullscreen,
339 net_wm_action_change_desktop,
340 net_wm_action_close,
341 net_wm_strut,
342 net_wm_strut_partial,
343 net_wm_icon_geometry,
344 net_wm_icon,
345 net_wm_pid,
346 net_wm_handled_icons,
347 net_wm_user_time,
348 net_frame_extents,
349 net_wm_ping,
350 net_wm_sync_request;
353 } // namespace bt
355 #endif // __EWMH_hh