OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 23 Январь, 2026 21:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 102 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 20 Январь, 2026 16:29 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
проблема в том, что без реализации INCR-протокола оно будет работать иногда. а если владелец selection вдруг задумается и забудет что-то прислать, то без таймаутов станет грустно. иксовые буфера обмена — они асинхронные, в этом самый хитрый прикол. пытаться работать с ними синхронно, конечно, можно… и это даже более-менее будет работать — до тех пор, пока внезапно не сломается. максимальный размер данных, которые можно пристегнуть к свойству, кстати — зависим от реализации иксов. да, можно считать что везде какой-то x.org, и туда аж двести килобайт поместятся… до тех пор, пока они НЕ поместятся. ;-)

в общем, там ничего простого нет. и лучше в документации честно предупреждать, что реализация буфера обмена сломана. на всякий случай.

p.s.: моя реализация тоже с ошибками. но я ТАК заколебался её делать, и ещё вдобавок пытаться отладить без наличия референса (потому что каждый делает как получилось, и оно кое-как работает кое-где, но везде хоть немного, да по разному)… к тому же там надо было впилить нормальную машину состояний, а я вместо этого воткнул кодокашу и сделал вид, что так и надо.

вообще, в коде на си я, например, при необходимости что-то с клипбордом делать тупо таскаю с собой полные исходники xsel, а софтина просто имеет ключик `--xsel` (или типа), в котором как xsel и запускается. ну, чтобы не требовать наличия xsel у пользователя. это оказался самый простой способ победить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 16:43 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>>> асинхронные, в этом самый хитрый прикол

Это не прикол, эта беда x-ов. Без учета, которого не будет работать ничего (((. Пока клиент жив, данные есть. Клиента нет, и данных нет.

А по поводу максимального размера данных - доки честно предупреждают 4 Кб, хотя и по 100 копировал. Нет проблем.

И почему сломана ??? Работает на голых иксах. Свою задачу выполняет ))). Правда не проверял на Linux с установленными навороченными менеджерами clipboard. У меня таких просто нет.

>>>> вообще, в коде на си

Универсальное решение, это всегда замечательно ))). Но когда есть выбор, предпочитаю решение минимально достаточное.


Последний раз редактировалось Михаил Вторник, 20 Январь, 2026 16:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 16:50 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
Михаил писал(а):
Это не прикол, эта беда x-ов. Без учета, которого не будет работать ничего (((. Пока клиент жив, данные есть. Клиента нет, и данных нет.
не «беда», а совершенно сознательное дизайн-решение. иксы прежде всего сетевые. в винде, вообще-то, есть точно такой же режим, с рекламированием типа, и отсылкой содержания по запросу. чтобы не мусорить в памяти офигенного размера блобами.

Михаил писал(а):
А по поводу максимального размера данных - доки честно предупреждают 4 Кб, хотя и по 100 копировал. Нет проблем.
четыре килобайта — это гарантированый минимум. в x.org реальный максимум — чуть меньше двухсот килобайт; но никто не обязан столько держать, и это не обязательно будет всегда так даже с одним сервером, но разными соединениями с ним.

Михаил писал(а):
И почему сломана ??? Работает на голых иксах. Свою задачу выполняет ))).
потому что я вам отправлю предложение посимвольно с INCR — и вы сможете получить примерно ничего. спеки разрешают, у вас не работает — это и есть определение сломаного.

p.s.: зачем так отправлю? а потому что я текст на лету формирую по кусочкам, например. и кусочками отсылаю. вполне штатный режим работы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 16:59 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
>>>> я вам отправлю предложение посимвольно с INCR

Вот здесь не согласен. Вы мне ничего не можете отправить. Я могу попросить предоставить данные в строго определенном формате и либо их получить в таком виде, либо не получить ничего. А то что данные приходят порциями, так они всегда так приходят.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 20:53 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Несколько слов по поводу синхронности, асинхронности. Сижу за компьютером - хочу перенести кусочек текста из соседнего приложения. Здесь и сейчас. О . . . какой асинхронности может идти речь !!!

Более сложный случай. Пишу сетевое приложение, которое в случайные моменты времени обменивается данными (пусть будет через clipboard или primary неважно) с удаленным компьютерам, отвечающим с задержкой. Да вот здесь без асинхронности не обойтись ???

И ничего подобного. Создаю отдельный поток для каждого соединения и спокойно жду. Опять же в синхронном режиме. Всегда так делаю. И асинхронность побоку. А xcb мне в этом помогает. Позволяет создавать столько соединений с X-сервером (каждое в отдельном потоке) сколько требуется. Xlib так не умеет.

Просто, логично, компактно. Чем мне нравиться идеология Linux. В ней нет навязывания процедур обратного вызова. В windows всего одна такая, называется оконная процедура (не вызывай меня, я вызову тебя). В Mac OS и Wayland все построено на обратных вызовах. Прям шагу без них ступить нельзя. Вот и Вы отметили на сколько у них кривая идеология и реализация отсюда соответствующая. Ноги то отсюда растут (((.

Процедуры обратного вызова это каменный век. Мало того, что они связывают программиста по рукам и ногам, так ещё заставляют компиляторы писать подстрижеными под одну линейку. ABI же никто не отменял. Вот и приходиться идти на различные ухищрения, чтобы и свой ABI сохранить и волков позорных накормить (((.

Ещё раз асинхронность- это попытка навязать аналог корпоративной многозадачности на одном ядре процессора, когда куча свободных вычислительных ядер простаивает. Другими словами аналог зеленых потоков. Звучит красиво. А на деле полная лажа. Был опыт. Писал рабочий менеджер вытесняющей многозадачности. Знаю о чем говорю. Да здравствует синхронность и настоящая многопоточность ))).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 21:28 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 644
Чё там как? ;-) Редактор текстовый будет, в смысле... как "настоящий"? ;-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 22:37 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
Михаил писал(а):
И ничего подобного. Создаю отдельный поток для каждого соединения и спокойно жду. Опять же в синхронном режиме. Всегда так делаю.
а, то-то у вас быстрый потокобезопасный GC в системе… или нет? а почему нет? может, потому что потоки — не лучшее решение? точнее, всегда худшее? если вы можете сериализовать данные — то что вам мешает создать новый процесс? а если не можете, то ваш поток обязан лочить всю систему и ничем не отличается от отсутствия потока.

Михаил писал(а):
И асинхронность побоку. А xcb мне в этом помогает. Позволяет создавать столько соединений с X-сервером (каждое в отдельном потоке) сколько требуется. Xlib так не умеет.
вообще-то умеет. но никто особо этот режим, конечно, не тестировал, потому что никому в здравом уме и твёрдой памяти он не нужен.

Михаил писал(а):
Ещё раз асинхронность- это попытка навязать аналог корпоративной многозадачности на одном ядре процессора, когда куча свободных вычислительных ядер простаивает.
а, так вот откуда растут ноги того, что современный софт сразу выжирает все доступные ресурсы и требует ещё. потому что автор каждой программы уверен, что он уникальный, его программа лучшая на свете, и пользователь больше ничего кроме неё запускать не будет. а если запустил — то сам себе виноват, компьютеры не предназначены для подобных задач.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 23:28 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Ну вот, теперь хоть стало понятно почему современный софт в лице Браузеров или Либра офиса выбирают все ресурсы. Не потому-ли, что вместо использования потокобезопасных эффективных приемов программирования, в угоду надежности занимаются размножением процессов. Со всеми вытекающими.

И да, Вы совершенно правы. Надо четко различать для каких целей пишется программа. Если это клиентское приложение в большинстве случаев однопоточный вариант более чем оправдан. Ну а для системных серверов. Которые по определению должны обслуживать тысячи клиентов и по определению работающие на выделенном сервере. Многопоточность это манна небесная. В отличии от создания кучи процессов и обеспечения взаимодействия между ними. Вот где действительно жрутся ресурсы, как не в себя.

Простой, но очень показательный пример. Linux в лайф режиме садит мой ноут за 40 минут. Подозреваю, что все написано в соответствии с озвученными критериями. Windows на этом же буке спокойно работает 5 часов. Видимо она неправильно написана. И почему-то вместо процессов использует потоки. И наверное про умные энергосберегающие таймеры ничего не знает (если не читали - очень занимательное чтиво). Про скорость работы уже даже не заикаюсь. Линукс раза в четыре медленнее, несмотря на то что весь образ в оперативной памяти и обращения к диску нет. От слова совсем нет !!!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 23:42 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
Михаил писал(а):
Ну а для системных серверов. Которые по определению должны обслуживать тысячи клиентов и по определению работающие на выделенном сервере. Многопоточность это манна небесная.
здесь авторы высокопроизводительных http-серверов, например, очень сильно смеялись.

Михаил писал(а):
Простой, но очень показательный пример. Linux в лайф режиме садит мой ноут за 40 минут.
ставьте побольше современного bloatware — справится и за десять. да, DE, если что — это тоже bloatware. из основного. у меня вот не садит. а ещё из 8 гб памяти у меня 6 гб свободны. открыт браузер, почтовик, tox-клиент, irc-клиент, крутится видеоплеер, куча терминалов, прочая ерундень.

Михаил писал(а):
Линукс раза в четыре медленнее, несмотря на то что весь образ в оперативной памяти и обращения к диску нет. От слова совсем нет !!!
вы опять какое-то неправильное bloatware поставили. должно быть раз в шесть минимум.

современные дистрибутивы линуксов ОЧЕНЬ плохие. borderline unusable.

Михаил писал(а):
Ну вот, теперь хоть стало понятно почему современный софт в лице Браузеров или Либра офиса выбирают все ресурсы. Не потому-ли, что вместо использования потокобезопасных эффективных приемов программирования, в угоду надежности занимаются размножением процессов. Со всеми вытекающими.
нет, не поэтому.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 00:08 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Смех это хорошо, юмор сильно повышает настроение и главное самооценку.

Вот честно, вообще ни одной программы не ставлю (тем более вредоносной). Только то что по умолчанию на флешке. И запускаю файл менеджер, терминал и себя конечно. Это все. В интернет тоже не пускаю. Для Amd64 четыре тестовых линукса: AltLinux, Mint Linux, Kali Linux и Armbian. То что удалось найти. Где взять нормальные даже не знаю. Достало уже выключение на самом интересном месте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 00:33 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
нормальных нет. надо делать под себя самому, и предпочтительно с программами пяти- и больше летней давности. я уже лет пять (или семь?) как систему не обновляю — и благодаря этому она всё ещё отлично работает, не тормозит, память не выжирает. и софт по мере возможности всё-таки пишу себе сам.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 10:15 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Хочу, но не получается не согласиться с Вами. Многопоточность и отсутствие GC требует идеального проектирования и не прощает даже мелких шероховатостей. Зачем использовать дешевые локальные синхронизации и бесплатный доступ к общим данным !!!

Если есть процессы и глобальные мьютексы, поддерживаемые непосредственно OS. Ну и что, что переключение медленнее, а обмен данными по отдельному протоколу. Зато ‘супер’ надежно. Замечательный повод посмеяться, над незадачливыми программерами. Отладка приложений которых занимает времени больше, чем написание самого приложения. Тоже смеюсь, если время появляется после отладки ))).

>>>> уже лет пять (или семь?) как систему не обновляю

Не обновлять систему. Интересный подход. Спасибо за подсказку. Сейчас примерно раз в полгода сношу все и восстанавливаю из образа, или полностью устанавливаю по новой. Так себе подход (((.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 12:14 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
так никто не мешает использовать общую память между процессами. разница в том, что в этом случае шарится только то, что надо, ни больше, ни меньше — а не всё состояние программы. в итоге весь остальной код тривиально предсказуем.

конечно, можно доблестно создавать себе проблемы в виде потоков, а потом их героически преодолевать — но тогда не стоит удивляться, что остальные смотрят на это с некоторым… удивлением, а не восхищением.

насчёт же обновления системы — я однажды понял, что с каждым обновлением у меня что-нибудь или отваливается, или начинает работать хуже. а вот лучше — ничего. и ответа на вопрос: «зачем же тогда обновляться?» я не нашёл. ненужное ненужно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 13:54 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Да, файлы проецируемые в память очень полезная штука. Много где использую. А в использовании потоков - доблести и тем более геройства нет ни капли. Тупая и нудная вычитка текста. Чистка и переструктуризация кода, для предельно ясной логики работы. Где здесь место для героизма ???


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 14:03 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
героизм (ненужный) начинается ровно в момент решения: «оу, я буду использовать потоки!» говорю как программист с более чем тридцатилетним стажем. (да, давлю авторитетом. а потому что могу! ;-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 16:04 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
А, понял причину. Linux для меня не ‘родная’ система. Первый опыт графические порты для X11 и Wayland написал меньше года назад. До этого с Linux никак не пересекался, от слова совсем (((.

Весь наработанный опыт касается исключительно программирования под windows. Вот и переношу наработанные навыки в другую систему. Возможно, для этого не предназначеной. Но ведь если не попробовать, не узнаешь ))).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 17:09 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Artyemov писал(а):
Чё там как? ;-) Редактор текстовый будет, в смысле... как "настоящий"? ;-)

Будет, Вы ему выбора не оставили. Как ‘полу настоящий’ точно !!! Работаю над этим ))).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Январь, 2026 20:21 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
да, в шынде несколько другая идеология. дорогие процессы, хреновые средства IPC, всё вот это вот. сокеты опрашиваем одним апи, пайпы другим, мэйлбоксы третьим, локальных несетевых сокетов вообще нет… обработка оконных событий самая плохая из всех что я видел — разве что в беосе хуже (к счастью, оно померло).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Январь, 2026 11:15 

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 85
Вот реализация последней - не очевидной части использования xcb библиотеки для замены xlib. Самый простой вариант работы с текстовым буфером обмена. В частности, не поддерживает INCR. Но вариант рабочий. Свою задачу выполняет ))).

А большего наверное и не надо. Остальное почти один в один соответствует коду xlib и затруднений не вызвало. Осталось собрать все вместе. И можно начинать тестировать графический порт на основе библиотеки xcb. Самому интересно, что получится !!! И стоит ли потраченного времени ???
Код:
 (* буфер обмена      *)

   PROCEDURE InitCLIP (                               );
      VAR repl : XCB.xcb_intern_atom_iterator_t;
   BEGIN
      (* окно буфера объмена ------ *)
      IF cwindow >  0  THEN RETURN END;
      NEW(tmpbord, 1024 * 1024       );
      cwindow := XCB.xcb_generate_id(connect           );
      vl_mask := 0;  vl_list[0] := 0 ;
      XCB.xcb_create_window(connect, 24, cwindow,xcbroot,
          0,0, 1,1, 1, XCB.XCB_WINDOW_CLASS_INPUT_OUTPUT,
                              rvisual, vl_mask, vl_list);

      (* запрашиваем атомы -------- *)
      CLIP := XCB.xcb_intern_atom(
                            connect, 0, 9, @'CLIPBOARD');
      TARG := XCB.xcb_intern_atom(
                            connect, 0, 7, @'TARGETS'  );
      UNIC := XCB.xcb_intern_atom(
                            connect, 0, 7, @'UNICODE'  );
      TEXT := XCB.xcb_intern_atom(
                            connect, 0, 4, @'TEXT'     );
      UTF8 := XCB.xcb_intern_atom(
                         connect, 1, 11, @'UTF8_STRING');
      utf8 := XCB.xcb_intern_atom(
              connect, 0,24,@'text/plain;charset=utf-8');

      UTF8 := UTF8 + XCB.XCB_ATOM_STRING * ORD(UTF8 = 0);
      UNIC := UNIC + XCB.XCB_ATOM_STRING * ORD(UNIC = 0);
      TEXT := TEXT + XCB.XCB_ATOM_STRING * ORD(TEXT = 0);
      utf8 := utf8 + XCB.XCB_ATOM_STRING * ORD(utf8 = 0);

      repl := XCB.xcb_intern_atom_reply(connect, CLIP,0);
      IF repl # NIL THEN CLIP := repl.atom;
                        Lib.free(VAL(ADDRESS, repl)) END;
      repl := XCB.xcb_intern_atom_reply(connect, TARG,0);
      IF repl # NIL THEN TARG := repl.atom;
                        Lib.free(VAL(ADDRESS, repl)) END;

      repl := XCB.xcb_intern_atom_reply(connect, UTF8,0);
      IF repl # NIL THEN UTF8 := repl.atom;
                        Lib.free(VAL(ADDRESS, repl)) END;
      repl := XCB.xcb_intern_atom_reply(connect, UNIC,0);
      IF repl # NIL THEN UNIC := repl.atom;
                        Lib.free(VAL(ADDRESS, repl)) END;
      repl := XCB.xcb_intern_atom_reply(connect, TEXT,0);
      IF repl # NIL THEN TEXT := repl.atom;
                        Lib.free(VAL(ADDRESS, repl)) END;
      repl := XCB.xcb_intern_atom_reply(connect, utf8,0);
      IF repl # NIL THEN utf8 := repl.atom;
                        Lib.free(VAL(ADDRESS, repl)) END;
   END InitCLIP;


   PROCEDURE sendtext (temp : ptrTEXT;
                 r_event : XCB.xcb_req_event_iterator_t);
      (* отправка запрошенных данных                  *)
      VAR n_event : XCB.xcb_selection_notify_event_t;
   BEGIN
      IF temp = NIL THEN RETURN                      END;

      n_event.response_type := XCB.XCB_SELECTION_NOTIFY ;
      n_event.detail        := r_event.detail   ;
      n_event.sequence      := r_event.sequence ;
      n_event.time          := r_event.time     ;
      n_event.target        := r_event.target   ;
      n_event.property      := r_event.property ;
      n_event.requestor     := r_event.requestor;
      n_event.selection     := r_event.selection;

      IF (n_event.target = TARG) THEN
         XCB.xcb_change_property(connect,
                    XCB.XCB_PROP_MODE_REPLACE,
                    n_event.requestor, n_event.property ,
                    XCB.XCB_ATOM_ATOM, 32, 4, ADR(UTF8));

      EI (n_event.target = UTF8) !
         (n_event.target = utf8) !
         (n_event.target = UNIC) !
         (n_event.target = TEXT) !
         (n_event.target = XCB.XCB_ATOM_STRING) THEN
         XCB.xcb_change_property(connect,
                    XCB.XCB_PROP_MODE_REPLACE ,
                    n_event.requestor, n_event.property ,
                    n_event.target, 8,
                      LEN(temp)-16, VAL(ADDRESS, temp) );

      ELSE n_event.property := 0                     END;

      XCB.xcb_send_event( connect, 0, n_event.requestor ,
                  XCB.XCB_EVENT_MASK_NO_EVENT, @n_event);
      XCB.xcb_flush(connect);
   END sendtext;


   PROCEDURE setboard (bord : ptrTEXT       );
      (* запись текста в буфер обмена      *)
   BEGIN
      IF bord = NIL THEN RETURN           END;

      InitCLIP(    );

      IF WinToUtf(bord^,tmpbord^) >0 THEN END;
      (* становимся владельцем clipboard   *)
      XCB.xcb_set_selection_owner(
                  connect, cwindow, CLIP, 0 );

      clpbord := NIL;
   END setboard;


   PROCEDURE getboard (           ) : ptrTEXT;
      (* чтение текста из буфера обмена    *)
      VAR g_event :
                 XCB.xcb_not_event_iterator_t;
      VAR repl :
              XCB.xcb_get_property_iterator_t;
      VAR size, prop, xsel, time : INTEGER;
          data : ADDRESS;
   BEGIN
      IF clpbord #NIL THEN RETURN clpbord END;

      InitCLIP(    );

      xsel := XCB.xcb_intern_atom(connect, 0 ,
                             9, @'XSEL_DATA');

      XCB.xcb_convert_selection(
          connect, cwindow, CLIP, UTF8, xsel ,
                   XCB.XCB_TIME_CURRENT_TIME);

      XCB.xcb_flush(connect);

      (* ожидаем не больше 100 миллисекунд *)
      g_event :=
             VAL(XCB.xcb_not_event_iterator_t,
             XCB.xcb_wait_for_event(connect));
      time := g_event.time + 0100;
      WHILE (ORD(BIT(g_event.response_type)
               * BIT(7FH) )
                  # XCB.XCB_SELECTION_NOTIFY)
                  & (g_event.time < time) DO
      g_event :=
             VAL(XCB.xcb_not_event_iterator_t,
             XCB.xcb_wait_for_event(connect));
      END;

      IF (ORD(BIT(g_event.response_type)
            * BIT(7FH) )
                  # XCB.XCB_SELECTION_NOTIFY)
                    THEN RETURN NIL       END;

      prop := XCB.xcb_get_property(connect, 0,
                    cwindow, g_event.property,
                XCB.XCB_GET_PROPERTY_TYPE_ANY,
                (*  max 1Mb  *) 0, 1024*1024);
      repl := XCB.xcb_get_property_reply(
                            connect, prop, 0);
      IF repl = NIL THEN RETURN NIL       END;

      data := 0;
      size :=
      XCB.xcb_get_property_value_length(repl);
      IF size > 0 THEN
         data :=
             XCB.xcb_get_property_value(repl);

         NEW(clpbord, size + 16);
         MOV(data, ADR(clpbord[0]),  size   );
      END;

      Lib.free(VAL(ADDRESS, repl));

      RETURN clpbord
   END getboard;


PROCEDURE clipproc*(bord : ptrTEXT) : ptrTEXT;
BEGIN
   IF bord = NIL THEN clpbord := getboard(  );
   EI bord # NIL THEN clpbord := bord     END;
   RETURN clpbord
END clipproc;


// пример обработки событий

      XCB.XCB_SELECTION_REQUEST : (* отправка данных  *)
                       sendtext(tmpbord, VAL(
                              XCB.xcb_req_event_iterator_t, a_event)) |

      XCB.XCB_SELECTION_NOTIFY  : (* получение данных   *)            |

      XCB.XCB_SELECTION_CLEAR   : (* смена владельца    *)            |



Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Январь, 2026 11:43 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1673
а почему бы и не стоить? опыт. современная Xlib тоже на xcb построена.

вообще, самая большая проблема Xlib — это дурацкий обработчик ошибок колбэком, возврат из которого по документации — unspecified behaviour. но и longjmp тоже — предлагается просто упасть трупом.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 102 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2026, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB