multipress: Make a subclass of GtkGestureSingle

The redundant API has been removed here.
This commit is contained in:
Carlos Garnacho 2014-03-21 19:21:56 +01:00
parent 3db87cb0b7
commit 000f38ed97
2 changed files with 29 additions and 152 deletions

View File

@ -31,15 +31,10 @@ struct _GtkGestureMultiPressPrivate
gdouble initial_press_y;
guint double_click_timeout_id;
guint n_presses;
guint button;
guint current_button;
guint rect_is_set : 1;
};
enum {
PROP_BUTTON = 1
};
enum {
PRESSED,
STOPPED,
@ -48,7 +43,7 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE_WITH_PRIVATE (GtkGestureMultiPress, gtk_gesture_multi_press, GTK_TYPE_GESTURE)
G_DEFINE_TYPE_WITH_PRIVATE (GtkGestureMultiPress, gtk_gesture_multi_press, GTK_TYPE_GESTURE_SINGLE)
static void
gtk_gesture_multi_press_finalize (GObject *object)
@ -68,51 +63,6 @@ gtk_gesture_multi_press_finalize (GObject *object)
G_OBJECT_CLASS (gtk_gesture_multi_press_parent_class)->finalize (object);
}
static void
gtk_gesture_multi_press_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkGestureMultiPress *gesture;
gesture = GTK_GESTURE_MULTI_PRESS (object);
switch (prop_id)
{
case PROP_BUTTON:
gtk_gesture_multi_press_set_button (gesture,
g_value_get_uint (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_gesture_multi_press_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkGestureMultiPressPrivate *priv;
GtkGestureMultiPress *gesture;
gesture = GTK_GESTURE_MULTI_PRESS (object);
priv = gtk_gesture_multi_press_get_instance_private (gesture);
switch (prop_id)
{
case PROP_BUTTON:
g_value_set_uint (value, priv->button);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static gboolean
gtk_gesture_multi_press_check (GtkGesture *gesture)
{
@ -125,12 +75,30 @@ gtk_gesture_multi_press_check (GtkGesture *gesture)
priv = gtk_gesture_multi_press_get_instance_private (multi_press);
sequences = gtk_gesture_get_sequences (gesture);
active = sequences || priv->double_click_timeout_id;
active = g_list_length (sequences) == 1 || priv->double_click_timeout_id;
g_list_free (sequences);
return active;
}
static void
_gtk_gesture_multi_press_stop (GtkGestureMultiPress *gesture)
{
GtkGestureMultiPressPrivate *priv;
priv = gtk_gesture_multi_press_get_instance_private (gesture);
if (priv->n_presses == 0)
return;
if (priv->n_presses != 0)
g_signal_emit (gesture, signals[STOPPED], 0);
priv->current_button = 0;
priv->n_presses = 0;
gtk_gesture_check (GTK_GESTURE (gesture));
}
static gboolean
_double_click_timeout_cb (gpointer user_data)
{
@ -139,8 +107,7 @@ _double_click_timeout_cb (gpointer user_data)
priv = gtk_gesture_multi_press_get_instance_private (gesture);
priv->double_click_timeout_id = 0;
gtk_gesture_multi_press_reset (gesture);
_gtk_gesture_multi_press_stop (gesture);
return FALSE;
}
@ -215,27 +182,26 @@ gtk_gesture_multi_press_update (GtkGesture *gesture,
priv = gtk_gesture_multi_press_get_instance_private (multi_press);
event = gtk_gesture_get_last_event (gesture, sequence);
if (!event)
return;
switch (event->type)
{
case GDK_BUTTON_PRESS:
button = event->button.button;
/* Fall through */
case GDK_TOUCH_BEGIN:
/* Ignore buttons we don't care about */
if (priv->button != 0 && button != priv->button)
break;
/* Reset the gesture if the button number changes mid-recognition */
if (priv->n_presses > 0 &&
priv->current_button != button)
gtk_gesture_multi_press_reset (multi_press);
_gtk_gesture_multi_press_stop (multi_press);
priv->current_button = button;
_gtk_gesture_multi_press_update_timeout (multi_press);
gtk_gesture_get_point (gesture, sequence, &x, &y);
if (!_gtk_gesture_multi_press_check_within_threshold (multi_press, x, y))
gtk_gesture_multi_press_reset (multi_press);
_gtk_gesture_multi_press_stop (multi_press);
/* Increment later the real counter, just if the gesture is
* reset on the pressed handler */
@ -318,86 +284,6 @@ gtk_gesture_multi_press_new (GtkWidget *widget)
NULL);
}
/**
* gtk_gesture_multi_press_reset:
* @gesture: a #GtkGestureMultiPress
*
* Resets the gesture, so the press count is reset to 0.
*
* Note: If this happens within a #GtkGestureMultiPress::pressed handler,
* the button press being currently handled will still increment the press
* counter, so a subsequent press would count as the second press.
*
* Since: 3.14
**/
void
gtk_gesture_multi_press_reset (GtkGestureMultiPress *gesture)
{
GtkGestureMultiPressPrivate *priv;
g_return_if_fail (GTK_IS_GESTURE (gesture));
priv = gtk_gesture_multi_press_get_instance_private (gesture);
if (priv->n_presses != 0)
g_signal_emit (gesture, signals[STOPPED], 0);
priv->current_button = 0;
priv->n_presses = 0;
gtk_gesture_check (GTK_GESTURE (gesture));
}
/**
* gtk_gesture_multi_press_set_button:
* @gesture: a #GtkGestureMultiPress
* @button: button number to listen to, or 0 for any button
*
* Sets the button number @gesture listens to. If non-0, every
* button press from a different button number will be ignored.
* Touch events implicitly match with button 1.
*
* Since: 3.14
**/
void
gtk_gesture_multi_press_set_button (GtkGestureMultiPress *gesture,
guint button)
{
GtkGestureMultiPressPrivate *priv;
g_return_if_fail (GTK_IS_GESTURE_MULTI_PRESS (gesture));
priv = gtk_gesture_multi_press_get_instance_private (gesture);
if (priv->button == button)
return;
priv->button = button;
g_object_notify (G_OBJECT (gesture), "button");
}
/**
* gtk_gesture_multi_press_get_button:
* @gesture: a #GtkgestureMultiPress
*
* Returns the button number @gesture listens for, or 0 if @gesture
* reacts to any button press.
*
* Returns: The button number, or 0 for any button.
*
* Since: 3.14
**/
guint
gtk_gesture_multi_press_get_button (GtkGestureMultiPress *gesture)
{
GtkGestureMultiPressPrivate *priv;
g_return_val_if_fail (GTK_IS_GESTURE_MULTI_PRESS (gesture), 0);
priv = gtk_gesture_multi_press_get_instance_private (gesture);
return priv->button;
}
/**
* gtk_gesture_multi_press_set_area:
* @gesture: a #GtkGesture

View File

@ -24,7 +24,7 @@
#endif
#include <gtk/gtkwidget.h>
#include <gtk/gtkgesture.h>
#include <gtk/gtkgesturesingle.h>
G_BEGIN_DECLS
@ -40,12 +40,12 @@ typedef struct _GtkGestureMultiPressClass GtkGestureMultiPressClass;
struct _GtkGestureMultiPress
{
GtkGesture parent_instance;
GtkGestureSingle parent_instance;
};
struct _GtkGestureMultiPressClass
{
GtkGestureClass parent_class;
GtkGestureSingleClass parent_class;
gboolean (* pressed) (GtkGestureMultiPress *gesture,
gint n_press,
@ -64,15 +64,6 @@ GType gtk_gesture_multi_press_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_3_14
GtkGesture * gtk_gesture_multi_press_new (GtkWidget *widget);
GDK_AVAILABLE_IN_3_14
void gtk_gesture_multi_press_reset (GtkGestureMultiPress *gesture);
GDK_AVAILABLE_IN_3_14
void gtk_gesture_multi_press_set_button (GtkGestureMultiPress *gesture,
guint button);
GDK_AVAILABLE_IN_3_14
guint gtk_gesture_multi_press_get_button (GtkGestureMultiPress *gesture);
GDK_AVAILABLE_IN_3_14
void gtk_gesture_multi_press_set_area (GtkGestureMultiPress *gesture,
const GdkRectangle *rect);