Процедуры оконных сообщений в Linux против Windows - PullRequest
6 голосов
/ 08 февраля 2009

В Windows при создании окна вы должны определить (c ++)

LRESULT CALLBACK message_proc(HWND Handle, UINT Message, WPARAM WParam, LPARAM LParam);

для обработки всех сообщений, отправляемых из ОС в окно, например нажатия клавиш и тому подобное.

Я хочу прочесть о том, как работает та же система в Linux. Может быть, это потому, что я немного отстаю в терминологии, но мне не удается найти что-либо об этом через Google (хотя я уверен, что их должно быть много!).

  • Это все еще одна функция C, которая обрабатывает все коммуникации?
  • Отличается ли определение функции на разных WM (Gnome, KDE) или оно обрабатывается на более низком уровне в ОС?

Редактировать : Я изучал такие инструменты, как QT и WxWidgets, но эти платформы, похоже, больше ориентированы на разработку приложений с обширным графическим интерфейсом. Я скорее ищу способ создать основное окно (ограничить изменение размера, границы / декорации) для моей графики OGL и получить ввод на более чем одной платформе. И, согласно моим первоначальным исследованиям, такого рода функции - единственный способ получить эти данные.

Какой будет лучший маршрут? Чтение, изучение, а затем использовать QT или WxWidgets? Или узнать, как работают системы и реализовать те несколько основных функций, которые я сам хочу?

Ответы [ 4 ]

7 голосов
/ 08 февраля 2009

Ну, на самом базовом уровне у вас есть протокол X Window http://en.wikipedia.org/wiki/X_Window_System_core_protocol,, с которым мы можем справиться довольно сложно, если вы захотите сделать какое-либо приложение. Следующим в стеке является Xlib http://en.wikipedia.org/wiki/Xlib, который является «удобной» оболочкой для протокола X, но все же сложен для «реальных» приложений. На вершине Xlib построено большинство других сред, пытающихся упростить разработку приложений. Наиболее известны: Xt, Gtk, Qt и т. Д.

Как и в окне, у вас есть «цикл обработки событий», и, если вы хотите, вы можете реализовать поверх него метафору GetMessage / DispachMessage для имитации поведения окон. Таким образом, у вас может быть WNDPROC, но изначально X не предоставляет такой возможности.

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

Если вам нужно что-то простое, вы можете попробовать SDL http://www.libsdl.org/,, который является кроссплатформенной библиотекой, предназначенной для разработки игр / простых приложений. Другой альтернативой является библиотека игр Allegro http://www.talula.demon.co.uk/allegro/.

5 голосов
/ 08 февраля 2009

Это совершенно и совершенно другое. Эта оконная процедура на 100% специфична для ОС Windows. Для Linux это будет зависеть от оконного менеджера (gnome, kde - как вы уже упоминали). Если вы хотите заняться кроссплатформенной разработкой, вы можете посмотреть на такие вещи, как QT.

Возможно, вы захотите взглянуть на следующие URL:

http://www.qtsoftware.com/products/appdev
http://en.wikipedia.org/wiki/Qt_toolkit

4 голосов
/ 09 февраля 2009

В принципе это абсолютно то же самое. Тем не менее, это не имеет никакого отношения к связи с ОС (как и в win32, использование user32.dll совершенно необязательно)

Приложение GUI где-то имеет цикл обработки событий, который обрабатывает сообщения из очереди на некотором уровне.

Существует множество библиотек, которые обычно используются для «скрытия» этого поведения - вы можете использовать их (и, действительно, вам следует). Во всяком случае, система событий Xlib даже более извращена, чем система user32.dll в Win32, и менее понятна, поэтому меньше людей используют ее напрямую.


В Linux или в Windows приложения могут использовать низкоуровневый графический интерфейс или библиотеку. Большинство используют библиотеку. Приложения также могут выбрать ни то, ни другое и работать без графического интерфейса (серверные приложения обычно делают это). Приложения могут создавать несколько потоков, один из которых находится в цикле событий, а другие работают по-другому. Это тоже популярный подход.

  • Большинство приложений с графическим интерфейсом используют библиотеку более высокого уровня для своего графического интерфейса
  • Неинтерактивные приложения, например серверные приложения, вообще не используют графический интерфейс и не используют библиотеки (например, XLib, user32.dll)
  • Приложения, которые не поддаются «циклу событий» (например, играм), обычно используют отдельный поток для обработки своего цикла событий.
  • Эти вещи в значительной степени справедливы для Win32 и Linux.
2 голосов
/ 08 февраля 2009

Как заявляет xhantt, то, что транспортирует эквивалентные сообщения, которые вы ищете, это X Window System. Что, действительно, может быть немного сложным.

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

Вы также можете найти XCB , которая является более новой и, возможно, более простой библиотекой.

Если вы создадите свое приложение поверх этих двух библиотек, оно будет работать без проблем (почти, мы никогда не можем быть слишком уверены) на каждой WM. И вам не потребуется зависимость, которую большинство пользователей Linux не имеют при установке. Если вы используете Qt, GTK и т. Д. ... Это будет проще и работать под любой WM, но на них может не быть установленной библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...