summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-06-10 16:52:27 +0100
committerSteve Block <steveblock@google.com>2011-06-14 01:14:02 +0100
commit54cdeeebc7adcbcd900e8b6a141a8cae27d9a631 (patch)
tree845b0d338b204a48560eca3b51b34cf92ed96840 /Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
parentd2c5226a647dc21d0c15267e09a3d19cf3e0d593 (diff)
downloadexternal_webkit-54cdeeebc7adcbcd900e8b6a141a8cae27d9a631.zip
external_webkit-54cdeeebc7adcbcd900e8b6a141a8cae27d9a631.tar.gz
external_webkit-54cdeeebc7adcbcd900e8b6a141a8cae27d9a631.tar.bz2
Merge WebKit at branches/chromium/742 r88085: Initial merge by git.
Change-Id: I0501b484b9528e31b0026e5ad64416dd6541cdde
Diffstat (limited to 'Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp')
-rw-r--r--Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp73
1 files changed, 49 insertions, 24 deletions
diff --git a/Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp b/Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
index 71d1b39..4e355d2 100644
--- a/Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
+++ b/Source/WebKit/chromium/src/gtk/WebInputEventFactory.cpp
@@ -45,15 +45,39 @@
namespace {
-bool countsAsDoubleClick(gint timeDiff, gint xDiff, gint yDiff)
+// For click count tracking.
+static int gNumClicks = 0;
+static GdkWindow* gLastClickEventWindow = 0;
+static gint gLastClickTime = 0;
+static gint gLastClickX = 0;
+static gint gLastClickY = 0;
+static WebKit::WebMouseEvent::Button gLastClickButton = WebKit::WebMouseEvent::ButtonNone;
+
+bool shouldForgetPreviousClick(GdkWindow* window, gint time, gint x, gint y)
{
static GtkSettings* settings = gtk_settings_get_default();
+
+ if (window != gLastClickEventWindow)
+ return true;
+
gint doubleClickTime = 250;
gint doubleClickDistance = 5;
g_object_get(G_OBJECT(settings),
"gtk-double-click-time", &doubleClickTime,
"gtk-double-click-distance", &doubleClickDistance, NULL);
- return timeDiff <= doubleClickTime && abs(xDiff) <= doubleClickDistance && abs(yDiff) <= doubleClickDistance;
+ return (time - gLastClickTime) > doubleClickTime
+ || abs(x - gLastClickX) > doubleClickDistance
+ || abs(y - gLastClickY) > doubleClickDistance;
+}
+
+void resetClickCountState()
+{
+ gNumClicks = 0;
+ gLastClickEventWindow = 0;
+ gLastClickTime = 0;
+ gLastClickX = 0;
+ gLastClickY = 0;
+ gLastClickButton = WebKit::WebMouseEvent::ButtonNone;
}
} // namespace
@@ -407,28 +431,6 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event)
ASSERT_NOT_REACHED();
};
- if (GDK_BUTTON_PRESS == event->type) {
- static int numClicks = 0;
- static GdkWindow* eventWindow = 0;
- static gint lastLeftClickTime = 0;
- static gint lastLeftClickX = 0;
- static gint lastLeftClickY = 0;
-
- gint timeDiff = event->time - lastLeftClickTime;
- gint xDiff = event->x - lastLeftClickX;
- gint yDiff = event->y - lastLeftClickY;
- if (eventWindow == event->window && countsAsDoubleClick(timeDiff, xDiff, yDiff))
- numClicks++;
- else
- numClicks = 1;
-
- result.clickCount = numClicks;
- eventWindow = event->window;
- lastLeftClickTime = event->time;
- lastLeftClickX = event->x;
- lastLeftClickY = event->y;
- }
-
result.button = WebMouseEvent::ButtonNone;
if (event->button == 1)
result.button = WebMouseEvent::ButtonLeft;
@@ -437,6 +439,23 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventButton* event)
else if (event->button == 3)
result.button = WebMouseEvent::ButtonRight;
+ if (result.type == WebInputEvent::MouseDown) {
+ bool forgetPreviousClick = shouldForgetPreviousClick(event->window, event->time, event->x, event->y);
+
+ if (!forgetPreviousClick && result.button == gLastClickButton)
+ ++gNumClicks;
+ else {
+ gNumClicks = 1;
+
+ gLastClickEventWindow = event->window;
+ gLastClickX = event->x;
+ gLastClickY = event->y;
+ gLastClickButton = result.button;
+ }
+ gLastClickTime = event->time;
+ }
+ result.clickCount = gNumClicks;
+
return result;
}
@@ -469,6 +488,9 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventMotion* event)
else if (event->state & GDK_BUTTON3_MASK)
result.button = WebMouseEvent::ButtonRight;
+ if (shouldForgetPreviousClick(event->window, event->time, event->x, event->y))
+ resetClickCountState();
+
return result;
}
@@ -505,6 +527,9 @@ WebMouseEvent WebInputEventFactory::mouseEvent(const GdkEventCrossing* event)
else if (event->state & GDK_BUTTON3_MASK)
result.button = WebMouseEvent::ButtonRight;
+ if (shouldForgetPreviousClick(event->window, event->time, event->x, event->y))
+ resetClickCountState();
+
return result;
}