[gtk+] expander: Use multipress gesture for event management
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] expander: Use multipress gesture for event management
- Date: Thu, 5 Jun 2014 14:16:29 +0000 (UTC)
commit fbb3fdda8c9d1d9face89d7b80e9a0555a4dbeef
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu Jun 5 15:27:25 2014 +0200
expander: Use multipress gesture for event management
This actually acts regardless of the value n_press, alternatively
expanding and collapsing the GtkExpander.
gtk/gtkexpander.c | 88 ++++++++++++++++++-----------------------------------
1 files changed, 30 insertions(+), 58 deletions(-)
---
diff --git a/gtk/gtkexpander.c b/gtk/gtkexpander.c
index 647b672..00cd43e 100644
--- a/gtk/gtkexpander.c
+++ b/gtk/gtkexpander.c
@@ -127,6 +127,7 @@ struct _GtkExpanderPrivate
{
GtkWidget *label_widget;
GdkWindow *event_window;
+ GtkGesture *multipress_gesture;
gint spacing;
guint expand_timer;
@@ -134,7 +135,6 @@ struct _GtkExpanderPrivate
guint expanded : 1;
guint use_underline : 1;
guint use_markup : 1;
- guint button_down : 1;
guint prelight : 1;
guint label_fill : 1;
guint resize_toplevel : 1;
@@ -158,20 +158,13 @@ static void gtk_expander_map (GtkWidget *widget);
static void gtk_expander_unmap (GtkWidget *widget);
static gboolean gtk_expander_draw (GtkWidget *widget,
cairo_t *cr);
-static gboolean gtk_expander_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gtk_expander_button_release (GtkWidget *widget,
- GdkEventButton *event);
+
static gboolean gtk_expander_enter_notify (GtkWidget *widget,
GdkEventCrossing *event);
static gboolean gtk_expander_leave_notify (GtkWidget *widget,
GdkEventCrossing *event);
static gboolean gtk_expander_focus (GtkWidget *widget,
GtkDirectionType direction);
-static void gtk_expander_grab_notify (GtkWidget *widget,
- gboolean was_grabbed);
-static void gtk_expander_state_flags_changed (GtkWidget *widget,
- GtkStateFlags previous_state);
static gboolean gtk_expander_drag_motion (GtkWidget *widget,
GdkDragContext *context,
gint x,
@@ -219,6 +212,13 @@ static void gtk_expander_get_preferred_width_for_height (GtkWidget *
gint *minimum_height,
gint *natural_height);
+/* Gestures */
+static void gesture_multipress_released_cb (GtkGestureMultiPress *gesture,
+ gint n_press,
+ gdouble x,
+ gdouble y,
+ GtkExpander *expander);
+
G_DEFINE_TYPE_WITH_CODE (GtkExpander, gtk_expander, GTK_TYPE_BIN,
G_ADD_PRIVATE (GtkExpander)
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
@@ -245,13 +245,9 @@ gtk_expander_class_init (GtkExpanderClass *klass)
widget_class->map = gtk_expander_map;
widget_class->unmap = gtk_expander_unmap;
widget_class->draw = gtk_expander_draw;
- widget_class->button_press_event = gtk_expander_button_press;
- widget_class->button_release_event = gtk_expander_button_release;
widget_class->enter_notify_event = gtk_expander_enter_notify;
widget_class->leave_notify_event = gtk_expander_leave_notify;
widget_class->focus = gtk_expander_focus;
- widget_class->grab_notify = gtk_expander_grab_notify;
- widget_class->state_flags_changed = gtk_expander_state_flags_changed;
widget_class->drag_motion = gtk_expander_drag_motion;
widget_class->drag_leave = gtk_expander_drag_leave;
widget_class->get_preferred_width = gtk_expander_get_preferred_width;
@@ -386,7 +382,6 @@ gtk_expander_init (GtkExpander *expander)
priv->expanded = FALSE;
priv->use_underline = FALSE;
priv->use_markup = FALSE;
- priv->button_down = FALSE;
priv->prelight = FALSE;
priv->label_fill = FALSE;
priv->expand_timer = 0;
@@ -394,6 +389,16 @@ gtk_expander_init (GtkExpander *expander)
gtk_drag_dest_set (GTK_WIDGET (expander), 0, NULL, 0, 0);
gtk_drag_dest_set_track_motion (GTK_WIDGET (expander), TRUE);
+
+ priv->multipress_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (expander));
+ gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->multipress_gesture),
+ GDK_BUTTON_PRIMARY);
+ gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (priv->multipress_gesture),
+ FALSE);
+ g_signal_connect (priv->multipress_gesture, "released",
+ G_CALLBACK (gesture_multipress_released_cb), expander);
+ gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->multipress_gesture),
+ GTK_PHASE_BUBBLE);
}
static void
@@ -510,6 +515,8 @@ gtk_expander_destroy (GtkWidget *widget)
priv->expand_timer = 0;
}
+ g_clear_object (&priv->multipress_gesture);
+
GTK_WIDGET_CLASS (gtk_expander_parent_class)->destroy (widget);
}
@@ -613,6 +620,7 @@ gtk_expander_realize (GtkWidget *widget)
&attributes, attributes_mask);
gtk_widget_register_window (widget, priv->event_window);
+ gtk_gesture_set_window (priv->multipress_gesture, priv->event_window);
gtk_widget_set_realized (widget, TRUE);
}
@@ -623,6 +631,7 @@ gtk_expander_unrealize (GtkWidget *widget)
if (priv->event_window)
{
+ gtk_gesture_set_window (priv->multipress_gesture, NULL);
gtk_widget_unregister_window (widget, priv->event_window);
gdk_window_destroy (priv->event_window);
priv->event_window = NULL;
@@ -981,52 +990,15 @@ gtk_expander_draw (GtkWidget *widget,
return FALSE;
}
-static gboolean
-gtk_expander_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- GtkExpander *expander = GTK_EXPANDER (widget);
-
- if (event->button == GDK_BUTTON_PRIMARY && event->window == expander->priv->event_window)
- {
- expander->priv->button_down = TRUE;
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-gtk_expander_button_release (GtkWidget *widget,
- GdkEventButton *event)
-{
- GtkExpander *expander = GTK_EXPANDER (widget);
-
- if (event->button == GDK_BUTTON_PRIMARY && expander->priv->button_down)
- {
- if (expander->priv->prelight)
- gtk_widget_activate (widget);
- expander->priv->button_down = FALSE;
- return TRUE;
- }
-
- return FALSE;
-}
-
static void
-gtk_expander_grab_notify (GtkWidget *widget,
- gboolean was_grabbed)
+gesture_multipress_released_cb (GtkGestureMultiPress *gesture,
+ gint n_press,
+ gdouble x,
+ gdouble y,
+ GtkExpander *expander)
{
- if (!was_grabbed)
- GTK_EXPANDER (widget)->priv->button_down = FALSE;
-}
-
-static void
-gtk_expander_state_flags_changed (GtkWidget *widget,
- GtkStateFlags previous_state)
-{
- if (!gtk_widget_is_sensitive (widget))
- GTK_EXPANDER (widget)->priv->button_down = FALSE;
+ if (expander->priv->prelight)
+ gtk_widget_activate (GTK_WIDGET (expander));
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]