GtkClickCounter.cpp [plain text]
#include "config.h"
#include "GtkClickCounter.h"
#include "GUniquePtrGtk.h"
#include <gtk/gtk.h>
namespace WebCore {
GtkClickCounter::GtkClickCounter()
: m_currentClickCount(0)
, m_previousClickButton(0)
, m_previousClickTime(0)
{
}
void GtkClickCounter::reset()
{
m_currentClickCount = 0;
m_previousClickPoint = IntPoint();
m_previousClickTime = 0;
m_previousClickButton = 0;
}
bool GtkClickCounter::shouldProcessButtonEvent(GdkEventButton*)
{
GUniquePtr<GdkEvent> nextEvent(gdk_event_peek());
if (!nextEvent)
return true;
if (nextEvent->any.type == GDK_2BUTTON_PRESS || nextEvent->any.type == GDK_3BUTTON_PRESS)
return false;
return true;
}
static guint32 getEventTime(GdkEvent* event)
{
guint32 time = gdk_event_get_time(event);
if (time)
return time;
GTimeVal timeValue;
g_get_current_time(&timeValue);
return (timeValue.tv_sec * 1000) + (timeValue.tv_usec / 1000);
}
int GtkClickCounter::clickCountForGdkButtonEvent(GtkWidget* widget, GdkEventButton* buttonEvent)
{
gint doubleClickDistance = 250;
gint doubleClickTime = 5;
GtkSettings* settings = gtk_settings_get_for_screen(gtk_widget_get_screen(widget));
g_object_get(settings,
"gtk-double-click-distance", &doubleClickDistance,
"gtk-double-click-time", &doubleClickTime, NULL);
GdkEvent* event(reinterpret_cast<GdkEvent*>(buttonEvent));
guint32 eventTime = getEventTime(event);
if ((event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS)
|| ((abs(buttonEvent->x - m_previousClickPoint.x()) < doubleClickDistance)
&& (abs(buttonEvent->y - m_previousClickPoint.y()) < doubleClickDistance)
&& (eventTime - m_previousClickTime < static_cast<guint>(doubleClickTime))
&& (buttonEvent->button == m_previousClickButton)))
m_currentClickCount++;
else
m_currentClickCount = 1;
gdouble x, y;
gdk_event_get_coords(event, &x, &y);
m_previousClickPoint = IntPoint(x, y);
m_previousClickButton = buttonEvent->button;
m_previousClickTime = eventTime;
return m_currentClickCount;
}
}