static void take_touch_grab (MetaBackend *backend) { MetaBackendX11 *x11 = META_BACKEND_X11 (backend); MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; XIEventMask mask = { META_VIRTUAL_CORE_POINTER_ID, sizeof (mask_bits), mask_bits }; XIGrabModifiers mods = { XIAnyModifier, 0 }; XISetMask (mask.mask, XI_TouchBegin); XISetMask (mask.mask, XI_TouchUpdate); XISetMask (mask.mask, XI_TouchEnd); XIGrabTouchBegin (priv->xdisplay, META_VIRTUAL_CORE_POINTER_ID, DefaultRootWindow (priv->xdisplay), False, &mask, 1, &mods); }
XLibWindowManagerAdapterPrivate::XLibWindowManagerAdapterPrivate( XLibWindowManagerAdapter *q) :q_ptr(q) { Window root; Status status; int xi_major = 2; int xi_minor = 2; m_mods.modifiers = XIAnyModifier; m_mods.status = 0; m_display = XOpenDisplay(NULL); Q_ASSERT_X(m_display, "XLibWindowManagerAdapter", "Failed to open connection to X server"); status = XIQueryVersion(m_display, &xi_major, &xi_minor); Q_ASSERT_X(status == Success, "XLibWindowManagerAdapter", "Failed to query XInput version"); if (xi_major < 2 || xi_minor < 2) { qFatal("XInput version of the server is too old (%d.%d)" , xi_major, xi_minor); } root = XDefaultRootWindow(m_display); XSelectInput(m_display, root, PropertyChangeMask); XMapWindow(m_display, root); XFlush(m_display); m_mask.deviceid = XIAllMasterDevices; m_mask.mask_len = XIMaskLen(XI_LASTEVENT); m_mask.mask = (unsigned char*)calloc(m_mask.mask_len, sizeof(unsigned char)); XISetMask(m_mask.mask, XI_TouchBegin); XISetMask(m_mask.mask, XI_TouchUpdate); XISetMask(m_mask.mask, XI_TouchEnd); XISetMask(m_mask.mask, XI_TouchOwnership); XISetMask(m_mask.mask, XI_HierarchyChanged); XIGrabTouchBegin(m_display, XIAllMasterDevices, root, 0, &m_mask, 1, &m_mods); }
void XLibWindowManagerAdapterPrivate::handleCreatedWindow(Window window) { QString targetName; if (window != XDefaultRootWindow(m_display)) { XClassHint *classHint = XAllocClassHint(); XGetClassHint(m_display, window, classHint); targetName = QString(classHint->res_class); XFree(classHint->res_name); XFree(classHint->res_class); XFree(classHint); } if (q_ptr->m_listener) { bool grabTouches = true; qDebug() << "Created: " << window << " " << targetName; q_ptr->m_listener->onWindowCreated(window, targetName, &grabTouches); if (grabTouches) { XIGrabTouchBegin(m_display, XIAllMasterDevices, window, 0, &m_mask, 1, &m_mods); } } }