两个xscreen输入多点触控设备,第二个x屏幕上的坐标错误

时间:2016-03-30 19:17:45

标签: touch xserver xinput evdev uinput

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

硬件设置为2 x 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,我们无法创建一个大型x屏幕,但我们安排了2个x屏幕(每个GPU一个),每个屏幕上对齐三个显示器。

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

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

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

1 个答案:

答案 0 :(得分:0)

对于任何可能在将来遇到这个问题的人,我们的团队很久以前就提出了一个小补丁,在这里可能会有用......

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