Loading

Paste #pmkxlsliu

  1. diff --git a/gtk/gtkdragsource.c b/gtk/gtkdragsource.c
  2. index 12ccc4a02a..7a9b2f7cc4 100644
  3. --- a/gtk/gtkdragsource.c
  4. +++ b/gtk/gtkdragsource.c
  5. @@ -96,9 +96,9 @@ struct _GtkDragSourceClass
  6.  {
  7.    GtkGestureSingleClass parent_class;
  8.  
  9. -  gboolean (* prepare) (GtkDragSource *source,
  10. -                        double         x,
  11. -                        double         y);
  12. +  GdkContentProvider * (* prepare) (GtkDragSource *source,
  13. +                                    double         x,
  14. +                                    double         y);
  15.  };
  16.  
  17.  enum {
  18. @@ -125,10 +125,6 @@ static void gtk_drag_source_cancel_cb         (GdkDrag             *drag,
  19.                                                 GdkDragCancelReason  reason,
  20.                                                 GtkDragSource       *source);
  21.  
  22. -static gboolean gtk_drag_source_prepare (GtkDragSource *source,
  23. -                                         double         x,
  24. -                                         double         y);
  25. -
  26.  static void gtk_drag_source_drag_begin (GtkDragSource *source);
  27.  
  28.  G_DEFINE_TYPE (GtkDragSource, gtk_drag_source, GTK_TYPE_GESTURE_SINGLE);
  29. @@ -251,6 +247,31 @@ gtk_drag_source_update (GtkGesture       *gesture,
  30.      }
  31.  }
  32.  
  33. +static gboolean
  34. +signal_accumulator_non_null (GSignalInvocationHint *ihint,
  35. +                             GValue                *return_accu,
  36. +                             const GValue          *handler_return,
  37. +                             gpointer               dummy)
  38. +{
  39. +  g_value_copy (handler_return, return_accu);
  40. +
  41. +  return g_value_get_object (handler_return) == NULL;
  42. +}
  43. +
  44. +static GdkContentProvider *
  45. +gtk_drag_source_prepare (GtkDragSource *source,
  46. +                         double         x,
  47. +                         double         y)
  48. +{
  49. +  if (source->actions == 0)
  50. +    return NULL;
  51. +
  52. +  if (source->content == NULL)
  53. +    return NULL;
  54. +
  55. +  return g_object_ref (source->content);
  56. +}
  57. +
  58.  static void
  59.  gtk_drag_source_class_init (GtkDragSourceClass *class)
  60.  {
  61. @@ -317,9 +338,9 @@ gtk_drag_source_class_init (GtkDragSourceClass *class)
  62.                      G_TYPE_FROM_CLASS (class),
  63.                      G_SIGNAL_RUN_LAST,
  64.                      G_STRUCT_OFFSET (GtkDragSourceClass, prepare),
  65. -                    g_signal_accumulator_first_wins, NULL,
  66. +                    signal_accumulator_non_null, NULL,
  67.                      NULL,
  68. -                    G_TYPE_BOOLEAN, 2,
  69. +                    GDK_TYPE_CONTENT_PROVIDER, 2,
  70.                      G_TYPE_DOUBLE, G_TYPE_DOUBLE);
  71.  
  72.    /**
  73. @@ -388,14 +409,6 @@ gtk_drag_source_class_init (GtkDragSourceClass *class)
  74.                      GDK_TYPE_DRAG_CANCEL_REASON);
  75.  }
  76.  
  77. -static gboolean
  78. -gtk_drag_source_prepare (GtkDragSource *source,
  79. -                         double         x,
  80. -                         double         y)
  81. -{
  82. -  return source->content != NULL && source->actions != 0;
  83. -}
  84. -
  85.  static void
  86.  drag_end (GtkDragSource *source,
  87.            gboolean       success)
  88. @@ -441,7 +454,7 @@ gtk_drag_source_drag_begin (GtkDragSource *source)
  89.    GdkSurface *surface;
  90.    double px, py;
  91.    int dx, dy;
  92. -  gboolean start_drag = FALSE;
  93. +  GdkContentProvider *content = NULL;
  94.  
  95.    widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
  96.    device = gtk_gesture_get_device (GTK_GESTURE (source));
  97. @@ -458,12 +471,13 @@ gtk_drag_source_drag_begin (GtkDragSource *source)
  98.    dx = round (px) - x;
  99.    dy = round (py) - y;
  100.  
  101. -  g_signal_emit (source, signals[PREPARE], 0, source->start_x, source->start_y, &start_drag);
  102. +  g_signal_emit (source, signals[PREPARE], 0, source->start_x, source->start_y, &content);
  103.  
  104. -  if (!start_drag)
  105. +  if (content == NULL)
  106.      return;
  107.  
  108. -  source->drag = gdk_drag_begin (surface, device, source->content, source->actions, dx, dy);
  109. +  source->drag = gdk_drag_begin (surface, device, content, source->actions, dx, dy);
  110. +  g_object_unref (content);
  111.  
  112.    if (source->drag == NULL)
  113.      return;