KisInputManager::Private::Private(KisInputManager *qq) : q(qq) , canvas(0) , toolProxy(0) , forwardAllEventsToTool(false) , disableTouchOnCanvas(false) , touchHasBlockedPressEvents(false) , lastTouchEvent(0) , defaultInputAction(0) , eventsReceiver(0) , moveEventCompressor(10 /* ms */, KisSignalCompressor::FIRST_ACTIVE) , testingAcceptCompressedTabletEvents(false) , testingCompressBrushEvents(false) , focusOnEnter(true) , containsPointer(true) { KisConfig cfg; disableTouchOnCanvas = cfg.disableTouchOnCanvas(); moveEventCompressor.setDelay(cfg.tabletEventsDelay()); testingAcceptCompressedTabletEvents = cfg.testingAcceptCompressedTabletEvents(); testingCompressBrushEvents = cfg.testingCompressBrushEvents(); setupActions(); canvasSwitcher = new CanvasSwitcher(this, q); qApp->installEventFilter(globalEventEater); }
KisInputManager::Private::Private(KisInputManager *qq) : q(qq) , moveEventCompressor(10 /* ms */, KisSignalCompressor::FIRST_ACTIVE) , canvasSwitcher(this, qq) { KisConfig cfg; disableTouchOnCanvas = cfg.disableTouchOnCanvas(); moveEventCompressor.setDelay(cfg.tabletEventsDelay()); testingAcceptCompressedTabletEvents = cfg.testingAcceptCompressedTabletEvents(); testingCompressBrushEvents = cfg.testingCompressBrushEvents(); setupActions(); }
void kis_x11_init_tablet() { KisConfig cfg; bool disableTouchOnCanvas = cfg.disableTouchOnCanvas(); // TODO: free this structure on exit KIS_X11 = new KisX11Data; KIS_X11->display = QX11Info::display(); kis_x11_create_intern_atoms(); // XInputExtension KIS_X11->use_xinput = false; KIS_X11->xinput_major = 0; KIS_X11->xinput_eventbase = 0; KIS_X11->xinput_errorbase = 0; // See if Xinput is supported on the connected display KIS_X11->ptrXCloseDevice = 0; KIS_X11->ptrXListInputDevices = 0; KIS_X11->ptrXOpenDevice = 0; KIS_X11->ptrXFreeDeviceList = 0; KIS_X11->ptrXSelectExtensionEvent = 0; KIS_X11->use_xinput = XQueryExtension(KIS_X11->display, "XInputExtension", &KIS_X11->xinput_major, &KIS_X11->xinput_eventbase, &KIS_X11->xinput_errorbase); if (KIS_X11->use_xinput) { KIS_X11->ptrXCloseDevice = XINPUT_LOAD(XCloseDevice); KIS_X11->ptrXListInputDevices = XINPUT_LOAD(XListInputDevices); KIS_X11->ptrXOpenDevice = XINPUT_LOAD(XOpenDevice); KIS_X11->ptrXFreeDeviceList = XINPUT_LOAD(XFreeDeviceList); KIS_X11->ptrXSelectExtensionEvent = XINPUT_LOAD(XSelectExtensionEvent); } if (KIS_X11->use_xinput) { int ndev, i, j; bool gotStylus, gotEraser; XDeviceInfo *devices = 0, *devs; XInputClassInfo *ip; XAnyClassPtr any; XValuatorInfoPtr v; XAxisInfoPtr a; XDevice *dev = 0; bool needCheckIfItIsReallyATablet; bool touchWacomTabletWorkaround; if (KIS_X11->ptrXListInputDevices) { devices = KIS_X11->ptrXListInputDevices(KIS_X11->display, &ndev); if (!devices) qWarning("QApplication: Failed to get list of tablet devices"); } if (!devices) ndev = -1; QTabletEvent::TabletDevice deviceType; for (devs = devices, i = 0; i < ndev && devs; i++, devs++) { dev = 0; deviceType = QTabletEvent::NoDevice; gotStylus = false; gotEraser = false; needCheckIfItIsReallyATablet = false; touchWacomTabletWorkaround = false; #if defined(Q_OS_IRIX) #else if (devs->type == KIS_ATOM(XWacomStylus) || devs->type == KIS_ATOM(XTabletStylus) ||devs->type == KIS_ATOM(XInputTablet)) { if (devs->type == KIS_ATOM(XInputTablet)) { kis_haveEvdevTablets = true; } deviceType = QTabletEvent::Stylus; gotStylus = true; } else if (devs->type == KIS_ATOM(XWacomEraser) || devs->type == KIS_ATOM(XTabletEraser)) { deviceType = QTabletEvent::XFreeEraser; gotEraser = true; } else if ((devs->type == KIS_ATOM(XInputKeyboard) || devs->type == KIS_ATOM(AiptekStylus)) && QString(devs->name) == "Aiptek") { /** * Some really "nice" tablets (more precisely, * Genius G-Pen 510 (aiptek driver)) report that * they are a "keyboard". Well, we cannot convince * them that they are not, so just check if this * "keyboard" has motion and proximity events. If * it looks like a duck... :) */ kis_haveEvdevTablets = true; deviceType = QTabletEvent::Stylus; gotStylus = true; needCheckIfItIsReallyATablet = true; } else if (disableTouchOnCanvas && devs->type == KIS_ATOM(WacomTouch) && QString(devs->name).contains("Wacom")) { kis_haveEvdevTablets = true; deviceType = QTabletEvent::Stylus; gotStylus = true; touchWacomTabletWorkaround = true; } #endif if (deviceType == QTabletEvent::NoDevice) continue; if (gotStylus || gotEraser) { if (KIS_X11->ptrXOpenDevice) dev = KIS_X11->ptrXOpenDevice(KIS_X11->display, devs->id); if (!dev) continue; QTabletDeviceData device_data; device_data.deviceType = deviceType; device_data.eventCount = 0; device_data.device = dev; device_data.xinput_motion = -1; device_data.xinput_key_press = -1; device_data.xinput_key_release = -1; device_data.xinput_button_press = -1; device_data.xinput_button_release = -1; device_data.xinput_proximity_in = -1; device_data.xinput_proximity_out = -1; device_data.isTouchWacomTablet = touchWacomTabletWorkaround; //device_data.widgetToGetPress = 0; if (dev->num_classes > 0) { for (ip = dev->classes, j = 0; j < dev->num_classes; ip++, j++) { switch (ip->input_class) { case KeyClass: DeviceKeyPress(dev, device_data.xinput_key_press, device_data.eventList[device_data.eventCount]); if (device_data.eventList[device_data.eventCount]) ++device_data.eventCount; DeviceKeyRelease(dev, device_data.xinput_key_release, device_data.eventList[device_data.eventCount]); if (device_data.eventList[device_data.eventCount]) ++device_data.eventCount; break; case ButtonClass: DeviceButtonPress(dev, device_data.xinput_button_press, device_data.eventList[device_data.eventCount]); if (device_data.eventList[device_data.eventCount]) ++device_data.eventCount; DeviceButtonRelease(dev, device_data.xinput_button_release, device_data.eventList[device_data.eventCount]); if (device_data.eventList[device_data.eventCount]) ++device_data.eventCount; break; case ValuatorClass: // I'm only going to be interested in motion when the // stylus is already down anyway! DeviceMotionNotify(dev, device_data.xinput_motion, device_data.eventList[device_data.eventCount]); if (device_data.eventList[device_data.eventCount]) ++device_data.eventCount; ProximityIn(dev, device_data.xinput_proximity_in, device_data.eventList[device_data.eventCount]); if (device_data.eventList[device_data.eventCount]) ++device_data.eventCount; ProximityOut(dev, device_data.xinput_proximity_out, device_data.eventList[device_data.eventCount]); if (device_data.eventList[device_data.eventCount]) ++device_data.eventCount; default: break; } } } if (needCheckIfItIsReallyATablet && (device_data.xinput_motion == -1 || device_data.xinput_proximity_in == -1 || device_data.xinput_proximity_out == -1)) { continue; } if (KisTabletDebugger::instance()->initializationDebugEnabled()) { dbgTablet << "###################################"; dbgTablet << "# Adding a tablet device:" << devs->name; dbgTablet << "Device Type:" << KisTabletDebugger::tabletDeviceToString(deviceType); } device_data.savedAxesData.tryFetchAxesMapping(dev); // get the min/max value for pressure! any = (XAnyClassPtr) (devs->inputclassinfo); for (j = 0; j < devs->num_classes; j++) { if (any->c_class == ValuatorClass) { v = (XValuatorInfoPtr) any; a = (XAxisInfoPtr) ((char *) v + sizeof (XValuatorInfo)); #if defined (Q_OS_IRIX) #else device_data.minX = a[0].min_value; device_data.maxX = a[0].max_value; device_data.minY = a[1].min_value; device_data.maxY = a[1].max_value; device_data.minPressure = a[2].min_value; device_data.maxPressure = a[2].max_value; device_data.minTanPressure = 0; device_data.maxTanPressure = 0; device_data.minZ = 0; device_data.maxZ = 0; device_data.minRotation = a[5].min_value; device_data.maxRotation = a[5].max_value; if (KisTabletDebugger::instance()->initializationDebugEnabled()) { dbgTablet << "# Axes limits data"; dbgTablet << "X: " << device_data.minX << device_data.maxX; dbgTablet << "Y: " << device_data.minY << device_data.maxY; dbgTablet << "Z: " << device_data.minZ << device_data.maxZ; dbgTablet << "Pressure:" << device_data.minPressure << device_data.maxPressure; dbgTablet << "Rotation:" << device_data.minRotation << device_data.maxRotation; dbgTablet << "T. Pres: " << device_data.minTanPressure << device_data.maxTanPressure; } #endif // got the max pressure no need to go further... break; } any = (XAnyClassPtr) ((char *) any + any->length); } // end of for loop qt_tablet_devices()->append(device_data); } // if (gotStylus || gotEraser) } if (KIS_X11->ptrXFreeDeviceList) KIS_X11->ptrXFreeDeviceList(devices); } }