LINUX.ORG.RU

что лежит в основе обработки событий?

 , , ,


1

1

здравствуйте, задался вопросом: как реализовать с нуля event-loop... вот я понимаю как работает select/poll - просто ждем некоторых «событий» на определенных дескрипторах, например, нажатие клавиши на стандартных поток ввода, или пришедших байт по сети на сокет... однако не понятно как, например, в qt или x11 реализованы все виды «событий», т.е. нажатие мышки, передвижение мышки, изменение цвета или еще что-то? какие дескрипторы файлов в данном случае select должен обрабатывать, если вообще основано на select, или там вообще другой механизм?

бесконечный цикл

UVV ★★★★★
()

да чё сложного? абстрактно вот так

event_t myevent;

while(event(&myevent)) {
    if (myevent.type == MOUSEMOVE) {
        ...
        continue;
    }
    if (myevent.type == KBD) {
        ...
    ...
    ...    
}

anonymous
()
Ответ на: комментарий от anonymous

сами события (тип event_t) как реализованы? что это? изменение в дескрипторе файлов каких-то или что?

xperious ★★
() автор топика
Ответ на: комментарий от beastie

хм, ну вот допустим, как посмотреть какой файл у меня в системе отвечает за мышь?)

xperious ★★
() автор топика
Ответ на: комментарий от xperious

Если брать иксы, то тут клиент-серверная архитектуры.

Клиент ни про какие «события мыши» в этом смысле не знает. Эти занимается сервер.

Сервер читает файлы /dev/input/. Один из них это мышь. (Кстати, можно дать комадну lsof, и станет видно, какие файлы какая программа читает).

Можно дать команду cat /dev/input/event1 и подвигать мышью, будет видно :)

Клиент же, в данном случае приложение Qt, общается с сервером через сокет по протоколу иксов. У меня в системе это файл /tmp/.X11-unix/X0.

anarquista ★★★★★
()
Ответ на: комментарий от xperious

Да, с помощью select или poll/epoll или как-то ещё. Но делает это сервер, процес Xorg. А клиентское приложение общается с сервером через сокет (возможно, что по сети).

anarquista ★★★★★
()
Ответ на: комментарий от anarquista

я просто хотел бы сам примитивнейший цикл сделать чтобы принимать события от мыши и клавиатуры... значит нужно добавить дескриптор файла /dev/input/mouse0 для мыши с помощью FD_SET?

xperious ★★
() автор топика
Ответ на: комментарий от xperious

тут смотря что понимать под «примитивнейшим циклом». если писать программу, которая будет взаимодействовать с ядром без иксов, то да. Добавлять какой-то из этих файлов и читать. Понадобится, наверное, подключить linux/input.h

но если говорить об обычных графических программах (те же qt), то они взаимодействуют с сокетом иксов и получают события по протоколу иксов.

anarquista ★★★★★
()
Ответ на: комментарий от anarquista

ну да, без иксов хотел, чтобы понять что лежит в основе любого event loop-а

xperious ★★
() автор топика
Ответ на: комментарий от anarquista

я так понимаю в основе libuv,boost.asio,qt,x11 лежит один и тот же принцип - мультиплексированный ввод-вывод

xperious ★★
() автор топика
Ответ на: комментарий от xperious

сами события (тип event_t) как реализованы? что это?

Это абстрактный event loop для улучшения понимания того что это такое и как оно обычно работает. Функция event() блокирует до тех пор, пока не произойдет какое-то событие. Как только оно происходит - управление возвращается. event_t - это, опять таки, для примера - переменная, куда функция event() будет запихивать данные о событии.

anonymous
()

Ну в иксах по сути дела связь с X.org осуществляется тоже через сокет. Так что тулкит тупо добавляет ещё один файловый дескриптор в набор для отслеживания, а когда он триггерется забирает все пришедшие события с помощью неблокирующих функций библиотеки Xlib или Xcb типа «забрать все события, которые есть, не ждать новых» (такие есть, читай доки).

Под виндой есть специальные системные вызовы типа «ждать оконного сообщения ИЛИ файлового события», а не только «ждать файлового события».

Что там под вяленым и маком я не знаю, но там тоже должны быть соответствующие функции (либо события от оконной системы приходят через обычный пайп/сокет, либо есть специальные функции ожидания сразу и того, и другого, реализованные на уровне API ОС).

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.