summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <[email protected]>2010-01-21 10:10:44 -0500
committerinfirit <[email protected]>2015-09-14 18:44:29 +0200
commite84e5ffa84180bffb2ca32bf072d065797a4621b (patch)
treebe2595a52cb512662da0ba4c8581a8a2ec41332d
parent8bcb4f8f0348d1a2971dbd741d48af9de2934ae6 (diff)
downloadmarco-e84e5ffa84180bffb2ca32bf072d065797a4621b.tar.bz2
marco-e84e5ffa84180bffb2ca32bf072d065797a4621b.tar.xz
Work around Xlib 64-bit "specialness"
When putting 32-bit properties into longs on 64-bit architectures, XGetWindowProperty assumes the values are supposed to be signed, and so it sign-extends values greater than 0x7fffffff. So if they *aren't* supposed to be signed, we need to chop off the high bits ourselves. (Most CARDINAL-valued properties only end up using small values anyway, so it doesn't matter, but _NET_WM_WINDOW_OPACITY uses the full range, and so was previously failing on 64-bit machines.) https://bugzilla.gnome.org/show_bug.cgi?id=605678
-rw-r--r--src/core/xprops.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/core/xprops.c b/src/core/xprops.c
index f9b4578a..82d28046 100644
--- a/src/core/xprops.c
+++ b/src/core/xprops.c
@@ -264,6 +264,16 @@ cardinal_list_from_results (GetPropertyResults *results,
*n_cardinals_p = results->n_items;
results->prop = NULL;
+#if GLIB_SIZEOF_LONG == 8
+ /* Xlib sign-extends format=32 items, but we want them unsigned */
+ {
+ int i;
+
+ for (i = 0; i < *n_cardinals_p; i++)
+ (*cardinals_p)[i] = (*cardinals_p)[i] & 0xffffffff;
+ }
+#endif
+
return TRUE;
}
@@ -608,6 +618,10 @@ cardinal_with_atom_type_from_results (GetPropertyResults *results,
return FALSE;
*cardinal_p = *(gulong*) results->prop;
+#if GLIB_SIZEOF_LONG == 8
+ /* Xlib sign-extends format=32 items, but we want them unsigned */
+ *cardinal_p &= 0xffffffff;
+#endif
XFree (results->prop);
results->prop = NULL;