atoms.net_wm_state_above = create("_NET_WM_STATE_ABOVE");
atoms.net_wm_state_below = create("_NET_WM_STATE_BELOW");
+ atoms.net_wm_state_add = 1;
+ atoms.net_wm_state_remove = 0;
+ atoms.net_wm_state_toggle = 2;
+
atoms.kde_net_system_tray_windows = create("_KDE_NET_SYSTEM_TRAY_WINDOWS");
atoms.kde_net_wm_system_tray_window_for =
create("_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR");
atoms.kde_net_wm_window_type_override =
create("_KDE_NET_WM_WINDOW_TYPE_OVERRIDE");
+ atoms.kwm_win_icon = create("KWM_WIN_ICON");
+
+ atoms.rootpmapid = create("_XROOTPMAP_ID");
+ atoms.esetrootid = create("ESETROOT_PMAP_ID");
+
atoms.openbox_premax = create("_OPENBOX_PREMAX");
atoms.openbox_active_window = create("_OPENBOX_ACTIVE_WINDOW");
+ atoms.openbox_restack_window = create("_OPENBOX_RESTACK_WINDOW");
}
void Property::set(Window win, Atom atom, Atom type, unsigned char* data,
{
assert(win != None); assert(atom != None); assert(type != None);
assert(size == 8 || size == 16 || size == 32);
- assert(*nelements > 0);
unsigned char *c_val = 0; // value alloc'd in Xlib, must be XFree()d
Atom ret_type;
int ret_size;
unsigned long ret_bytes;
int result;
- unsigned long maxread = *nelements;
bool ret = false;
// try get the first element
ret = (result == Success && ret_type == type && ret_size == size &&
*nelements > 0);
if (ret) {
- if (ret_bytes == 0 || maxread <= *nelements) {
+ if (ret_bytes == 0) {
// we got the whole property's value
*value = new unsigned char[*nelements * size/8 + 1];
memcpy(*value, c_val, *nelements * size/8 + 1);
XFree(c_val);
// the number of longs that need to be retreived to get the property's
// entire value. The last + 1 is the first long that we retrieved above.
- int remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
- if (remain > size/8 * (signed)maxread) // dont get more than the max
- remain = size/8 * (signed)maxread;
+ long remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
result = XGetWindowProperty(**display, win, atom, 0l,
remain, false, type, &ret_type, &ret_size,
nelements, &ret_bytes, &c_val);
- ret = (result == Success && ret_type == type && ret_size == size &&
- ret_bytes == 0);
+ ret = (result == Success && ret_type == type && ret_size == size);
/*
If the property has changed type/size, or has grown since our first
read of it, then stop here and try again. If it shrank, then this will
still work.
*/
- if (! ret)
- return get(win, atom, type, &maxread, value, size);
+ if (! ret) {
+ return get(win, atom, type, nelements, value, size);
+ }
*value = new unsigned char[*nelements * size/8 + 1];
memcpy(*value, c_val, *nelements * size/8 + 1);
bool Property::get(Window win, Atom atom, Atom type, unsigned long *value)
{
unsigned long *temp;
- unsigned long num = 1;
+ unsigned long num;
if (! get(win, atom, type, &num, (unsigned char **) &temp, 32))
return false;
- *value = temp[0];
- delete [] temp;
- return true;
+ if (num >= 1) {
+ *value = temp[0];
+ delete [] temp;
+ return true;
+ }
+ return false;
}
bool Property::get(Window win, Atom atom, StringType type, ustring *value)
{
- unsigned long n = 1;
+ unsigned long n;
StringVect s;
- if (get(win, atom, type, &n, &s)) {
+ if (get(win, atom, type, &n, &s) && n > 0) {
*value = s[0];
return true;
}
bool Property::get(Window win, Atom atom, StringType type,
unsigned long *nelements, StringVect *strings)
{
- assert(*nelements > 0);
-
Atom t;
bool u; // utf8 encoded?
switch (type) {
}
unsigned char *value;
- unsigned long elements = (unsigned) -1;
+ unsigned long elements;;
if (!get(win, atom, t, &elements, &value, 8) || elements < 1)
return false;
std::string::const_iterator it = s.begin(), end = s.end();
unsigned long num = 0;
- while(num < *nelements) {
+ while(true) {
std::string::const_iterator tmp = it; // current string.begin()
it = std::find(tmp, end, '\0'); // look for null between tmp and end
strings->push_back(std::string(tmp, it)); // s[tmp:it)