/** * gdk_drag_context_get_device: * @context: a #GdkDragContext * * Returns the #GdkDevice associated to the drag context. * * Returns: (transfer none): The #GdkDevice associated to @context. **/ GdkDevice * gdk_drag_context_get_device (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), NULL); return context->device; }
/** * gdk_drag_get_selection: * @context: a #GdkDragContext. * * Returns the selection atom for the current source window. * * Returns: (transfer none): the selection atom, or %GDK_NONE */ GdkAtom gdk_drag_get_selection (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), GDK_NONE); return GDK_DRAG_CONTEXT_GET_CLASS (context)->get_selection (context); }
static gboolean gstyle_color_widget_on_drag_drop (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time) { GstyleColorWidget *self = (GstyleColorWidget *)widget; GdkAtom target; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); target = gtk_drag_dest_find_target (widget, context, NULL); if ((target == gdk_atom_intern_static_string ("GSTYLE_COLOR_WIDGET") || target == gdk_atom_intern_static_string ("application/x-color") || gtk_targets_include_text (&target, 1)) && is_in_drop_zone (self, x, y)) { gtk_drag_get_data (widget, context, target, time); return TRUE; } return FALSE; }
/** * gdk_drag_context_list_targets: * @context: a #GdkDragContext * * Retrieves the list of targets of the context. * * Return value: (transfer none) (element-type GdkAtom): a #GList of targets * * Since: 2.22 **/ GList * gdk_drag_context_list_targets (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), NULL); return context->targets; }
/** * gdk_drag_drop_succeeded: * @context: a #GdkDragContext * * Returns whether the dropped data has been successfully * transferred. This function is intended to be used while * handling a %GDK_DROP_FINISHED event, its return value is * meaningless at other times. * * Return value: %TRUE if the drop was successful. * * Since: 2.6 **/ gboolean gdk_drag_drop_succeeded (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), FALSE); return GDK_DRAG_CONTEXT_GET_CLASS (context)->drop_status (context); }
/** * gdk_drag_context_get_dest_window: * @context: a #GdkDragContext * * Returns the destination windw for the DND operation. * * Return value: (transfer none): a #GdkWindow * * Since: 3.0 **/ GdkWindow * gdk_drag_context_get_dest_window (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), NULL); return context->dest_window; }
/** * gdk_drag_context_get_protocol: * @context: a #GdkDragContext * * Returns the drag protocol thats used by this context. * * Returns: the drag protocol * * Since: 3.0 */ GdkDragProtocol gdk_drag_context_get_protocol (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), GDK_DRAG_PROTO_NONE); return context->protocol; }
/** * gdk_drag_context_get_actions: * @context: a #GdkDragContext * * Determines the bitmask of actions proposed by the source if * gdk_drag_context_get_suggested_action() returns GDK_ACTION_ASK. * * Return value: the #GdkDragAction flags * * Since: 2.22 **/ GdkDragAction gdk_drag_context_get_actions (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), GDK_ACTION_DEFAULT); return context->actions; }
/** * gdk_drag_context_get_suggested_action: * @context: a #GdkDragContext * * Determines the suggested drag action of the context. * * Return value: a #GdkDragAction value * * Since: 2.22 **/ GdkDragAction gdk_drag_context_get_suggested_action (GdkDragContext *context) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), 0); return context->suggested_action; }
/** * gdk_drag_drop: * @context: a #GdkDragContext * @time_: the timestamp for this operation * * Drops on the current destination. * * This function is called by the drag source. */ void gdk_drag_drop (GdkDragContext *context, guint32 time_) { g_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); GDK_DRAG_CONTEXT_GET_CLASS (context)->drag_drop (context, time_); }
/** * gdk_drop_finish: * @context: a #GdkDragContext * @success: %TRUE if the data was successfully received * @time_: the timestamp for this operation * * Ends the drag operation after a drop. * * This function is called by the drag destination. */ void gdk_drop_finish (GdkDragContext *context, gboolean success, guint32 time_) { g_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); GDK_DRAG_CONTEXT_GET_CLASS (context)->drop_finish (context, success, time_); }
/** * gdk_drag_status: * @context: a #GdkDragContext * @action: the selected action which will be taken when a drop happens, * or 0 to indicate that a drop will not be accepted * @time_: the timestamp for this operation * * Selects one of the actions offered by the drag source. * * This function is called by the drag destination in response to * gdk_drag_motion() called by the drag source. */ void gdk_drag_status (GdkDragContext *context, GdkDragAction action, guint32 time_) { g_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); GDK_DRAG_CONTEXT_GET_CLASS (context)->drag_status (context, action, time_); }
/** * gdk_drop_reply: * @context: a #GdkDragContext * @accepted: %TRUE if the drop is accepted * @time_: the timestamp for this operation * * Accepts or rejects a drop. * * This function is called by the drag destination in response * to a drop initiated by the drag source. */ void gdk_drop_reply (GdkDragContext *context, gboolean accepted, guint32 time_) { g_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); GDK_DRAG_CONTEXT_GET_CLASS (context)->drop_reply (context, accepted, time_); }
static gboolean gstyle_color_widget_on_drag_failed (GtkWidget *widget, GdkDragContext *context, GtkDragResult result) { GstyleColorWidget *self = (GstyleColorWidget *)widget; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); return FALSE; }
static void gstyle_color_widget_on_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time) { GstyleColorWidget *self = (GstyleColorWidget *)widget; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); gtk_drag_unhighlight (widget); }
static void gstyle_color_widget_on_drag_end (GtkWidget *widget, GdkDragContext *context) { GstyleColorWidget *self = (GstyleColorWidget *)widget; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); gtk_widget_destroy (self->dnd_window); self->dnd_window = NULL; self->dnd_color_widget = NULL; self->is_on_drag = FALSE; }
static void gstyle_color_widget_on_drag_data_delete (GtkWidget *widget, GdkDragContext *context) { GstyleColorWidget *self = (GstyleColorWidget *)widget; GActionGroup *group; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); group = gtk_widget_get_action_group (GTK_WIDGET (self), "gstyle-color-widget-menu"); if (group != NULL) g_action_group_activate_action (group, "remove", NULL); }
/** * gdk_drag_find_window_for_screen: * @context: a #GdkDragContext * @drag_window: a window which may be at the pointer position, but * should be ignored, since it is put up by the drag source as an icon * @screen: the screen where the destination window is sought * @x_root: the x position of the pointer in root coordinates * @y_root: the y position of the pointer in root coordinates * @dest_window: (out): location to store the destination window in * @protocol: (out): location to store the DND protocol in * * Finds the destination window and DND protocol to use at the * given pointer position. * * This function is called by the drag source to obtain the * @dest_window and @protocol parameters for gdk_drag_motion(). * * Since: 2.2 */ void gdk_drag_find_window_for_screen (GdkDragContext *context, GdkWindow *drag_window, GdkScreen *screen, gint x_root, gint y_root, GdkWindow **dest_window, GdkDragProtocol *protocol) { g_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); *dest_window = GDK_DRAG_CONTEXT_GET_CLASS (context) ->find_window (context, drag_window, screen, x_root, y_root, protocol); }
/** * gdk_drag_context_set_device: * @context: a #GdkDragContext * @device: a #GdkDevice * * Associates a #GdkDevice to @context, so all Drag and Drop events * for @context are emitted as if they came from this device. */ void gdk_drag_context_set_device (GdkDragContext *context, GdkDevice *device) { g_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); g_return_if_fail (GDK_IS_DEVICE (device)); if (context->device) g_object_unref (context->device); context->device = device; if (context->device) g_object_ref (context->device); }
static void gstyle_color_widget_on_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *data, guint info, guint time) { GstyleColorWidget *self = (GstyleColorWidget *)widget; GdkAtom target = gtk_selection_data_get_target (data); GstyleColor *color; guint16 data_rgba[4]; GdkRGBA rgba; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); if (self->filter_func != NULL && GSTYLE_IS_COLOR (self->filtered_color)) color = self->filtered_color; else color = self->color; if (target == gdk_atom_intern_static_string ("GSTYLE_COLOR_WIDGET")) gtk_selection_data_set (data, target, 8, (void*)&color, sizeof (gpointer)); else if (target == gdk_atom_intern_static_string ("application/x-color")) { gstyle_color_fill_rgba (color, &rgba); data_rgba[0] = (guint16) (rgba.red * 65535); data_rgba[1] = (guint16) (rgba.green * 65535); data_rgba[2] = (guint16) (rgba.blue * 65535); data_rgba[3] = (guint16) (rgba.alpha * 65535); gtk_selection_data_set (data, target, 16, (void*)&data_rgba, 8); } else if (gtk_targets_include_text (&target, 1)) { g_autofree gchar *name = NULL; name = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_ORIGINAL); if (name == NULL) name = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_RGB_HEX6); gtk_selection_data_set_text (data, name, -1); } }
/** * gtk_drag_dest_find_target: (method) * @widget: drag destination widget * @context: drag context * @target_list: (allow-none): list of droppable targets, or %NULL to use * gtk_drag_dest_get_target_list (@widget). * * Looks for a match between the supported targets of @context and the * @dest_target_list, returning the first matching target, otherwise * returning %GDK_NONE. @dest_target_list should usually be the return * value from gtk_drag_dest_get_target_list(), but some widgets may * have different valid targets for different parts of the widget; in * that case, they will have to implement a drag_motion handler that * passes the correct target list to this function. * * Returns: (transfer none): first target that the source offers * and the dest can accept, or %GDK_NONE */ GdkAtom gtk_drag_dest_find_target (GtkWidget *widget, GdkDragContext *context, GtkTargetList *target_list) { GList *tmp_target; GList *tmp_source = NULL; GtkWidget *source_widget; g_return_val_if_fail (GTK_IS_WIDGET (widget), GDK_NONE); g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), GDK_NONE); source_widget = gtk_drag_get_source_widget (context); if (target_list == NULL) target_list = gtk_drag_dest_get_target_list (widget); if (target_list == NULL) return GDK_NONE; tmp_target = target_list->list; while (tmp_target) { GtkTargetPair *pair = tmp_target->data; tmp_source = gdk_drag_context_list_targets (context); while (tmp_source) { if (tmp_source->data == GUINT_TO_POINTER (pair->target)) { if ((!(pair->flags & GTK_TARGET_SAME_APP) || source_widget) && (!(pair->flags & GTK_TARGET_SAME_WIDGET) || (source_widget == widget)) && (!(pair->flags & GTK_TARGET_OTHER_APP) || !source_widget) && (!(pair->flags & GTK_TARGET_OTHER_WIDGET) || (source_widget != widget))) return pair->target; else break; } tmp_source = tmp_source->next; } tmp_target = tmp_target->next; } return GDK_NONE; }
static gboolean gstyle_color_widget_on_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time) { GstyleColorWidget *self = (GstyleColorWidget *)widget; GstylePaletteWidgetDndLockFlags dnd_lock; GdkAtom target; GdkDragAction drag_action; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); target = gtk_drag_dest_find_target (widget, context, NULL); dnd_lock = get_palette_widget_dnd_lock (self); if ((dnd_lock & GSTYLE_PALETTE_WIDGET_DND_LOCK_FLAGS_DRAG) != 0) { gdk_drag_status (context, 0, time); return FALSE; } if ((target == gdk_atom_intern_static_string ("GSTYLE_COLOR_WIDGET") || target == gdk_atom_intern_static_string ("application/x-color") || gtk_targets_include_text (&target, 1)) && (dnd_lock & GSTYLE_PALETTE_WIDGET_DND_LOCK_FLAGS_DROP) == 0 && is_in_drop_zone (self, x, y)) { gtk_drag_highlight (widget); drag_action = gdk_drag_context_get_actions (context); if ((drag_action | GDK_ACTION_COPY) != 0) { gdk_drag_status (context, GDK_ACTION_COPY, time); return TRUE; } } gdk_drag_status (context, 0, time); return FALSE; }
/** * gdk_drag_motion: * @context: a #GdkDragContext * @dest_window: the new destination window, obtained by * gdk_drag_find_window() * @protocol: the DND protocol in use, obtained by gdk_drag_find_window() * @x_root: the x position of the pointer in root coordinates * @y_root: the y position of the pointer in root coordinates * @suggested_action: the suggested action * @possible_actions: the possible actions * @time_: the timestamp for this operation * * Updates the drag context when the pointer moves or the * set of actions changes. * * This function is called by the drag source. * * Returns: */ gboolean gdk_drag_motion (GdkDragContext *context, GdkWindow *dest_window, GdkDragProtocol protocol, gint x_root, gint y_root, GdkDragAction suggested_action, GdkDragAction possible_actions, guint32 time_) { g_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), FALSE); return GDK_DRAG_CONTEXT_GET_CLASS (context) ->drag_motion (context, dest_window, protocol, x_root, y_root, suggested_action, possible_actions, time_); }
static void gstyle_color_widget_on_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint info, guint time) { GstyleColorWidget *self = GSTYLE_COLOR_WIDGET (widget); GstyleColor * const *src_color; g_autofree gchar *color_string = NULL; GstyleColorKind kind; GdkAtom target; guint16 *data_rgba; GdkRGBA rgba; gint len; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); target = gtk_selection_data_get_target (data); if (target == gdk_atom_intern_static_string ("GSTYLE_COLOR_WIDGET")) { /* TODO: check if the color widget is coming from a PaletteWidget container */ src_color = (void*)gtk_selection_data_get_data (data); if (*src_color != self->color) dnd_color_fill (self, *src_color, self->color); gtk_drag_finish (context, TRUE, FALSE, time); return; } else if (target == gdk_atom_intern_static_string ("application/x-color")) { len = gtk_selection_data_get_length (data); if (len < 0 ) goto failed; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" data_rgba = (guint16 *)gtk_selection_data_get_data (data); #pragma GCC diagnostic pop rgba.red = data_rgba[0] / 65535.; rgba.green = data_rgba[1] / 65535.; rgba.blue = data_rgba[2] / 65535.; rgba.alpha = data_rgba[3] / 65535.; gstyle_color_set_rgba (self->color, &rgba); gtk_drag_finish (context, TRUE, FALSE, time); return; } else if (gtk_targets_include_text (&target, 1)) { color_string = (gchar *)gtk_selection_data_get_text (data); if (!gstyle_str_empty0 (color_string)) { if (!gstyle_color_parse_color_string (color_string, &rgba, &kind)) goto failed; gstyle_color_set_rgba (self->color, &rgba); gtk_drag_finish (context, TRUE, FALSE, time); } } failed: gtk_drag_finish (context, FALSE, FALSE, time); }