File: xproperty.c

package info (click to toggle)
docker 1.5-2
  • links: PTS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 244 kB
  • sloc: ansic: 1,544; makefile: 129
file content (64 lines) | stat: -rw-r--r-- 2,190 bytes parent folder | download | duplicates (6)
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
#include "xproperty.h"
#include "docker.h"

gboolean xprop_get8(Window window, Atom atom, Atom type, int size,
                    gulong *count, guchar **value)
{
  Atom ret_type;
  int ret_size;
  unsigned long ret_bytes;
  int result;
  unsigned long nelements = *count;
  unsigned long maxread = nelements;

  *value = NULL;
  
  /* try get the first element */
  result = XGetWindowProperty(display, window, atom, 0l, 1l, False,
                              AnyPropertyType, &ret_type, &ret_size,
                              &nelements, &ret_bytes, value);
  if (! (result == Success && ret_type == type &&
         ret_size == size && nelements > 0)) {
    if (*value) XFree(*value);
    *value = NULL;
    nelements = 0;
  } else {
    /* we didn't the whole property's value, more to get */
    if (! (ret_bytes == 0 || maxread <= nelements)) {
      int remain;
      
      /* get the entire property since it is larger than one element long */
      XFree(*value);
      /*
        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.
      */
      remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
      /* dont get more than the max */
      if (remain > size/8 * (signed)maxread)
        remain = size/8 * (signed)maxread;
      result = XGetWindowProperty(display, window, atom, 0l, remain,
                                  False, type, &ret_type, &ret_size,
                                  &nelements, &ret_bytes, value);
      /*
       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 (!(result == Success && ret_type == type &&
            ret_size == size && ret_bytes == 0)) {
        if (*value) XFree(*value);
        xprop_get8(window, atom, type, size, count, value);
      }
    }
  }

  *count = nelements;
  return *value != NULL;
}

gboolean xprop_get32(Window window, Atom atom, Atom type, int size,
                     gulong *count, gulong **value)
{
  return xprop_get8(window, atom, type, size, count, (guchar**)value);
}