gtk: Add a GdkDevice parameter to ::press-and-hold
This would be useful when popping up menus, just so we know what device to trigger it for.
This commit is contained in:
@@ -27,7 +27,6 @@ BOOLEAN:ENUM
|
||||
BOOLEAN:ENUM,BOOLEAN
|
||||
BOOLEAN:ENUM,DOUBLE
|
||||
BOOLEAN:ENUM,INT
|
||||
BOOLEAN:ENUM,INT,INT
|
||||
BOOLEAN:OBJECT
|
||||
BOOLEAN:OBJECT,UINT,FLAGS
|
||||
BOOLEAN:OBJECT,INT,INT,UINT
|
||||
@@ -37,6 +36,7 @@ BOOLEAN:OBJECT,BOXED,BOXED
|
||||
BOOLEAN:OBJECT,OBJECT,OBJECT
|
||||
BOOLEAN:OBJECT,STRING,STRING
|
||||
BOOLEAN:OBJECT,ENUM
|
||||
BOOLEAN:OBJECT,ENUM,INT,INT
|
||||
BOOLEAN:INT
|
||||
BOOLEAN:INT,INT
|
||||
BOOLEAN:INT,INT,INT
|
||||
|
||||
@@ -3118,8 +3118,9 @@ gtk_widget_class_init (GtkWidgetClass *klass)
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (GtkWidgetClass, press_and_hold),
|
||||
_gtk_boolean_handled_accumulator, NULL,
|
||||
_gtk_marshal_BOOLEAN__ENUM_INT_INT,
|
||||
G_TYPE_BOOLEAN, 3,
|
||||
_gtk_marshal_BOOLEAN__OBJECT_ENUM_INT_INT,
|
||||
G_TYPE_BOOLEAN, 4,
|
||||
GDK_TYPE_DEVICE,
|
||||
GTK_TYPE_PRESS_AND_HOLD_ACTION,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_INT);
|
||||
@@ -6949,6 +6950,7 @@ gtk_widget_press_and_hold_cancel (GtkWidget *widget)
|
||||
|
||||
g_signal_emit (widget, widget_signals[PRESS_AND_HOLD],
|
||||
0,
|
||||
data->device,
|
||||
GTK_PRESS_AND_HOLD_CANCEL,
|
||||
-1, -1,
|
||||
&return_value);
|
||||
@@ -7037,6 +7039,7 @@ gtk_widget_press_and_hold_timeout (gpointer user_data)
|
||||
/* Done, clean up and emit the trigger signal */
|
||||
g_signal_emit (widget, widget_signals[PRESS_AND_HOLD],
|
||||
0,
|
||||
data->device,
|
||||
GTK_PRESS_AND_HOLD_TRIGGER,
|
||||
data->current_x, data->current_y,
|
||||
&return_value);
|
||||
@@ -7135,6 +7138,7 @@ gtk_widget_press_and_hold_begin_animation_timeout (gpointer user_data)
|
||||
|
||||
static gboolean
|
||||
gtk_widget_press_and_hold_query (GtkWidget *widget,
|
||||
GdkDevice *device,
|
||||
gint x,
|
||||
gint y)
|
||||
{
|
||||
@@ -7142,6 +7146,7 @@ gtk_widget_press_and_hold_query (GtkWidget *widget,
|
||||
|
||||
g_signal_emit (widget, widget_signals[PRESS_AND_HOLD],
|
||||
0,
|
||||
device,
|
||||
GTK_PRESS_AND_HOLD_QUERY,
|
||||
x, y,
|
||||
&return_value);
|
||||
@@ -7161,7 +7166,7 @@ gtk_widget_press_and_hold_start (GtkWidget *widget,
|
||||
|
||||
data = gtk_widget_get_press_and_hold_data (widget);
|
||||
|
||||
if (gtk_widget_press_and_hold_query (widget, event->x, event->y))
|
||||
if (gtk_widget_press_and_hold_query (widget, data->device, event->x, event->y))
|
||||
{
|
||||
gint timeout, begin_ani_timeout;
|
||||
GdkScreen *screen;
|
||||
|
||||
@@ -435,6 +435,7 @@ struct _GtkWidgetClass
|
||||
void (* captured_event) (GtkWidget *widget,
|
||||
GdkEvent *event);
|
||||
gboolean (* press_and_hold) (GtkWidget *widget,
|
||||
GdkDevice *device,
|
||||
GtkPressAndHoldAction action,
|
||||
gint x,
|
||||
gint y);
|
||||
|
||||
@@ -23,42 +23,12 @@
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
struct CoordData
|
||||
{
|
||||
gint x;
|
||||
gint y;
|
||||
GtkWidget *widget;
|
||||
};
|
||||
|
||||
static void
|
||||
popup_position_func (GtkMenu *menu,
|
||||
gint *x,
|
||||
gint *y,
|
||||
gboolean *push_in,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkRequisition req;
|
||||
GdkScreen *screen;
|
||||
struct CoordData *data = user_data;
|
||||
|
||||
screen = gtk_widget_get_screen (data->widget);
|
||||
gtk_widget_get_preferred_size (GTK_WIDGET (menu), &req, NULL);
|
||||
|
||||
*x = data->x;
|
||||
*y = data->y;
|
||||
|
||||
*x = CLAMP (*x, 0, MAX (0, gdk_screen_get_width (screen) - req.width));
|
||||
*y = CLAMP (*y, 0, MAX (0, gdk_screen_get_height (screen) - req.height));
|
||||
}
|
||||
|
||||
static void
|
||||
press_and_hold_show_menu (GtkWidget *widget,
|
||||
gint x,
|
||||
gint y)
|
||||
GdkDevice *device)
|
||||
{
|
||||
GtkWidget *menu;
|
||||
GtkWidget *item;
|
||||
struct CoordData data;
|
||||
|
||||
menu = gtk_menu_new ();
|
||||
|
||||
@@ -74,34 +44,29 @@ press_and_hold_show_menu (GtkWidget *widget,
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
|
||||
gtk_widget_show (item);
|
||||
|
||||
data.widget = widget;
|
||||
gdk_window_get_origin (gtk_widget_get_window (widget), &data.x, &data.y);
|
||||
data.x += x;
|
||||
data.y += y;
|
||||
|
||||
gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
|
||||
popup_position_func,
|
||||
&data,
|
||||
1,
|
||||
GDK_CURRENT_TIME);
|
||||
gtk_menu_popup_for_device (GTK_MENU (menu), device,
|
||||
NULL, NULL, NULL, NULL, NULL,
|
||||
1,
|
||||
GDK_CURRENT_TIME);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
press_and_hold (GtkWidget *widget,
|
||||
GtkPressAndHoldAction action,
|
||||
gint x,
|
||||
gint y,
|
||||
gboolean keyboard)
|
||||
GdkDevice *device,
|
||||
GtkPressAndHoldAction action,
|
||||
gint x,
|
||||
gint y,
|
||||
gpointer user_data)
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case GTK_PRESS_AND_HOLD_QUERY:
|
||||
g_print ("press-and-hold-query on %s\n", gtk_widget_get_name (widget));
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
case GTK_PRESS_AND_HOLD_TRIGGER:
|
||||
g_print ("press-and-hold-trigger on %s\n", gtk_widget_get_name (widget));
|
||||
press_and_hold_show_menu (widget, x, y);
|
||||
press_and_hold_show_menu (widget, device);
|
||||
break;
|
||||
|
||||
case GTK_PRESS_AND_HOLD_CANCEL:
|
||||
@@ -109,7 +74,7 @@ press_and_hold (GtkWidget *widget,
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GtkTreeModel *
|
||||
|
||||
Reference in New Issue
Block a user