0

首先嗨,这是我在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 中校准的新版本)。如果是这种情况,任何关于这可能发生在哪里的提示都会很棒。如果不是这种情况,任何帮助都将受到高度赞赏。

4

1 回答 1

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);
     }
 }
于 2016-12-09T23:46:12.347 回答