LINUX.ORG.RU

История изменений

Исправление Zubok, (текущая версия) :

Тем не менее, я накатал себе тестовый примерчик: с unsigned *data работает, с unsigned long *data — нет.

Это потому что xcb_change_property требует data в другом формате. В Xlib была попытка отвязаться от представления данных в запросе и сделать как бы более общий сишный интерфейс. То есть 32-битные данные в long, 16-битные - в short, а 8-битные char, а функция уже сама там преобразует к нужному виду, пакует в посылку. В XCB этого всего нет - данные надо передавать как в запросе:

ChangeProperty

window: WINDOW
property, type: ATOM
format: {8, 16, 32}
mode: { Replace, Prepend, Append}
data: LISTofINT8 or LISTofINT16 or LISTofINT32
Errors: Alloc, Atom, Match, Value, Window

Твой unsigned как раз LISTofINT32 и получается, поэтому работает, а unsigned long не работает. А вот в XChangeProperty все будет с точностью до наоборот. Поэтому и получалось, что код, в котором по наивности на 32-битных платформах указали массив uint32_t (и работало), на 64-битных не работал уже. А в XCB лучше настаивать на 32 битах в данном случае на всех платформах.

Исправление Zubok, :

Это потому что xcb_change_property требует data в другом формате. В Xlib была попытка отвязаться от представления данных в запросе и сделать как бы более общий сишный интерфейс. То есть 32-битные данные в long, 16-битные - в short, а 8-битные char, а функция уже сама там преобразует к нужному виду, пакует в посылку. В XCB этого всего нет - данные надо передавать как в запросе:

ChangeProperty

window: WINDOW
property, type: ATOM
format: {8, 16, 32}
mode: { Replace, Prepend, Append}
data: LISTofINT8 or LISTofINT16 or LISTofINT32
Errors: Alloc, Atom, Match, Value, Window

Твой unsigned как раз LISTofINT32 и получается, поэтому работает, а unsigned long не работает. А вот в XChangeProperty все будет с точностью до наоборот. Поэтому и получалось, что код, в котором по наивности на 32-битных платформах указали массив uint32_t (и работало), на 64-битных не работал уже. А в XCB лучше настаивать на 32 битах в данном случае на всех платформах.

Исправление Zubok, :

Это потому, что xcb_change_property требует data в другом формате. В Xlib была попытка отвязаться от представления данных в запросе и сделать как бы более общий сишный интерфейс. То есть 32-битные данные в long, 16-битные - в short, а 8-битные char, а функция уже сама там преобразует к нужному виду, пакует в посылку. В XCB этого всего нет - данные надо передавать как в запросе:

ChangeProperty

window: WINDOW
property, type: ATOM
format: {8, 16, 32}
mode: { Replace, Prepend, Append}
data: LISTofINT8 or LISTofINT16 or LISTofINT32
Errors: Alloc, Atom, Match, Value, Window

Твой unsigned как раз LISTofINT32 и получается, поэтому работает, а unsigned long не работает. А вот в XChangeProperty все будет с точностью до наоборот. Поэтому и получалось, что код, в котором по наивности на 32-битных платформах указали массив uint32_t (и работало), на 64-битных не работал уже. А в XCB лучше настаивать на 32 битах в данном случае на всех платформах.

Исправление Zubok, :

Это потому, что xcb_change_property требует data в другом формате. В Xlib была попытка отвязаться от представления данных в запросе и сделать как бы более общий сишный интерфейс. То есть 32-битные данные в long, 16-битные - в short, а 8-битные char, а функция уже сама там преобразует к нужному виду, пакует в посылку. В XCB этого всего нет - данные надо передавать как в запросе:

ChangeProperty

window: WINDOW
property, type: ATOM
format: {8, 16, 32}
mode: { Replace, Prepend, Append}
data: LISTofINT8 or LISTofINT16 or LISTofINT32
Errors: Alloc, Atom, Match, Value, Window

Твой unsigned как раз LISTofINT32 и получается, поэтому работает, а unsigned long не работает. А вот в XChangeProperty все будет с точностью до наоборот. Поэтому и получалось, что код, в котором по наивности на 32-битных платформах указали массив uint32_t (и работало), на 64-битных не работал уже. А в XCB лучше настаивать на 32 битах в данном случае.

Исходная версия Zubok, :

Это потому, что xcb_change_property требует data в другом формате. В Xlib была попытка отвязаться от представления данных в запросе и сделать как бы более общий сишный интерфейс. То есть 32-битные данные в long, 16-битные - в short, а 8-битные char, а функция уже сама там преобразует к нужному виду, пакует в посылку. В XCB этого всего нет - данные надо передавать как в запросе:

ChangeProperty

window: WINDOW
property, type: ATOM
format: {8, 16, 32}
mode: { Replace, Prepend, Append}
data: LISTofINT8 or LISTofINT16 or LISTofINT32
Errors: Alloc, Atom, Match, Value, Window

Твой unsigned как раз LISTofINT32 и получается, поэтому работает, а unsigned long не работает. А вот в XChangeProperty все будет с точностью до наоборот.