all repos — openbox @ 299dc47a6b6379bba77fc489ef6825dcfe18faf5

openbox fork - make it a bit more like ryudo

otk/property.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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
#ifndef   __atom_hh
#define   __atom_hh

/*! @file property.hh
  @brief Provides access to window properties
*/

#include "ustring.hh"
#include "screeninfo.hh"

extern "C" {
#include <X11/Xlib.h>
}

#include <vector>
#include <cassert>

namespace otk {

//! The atoms on the X server which this class will cache
struct Atoms {
  // types
  Atom cardinal; //!< The atom which represents the Cardinal data type
  Atom window;   //!< The atom which represents window ids
  Atom pixmap;   //!< The atom which represents pixmap ids
  Atom atom;     //!< The atom which represents atom values
  Atom string;   //!< The atom which represents ascii strings
  Atom utf8;     //!< The atom which represents utf8-encoded strings

  Atom openbox_pid;

  // window hints
  Atom wm_colormap_windows;
  Atom wm_protocols;
  Atom wm_state;
  Atom wm_delete_window;
  Atom wm_take_focus;
  Atom wm_change_state;
  Atom wm_name;
  Atom wm_icon_name;
  Atom wm_class;
  Atom wm_window_role;
  Atom motif_wm_hints;

  Atom openbox_show_root_menu;
  Atom openbox_show_workspace_menu;

  // NETWM atoms
  // root window properties
  Atom net_supported;
  Atom net_client_list;
  Atom net_client_list_stacking;
  Atom net_number_of_desktops;
  Atom net_desktop_geometry;
  Atom net_desktop_viewport;
  Atom net_current_desktop;
  Atom net_desktop_names;
  Atom net_active_window;
  Atom net_workarea;
  Atom net_supporting_wm_check;
//  Atom net_virtual_roots;
  Atom net_desktop_layout;
  Atom net_showing_desktop;
  // root window messages
  Atom net_close_window;
  Atom net_wm_moveresize;
  // application window properties
//  Atom net_properties;
  Atom net_wm_name;
  Atom net_wm_visible_name;
  Atom net_wm_icon_name;
  Atom net_wm_visible_icon_name;
  Atom net_wm_desktop;
  Atom net_wm_window_type;
  Atom net_wm_state;
  Atom net_wm_strut;
//  Atom net_wm_icon_geometry;
  Atom net_wm_icon;
//  Atom net_wm_pid;
//  Atom net_wm_handled_icons;
  Atom net_wm_allowed_actions;
  // application protocols
//  Atom   Atom net_wm_ping;

  Atom net_wm_window_type_desktop;
  Atom net_wm_window_type_dock;
  Atom net_wm_window_type_toolbar;
  Atom net_wm_window_type_menu;
  Atom net_wm_window_type_utility;
  Atom net_wm_window_type_splash;
  Atom net_wm_window_type_dialog;
  Atom net_wm_window_type_normal;

  Atom net_wm_moveresize_size_topleft;
  Atom net_wm_moveresize_size_topright;
  Atom net_wm_moveresize_size_bottomleft;
  Atom net_wm_moveresize_size_bottomright;
  Atom net_wm_moveresize_move;

  Atom net_wm_action_move;
  Atom net_wm_action_resize;
  Atom net_wm_action_minimize;
  Atom net_wm_action_shade;
  Atom net_wm_action_stick;
  Atom net_wm_action_maximize_horz;
  Atom net_wm_action_maximize_vert;
  Atom net_wm_action_fullscreen;
  Atom net_wm_action_change_desktop;
  Atom net_wm_action_close;

  Atom net_wm_state_modal;
  Atom net_wm_state_sticky;
  Atom net_wm_state_maximized_vert;
  Atom net_wm_state_maximized_horz;
  Atom net_wm_state_shaded;
  Atom net_wm_state_skip_taskbar;
  Atom net_wm_state_skip_pager;
  Atom net_wm_state_hidden;
  Atom net_wm_state_fullscreen;
  Atom net_wm_state_above;
  Atom net_wm_state_below;

  Atom kde_net_system_tray_windows;
  Atom kde_net_wm_system_tray_window_for;
  Atom kde_net_wm_window_type_override;

  Atom openbox_premax;
  Atom openbox_active_window;
};


//! Provides easy access to window properties.
class Property {
public:
  
  //! The possible types/encodings of strings
  enum StringType {
    ascii, //!< Standard 8-bit ascii string
    utf8,  //!< Utf8-encoded string
#ifndef DOXYGEN_IGNORE
    NUM_STRING_TYPE
#endif
  };

  //! A list of ustrings
  typedef std::vector<ustring> StringVect;

  //! The value of all atoms on the X server that exist in the
  //! Atoms struct
  static Atoms atoms;

private:
  //! Sets a property on a window
  static void set(Window win, Atom atom, Atom type, unsigned char *data,
                  int size, int nelements, bool append);
  //! Gets a property's value from a window
  static bool get(Window win, Atom atom, Atom type,
                  unsigned long *nelements, unsigned char **value,
                  int size);

public:
  //! Initializes the Property class.
  /*!
    CAUTION: This function uses otk::Display, so ensure that
    otk::Display::initialize has been called before initializing this class!
  */
  static void initialize();

  //! Sets a single-value property on a window to a new value
  /*!
    @param win The window id of the window on which to set the property's value
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type The Atom value of the property type. This can be found in the
                struct returned by Property::atoms.
    @param value The value to set the property to
  */
  static void set(Window win, Atom atom, Atom type, unsigned long value);
  //! Sets an multiple-value property on a window to a new value
  /*!
    @param win The window id of the window on which to set the property's value
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type The Atom value of the property type. This can be found in the
                struct returned by Property::atoms.
    @param value Any array of values to set the property to. The array must
                 contain <i>elements</i> number of elements
    @param elements The number of elements in the <i>value</i> array
  */
  static void set(Window win, Atom atom, Atom type,
                  unsigned long value[], int elements);
  //! Sets a string property on a window to a new value
  /*!
    @param win The window id of the window on which to set the property's value
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type A member of the Property::StringType enum that specifies the
                type of the string the property is being set to
    @param value The string to set the property to
  */
  static void set(Window win, Atom atom, StringType type,
                  const ustring &value);
  //! Sets a string-array property on a window to a new value
  /*!
    @param win The window id of the window on which to set the property's value
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type A member of the Property::StringType enum that specifies the
                type of the string the property is being set to
    @param strings A list of strings to set the property to
  */
  static void set(Window win, Atom atom, StringType type,
                  const StringVect &strings);

  //! Gets the value of a property on a window
  /*!
    @param win The window id of the window to get the property value from
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type The Atom value of the property type. This can be found in the
                struct returned by Property::atoms.
    @param nelements The maximum number of elements to retrieve from the
                     property (assuming it has more than 1 value in it). To
                     retrieve all possible elements, use "(unsigned) -1".<br>
                     When the function returns, if it returns true, this will
                     contain the actual number of elements retrieved.<br>
    @param value If the function returns true, then this contains an array of
                 retrieved values for the property.<br>
                 The <i>value</i> is allocated inside the function and
                 <b>delete[]</b> value needs to be called when you are done
                 with it.<br>
                 The <i>value</i> array returned is null terminated, and has
                 <i>nelements</i> elements in it plus the terminating null.
    @return true if retrieval of the specified property with the specified
            type was successful; otherwise, false
  */
  static bool get(Window win, Atom atom, Atom type,
                  unsigned long *nelements, unsigned long **value);
  //! Gets a single element from the value of a property on a window
  /*!
    @param win The window id of the window to get the property value from
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type The Atom value of the property type. This can be found in the
                struct returned by Property::atoms.
    @param value If the function returns true, then this contains the first
                 (and possibly only) element in the value of the specified
                 property.
    @return true if retrieval of the specified property with the specified
            type was successful; otherwise, false
  */
  static bool get(Window win, Atom atom, Atom type, unsigned long *value);
  //! Gets a single string from the value of a property on a window
  /*!
    @param win The window id of the window to get the property value from
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type A member of the Property::StringType enum that specifies the
                type of the string property to retrieve
    @param value If the function returns true, then this contains the first
                 (and possibly only) string in the value of the specified
                 property.
    @return true if retrieval of the specified property with the specified
            type was successful; otherwise, false
  */
  static bool get(Window win, Atom atom, StringType type, ustring *value);
  //! Gets strings from the value of a property on a window
  /*!
    @param win The window id of the window to get the property value from
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
    @param type A member of the Property::StringType enum that specifies the
                type of the string property to retrieve
    @param nelements The maximum number of strings to retrieve from the
                     property (assuming it has more than 1 string in it). To
                     retrieve all possible strings, use "(unsigned) -1".<br>
                     When the function returns, if it returns true, this will
                     contain the actual number of strings retrieved.<br>
    @param strings If the function returns true, then this contains all of the
                   strings retrieved from the property's value.
    @return true if retrieval of the specified property with the specified
            type was successful; otherwise, false
  */
  static bool get(Window win, Atom atom, StringType type,
                  unsigned long *nelements, StringVect *strings);

  //! Removes a property from a window
  /*!
    @param win The window id of the window to remove the property from
    @param atom The Atom value of the property to set. This can be found in the
                struct returned by Property::atoms.
  */
  static void erase(Window win, Atom atom);
};

}

#endif // __atom_hh