diff --git a/src/common.h b/src/common.h
index 42b8bba..911518c 100644
--- a/src/common.h
+++ b/src/common.h
@@ -1595,21 +1595,6 @@ bool
wid_get_text_prop(session_t *ps, Window wid, Atom prop,
char ***pstrlst, int *pnstr);
-/**
- * Free a winprop_t.
- *
- * @param pprop pointer to the winprop_t to free.
- */
-static inline void
-free_winprop(winprop_t *pprop) {
- // Empty the whole structure to avoid possible issues
- if (pprop->ptr) {
- cxfree(pprop->ptr);
- pprop->ptr = NULL;
- }
- pprop->nitems = 0;
-}
-
void
force_repaint(session_t *ps);
diff --git a/src/win.c b/src/win.c
index ba436ac..27eaff2 100644
--- a/src/win.c
+++ b/src/win.c
@@ -1231,7 +1231,7 @@ win_update_frame_extents(session_t *ps, win *w, Window client) {
4L, XCB_ATOM_CARDINAL, 32);
if (prop.nitems == 4) {
- const unsigned long * const extents = prop.c32;
+ const uint32_t * const extents = prop.c32;
const bool changed = w->frame_extents.left != extents[0] ||
w->frame_extents.right != extents[1] ||
w->frame_extents.top != extents[2] ||
diff --git a/src/x.c b/src/x.c
index 02939d8..9c097af 100644
--- a/src/x.c
+++ b/src/x.c
@@ -27,28 +27,27 @@
* and number of items. A blank one on failure.
*/
winprop_t
-wid_get_prop_adv(const session_t *ps, Window w, Atom atom, long offset,
- long length, Atom rtype, int rformat) {
- Atom type = None;
- int format = 0;
- unsigned long nitems = 0, after = 0;
- unsigned char *data = NULL;
+wid_get_prop_adv(const session_t *ps, xcb_window_t w, xcb_atom_t atom, long offset,
+ long length, xcb_atom_t rtype, int rformat) {
+ xcb_get_property_reply_t *r = xcb_get_property_reply(ps->c,
+ xcb_get_property(ps->c, 0, w, atom, rtype, offset, length), NULL);
- if (Success == XGetWindowProperty(ps->dpy, w, atom, offset, length,
- False, rtype, &type, &format, &nitems, &after, &data)
- && nitems && (AnyPropertyType == type || type == rtype)
- && (!rformat || format == rformat)
- && (8 == format || 16 == format || 32 == format)) {
- return (winprop_t) {
- .ptr = data,
- .nitems = nitems,
- .type = type,
- .format = format,
- };
+ if (r && xcb_get_property_value_length(r) &&
+ (rtype == XCB_ATOM_ANY || r->type == rtype) &&
+ (!rformat || r->format == rformat) &&
+ (r->format == 8 || r->format == 16 || r->format == 32))
+ {
+ int len = xcb_get_property_value_length(r);
+ return (winprop_t) {
+ .ptr = xcb_get_property_value(r),
+ .nitems = len/(r->format/8),
+ .type = r->type,
+ .format = r->format,
+ .r = r,
+ };
}
- cxfree(data);
-
+ free(r);
return (winprop_t) {
.ptr = NULL,
.nitems = 0,
diff --git a/src/x.h b/src/x.h
index 09b4c75..3e1cde3 100644
--- a/src/x.h
+++ b/src/x.h
@@ -15,14 +15,16 @@ typedef struct session session_t;
typedef struct winprop {
union {
void *ptr;
- char *p8;
- short *p16;
- long *p32;
- unsigned long *c32; // 32bit cardinal
+ int8_t *p8;
+ int16_t *p16;
+ int32_t *p32;
+ uint32_t *c32; // 32bit cardinal
};
unsigned long nitems;
xcb_atom_t type;
int format;
+
+ xcb_get_property_reply_t *r;
} winprop_t;
#define XCB_SYNCED_VOID(func, c, ...) xcb_request_check(c, func##_checked(c, __VA_ARGS__));
@@ -64,15 +66,15 @@ x_sync(xcb_connection_t *c) {
* and number of items. A blank one on failure.
*/
winprop_t
-wid_get_prop_adv(const session_t *ps, Window w, Atom atom, long offset,
- long length, Atom rtype, int rformat);
+wid_get_prop_adv(const session_t *ps, xcb_window_t w, xcb_atom_t atom, long offset,
+ long length, xcb_atom_t rtype, int rformat);
/**
* Wrapper of wid_get_prop_adv().
*/
static inline winprop_t
-wid_get_prop(const session_t *ps, Window wid, Atom atom, long length,
- Atom rtype, int rformat) {
+wid_get_prop(const session_t *ps, xcb_window_t wid, xcb_atom_t atom, long length,
+ xcb_atom_t rtype, int rformat) {
return wid_get_prop_adv(ps, wid, atom, 0L, length, rtype, rformat);
}
@@ -134,3 +136,18 @@ x_print_error(unsigned long serial, uint8_t major, uint8_t minor, uint8_t error_
xcb_pixmap_t
x_create_pixmap(session_t *ps, uint8_t depth, xcb_drawable_t drawable, uint16_t width, uint16_t height);
+
+/**
+ * Free a winprop_t.
+ *
+ * @param pprop pointer to the winprop_t to free.
+ */
+static inline void
+free_winprop(winprop_t *pprop) {
+ // Empty the whole structure to avoid possible issues
+ if (pprop->r)
+ free(pprop->r);
+ pprop->ptr = NULL;
+ pprop->r = NULL;
+ pprop->nitems = 0;
+}