mirror of https://github.com/adamdruppe/arsd.git
xget property was totes broken on 64 bit
This commit is contained in:
parent
b4cf5d0c46
commit
0c0d4fe0c9
|
@ -3673,7 +3673,15 @@ version(X11) {
|
||||||
if(actualFormat == 0)
|
if(actualFormat == 0)
|
||||||
return null;
|
return null;
|
||||||
else {
|
else {
|
||||||
auto byteLength = actualItems * actualFormat / 8;
|
int byteLength;
|
||||||
|
if(actualFormat == 32) {
|
||||||
|
// 32 means it is a C long... which is variable length
|
||||||
|
actualFormat = cast(int) arch_long.sizeof * 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// then it is just a bit count
|
||||||
|
byteLength = cast(int) (actualItems * actualFormat / 8);
|
||||||
|
|
||||||
auto d = new ubyte[](byteLength);
|
auto d = new ubyte[](byteLength);
|
||||||
d[] = cast(ubyte[]) data[0 .. byteLength];
|
d[] = cast(ubyte[]) data[0 .. byteLength];
|
||||||
XFree(data);
|
XFree(data);
|
||||||
|
@ -12462,33 +12470,43 @@ void demandAttention(SimpleWindow window, bool needs = true) {
|
||||||
TrueColorImage getWindowNetWmIcon(Window window) {
|
TrueColorImage getWindowNetWmIcon(Window window) {
|
||||||
auto display = XDisplayConnection.get;
|
auto display = XDisplayConnection.get;
|
||||||
|
|
||||||
auto data = cast(arch_ulong[]) getX11PropertyData (window, GetAtom!"_NET_WM_ICON"(display), XA_CARDINAL);
|
auto data = getX11PropertyData (window, GetAtom!"_NET_WM_ICON"(display), XA_CARDINAL);
|
||||||
|
|
||||||
if (data.length > 2) {
|
if (data.length > arch_ulong.sizeof * 2) {
|
||||||
|
auto meta = cast(arch_ulong[]) (data[0 .. arch_ulong.sizeof * 2]);
|
||||||
// these are an array of rgba images that we have to convert into pixmaps ourself
|
// these are an array of rgba images that we have to convert into pixmaps ourself
|
||||||
|
|
||||||
int width = cast(int) data[0];
|
int width = cast(int) meta[0];
|
||||||
int height = cast(int) data[1];
|
int height = cast(int) meta[1];
|
||||||
data = data[2 .. 2 + width * height];
|
|
||||||
|
auto bytes = cast(ubyte[]) (data[arch_ulong.sizeof * 2 .. $]);
|
||||||
|
|
||||||
|
static if(arch_ulong.sizeof == 4) {
|
||||||
|
bytes = bytes[0 .. width * height * 4];
|
||||||
|
alias imageData = bytes;
|
||||||
|
} else static if(arch_ulong.sizeof == 8) {
|
||||||
|
bytes = bytes[0 .. width * height * 8];
|
||||||
|
auto imageData = new ubyte[](4 * width * height);
|
||||||
|
} else static assert(0);
|
||||||
|
|
||||||
|
|
||||||
auto bytes = cast(ubyte[]) data;
|
|
||||||
|
|
||||||
// this returns ARGB. Remember it is little-endian so
|
// this returns ARGB. Remember it is little-endian so
|
||||||
// we have BGRA
|
// we have BGRA
|
||||||
// our thing uses RGBA, which in little endian, is ABGR
|
// our thing uses RGBA, which in little endian, is ABGR
|
||||||
for(int idx = 0; idx < bytes.length; idx += 4) {
|
for(int idx = 0, idx2 = 0; idx < bytes.length; idx += arch_ulong.sizeof, idx2 += 4) {
|
||||||
auto r = bytes[idx + 2];
|
auto r = bytes[idx + 2];
|
||||||
auto g = bytes[idx + 1];
|
auto g = bytes[idx + 1];
|
||||||
auto b = bytes[idx + 0];
|
auto b = bytes[idx + 0];
|
||||||
auto a = bytes[idx + 3];
|
auto a = bytes[idx + 3];
|
||||||
|
|
||||||
bytes[idx + 0] = r;
|
imageData[idx2 + 0] = r;
|
||||||
bytes[idx + 1] = g;
|
imageData[idx2 + 1] = g;
|
||||||
bytes[idx + 2] = b;
|
imageData[idx2 + 2] = b;
|
||||||
bytes[idx + 3] = a;
|
imageData[idx2 + 3] = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new TrueColorImage(width, height, bytes);
|
return new TrueColorImage(width, height, imageData);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
Loading…
Reference in New Issue