2012-01-30 5 views
4

Я создаю кросс-платформенный игровой движок, и теперь я сосредоточен на системе ввода.Получение ввода устройства (мышь, клавиатура ...) на LINUX

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

В окнах я создал окно «Только для сообщений», которое подает входную систему с сообщениями (переведенными на платформу независимо) из RAWINPUT.

Теперь у меня возникли проблемы, чтобы выяснить, как сделать подобное в системе на основе unix. Есть ли удобный способ получить вход (keyup, keydown, mousemove ...) из ядра? Или любым другим способом без необходимости показывать любое окно?

EDIT

Я не хочу, чтобы мой вход системы будет зависеть от моей видеообработки. Renderer должен просто уведомлять вход при изменении фокуса приложения ... Поэтому я хочу, чтобы система ввода работала по разному потоку, чем с визуализатором.

ответ

0

В системе X Window есть концепция только для ввода окон, которая более или менее параллельна окну только для сообщений под Windows.

5

Обычно кросс-платформенный ввод достигается с помощью библиотеки-обертки - SDL - это тот, который довольно хорош в этом, а текущая версия - даже лицензированная BSD.

Преимущества использования обертки настолько велики, что даже игры Windows, использующие собственное решение для Windows, обычно используют SDL в качестве оболочки при работе в Linux (это была оригинальная причина, по которой был создан SDL).

Так что в худшем случае вы можете хранить свои библиотеки в Windows и использовать SDL для реализации специально в системах * nix.

+0

Я не хочу, чтобы моя система ввода зависела от моего рендерера. Renderer должен просто уведомлять вход при изменении фокуса приложения ... Поэтому я хочу, чтобы система ввода работала по разному потоку, чем с визуализатором. SDL, к сожалению, необходимо, чтобы оба они были в одном потоке. – relaxxx

+0

Я не знаю о таком ограничении под SDL. Как вы думаете, почему он существует? Попробуйте googling для 'sdl multithreading', существует множество примеров программ, которые делают то, что вы утверждаете, невозможно. –

2

Предполагая, что вы используете X11:

Питер Хуттерер имеет series of XInput2 articles. Похоже, поддерживается raw events.

ManyMouse claims to use XInput2 without a window:

  • В системах Unix, мы пытаемся использовать расширение XInput2, если это возможно. ManyMouse попытается отступить к другим подходам, если нет X-сервера или X-сервер не поддерживает XInput2. Если вы хотите использовать цель XInput2 , убедитесь, что вы ссылаетесь на «-ldl», так как мы используем dlopen() для , найдите библиотеки X11/XInput2. Вам не нужно напрямую ссылаться на Xlib , а ManyMouse будет изящно издан (не сообщая никому из мышей в драйвере ManyMouse XInput2), если библиотеки не существуют в системе конечного пользователя. Естественно, вам понадобятся заголовки X11 в вашей системе (на Ubuntu, вы хотели бы apt-get install libxi-dev). Вы можете построить с SUPPORT_XINPUT2, установленным на ноль, чтобы полностью отключить поддержку XInput2. Обратите внимание: цель XInput2 не нуждается в вашем приложении для предоставления окна X11 . Приложение test_manymouse_stdio работает с этой целью, пока запущен сервер X.Обратите внимание, что расширение X11 DGA конфликтует с XInput2 (в частности: SDL может его использовать). Это хороший способ иметь дело с этого в SDL 1.2:

Может быть стоит посмотреть через источник.

Смежные вопросы