Как прочитать значение давления от стилуса графического планшета в Linux? - PullRequest
5 голосов
/ 30 января 2012

Я пытаюсь добавить поддержку чувствительности к давлению в Synergy на Linux. я считаю, что первым шагом должно быть определение значения давления на серверная сторона. Движение стилуса появляется как событие MotionNotify, когда XNextEvent называется. Тем не менее, эта линия не выводит давление значение при использовании стилуса:

   case MotionNotify:
           XDeviceMotionEvent* motionEvent = reinterpret_cast<XDeviceMotionEvent*>(xevent);
           LOG((CLOG_INFO "tablet event: pressure=%d", motionEvent->axis_data[2]));

Чтобы решить эту проблему, я предположил, что я не могу быть "подписан" на такие информация, поэтому после некоторых примеров, которые я нашел в Интернете, я попытался Чтобы открыть устройство Wacom:

   void
   CXWindowsScreen::openWacom()
   {
           // init tablet (e.g. wacom)
           int deviceCount;
           XDeviceInfo* deviceInfo = XListInputDevices(m_display, &deviceCount);
           for (int i = 0; i < deviceCount; ++i) {

                   if (CString(deviceInfo[i].name).find("stylus") != CString::npos) {

                           LOG((CLOG_INFO "tablet device: name='%s', id=%d",
                                           deviceInfo[i].name, deviceInfo[i].id));

                           XDevice* tabletStylusDevice = XOpenDevice(m_display, deviceInfo[i].id);
                           if (tabletStylusDevice == NULL) {
                                   LOG((CLOG_ERR "failed to open tablet device"));
                                   return;
                           }

                           XEventClass eventClass;
                           DeviceMotionNotify(tabletStylusDevice, m_tabletMotionEvent, eventClass);
                           XSelectExtensionEvent(m_display, m_window, &eventClass, 1);

                           LOG((CLOG_INFO "tablet motion event=%d class=%d",
                                           m_tabletMotionEvent, eventClass));
                   }
           }
           XFreeDeviceList(deviceInfo);
   }

Это действительно обнаруживает устройство Wacom ...

   2012-01-30T11:15:59 INFO: tablet device: name='Wacom Intuos4 6x9 stylus', id=8
           /home/nick/Projects/synergy/1.4/src/lib/platform/CXWindowsScreen.cpp,1144
   2012-01-30T11:15:59 INFO: tablet motion event=105 class=2153
           /home/nick/Projects/synergy/1.4/src/lib/platform/CXWindowsScreen.cpp,1157

Но я до сих пор никогда не получал стилус событие 105 (m_tabletMotionEvent) из XNextEvent ...

   if (xevent->type == m_tabletMotionEvent) {
           XDeviceMotionEvent* motionEvent = reinterpret_cast<XDeviceMotionEvent*>(xevent);
           LOG((CLOG_INFO "tablet event: pressure=%d", motionEvent->axis_data[2]));
           return;
   }

Другими словами, вышеприведенное if никогда не оценивается как истинное.

Я надеюсь, что кто-то может помочь мне с этим, я пытался решить это в течение нескольких недель.

Следующей задачей будет подделка уровня давления на Синергию клиент, чтобы такие программы, как GIMP, получали его (и я даже не уверен, куда начнем с этого).

...