diff options
Diffstat (limited to 'libslab/double-click-detector.c')
-rw-r--r-- | libslab/double-click-detector.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/libslab/double-click-detector.c b/libslab/double-click-detector.c new file mode 100644 index 00000000..64ed58e8 --- /dev/null +++ b/libslab/double-click-detector.c @@ -0,0 +1,85 @@ +/* + * This file is part of libslab. + * + * Copyright (c) 2006, 2007 Novell, Inc. + * + * Libslab is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * Libslab is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with libslab; if not, write to the Free Software Foundation, Inc., 51 + * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "double-click-detector.h" + +#include <gtk/gtk.h> + +#include "libslab-utils.h" + +G_DEFINE_TYPE (DoubleClickDetector, double_click_detector, G_TYPE_OBJECT); + +static void +double_click_detector_class_init (DoubleClickDetectorClass * detector_class) +{ +} + +static void +double_click_detector_init (DoubleClickDetector * detector) +{ + GtkSettings *settings; + gint click_interval; + + settings = gtk_settings_get_default (); + + g_object_get (G_OBJECT (settings), "gtk-double-click-time", &click_interval, NULL); + + detector->double_click_time = (guint32) click_interval; + detector->last_click_time = 0; +} + +DoubleClickDetector * +double_click_detector_new () +{ + return g_object_new (DOUBLE_CLICK_DETECTOR_TYPE, NULL); +} + +gboolean +double_click_detector_is_double_click (DoubleClickDetector *this, guint32 event_time, + gboolean auto_update) +{ + gint32 delta; + + if (event_time <= 0) + event_time = libslab_get_current_time_millis (); + + if (this->last_click_time <= 0) { + if (auto_update) + double_click_detector_update_click_time (this, event_time); + + return FALSE; + } + + delta = event_time - this->last_click_time; + + if (auto_update) + double_click_detector_update_click_time (this, event_time); + + return delta < this->double_click_time; +} + +void +double_click_detector_update_click_time (DoubleClickDetector *this, guint32 event_time) +{ + if (event_time <= 0) + event_time = libslab_get_current_time_millis (); + + this->last_click_time = event_time; +} |