toolbar: Replace button-press-event handler with gesture

This commit is contained in:
Timm Bäder 2016-12-02 12:39:46 +01:00
parent 55b1f231fb
commit be9adea58e

View File

@ -60,6 +60,7 @@
#include "gtkwidgetpath.h"
#include "gtkwidgetprivate.h"
#include "gtkwindowprivate.h"
#include "gtkgesturemultipress.h"
/**
@ -130,6 +131,8 @@ struct _GtkToolbarPrivate
GTimer *timer;
GtkGesture *click_gesture;
gulong settings_connection;
gint idle_id;
@ -245,8 +248,6 @@ static void gtk_toolbar_real_style_changed (GtkToolbar *toolbar
GtkToolbarStyle style);
static gboolean gtk_toolbar_focus_home_or_end (GtkToolbar *toolbar,
gboolean focus_home);
static gboolean gtk_toolbar_button_press (GtkWidget *toolbar,
GdkEventButton *event);
static gboolean gtk_toolbar_arrow_button_press (GtkWidget *button,
GdkEventButton *event,
GtkToolbar *toolbar);
@ -275,6 +276,12 @@ static gboolean gtk_toolbar_render (GtkCssGadget *gadget,
int width,
int height,
gpointer data);
static void gtk_toolbar_pressed_cb (GtkGestureMultiPress *gesture,
int n_press,
double x,
double y,
gpointer user_data);
/* methods on ToolbarContent 'class' */
static ToolbarContent *toolbar_content_new_tool_item (GtkToolbar *toolbar,
@ -395,7 +402,6 @@ gtk_toolbar_class_init (GtkToolbarClass *klass)
gobject_class->finalize = gtk_toolbar_finalize;
gobject_class->dispose = gtk_toolbar_dispose;
widget_class->button_press_event = gtk_toolbar_button_press;
widget_class->draw = gtk_toolbar_draw;
widget_class->measure = gtk_toolbar_measure_;
widget_class->size_allocate = gtk_toolbar_size_allocate;
@ -674,6 +680,12 @@ gtk_toolbar_init (GtkToolbar *toolbar)
priv->max_homogeneous_pixels = -1;
priv->timer = g_timer_new ();
priv->click_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (toolbar));
gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (priv->click_gesture), FALSE);
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->click_gesture), 0);
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->click_gesture), GTK_PHASE_BUBBLE);
g_signal_connect (priv->click_gesture, "pressed", G_CALLBACK (gtk_toolbar_pressed_cb), toolbar);
}
static void
@ -2553,22 +2565,31 @@ gtk_toolbar_arrow_button_press (GtkWidget *button,
return TRUE;
}
static gboolean
gtk_toolbar_button_press (GtkWidget *toolbar,
GdkEventButton *event)
static void
gtk_toolbar_pressed_cb (GtkGestureMultiPress *gesture,
int n_press,
double x,
double y,
gpointer user_data)
{
if (gdk_event_triggers_context_menu ((GdkEvent *) event))
GtkToolbar *toolbar = user_data;
GdkEventSequence *sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
const GdkEvent *event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
int button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
if (gdk_event_triggers_context_menu (event))
{
gboolean return_value;
g_signal_emit (toolbar, toolbar_signals[POPUP_CONTEXT_MENU], 0,
(int)event->x_root, (int)event->y_root, event->button,
&return_value);
(int)x, (int)y, button, &return_value);
return return_value;
if (return_value)
gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
else
gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_DENIED);
}
return FALSE;
}
static gboolean
@ -2941,6 +2962,7 @@ gtk_toolbar_finalize (GObject *object)
g_source_remove (priv->idle_id);
g_clear_object (&priv->gadget);
g_clear_object (&priv->click_gesture);
G_OBJECT_CLASS (gtk_toolbar_parent_class)->finalize (object);
}