2016-03-30 11 views
0

Прежде всего привет, это мой первый вопрос в StackOverflow :)Два xscreens uinput мультитач устройства, неправильные координаты на втором экране х

Настройка аппаратного графических процессоров NVIDIA gtx980 2 х соединены с 3 мониторами. Видеоканал устроен как один ряд из 6 мониторов. Мы используем проприетарные драйверы nvidia. Версия xserver - 1.15.1 (7.7).

Мы создаем устройство ввода-вывода multiintouch (MT), подключенное к другому ведущему устройству, чем основной указатель. Максимальные и минимальные значения ABS_X и ABS_MT_POSITION_X устанавливаются в соответствии с размером обоих xscreens (0, 11520 - 1). Это проверяется с помощью xinput list [id устройства].

Поскольку мы используем два графических процессора, мы не можем создать один большой xscreen, но мы организуем 2 xscreens (по одному для каждого графического процессора) с тремя мониторами, выровненными по каждому из них.

Проблемы лежат на втором xscreen (xscreen1). Когда мы излучаем события касания с координатой x выше 5760 (размер первого xscreen), точки сообщаются xserver по далекой координате x (вероятно, в конце второго xscreen или дальше). Мы проверили это, начиная с xscreen0 и перейдя ко второму. Координата y получает сообщение правильно (поскольку оба xscreens выровнены по y).

Калибровочная матрица виртуального мультитач-устройства является идентификационной матрицей. Если uinput-устройство создано как одноточечное устройство ABS (например, планшет wacom, я думаю), координата x сообщается правильно.

Я думаю, что проблема может возникнуть в evdev или внутри xserver (так как я прочитал новые версии, откалиброванные внутри сервера не в evdev). Если это так, любой намек на то, где это может произойти, будет замечательным. Если это не так, любая помощь будет высоко оценена.

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^