【问题标题】:SDL_PollEvent sometime not capturing touch event after screen reconnectSDL_PollEvent 有时在屏幕重新连接后不捕获触摸事件
【发布时间】:2018-05-24 16:27:41
【问题描述】:

我正在使用 SDL 库来捕获屏幕上的触摸和鼠标事件。但是如果我断开触摸屏并重新连接它,有时我会停止获取手指触摸事件,即 SDL_FINGERMOTION、SDL_FINGERDOWN、SDL_FINGERUP。

下面是我正在使用的代码:

while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_QUIT:{
                //Some Code
            }
            case SDL_MOUSEBUTTONDOWN:{
                //Some Code
            }
            case SDL_MOUSEBUTTONUP:{
                //Some Code
            }
            case SDL_MOUSEMOTION:{
               //Some Code
            }
        case SDL_FINGERMOTION:
        case SDL_FINGERDOWN:
        case SDL_FINGERUP: {
             //Some Code
            }
        }
    }
    return true;
}

任何建议都会有所帮助。

PS 使用 opensuse 42.2 和 SDL2

【问题讨论】:

    标签: c++ sdl-2 touchscreen


    【解决方案1】:

    在 Linux 上,SDL 在您调用 SDL_Init(... | SDL_INIT_EVENTS) 的那一刻打开每个可用的输入事件设备。如果从系统中删除输入设备,SDL 将在尝试轮询时收到错误消息。但是,当添加新的输入设备时,SDL 不会收到通知,因此它永远不会打开新的输入事件设备。

    解决方法可能是定期检查 /dev/input/event* 自己,看看是否有任何变化,如果有,请执行 SDL_QuitSubSystem(SDL_INIT_EVENTS); SDL_Init(SDL_INIT_EVENTS)。但是,这是一种 hack,可能无法可靠地工作。

    【讨论】:

    • 最近的 SDL2 或多或少支持游戏杆、游戏手柄、音频设备和某些实现(例如 linux evdev)触摸屏的热添加。
    • @G。 Sliepen 我在 SDL 中没有看到 SDL_Exit 你的意思是 SDL_QuitSubSystem 吗?
    • 不幸的是它不起作用。我在我的应用程序 SDL_QuitSubSystem(SDL_INIT_EVENTS) 中添加了以下重新连接事件; SDL_Init(SDL_INIT_EVENTS)
    • 啊,是的,我的意思是SDL_QuitSubSystem()
    • 在调查了SDL2 lib后,我发现在重新连接后,触摸设备的触摸ID发生了变化,因为SDL无法处理触摸事件,因为它有不同的触摸ID和触摸设备映射它最初是使用 SDL_Init 创建的。所以我们必须调用 SDL_Init(SDL_INIT_VIDEO) 来重新初始化 SDL touch id 和 touch device mapping。不幸的是,我的项目不允许再次重新初始化 SDL。所以我必须使用 X11 api 获取 touch id 来处理这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2020-04-09
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多