【问题标题】:Two xscreens uinput multitouch device, wrong coordinates on second x screen两屏输入多点触控设备,第二个x屏坐标错误
【发布时间】:2016-03-30 19:17:44
【问题描述】:

首先你好,这是我在stackoverflow中的第一个问题:)

硬件设置是 2 个 nvidia gtx980 GPU,每个 GPU 连接到 3 个显示器。 拼接墙布置为一排 6 台显示器。 我们正在使用专有的 nvidia 驱动程序。 xserver 版本为 1.15.1 (7.7)。

我们创建了一个 uinput 多点触控 ABS (MT) 设备,该设备连接到与核心指针不同的主设备。 ABS_X 和 ABS_MT_POSITION_X 的最大值和最小值根据两个 xscreen 的大小 (0, 11520 - 1) 设置。这是使用 xinput list [device id] 检查的。

由于我们使用两个 GPU,我们无法创建一个大 xscreen,但我们安排了 2 个 xscreen(每个 GPU 一个),每个 xscreen 上对齐三个显示器。

问题在于第二个 xscreen (xscreen1)。当我们发出 x 坐标高于 5760(第一个 xscreen 的大小)的触摸事件时,xserver 会在远处的 x 坐标上报告点(可能在第二个 xscreen 的末尾或更远)。我们已经从 xscreen0 开始检查了这一点并移至第二个。 y 坐标得到正确报告(因为两个 xscreen 都是 y 对齐的)。

虚拟多点触控设备的校准矩阵是单位矩阵。 如果将 uinput 设备创建为 ABS 单点设备(我猜像 wacom 数位板),则 x 坐标将正确报告。

我认为问题可能出在 evdev 或 xserver 内部(因为我已经阅读了在服务器内部而不是在 evdev 中校准的新版本)。如果是这种情况,任何关于这可能发生在哪里的提示都会很棒。如果不是这种情况,我们非常感谢任何帮助。

【问题讨论】:

    标签: touch xserver xinput evdev uinput


    【解决方案1】:

    对于将来可能遇到此问题的任何人,我们的团队很久以前就提出了一个小补丁,以备不时之需...

    ---
    dix/events.c | 21 +++++++++++++++++++--
    mi/mieq.c    | 26 ++++++++++++++++++++++++++
    2 files changed, 45 insertions(+), 2 deletions(-)
    
    diff --git a/dix/events.c b/dix/events.c
    index 8efdf18..5155ef5 100644
    --- a/dix/events.c
    +++ b/dix/events.c
    @@ -2999,8 +2999,25 @@ CheckMotion(DeviceEvent *ev, DeviceIntPtr pDev)
                 /* Motion events entering DIX get translated to Screen 0
                    coordinates.  Replayed events have already been
                    translated since they've entered DIX before */
    -            ev->root_x += pSprite->screen->x - screenInfo.screens[0]->x;
    -            ev->root_y += pSprite->screen->y - screenInfo.screens[0]->y;
    +
    +                       /*Now we take into account inputs comming from MT device that uses absolutes coordinates.*/
    +                       switch (ev->type) {
    +                               case ET_Motion:
    +                               case ET_KeyPress:
    +                               case ET_KeyRelease:
    +                               case ET_ButtonPress:
    +                               case ET_ButtonRelease:
    +                                       ev->root_x += pSprite->screen->x - screenInfo.screens[0]->x;
    +                                       ev->root_y += pSprite->screen->y - screenInfo.screens[0]->y;
    +                                       break;
    +                               case ET_TouchBegin:
    +                               case ET_TouchUpdate:
    +                               case ET_TouchEnd:
    +                                       ev->root_x -= screenInfo.screens[0]->x;
    +                                       ev->root_y -= screenInfo.screens[0]->y;
    +                                       break;
    +
    +                       }
             }
             else
     #endif
    diff --git a/mi/mieq.c b/mi/mieq.c
    index 05447d6..cc151f6 100644
    --- a/mi/mieq.c
    +++ b/mi/mieq.c
    @@ -447,6 +447,32 @@ mieqMoveToNewScreen(DeviceIntPtr dev, ScreenPtr screen, DeviceEvent *event)
             DequeueScreen(dev) = screen;
             x = event->root_x;
             y = event->root_y;
    +
    +
    +               /*Now we take into account inputs comming from MT device that uses absolutes coordinates.*/
    +               switch (event->type) {
    +                       case ET_Motion:
    +                       case ET_KeyPress:
    +                       case ET_KeyRelease:
    +                       case ET_ButtonPress:
    +                       case ET_ButtonRelease:
    +                               // print
    +                               break;
    +                       case ET_TouchBegin:
    +                       case ET_TouchUpdate:
    +                       case ET_TouchEnd:
    +                               {
    +                               ScreenPtr screenPtr = dev->spriteInfo->sprite->pDequeueScreen;
    +                               x -= screenPtr->x;
    +                               y -= screenPtr->y;
    +                               NewCurrentScreen(dev, screenPtr, x, y);
    +                               return;
    +                               // break;
    +                               }
    +                       default:
    +                               break;
    +               }
    +
             NewCurrentScreen(dev, DequeueScreen(dev), x, y);
         }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多