如何从Linux中的图形输入板手写笔读取压力值?

时间:2012-01-30 11:31:42

标签: c++ linux x11 wacom

我正在尝试在Linux上为Synergy添加压力敏感度支持。一世 相信第一步应该是检测压力值 服务器端。手写笔运动作为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 (X_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永远不会评估为真。

我希望有人可以帮我解决这个问题,我一直在努力解决这个问题。

接下来的挑战将是假设Synergy的压力水平 客户端,以便像GIMP这样的程序将收到它(我甚至不知道在哪里 从那开始)。

0 个答案:

没有答案