summaryrefslogtreecommitdiff
path: root/gtk/gtkmain.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-08-09 18:47:14 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-08-09 19:13:28 +0200
commit25c3616a79179470fe9deeeb182d120fa2f97322 (patch)
tree0b5072b01b18f692405fe1c63b9fbf6f6893f3c7 /gtk/gtkmain.c
parent86e5ad85b7018c7bc4e692a8c1d679f7c897c96e (diff)
downloadgtk+-25c3616a79179470fe9deeeb182d120fa2f97322.tar.gz
gtkmain: Pass coordinates when synthesizing pointer events
Instead of passing an event and figuring out coordinates from it, pass directly the toplevel coordinates so that we can use this outside event handling. All callers have been updated to pass the coordinates, in practical effects they were already based on the GtkNative.
Diffstat (limited to 'gtk/gtkmain.c')
-rw-r--r--gtk/gtkmain.c42
1 files changed, 16 insertions, 26 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index de77602d9f..f17fb095f5 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1086,30 +1086,19 @@ rewrite_event_for_toplevel (GdkEvent *event)
}
static gboolean
-translate_event_coordinates (GdkEvent *event,
- double *x,
- double *y,
- GtkWidget *widget)
+translate_coordinates (double event_x,
+ double event_y,
+ double *x,
+ double *y,
+ GtkWidget *widget)
{
- GtkWidget *event_widget;
GtkNative *native;
graphene_point_t p;
- double event_x, event_y;
- double native_x, native_y;
*x = *y = 0;
+ native = gtk_widget_get_native (widget);
- if (!gdk_event_get_position (event, &event_x, &event_y))
- return FALSE;
-
- event_widget = gtk_get_event_widget (event);
- native = gtk_widget_get_native (event_widget);
-
- gtk_native_get_surface_transform (GTK_NATIVE (native), &native_x, &native_y);
- event_x -= native_x;
- event_y -= native_y;
-
- if (!gtk_widget_compute_point (event_widget,
+ if (!gtk_widget_compute_point (GTK_WIDGET (native),
widget,
&GRAPHENE_POINT_INIT (event_x, event_y),
&p))
@@ -1126,7 +1115,8 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel,
GtkCrossingType crossing_type,
GtkWidget *old_target,
GtkWidget *new_target,
- GdkEvent *event,
+ double surface_x,
+ double surface_y,
GdkCrossingMode mode,
GdkDrop *drop)
{
@@ -1182,7 +1172,7 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel,
crossing.new_descendent = NULL;
}
check_crossing_invariants (widget, &crossing);
- translate_event_coordinates (event, &x, &y, widget);
+ translate_coordinates (surface_x, surface_y, &x, &y, widget);
gtk_widget_handle_crossing (widget, &crossing, x, y);
if (crossing_type == GTK_CROSSING_POINTER)
gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_PRELIGHT);
@@ -1225,7 +1215,7 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel,
crossing.old_descendent = old_target ? crossing.new_descendent : NULL;
}
- translate_event_coordinates (event, &x, &y, widget);
+ translate_coordinates (surface_x, surface_y, &x, &y, widget);
gtk_widget_handle_crossing (widget, &crossing, x, y);
if (crossing_type == GTK_CROSSING_POINTER)
gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_PRELIGHT, FALSE);
@@ -1392,7 +1382,7 @@ handle_pointing_event (GdkEvent *event)
old_target = update_pointer_focus_state (toplevel, event, NULL);
gtk_synthesize_crossing_events (GTK_ROOT (toplevel), GTK_CROSSING_POINTER, old_target, NULL,
- event, gdk_crossing_event_get_mode (event), NULL);
+ x, y, gdk_crossing_event_get_mode (event), NULL);
break;
case GDK_TOUCH_END:
case GDK_TOUCH_CANCEL:
@@ -1405,7 +1395,7 @@ handle_pointing_event (GdkEvent *event)
old_target = update_pointer_focus_state (toplevel, event, NULL);
gtk_drop_begin_event (drop, GDK_DRAG_LEAVE);
gtk_synthesize_crossing_events (GTK_ROOT (toplevel), GTK_CROSSING_DROP, old_target, NULL,
- event, GDK_CROSSING_NORMAL, drop);
+ x, y, GDK_CROSSING_NORMAL, drop);
gtk_drop_end_event (drop);
}
break;
@@ -1432,7 +1422,7 @@ handle_pointing_event (GdkEvent *event)
sequence))
{
gtk_synthesize_crossing_events (GTK_ROOT (toplevel), GTK_CROSSING_POINTER, old_target, target,
- event, GDK_CROSSING_NORMAL, NULL);
+ x, y, GDK_CROSSING_NORMAL, NULL);
}
gtk_window_maybe_update_cursor (toplevel, NULL, device);
@@ -1443,7 +1433,7 @@ handle_pointing_event (GdkEvent *event)
GdkDrop *drop = gdk_dnd_event_get_drop (event);
gtk_drop_begin_event (drop, type);
gtk_synthesize_crossing_events (GTK_ROOT (toplevel), GTK_CROSSING_DROP, old_target, target,
- event, GDK_CROSSING_NORMAL, gdk_dnd_event_get_drop (event));
+ x, y, GDK_CROSSING_NORMAL, gdk_dnd_event_get_drop (event));
gtk_drop_end_event (drop);
}
else if (type == GDK_TOUCH_BEGIN)
@@ -1483,7 +1473,7 @@ handle_pointing_event (GdkEvent *event)
new_target = GTK_WIDGET (toplevel);
gtk_synthesize_crossing_events (GTK_ROOT (toplevel), GTK_CROSSING_POINTER, target, new_target,
- event, GDK_CROSSING_UNGRAB, NULL);
+ x, y, GDK_CROSSING_UNGRAB, NULL);
gtk_window_maybe_update_cursor (toplevel, NULL, device);
update_pointer_focus_state (toplevel, event, new_target);
}