Skip to content
  • Carlos Garnacho's avatar
    core: Add minimal handling of touch events · 991c85f6
    Carlos Garnacho authored
    Currently touch events are ignored in the core event handler,
    and hence dealt with within GDK. If those touch events were
    emulating pointer events, GDK would attempt to convert back
    those events to pointer events as the frame GdkWindow doesn't
    have the GDK_TOUCH_MASK set.
    
    This results in XI_TouchBegin events being initially processed
    by GDK, converted to button events, and triggering a grab op
    that subverts touch events into pointer events, so the touch
    is never ever seen again by GDK. This leaves GDK in an
    inconsistent internal state wrt pointer grabs, so future
    pointer-emulating touches will refer to the same window forever.
    
    Fix this by handling touch events minimally, just enough to
    convert XI_TouchBegin to GDK_BUTTON_PRESS within mutter, so GDK
    is bypassed for every touch event just like it is for pointer
    events. This, and the XIGrabDevice() that keeps coercing pointer
    events when the grab operation starts, are enough to fix window
    drag and drop on touch devices.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=723552
    991c85f6