Example #1
0
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);
        }
    }
}