首先,嗨,这是我在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中)。如果是这种情况,任何关于这可能发生的地方的提示都会很棒。如果不是这种情况,我们非常感谢任何帮助。
答案 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);
}
}