Захват ввода в Linux - PullRequest
       21

Захват ввода в Linux

5 голосов
/ 24 сентября 2008

Во-первых, да, я знаю о этом вопросе , но я ищу немного больше информации, чем это. На самом деле, у меня довольно похожая проблема: мне нужно иметь возможность захватывать ввод для мыши / клавиатуры / джойстика, и я также хотел бы избежать SDL, если это вообще возможно. Мне было более или менее интересно, если кто-нибудь знает, где я могу получить некоторые приличные учебники по обработке ввода с устройств в Linux, возможно, даже некоторые учебники. SDL отлично работает для кроссплатформенной обработки ввода, но я не собираюсь использовать что-либо еще из SDL, поэтому я бы хотел полностью исключить это. Предложения, комментарии и помощь приветствуются. Спасибо!

Изменить для наглядности:

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

Ответы [ 5 ]

5 голосов
/ 24 сентября 2008

Используя ссылку ниже, посмотрите на функцию void kGUISystemX :: Loop (void)

Это мой основной цикл получения ввода с клавиатуры и мыши с помощью X Windows в Linux.

http://code.google.com/p/kgui/source/browse/trunk/kguilinux.cpp

Вот фрагмент:

    if(XPending(m_display))
    {
        XNextEvent(m_display, &m_e);
        switch(m_e.type)
        {
        case MotionNotify:
            m_mousex=m_e.xmotion.x;
            m_mousey=m_e.xmotion.y;
        break;
        case ButtonPress:
            switch(m_e.xbutton.button)
            {
            case Button1:
                m_mouseleft=true;
            break;
            case Button3:
                m_mouseright=true;
            break;
            case Button4:/* middle mouse wheel moved */
                m_mousewheel=1;
            break;
            case Button5:/* middle mouse wheel moved */
                m_mousewheel=-1;
            break;
            }
        break;
        case ButtonRelease:
            switch(m_e.xbutton.button)
            {
            case Button1:
                m_mouseleft=false;
            break;
            case Button3:
                m_mouseright=false;
            break;
            }
        break;
        case KeyPress:
        {
            XKeyEvent *ke;
            int ks;
            int key;

            ke=&m_e.xkey;
            kGUI::SetKeyShift((ke->state&ShiftMask)!=0);
            kGUI::SetKeyControl((ke->state&ControlMask)!=0);
            ks=XLookupKeysym(ke,(ke->state&ShiftMask)?1:0);
......
2 голосов
/ 24 сентября 2008

Если вы знаете, что ваш проект будет работать только под Linux (не под Windows или даже с одним из BSD), вам следует изучить систему ввода ядра Linux. Загрузите исходный код ядра и прочитайте Documentation/input/input.txt, в частности описание системы evdev.

Для решения значительно более высокого уровня (и более переносимого), читайте в Xlib . Очевидно, что для этого требуется работающий X-сервер, но он обладает преимуществом наследования настроек клавиатуры пользователя. К сожалению, события джойстика не включены, для них вам, вероятно, потребуется использовать API-интерфейс джойстика ядра.

1 голос
/ 24 сентября 2008

Вы не указали цель своего приложения, но чтение необработанных данных с устройств ввода редко требуется, если вы просто не делаете это для развлечения (или школьный проект или что-то еще)

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

Если вы пишете клиент в текстовом режиме, то, возможно, readline или даже ncurses могут быть хорошими альтернативами.

1 голос
/ 24 сентября 2008

Вы можете начать с чтения Это руководство Форма Проект документации Linux

0 голосов
/ 24 декабря 2012

Вы можете получить прямой ввод из файлов в / dev / input. Это самый простой способ сделать это, и вам не нужно никакого дополнительного программного обеспечения.

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