dnd: Allow programmatic drag cancellation
Add a gtk_drag_cancel() function that can be used on the source side to cancel an ongoing drag operation. This can be useful, e.g. if the data that is being dragged becomes unavailable. gtk_drag_cancel() will become public API in 3.16; we keep it private here so we can use it from GtkNotebook.
This commit is contained in:
@@ -6509,6 +6509,7 @@ gtk_drag_unhighlight
|
|||||||
<SUBSECTION Source Side>
|
<SUBSECTION Source Side>
|
||||||
gtk_drag_begin
|
gtk_drag_begin
|
||||||
gtk_drag_begin_with_coordinates
|
gtk_drag_begin_with_coordinates
|
||||||
|
gtk_drag_cancel
|
||||||
gtk_drag_set_icon_widget
|
gtk_drag_set_icon_widget
|
||||||
gtk_drag_set_icon_pixbuf
|
gtk_drag_set_icon_pixbuf
|
||||||
gtk_drag_set_icon_stock
|
gtk_drag_set_icon_stock
|
||||||
|
|||||||
33
gtk/gtkdnd.c
33
gtk/gtkdnd.c
@@ -245,7 +245,7 @@ static void gtk_drag_drop (GtkDragSourceInfo *info,
|
|||||||
static void gtk_drag_drop_finished (GtkDragSourceInfo *info,
|
static void gtk_drag_drop_finished (GtkDragSourceInfo *info,
|
||||||
GtkDragResult result,
|
GtkDragResult result,
|
||||||
guint time);
|
guint time);
|
||||||
static void gtk_drag_cancel (GtkDragSourceInfo *info,
|
static void gtk_drag_cancel_internal (GtkDragSourceInfo *info,
|
||||||
GtkDragResult result,
|
GtkDragResult result,
|
||||||
guint32 time);
|
guint32 time);
|
||||||
|
|
||||||
@@ -4218,9 +4218,9 @@ gtk_drag_end (GtkDragSourceInfo *info,
|
|||||||
* or programmatically.
|
* or programmatically.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
gtk_drag_cancel (GtkDragSourceInfo *info,
|
gtk_drag_cancel_internal (GtkDragSourceInfo *info,
|
||||||
GtkDragResult result,
|
GtkDragResult result,
|
||||||
guint32 time)
|
guint32 time)
|
||||||
{
|
{
|
||||||
gtk_drag_end (info, time);
|
gtk_drag_end (info, time);
|
||||||
gdk_drag_abort (info->context, time);
|
gdk_drag_abort (info->context, time);
|
||||||
@@ -4277,7 +4277,7 @@ gtk_drag_key_cb (GtkWidget *widget,
|
|||||||
switch (event->keyval)
|
switch (event->keyval)
|
||||||
{
|
{
|
||||||
case GDK_KEY_Escape:
|
case GDK_KEY_Escape:
|
||||||
gtk_drag_cancel (info, GTK_DRAG_RESULT_USER_CANCELLED, event->time);
|
gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_USER_CANCELLED, event->time);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_KEY_space:
|
case GDK_KEY_space:
|
||||||
@@ -4293,7 +4293,7 @@ gtk_drag_key_cb (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_drag_cancel (info, GTK_DRAG_RESULT_NO_TARGET, event->time);
|
gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_NO_TARGET, event->time);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -4360,7 +4360,7 @@ gtk_drag_grab_broken_event_cb (GtkWidget *widget,
|
|||||||
|| event->grab_window == gtk_widget_get_window (info->ipc_widget))
|
|| event->grab_window == gtk_widget_get_window (info->ipc_widget))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
gtk_drag_cancel (info, GTK_DRAG_RESULT_GRAB_BROKEN, gtk_get_current_event_time ());
|
gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_GRAB_BROKEN, gtk_get_current_event_time ());
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4377,9 +4377,10 @@ gtk_drag_grab_notify_cb (GtkWidget *widget,
|
|||||||
if (gtk_widget_device_is_shadowed (widget, pointer))
|
if (gtk_widget_device_is_shadowed (widget, pointer))
|
||||||
{
|
{
|
||||||
/* We have to block callbacks to avoid recursion here, because
|
/* We have to block callbacks to avoid recursion here, because
|
||||||
gtk_drag_cancel calls gtk_grab_remove (via gtk_drag_end) */
|
* gtk_drag_cancel_internal calls gtk_grab_remove (via gtk_drag_end)
|
||||||
|
*/
|
||||||
g_signal_handlers_block_by_func (widget, gtk_drag_grab_notify_cb, data);
|
g_signal_handlers_block_by_func (widget, gtk_drag_grab_notify_cb, data);
|
||||||
gtk_drag_cancel (info, GTK_DRAG_RESULT_GRAB_BROKEN, gtk_get_current_event_time ());
|
gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_GRAB_BROKEN, gtk_get_current_event_time ());
|
||||||
g_signal_handlers_unblock_by_func (widget, gtk_drag_grab_notify_cb, data);
|
g_signal_handlers_unblock_by_func (widget, gtk_drag_grab_notify_cb, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4403,7 +4404,7 @@ gtk_drag_button_release_cb (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_drag_cancel (info, GTK_DRAG_RESULT_NO_TARGET, event->time);
|
gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_NO_TARGET, event->time);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -4456,3 +4457,15 @@ gtk_drag_check_threshold (GtkWidget *widget,
|
|||||||
return (ABS (current_x - start_x) > drag_threshold ||
|
return (ABS (current_x - start_x) > drag_threshold ||
|
||||||
ABS (current_y - start_y) > drag_threshold);
|
ABS (current_y - start_y) > drag_threshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_drag_cancel (GdkDragContext *context)
|
||||||
|
{
|
||||||
|
GtkDragSourceInfo *info;
|
||||||
|
|
||||||
|
g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
|
||||||
|
|
||||||
|
info = gtk_drag_get_source_info (context, FALSE);
|
||||||
|
if (info != NULL)
|
||||||
|
gtk_drag_cancel_internal (info, GTK_DRAG_RESULT_ERROR, gtk_get_current_event_time ());
|
||||||
|
}
|
||||||
|
|||||||
@@ -163,6 +163,8 @@ void _gtk_widget_remove_controller (GtkWidget
|
|||||||
GList * _gtk_widget_list_controllers (GtkWidget *widget,
|
GList * _gtk_widget_list_controllers (GtkWidget *widget,
|
||||||
GtkPropagationPhase phase);
|
GtkPropagationPhase phase);
|
||||||
|
|
||||||
|
void gtk_drag_cancel (GdkDragContext *context);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GTK_WIDGET_PRIVATE_H__ */
|
#endif /* __GTK_WIDGET_PRIVATE_H__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user