>>> сравнивать изначально сдизайненый для сетевой прозрачности протокол и прибитый гвоздями
>> То есть по дизайну подразумевается вариант, что именно клиент берёт на себя
>> задачу отождествления окон с локальными данными (в частности указателями), я правильно
>> понял?
> это данные клиента — он об этом и заботится.Дык о чём и речь, что надо позаботиться. Если кто привык к другой ОС, где для этого есть специальный вызов, он скажет, что Wayland проще X11.
> никто, впрочем, не
> запрещает прикрепить оный указатель как значение свойства. малоосмысленно, но можно.
Я вот тут не знаю, надо смотреть код, как этот поинтер внутри... сериализуется в строку или два 32-х разрядных значения, нет ли там UB. Точнее, лучше даже не смотреть, а просто так не делать.
>> Ну Вы же сами пишете, что свойства, которые важны _для_сервера_ это другое,
> где? я такого не писал.
В предыдущем ответе https://www.opennet.ru/openforum/vsluhforumID3/122311.html#286
"сравнивать изначально сдизайненый для сетевой прозрачности протокол и прибитый гвоздями к локалхосту протокол".
Исходно смысл несколько шире, вывод я сам сделал.
> серверу вообще наплевать, какие свойства к окну
> прикреплены.
Серверу может и наплевать на всё, кроме XCB_CW_CURSOR, а той штуке, которая рисует заголовок окна интересны некоторые _MOTIF_WM_HINTS, или же _NET_WM_NAME.
>> что использовать те свойства для хранения данных, которые имеют смысл только
>> для клиента -- не стоит.
> это вопрос конкретных применений. всё равно у софта сложнее приветмира есть структура
> данных об окне — в которой и хранятся данные, очень специфичные
> для кода приложения. идея лепить указатель на это в специально выделеные
> системой слоты (что и делает `SetWindowLong()`) — такая себе. никакого механизма
> резервирования этих слотов нет, так что минное поле.
Так в SetWindowLongPtr как раз и отправляют указатель на ту структуру. При получении сообщения сообщения вытаскивают и далее по указателю с данными и работают.
>>> p.s.: фанаты XCB — скажите, вы реально упарываетесь по BDSM?
>> А что, у этой штуки есть фанаты?
> ну используют же её зачем-то. кроме как большой любви к BSDM —
> я других причин особо не вижу.
Я наугад выбрал несколько софтин (mpv и что-то ещё), везде оказалась XLib. XCB пришлось поискать, сразу же находится Qt.
>> И вообще был удивлён ситуацией: интерфейс разработан давно, но документация в
>> незавершённом состоянии.
> потому что далеко не всем нравится программировать на уровне протокола иксов.
По-моему, такие берут GTK, Qt и тому подобное (ой, про Electron забыл). Кто сунется ниже, тому уже все кошки чёрные.
> разработчики
> иксов это отлично понимали, и сделали xlib. а потом пришли Стильные
> Современные Молодёжные, и оказалось, что деды были глупые, надо совсем не
> так. как и происходит почти всегда в подобных ситуациях — отчего-то
> Новое Стильное и так далее решение взлетать не очень торопится.
Ну вообще да, раздел "зачем нужно XCB" практически калька с Wayland, только без "без тиринга". То есть можно провесть аналогию и на её основании попробовать строить прогноз развития. Однако, Wayland немножко дальше чем XCB продвинулся.
>> При том что якобы XCB уже заменила XLib (она и заменила
> да как-то не особо. вон, у меня xlib вполне наличествует. и софт
> её активно использует. что-то не очень с заменой сложилось, как я
> посмотрю.
Так то xlib вроде как есть, но если приглядеться, то это немного не xlib:
/*
* XCloseDisplay - XSync the connection to the X Server, close the connection,
* and free all associated storage. Extension close procs should only free
* memory and must be careful about the types of requests they generate.
*/int
XCloseDisplay (
register Display *dpy)
{
register _XExtension *ext;
register int i;
if (!(dpy->flags & XlibDisplayClosing))
{
dpy->flags |= XlibDisplayClosing;
for (i = 0; i < dpy->nscreens; i++) {
register Screen *sp = &dpy->screens[i];
XFreeGC (dpy, sp->default_gc);
}
if (dpy->cursor_font != None) {
XUnloadFont (dpy, dpy->cursor_font);
}
XSync(dpy, 1); /* throw away pending events, catch errors */
/* call out to any extensions interested */
for (ext = dpy->ext_procs; ext; ext = ext->next) {
if (ext->close_display)
(*ext->close_display)(dpy, &ext->codes);
}
/* if the closes generated more protocol, sync them up */
if (X_DPY_GET_REQUEST(dpy) != X_DPY_GET_LAST_REQUEST_READ(dpy))
XSync(dpy, 1);
}
xcb_disconnect(dpy->xcb->connection);
_XFreeDisplayStructure (dpy);
return 0;
}