From ca280bfe3bc551f814d59d25079e098798fbdad7 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Thu, 27 Feb 2014 16:48:16 +0100 Subject: [PATCH] Android: Support double click event It's impossible to get the distance between two touch events down to 5 pixels on e.g. my Nexus 5. This patch makes it possible to tweak the distance through the platform theme, and sets the distance to 15% of an inch on Android. Also provides a way to override the default minimum of 5 pixels by using an environment variable. [ChangeLog][Android] Fixed double click events Task-number: QTBUG-36974 Change-Id: I23d94020c531747d6638b645133611614a2a0703 Reviewed-by: BogDan Vatra --- src/gui/kernel/qguiapplication.cpp | 4 ++- src/gui/kernel/qplatformtheme.cpp | 2 ++ src/gui/kernel/qplatformtheme.h | 3 ++- .../android/qandroidplatformtheme.cpp | 26 ++++++++++++++++++- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 1347f309e57..b2d774b40da 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -145,7 +145,7 @@ ulong QGuiApplicationPrivate::mousePressTime = 0; Qt::MouseButton QGuiApplicationPrivate::mousePressButton = Qt::NoButton; int QGuiApplicationPrivate::mousePressX = 0; int QGuiApplicationPrivate::mousePressY = 0; -int QGuiApplicationPrivate::mouse_double_click_distance = 5; +int QGuiApplicationPrivate::mouse_double_click_distance = -1; static Qt::LayoutDirection layout_direction = Qt::LeftToRight; static bool force_reverse = false; @@ -1255,6 +1255,8 @@ void QGuiApplicationPrivate::init() initPalette(); QFont::initialize(); + mouse_double_click_distance = platformTheme()->themeHint(QPlatformTheme::MouseDoubleClickDistance).toInt(); + #ifndef QT_NO_CURSOR QCursorData::initialize(); #endif diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp index e12eb318dcf..05ab2f15ba6 100644 --- a/src/gui/kernel/qplatformtheme.cpp +++ b/src/gui/kernel/qplatformtheme.cpp @@ -499,6 +499,8 @@ QVariant QPlatformTheme::defaultThemeHint(ThemeHint hint) return QVariant(false); case MousePressAndHoldInterval: return QVariant(800); + case MouseDoubleClickDistance: + return QVariant(5); } return QVariant(); } diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h index 205a5bab690..073eda8d07a 100644 --- a/src/gui/kernel/qplatformtheme.h +++ b/src/gui/kernel/qplatformtheme.h @@ -108,7 +108,8 @@ public: PasswordMaskCharacter, DialogSnapToDefaultButton, ContextMenuOnMouseRelease, - MousePressAndHoldInterval + MousePressAndHoldInterval, + MouseDoubleClickDistance }; enum DialogType { diff --git a/src/plugins/platforms/android/qandroidplatformtheme.cpp b/src/plugins/platforms/android/qandroidplatformtheme.cpp index 039b19f8614..94e58eaeb67 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.cpp +++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include QAndroidPlatformTheme::QAndroidPlatformTheme(QAndroidPlatformNativeInterface *androidPlatformNativeInterface) @@ -179,7 +180,30 @@ QVariant QAndroidPlatformTheme::themeHint(ThemeHint hint) const return QStringList("android"); } return QStringList("fusion"); - break; + + case MouseDoubleClickDistance: + { + int minimumDistance = qgetenv("QT_ANDROID_MINIMUM_MOUSE_DOUBLE_CLICK_DISTANCE").toInt(); + int ret = minimumDistance; + + QAndroidPlatformIntegration *platformIntegration + = static_cast(QGuiApplicationPrivate::platformIntegration()); + QAndroidPlatformScreen *platformScreen = platformIntegration->screen(); + if (platformScreen != 0) { + QScreen *screen = platformScreen->screen(); + qreal dotsPerInch = screen->physicalDotsPerInch(); + + // Allow 15% of an inch between clicks when double clicking + int distance = qRound(dotsPerInch * 0.15); + if (distance > minimumDistance) + ret = distance; + } + + if (ret > 0) + return ret; + + // fall through + } default: return QPlatformTheme::themeHint(hint); }