drop target: Warn about broken signal handler returns
authorBenjamin Otte <otte@redhat.com>
Tue, 27 Sep 2022 01:44:41 +0000 (03:44 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 27 Sep 2022 01:50:29 +0000 (03:50 +0200)
Signal handlers ust return their preferred action and that one must be
unique.

Shout at them if they don't do that, before gdk_drop_status() does
tesame thing.

Related: gnome-build-meta#554
Related: gnome-builder#1799

gtk/gtkdroptarget.c

index 31ca55f950069f7b9db104e87bc37dcbbf14b299..d3d834d70e72ae10d59099e3589e0d97fe037cb8 100644 (file)
@@ -430,6 +430,12 @@ gtk_drop_target_handle_event (GtkEventController *controller,
 
         graphene_point_init (&self->coords, x, y);
         g_signal_emit (self, signals[MOTION], 0, x, y, &preferred);
+        if (!gdk_drag_action_is_unique (preferred))
+          {
+            g_critical ("Handler for GtkDropTarget::motion on %s %p did not return a unique preferred action",
+                        G_OBJECT_TYPE_NAME (widget), widget);
+            preferred = make_action_unique (preferred);
+          }
         if (preferred &&
             gtk_drop_status (self->drop, self->actions, preferred))
           {
@@ -497,6 +503,12 @@ gtk_drop_target_handle_crossing (GtkEventController    *controller,
       gtk_drop_target_start_drop (self, crossing->drop);
 
       g_signal_emit (self, signals[ENTER], 0, x, y, &preferred);
+        if (!gdk_drag_action_is_unique (preferred))
+          {
+            g_critical ("Handler for GtkDropTarget::enter on %s %p did not return a unique preferred action",
+                        G_OBJECT_TYPE_NAME (widget), widget);
+            preferred = make_action_unique (preferred);
+          }
       if (preferred &&
           gtk_drop_status (self->drop, self->actions, preferred))
         {