在Linux中捕获输入

时间:2020-03-06 14:38:48  来源:igfitidea点击:

首先,是的,我知道这个问题,但是我正在寻找更多有关该问题的信息。实际上,我有一个非常相似的问题,那就是我需要能够捕获鼠标/键盘/操纵杆的输入,并且我还想尽可能避免使用SDL。我或者多或者少想知道是否有人知道我可以从Linux上的设备处理输入中获得一些不错的入门知识,也许甚至还有一些教程。 SDL非常适合跨平台输入处理,但是我将不再使用SDL的任何其他功能,因此我希望将其全部删除。建议,评论和帮助都将受到赞赏。谢谢!

为清楚起见进行编辑:

关键是捕获鼠标的运动,键盘的按下/释放,鼠标的单击以及游戏的潜在操纵杆处理。

解决方案

我们可以通过阅读本教程表单Linux文档项目开始

我们没有说明应用程序的目的,但是很少需要从输入设备读取原始数据,除非我们只是出于娱乐目的(或者学校项目或者其他目的)

如果要编写GUI应用程序(在X11图形环境中运行的GUI应用程序),则可以依赖图形工具箱(或者原始X)输入驱动程序。

如果我们正在编写文本模式客户端,则readline甚至ncurses可能是不错的选择。

如果我们知道项目只能在Linux下运行(而不是Windows甚至是BSD之一),则应研究Linux内核的输入系统。下载内核源代码并阅读Documentation / input / input.txt,尤其是evdev系统的描述。

要获得更高级别(且更具可移植性)的解决方案,请阅读Xlib。显然,它需要一个正在运行的X服务器,但是它具有继承用户键盘设置的优点。不幸的是,没有包括操纵杆事件,我们可能需要使用内核操纵杆API。

使用下面的链接查看函数void kGUISystemX :: Loop(void)

这是我在Linux上使用X Windows通过键盘和鼠标获取输入的主要循环。

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);
......