Drop GTK_DEST_DEFAULT_HIGHLIGHT
authorMatthias Clasen <mclasen@redhat.com>
Sun, 5 Jan 2020 14:49:45 +0000 (09:49 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 8 Jan 2020 23:48:20 +0000 (18:48 -0500)
Redo highlight handling slightly. GtkDropTarget now has
a ::armed property that can be tracked to do custom highlighting,
and we always add the dnd style class to armed drop sites.

gtk/gtkdnd.c
gtk/gtkdragdest.c
gtk/gtkdragdest.h

index 71ae8405b5e8243f134be4a300995a0b824295c1..5e31546b894b20d6afd55218d9ee9c9bd4a3ee65 100644 (file)
@@ -357,9 +357,6 @@ gtk_drag_dest_leave (GtkWidget      *widget,
   track_motion = gtk_drop_target_get_track_motion (dest);
   armed = gtk_drop_target_get_armed (dest);
 
-  if ((flags & GTK_DEST_DEFAULT_HIGHLIGHT) && armed)
-    gtk_drag_unhighlight (widget);
-
   if (!(flags & GTK_DEST_DEFAULT_MOTION) || armed || track_motion)
     gtk_drop_target_emit_drag_leave (dest, drop, time);
   
@@ -400,13 +397,7 @@ gtk_drag_dest_motion (GtkWidget *widget,
 
       if (actions && target)
         {
-          if (!gtk_drop_target_get_armed (dest))
-            {
-              gtk_drop_target_set_armed (dest, TRUE);
-              if (flags & GTK_DEST_DEFAULT_HIGHLIGHT)
-                gtk_drag_highlight (widget);
-            }
-
+          gtk_drop_target_set_armed (dest, TRUE);
           gdk_drop_status (drop, dest_actions);
         }
       else
index b8d66334a008ff16f7600e21e2a7aee0a266b640..0c1b86c10e02fa47e0d2e5baadac7ee446ad230a 100644 (file)
@@ -73,6 +73,7 @@ enum {
   PROP_ACTIONS,
   PROP_DEFAULTS,
   PROP_TRACK_MOTION,
+  PROP_ARMED,
   NUM_PROPERTIES
 };
 
@@ -163,6 +164,10 @@ gtk_drop_target_get_property (GObject    *object,
       g_value_set_boolean (value, gtk_drop_target_get_track_motion (dest));
       break;
 
+    case PROP_ARMED:
+      g_value_set_boolean (value, gtk_drop_target_get_armed (dest));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -218,6 +223,17 @@ gtk_drop_target_class_init (GtkDropTargetClass *class)
                              FALSE,
                              G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkDropTarget:armmed:
+   *
+   * Whether the drop target is currently the targed of an ongoing drag operation,
+   * and highlighted.
+   */
+  properties[PROP_ARMED] =
+       g_param_spec_boolean ("armed", P_("Armed"), P_("Armed"),
+                             FALSE,
+                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
 
   /**
@@ -713,7 +729,20 @@ void
 gtk_drop_target_set_armed (GtkDropTarget *target,
                            gboolean       armed)
 {
+  if (target->armed == armed)
+    return;
+
   target->armed = armed;
+
+  if (target->widget)
+    {
+      if (armed)
+        gtk_drag_highlight (target->widget);
+      else
+        gtk_drag_unhighlight (target->widget);
+    }
+
+  g_object_notify_by_pspec (G_OBJECT (target), properties[PROP_ARMED]);
 }
 
 gboolean
index e28d5b3aa9191a808097b1691dfd4ec00536b33d..2854eef2c368c47e258dfab731736f4690ab1974 100644 (file)
@@ -45,9 +45,8 @@ typedef struct _GtkDropTarget GtkDropTarget;
  *   widget will check if the drag matches this widget’s list of possible formats
  *   and actions.
  *   GTK+ will then call gdk_drag_status() as appropriate.
- * @GTK_DEST_DEFAULT_HIGHLIGHT: If set for a widget, GTK+ will draw a highlight on
- *   this widget as long as a drag is over this widget and the widget drag format
- *   and action are acceptable.
+ * @GTK_DEST_DEFAULT_HIGHLIGHT: Does not do anything now. GTK always adds
+ *   the dnd style class to armed drop sites.
  * @GTK_DEST_DEFAULT_DROP: Does not do anything now.
  * @GTK_DEST_DEFAULT_ALL: If set, specifies that all default actions should
  *   be taken.