OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 03 Март, 2026 02:23

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




Начать новую тему Ответить на тему  [ Сообщений: 106 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 02 Январь, 2026 19:47 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1695
Михаил писал(а):
Ой, может что-то неправильно сделал. Оператор IS - слева экземпляр объекта, содержит динамический tag type, справа статический tag type объекта, вычисляемый на этапе компиляции, одно cmp и все ???.
наследник является в то же время и родителем. классическое: фигура -> круг — круг и круг, и фигура. это можно реализовать или таблицей, или походом вверх по всей цепочке родителей. у вас, судя по описанию, круг только круг, но не фигура.

Михаил писал(а):
WITH - исключил.
с учётом того, что у вас, похоже, IS/AS неправильные — то и WITH, конечно, бесполезен. ;-)

Михаил писал(а):
Forward, тоже не люблю, исключил в своем подмножестве.
тогда у вас или невозможно написать взаимно рекурсивные процедуры, или компилятор многопроходный. ;-)

Михаил писал(а):
Вот wayland.
не пишите матом в приличном обществе, пожалуйста. ;-) кейт пакард — тупая бездарь. в иксы он идиотский xrender затащил, например.

Михаил писал(а):
Потоки можно и нужно использовать, в подходящих задачах
есть простое и надёжное правило для определения того, нужны ли в задаче потоки: если кажется, что нужны — то однозначно не нужны.

да, можно упороться реализацией какого-нибудь raymarching'а чисто на цпу, и тайловая реализация с потоками, конечно, будет быстрее, а процессы тут помогут значительно меньше из-за бо́льших накладных расходов на передачу данных. но это очень нишевые случаи.

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

Михаил писал(а):
>>>> в идеале, конечно, было бы ещё неплохо проштудировать Драконью Книгу, там много вкусного.
Знаю такую. Она меня пугает. Тензорный (функциональный) анализ, по сравнению с ней кажутся легким чтением.
там всё намного проще, чем кажется издалека. и потом: её же не надо зубрить. достаточно просмотреть чтобы знать, какие подходы бывают, а потом консультироваться, когда надо какой-то подход реализовать. ну, или просто для удовольствия перед сном почитать. ;-)

Михаил писал(а):
Вот это, за гранью моего понимания (((. Как Вы все успеваете ))).
никак не успеваю. но это не мешает стараться. ;-)

на самом деле как ещё обкатать новый компилятор в бою, если не писать на нём что-то более-менее серьёзное? простые 2д-игрушки, как по мне, идеально подходят: писать весело, играть весело, и задача вполне серьёзная для компилятора.


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Сто лет в BB, и Сто % был уверен, что IS не распространяется на родителей. Проверил. Реальность оказалась другой - распространяется (((. Спасибо ))).

Компилятор однопроходный, а взаимно рекурсивные процедуры пишу так:

proc A;
proc B; begin A; end B;
begin B; end A;

Матом, а если других нет ))). С wayland - вероятно и Микрософт внес свою лепту. Они вроде главные спонсоры (((.

С потоками и GC намучился в свое время, чуть с работы не вылетел. Пока не сделал свой простенький менеджер памяти без GC.

>>>> Драконью Книгу . . . удовольствия перед сном почитать.

Почитать, конечно придется. Но вот про удовольствие. Это шутка такая ???.

>>>> на самом деле как ещё обкатать новый компилятор в бою, если не писать на нём что-то более-менее серьёзное? простые 2д-игрушки, как по мне, идеально подходят: писать весело, играть весело, и задача вполне серьёзная для компилятора.

Ага серьезная. Да это наверное самое сложное, что есть в мире программирования. Потоки, графика, интерфейс, сюжет. Есть область, которую можно пропустить ???


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1695
Михаил писал(а):
Сто лет в BB, и Сто % был уверен, что IS не распространяется на родителей. Проверил. Реальность оказалась другой - распространяется (((. Спасибо ))).
бывает. я в компиляторе как-то ноды сложения и вычитания перепутал. и заметил далеко не сразу: тесты для всяких записей и процедур сделал, а для сложения — да ну, кто ж там лажануть-то сможет, зачем.

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

Михаил писал(а):
>>>> Драконью Книгу . . . удовольствия перед сном почитать.
Почитать, конечно придется. Но вот про удовольствие. Это шутка такая ???.
да нет, отчего. почитать какую-нибудь техническую литературу перед сном — вполне удовольствие. не каждый вечер, конечно, под настроение. не то чтобы это сильно отличалось от перечитывания какой-нибудь хорошей художественной книги, если вдуматься.

хотя больше пошутил, конечно.

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


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1695
вот вам ещё подарок: полноценный компилятор с использованием sea of nodes, начиная с самого простейшего, и до структур с методами. каждый раздел имеет пояснения, всё вместе сделано Клифом Кликом — собственно, автором концепции sea of nodes. компилятор в конце натурально полноценный, со всеми рюшечками типа указателей, кодогеном под несколько архитектур, с выделением регистров используя graph coloring.

пререквизиты: необходимо понимать, что такое SSA, CFG, DFA, def-use chains и прочие маты из compiler 101. такие простые вещи Клифф особо не разжёвывает. всё это, в принципе, можно найти в книге про SSA от Inria, ссылку на которую я давал выше.

Клифф Клик, помимо прочего, автор C2: оптимизирующего JIT-компилятора для java. в котором как раз в полный рост использует SoN.

можете успеть сделать компилятор оберона на SoN первее меня. я не обижусь (если исходники, конечно, будут открытые ;-). я именно по этому постигал SoN на практике.


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Спасибо, шикарный подарок ))). Интересный проект https://aglang.org, пишет свой язык, работал в Гугле, предлагал руководству в качестве оф.языка.

Раньше Вас, точно нет. В приоритетах - поддержка дисплеев высокого разрешения (retina), добавить android, устранение ошибок и недоделок. И новый - чтение на ночь, рекомендованной Вами литературы. И только потом, если звезды сложатся . . . )))


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1695
The initial build takes ≈60Gb of storage, it requires 16+Gb RAM, and depending on device configuration can take up to 6 Hours.
«прелестно, прелестно!» (ц)
бейте это лопатой пока не залезет обратно туда, откуда вылезло.


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

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 207
Не могу скомпилировать такую программу (адаптацию одного из моих ГПСЧ к Вашей среде). В логе пишет "x8k.SYM" не создан!" Также при отладке я часто получал сообщение что-то вроде "идентификатор не определен" без указания этого самого идентификатора, и такую ошибку может быть сложно искать. Также, похоже, компилятор в сообщениях об ошибках нумерует строки с 0, а в редакторах они нумеруются с 1.

Код:
(**
 * 1. https://doi.org/10.1214/aoap/1177005878
 * 2. https://groups.google.com/g/comp.lang.fortran/c/5Bi8cFoYwPE
 *)
MODULE xkiss;

TYPE XkissArState = RECORD
    x : INTEGER;
    a0, a1, c : INTEGER;
END;


PROCEDURE XkissArInit(VAR obj : XkissArState; x, a0, a1 : INTEGER);
BEGIN
    obj.x := x;
    obj.a0 := a0 MOD 67108863; (* 2^26 - 1 *)
    obj.a1 := a1 MOD 67108863; (* 2^26 - 1 *)
    obj.c  := 1;
    IF obj.x = 0  THEN obj.x  := 123456 END;
    IF obj.a0 < 0 THEN obj.a0 := 0 END;
    IF obj.a1 < 0 THEN obj.a1 := 0 END
END XkissArInit;


PROCEDURE XkissArNext(VAR obj : XkissArState) : INTEGER;
CONST
    mask26 = 03FFFFFFH;
    mask31 = 07FFFFFFFH;
VAR
    t: INTEGER;
BEGIN
    (* LFSR part *)
    obj.x := ORD(SET(obj.x) / SET(LSH(obj.x, 1)));
    obj.x := ORD(SET(obj.x) / SET(ROR(obj.x, 23)) / SET(ROR(obj.x, 5)));
    (* AWC part *)
    t := obj.a0 + obj.a1 + obj.c;
    obj.a1 := obj.a0;
    obj.c  := LSH(t, -26);
    obj.a0 := ORD(SET(t) * SET(mask26));
    (* Output function *)
    RETURN ORD(SET(mask31) * (SET(obj.x) / SET(LSH(obj.a0, 6)) /
        SET(obj.a1 * 29)))
END XkissArNext;


PROCEDURE XkissArTest() : BOOLEAN;
CONST
    uref = 0453EFE6EH;
VAR
    prng : XkissArState;
    i, u : INTEGER;
BEGIN
    u := 0;
    XkissArInit(prng, 12345678, 3, 2);
    FOR i := 1 TO 1000000 DO
        u := XkissArNext(prng)
    END;
    OUT("Output:    "); OUT(u); OUT(" ");
    OUT("Reference: "); OUT(uref); OUT(" ");
    FOR i := 1 TO 10 DO
        u := XkissArNext(prng);
        OUT(u);
        OUT(" ")
    END;
    RETURN u = uref
END XkissArTest;


BEGIN
    IF XkissArTest() THEN OUT("Passed")
    ELSE                  OUT("Failed")
    END
END xkiss.


Ещё по исходникам из дистрибутива: там встречаются идентификаторы на транслите вроде DrawOval. Также в исходниках используется кодировка 1251 вместо более привычной UTF-8. Впрочем, в исходниках вообще обычно не используют символы, отличные от ASCII и естественные языки, отличные от английского (т.к. программист не обязан знать русский язык, но обязан знать английский).


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Не ходите в Aфрику гулять . . . Не берите, то что там лежит . . . А если по существу, то часть пробелов в тексте, не пробелы, а какие-то скрытые символы, воспринимаемые компилятором как индефикаторы. Позже посмотрю в hex редакторе что это. А пока просто почистил. И второе, именование имени модуля - отсутствовал префикс имени папки назначения. Тоже поправил. Исправленный mod файл и краткая инструкция в архиве ))).


Вложения:
_ScrollLock.png
_ScrollLock.png [ 11.67 КБ | Просмотров: 736 ]
XKISS.RAR [5.02 КБ]
Скачиваний: 16
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 03 Январь, 2026 19:08 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 207
Михаил писал(а):
Не ходите в Aфрику гулять . . . Не берите, то что там лежит . . . А если по существу, то часть пробелов в тексте, не пробелы, а какие-то скрытые символы, воспринимаемые компилятором как индефикаторы. Позже посмотрю в hex редакторе что это. А пока просто почистил. И второе, именование имени модуля - отсутствовал префикс имени папки назначения. Тоже поправил. Исправленный mod файл и краткая инструкция в архиве ))).


Спасибо. Похоже, я нашёл ошибку компилятора. Вот короткая программа:

Код:
MODULE bexmRotator;

VAR
    u : INTEGER;
BEGIN
    u := 8;
    u := ROR(u, 1);
    OUT(u)
END bexmRotator.


Она у меня выдаёт 16 вместо 4 (ROR = Rotate Right). В описании Оберон-07 от Вирта ROR описана как "x rotated right by n bits". О формате исходника:
1) В качестве разделителя строк используется символ с кодом 13, что достаточно экзотично (т.е. это не CRLF из Windows и не LF из Unix).
2) После вставки коммандера по CTRL-R файл с исходниками перестаёт быть корректным файлом в ASCII и даже в UTF-8. Т.е. любой исходник с коммандером получается невозможно представить в ASCII, что странно.


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Спасибо. Да действительно в спецификации Oberon07 так. А вот в спецификации Oberon-2, такой команды нет. А операции сдвига представлены универсальными ASH, LSH в которых сдвиг влево - неотрицательное целое, сдвиг вправо - отрицательное целое. Решил не ломать общую концепцию и сделал также: ROR(8, -1) = 4, а ROR(8, 1) = 16. Вот у Вас такой результат и получился.

ASCII, UTF-8. Честно даже не заморачивался этим вопросом. У меня так, есть кириллица - UTF-8, нет кириллицы - ASCII. Точнее сохранить можно в UTF-8, а по умолчанию win1251.

Кстати, Вы используете очень интересный алгоритм вычисления случайных чисел. Как Вы смотрите, если при необходимости буду им пользоваться. Естественно с указанием Вашего авторства.


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

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 207
Михаил писал(а):
А вот в спецификации Oberon-2, такой команды нет.

Там есть команды в модуле SYSTEM под названием ROT, и я не помню, в какую сторону там сдвиг. От сдвига влево можно ожидать скорее название ROL (ROtate Left) или ROTL. А то этот ROR в роли сдвига влево может привести к тихим, но коварным ошибкам при переносе программ.

Цитата:
при необходимости буду им пользоваться

Пользуйтесь, конечно, BigCrush, SmokeRand и PractRand 0.94 (по меньшей мере до 16 ТиБ) он проходит. Только сдвиги правильные проставьте и добейтесь прохождения внутреннего теста, без этого он развалится. Но я его сделал скорее как эксперимент для обхода ограничений системы типов Оберона, чем как нечто образцово-показательное :)

Ещё о генераторах: у Вас при прибавлении к 2147483647 всегда получается -2147483648? Это - устойчивое поведение компилятора или нет? Просто если у Вас будет везде Wraparound при целочисленном переполнении, то можете взять ГПСЧ поприличнее, шифр ChaCha20, с сидом от /dev/urandom или его аналогов.


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Спасибо, за разрешение. Алгоритм симпатичный. Постоянно страдаю, если случайное число. Лезу в os api и достаю время. Ужасть ))).

ROR переименовал в RSH, чтобы уж точно была полная ассоциация с ASH и LSH. И обнаружил ошибку в сдвиге - integer переменные при сдвиге с переменной, сдвигаются как longint. Хорошо, что хоть при сдвиге на константу сдвигаются корректно в соответствии с типом. Ещё один ужасть (((.

Сегодня буду исправлять. И следующую сборку выложу с исправлениями.

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

>>> ГПСЧ поприличнее, шифр ChaCha20, с сидом от /dev/urandom или его аналогов.

Честно, я и слов таких не знаю. Меня вполне устраивает Ваш вариант. Спасибо ))).


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

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 207
Михаил писал(а):
Лезу в os api и достаю время.

У Linux и Windows есть специальные API именно для генерации случайных чисел, причём криптографического качества. В Linux - это "файл" /dev/urandom, в Windows - функции CryptAcquireContext, CryptGenRandom, CryptReleaseContext, CryptReleaseContext. Они не очень быстрые, но для начальных значений (seed) - в самый раз.

Цитата:
Честно, я и слов таких не знаю.

Вот ChaCha20: https://datatracker.ietf.org/doc/html/rfc7539, только счётчик не забудьте заменить на 64 бита. Он сложнее и нередко медленнее всяких bithack-генераторов (в т.ч. моего), но намного надёжнее. Впрочем, если Вы не занимаетесь каким-то серьёзным моделированием, то и алгоритмы попроще, в т.ч. мой вариант KISS, скорее всего подойдут.


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

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4748
Откуда: Россия, Орёл
Тема с генераторами случайных чисел отделена: viewtopic.php?f=27&t=7034


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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1695
а, кстати. раз уж рекомендации, то ещё рекомендую Coffee Compiler Club. это такие неформальные поболтушки с Клиффом Кликом как ведущим обо всём, что так или иначе затрагивает темы компиляции. иногда просто рассуждают, иногда Клифф поясняет всякое интересное. совершенно неформальные, Клифф не чурается всяких «факов» если они в тему.


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Разбираюсь с xcb+xkb. Как всегда быстро не получилось. Наступил на все грабли. На некоторые не по одному разу. В целом создалось впечатление, что обертка Xlib хуже обертываемого оригинала xcb. Это касается, как выбранной нотации именования функций, так и механики обработки сообщений и структуры данных.

Плюс можно использовать прямой перевод одного кода в другой и даже смешивать вызовы xcb и Xlib. Судя по топикам в форуме эта тема достаточно актуальна. Вот работающий код на котором набил наибольшее количество шишек. Вдруг пригодиться. Он одинаково годиться для обеих реализаций.

Осталось только разобраться с текстовым буфером обмена. Но там вроде не сложно. В крайнем случае сделаю прямой перевод.

Достоинством библиотеки xkbcommon - возможность работать с альтернативными кодировками koi-8 и utf-8, как вместе, так и раздельно. Плюс добавил код создания кастомного курсора. Там просто, но с первого раза не получилось.

Код:
VAR xkbcont : ADDRESS;
    xkbkmap : ADDRESS;
    xkbstat : ADDRESS;

VAR dxcbimg : ADDRESS;
    crtpixm : ADDRESS;

    dxkbx11 : ADDRESS;
    x11sext : ADDRESS;
    x11core : ADDRESS;
    x11kmap : ADDRESS;
    x11stat : ADDRESS;

    xdevice : INTEGER;

   xcb_c_pixmap : PROCEDURE@(     c : ADDRESS;
                                  d : INTEGER;
                               data : ADDRESS;
                              width : INTEGER;
                             height : INTEGER;
                              depth : INTEGER;
                                 fg : INTEGER;
                                 bg : INTEGER;
                                gcp : ADDRESS) : INTEGER;

   xkb_x11_sext : PROCEDURE@(     c : ADDRESS;
                  major_xkb_version : INTEGER;
                  minor_xkb_version : INTEGER;
                              flags : INTEGER;
              major_xkb_version_out : ADDRESS;
              minor_xkb_version_out : ADDRESS;
                     base_event_out : ADDRESS;
                     base_error_out : ADDRESS) : INTEGER;
   xkb_x11_core : PROCEDURE@(     c : ADDRESS) : INTEGER;
   xkb_x11_kmap : PROCEDURE@(context: ADDRESS;
                                  c : ADDRESS;
                          device_id : INTEGER;
                              flags : INTEGER) : ADDRESS;
   xkb_x11_stat : PROCEDURE@(keymap : ADDRESS;
                                  c : ADDRESS;
                          device_id : INTEGER) : ADDRESS;


   PROCEDURE mycursor (x,y, w,h : INTEGER ;
                       cs : ARRAY OF SCHR ) : INTEGER;
      VAR s,m, c,  i, n,p :  INTEGER;
          src,msk : ARRAY 32 OF BSET;
   BEGIN
      (* load libxcb-image.so.0 ------------------ *)
      dxcbimg := DLL.dlopen(
                 @'libxcb-image.so.0', DLL.RTLD_LAZY);
      IF dxcbimg < 1 THEN RETURN 0                END;
      crtpixm := DLL.dlsym(dxcbimg,
               @'xcb_create_pixmap_from_bitmap_data');
      PUT(@xcb_c_pixmap, @crtpixm);
      (* ----------------------------------------- *)

      FOR i := 0 TO 31     DO
          src[i] := {}; msk[i] := {}              END;
      FOR i := 0 TO w*h -1 DO
          n := i DIV 32;
          p := i MOD 32;
          IF cs[i] = '*' THEN ICL(src[n], p)      END;
          IF cs[i] # ' ' THEN ICL(msk[n], p)  END END;

      s := xcb_c_pixmap(connect, xscreen.root, @src,
                                    w, h, 1, 0, 0,0 );
      m := xcb_c_pixmap(connect, xscreen.root, @msk,
                                    w, h, 1, 0, 0,0 );
      c := XCB.xcb_generate_id(connect);
      XCB.xcb_create_cursor(connect, c ,
          s,m, 0H,0H,0H, 0DD00H, 0FFFFH, 0FFFFH, x,y);

      XCB.xcb_flush(connect);

      XCB.xcb_free_pixmap(connect, s);
      XCB.xcb_free_pixmap(connect, m);

      dxcbimg := DLL.dlclose(dxcbimg);

      RETURN c ;
   END mycursor;


PROCEDURE StartXKB(  );
BEGIN
   (* обязательная установка локали ----------------- *)
   IF Lib.setlocale(Lib.LC_CTYPE, @(0X+0X)) > 0 THEN END;

   (* расширение xkbcommon-x11 ---------------------- *)
   dxkbx11 := DLL.dlopen(
                @'libxkbcommon-x11.so.0', DLL.RTLD_LAZY);
   IF dxkbx11 > 0 THEN
   x11sext := DLL.dlsym(dxkbx11,
                         @'xkb_x11_setup_xkb_extension');
   x11core := DLL.dlsym(dxkbx11,
                 @'xkb_x11_get_core_keyboard_device_id');
   x11kmap := DLL.dlsym(dxkbx11,
                      @'xkb_x11_keymap_new_from_device');
   x11stat := DLL.dlsym(dxkbx11,
                       @'xkb_x11_state_new_from_device');
   PUT(@xkb_x11_sext, @x11sext);
   PUT(@xkb_x11_core, @x11core);
   PUT(@xkb_x11_kmap, @x11kmap);
   PUT(@xkb_x11_stat, @x11stat);

   (* инициализация xkbcommon с xkbcommon-x11 ------- *)
   xkbcont := XKB.xkb_context_new(
                               XKB.XKB_CONTEXT_NO_FLAGS);
   xdevice := xkb_x11_sext(connect, 1,0, 0, 0,0, 0,0   );
   xdevice := xkb_x11_core(connect);
   xkbkmap := xkb_x11_kmap(xkbcont, connect,
               xdevice, XKB.XKB_KEYMAP_COMPILE_NO_FLAGS);
   xkbstat := xkb_x11_stat(xkbkmap, connect, xdevice   );

                  ELSE
   (* инициализация xkbcommon без xkbcommon-x11 ----- *)
   xkbcont := XKB.xkb_context_new(
                               XKB.XKB_CONTEXT_NO_FLAGS);
   xkbkmap := XKB.xkb_keymap_new_from_names(xkbcont, 0,
                        XKB.XKB_KEYMAP_COMPILE_NO_FLAGS);
   xkbstat := XKB.xkb_state_new(xkbkmap)             END;

   // dxkbx11 := DLL.dlclose(dxkbx11);
END StartXKB;


// пример обработки нажатия клавиши на клавиатуре

      XCB.XCB_KEY_PRESS      :
                          but := ORD(BIT(k_event.detail) * BIT(0FFH) );
                          key := {}; set := BIT(k_event.state        );

                          (* модификаторы shift, control, alt       *)
                          depress := ORD(set * BIT(
                                                XCB.XCB_MOD_MASK_SHIFT
                                            + XCB.XCB_MOD_MASK_CONTROL
                                            + XCB.XCB_MOD_MASK_1   ) );
                          (* включение CapsLock, NumLock            *)
                          xlocked := ORD(set * BIT(
                                                 XCB.XCB_MOD_MASK_LOCK
                                               + XCB.XCB_MOD_MASK_2) );
                          (* активная раскладка клавиатуры        *)
                          xlayout := LSH(ORD(set * BIT(0F000H)),  -13);

                          XKB.xkb_state_update_mask(xkbstat,
                                                    depress,
                                                    latched,
                                                    xlocked,
                                                    0, 0,
                                                    xlayout);

                          (* кодировка utf-8 ---------------------- *]
                          chr := XKB.xkb_state_key_get_utf32(
                                                       xkbstat,  but );

                          [* кодировка koi-8 ---------------------- *)
                          chr := XKB.xkb_state_key_get_one_sym(
                                                       xkbstat,  but );

                           . . .



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

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1695
Михаил писал(а):
Осталось только разобраться с текстовым буфером обмена. Но там вроде не сложно.
the famous last words. посмотрите на это «несложно» в LC. и поверьте: там неполная реализация.


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Посмотрел . . . Верю !!! Вот только у меня ключевое слово ‘текстовый’, и да забыл добавить 4Кб (((. А у Вас полный вариант на все возможные случае, да ещё над не самой простой структурой BB ))). Вот код реализации для Xlib (200 строчек), для xcb судя по найденой инфе еще проще и короче (кстати в win аналогичный код всего 50 строчек).


Вложения:
xlib-clipboard.txt [5.85 КБ]
Скачиваний: 9
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 20 Январь, 2026 14:58 

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


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

Зарегистрирован: Вторник, 30 Сентябрь, 2025 21:13
Сообщения: 108
Вот, в LC Вы реализовали полную спецификацию !!! А там . . . , слабо слышащим лучше не читать (((. Вот и не читал. Испугали словосочетания ‘права собственности’, ‘oбязанности владельца’ . Реализовал простую концепцию:

Приложение теряет фокус. Тогда, если есть данные для копирования захватывает буфер и взводит ожидание для отправки данных клиенту по запросу.

Приложение получает фокус. Тогда отпускает буфер и взводит флаг обновить. Затем, если первой поступает команда вставки от пользователя, проверяет наличие данных в clipboard-е. Есть копирует к себе и вставляет, иначе использует сохраненное предыдущее значение.


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

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


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

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


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

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