Skip to content
Daniel Schürmann edited this page Feb 19, 2014 · 11 revisions

Problem

Mixxx 1.11 don't works very well on touch screen devices. This was reported in some bugs like

These bug reports are containing many details and further lings, but are cluttered due to the post style. So here now brief overview.

OS level touch to mouse solution

All three OS's are offering a native touch to mouse converter. It is required to be able to use legacy application which are not able to receive original touch events. The right click is generated by some kind gesture. It is only a single pointing device emulated to achieve maximum compatibility. Unfortunately these solutions are optimized for common standard widgets. Mixxx on the other side does not use standard widgets. The Mixxx widgets are designed to behave as close possible like hardware Midi controls. The main difference here is that Mixxx buttons are emitting without delay on the push event while normal GUI buttons are emitting on release event. This way we have not time to detect a right click gesture without delaying the left click.

Here an overview to the different native right click solutions:

Windows 8

  • Right click = Releasing after long push

Ubuntu

  • Right click = long push
  • Right click = Two finger click

iOs

  • Right click = long push

Mixxx Right click solution

Since the Mixxx buttons behaves like Midi buttons, a natural solution for the right click problem is to introduce a shift button like we can find on many DJ controllers as well.

In https://github.com/mixxxdj/mixxx/pull/76 was the new "[Controls]", "touch_shift" Control Object introduced which can be connected to a GUI Shift Button, a keyboard key or a controller button. Once this is = 1.0, the connected button is pressed, all touch tabs will be interpreted as right clicks.

This allows us to issue right and left clicks without additional latency to detect a gesture.

Please note: We have already discussed a way to generalize the shift key in Mixxx. We might will remove "[Controls]", "touch_shift" once this is introduce.

Multi touch

All legacy widgets only support one pointing device. A second point might produces failure. Consequently the native touch to mouse solutions only support single touch. Once it is active the Application does not receive any touch events. This works for all legacy applications, but we loose the benefit of multi touch.

The Qt4 solution relies on that. This means, if you enable touch for a single widget, the native touch to mouse solution is disabled. This way we have nice multi touch support on Mixxx's buttons but no touch at all for the library.

In Qt5 this problem is solved by Qt's own touch to mouse solution which is configurable per widget.

To fix this for Qt4 the Qt5 solution was introduced by overwriting Qt4 functions. See In https://github.com/mixxxdj/mixxx/pull/76 this fallback solution only supports a single pointing device to be compatible with all legacy widgets.

Normally, widgets will loose a button pressed state when loosing the focus. This is a normal behaviour if we have a single pointing device. The widget implementation expects it and may rely on it.

If we need to control more widgets at the same time, the pressed state must not removed wit the focus. In this case we have no mouse emulation, but real multi touch support. This was Implemented on the widget itself.

So you will find both solutions in https://github.com/mixxxdj/mixxx/pull/76 1.) A single point touch mouse emulation for all widgets in MixxxApplication. The touch point behaves exactly like a Mouse. 2.) A real multi touch solution in WWidget. It is still using Mouse events, but the widgets are prepared. This solution is not effected by the focus.

Clone this wiki locally