На помощь призывается Zubok
Уже совсем отчаялся и делаю так:
void sml_window_icon(sml_window * win, sml_raster * icon) {
unsigned long * data = NULL;
u32 count = 0;
u32 x;
u32 y;
if (!win) {
sml_setxerrno(BadWindow);
return;
}
if (!icon){
sml_setxerrno(BadWindow);
return;
}
if (icon->size.x != icon->size.y) {
sml_setxerrno(BadPixmap);
return;
}
data = bxi_malloc((16 * 16 + 2 + 32 * 32 + 2) * sizeof(unsigned long));
data[count++] = 16;
data[count++] = 16;
for (y = 0; y < 16; y++)
for (x = 0; x < 16; x++)
data[count++] = 0xffffffffu;
data[count++] = 32;
data[count++] = 32;
for (y = 0; y < 32; y++)
for (x = 0; x < 32; x++)
data[count++] = 0xffffffffu;
sml_x(XChangeProperty(sml_xdisplay(), win->widget->xwindow,
sml_atom_wmicon, sml_atom_cardinal,
32, PropModeReplace,
(const u8 *)&data, count));
}
Обкурился манами, везде у всех в 2004м так же падало, но у них было uint32 вместо unsigned long, под х64 он 8 байт. https://github.com/SFML/SFML/pull/1171/commits/7fe96d1ba385269c5d7de8de624b12...
На 32х битной системе все работало (непереносимо на х64) вот так:
uint32_t * data = malloc(memsize * sizeof(uint32_t));
if (!(data))
return SML_ERR_BADALLOC;
int32_t count = 0;
{
data[count++] = 16;
data[count++] = 16;
memcpy(data + count, warehouse.elem[image16].data.img.image->data, 16 * 16 * 4);
count += 16 * 16;
}
{
data[count++] = 32;
data[count++] = 32;
memcpy(data + count, warehouse.elem[image32].data.img.image->data, 32 * 32 * 4);
count += 32 * 32;
}
SML_CHECKXFNC(XChangeProperty(warehouse.screen.display,
warehouse.elem[index].data.win.window,
warehouse.atoms.wmicon,
warehouse.atoms.cardinal,
32, PropModeReplace,
(const unsigned char *) data, count));