Updating branch refs/heads/jannis/new-shortcuts-pane to 37fefbcce950246d7277d82c0df8d91ebb15e326 (commit) from ffe9390edb86f1a448b4080f523d3ab6979df363 (commit)
commit 37fefbcce950246d7277d82c0df8d91ebb15e326 Author: Jannis Pohlmann <jannis.pohlm...@codethink.co.uk> Date: Sat Dec 24 03:34:16 2011 +0100 Add ThunarDNDTarget enum. Try implement shortcut reorder DND. This is not working but I'm uploading what I have so that others can have a look. thunar/thunar-enum-types.c | 21 +++++++++++ thunar/thunar-enum-types.h | 15 ++++++++ thunar/thunar-shortcut-group.c | 44 +++++++++++++++++++++++- thunar/thunar-shortcut.c | 74 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 152 insertions(+), 2 deletions(-) diff --git a/thunar/thunar-enum-types.c b/thunar/thunar-enum-types.c index 374d25c..4ede8f2 100644 --- a/thunar/thunar-enum-types.c +++ b/thunar/thunar-enum-types.c @@ -359,3 +359,24 @@ thunar_shortcut_type_get_type (void) return type; } + + + +GType +thunar_dnd_target_get_type (void) +{ + static GType type = G_TYPE_INVALID; + + if (G_UNLIKELY (type == G_TYPE_INVALID)) + { + static const GEnumValue values[] = + { + { THUNAR_DND_TARGET_SHORTCUT, "THUNAR_DND_TARGET_SHORTCUT", "shortcut", }, + { 0, NULL, NULL, }, + }; + + type = g_enum_register_static (I_("ThunarDNDTarget"), values); + } + + return type; +} diff --git a/thunar/thunar-enum-types.h b/thunar/thunar-enum-types.h index 68b1f5c..b25014b 100644 --- a/thunar/thunar-enum-types.h +++ b/thunar/thunar-enum-types.h @@ -314,6 +314,21 @@ typedef enum GType thunar_shortcut_type_get_type (void) G_GNUC_CONST; + +#define THUNAR_TYPE_DND_TARGET (thunar_dnd_target_get_type ()) + +/** + * ThunarDNDTarget: + * + * Enum for thunar-internal drag-and-drop targets. + **/ +typedef enum +{ + THUNAR_DND_TARGET_SHORTCUT, +} ThunarDNDTarget; + +GType thunar_dnd_target_get_type (void) G_GNUC_CONST; + G_END_DECLS #endif /* !__THUNAR_ENUM_TYPES_H__ */ diff --git a/thunar/thunar-shortcut-group.c b/thunar/thunar-shortcut-group.c index 258877a..4c16439 100644 --- a/thunar/thunar-shortcut-group.c +++ b/thunar/thunar-shortcut-group.c @@ -59,6 +59,11 @@ static void thunar_shortcut_group_set_property (GObject guint prop_id, const GValue *value, GParamSpec *pspec); +static gboolean thunar_shortcut_group_drag_motion (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint timestamp); static void thunar_shortcut_group_attract_attention (ThunarShortcutGroup *group); static gboolean thunar_shortcut_group_flash_expander (gpointer user_data); static void thunar_shortcut_group_expand_style_set (ThunarShortcutGroup *group, @@ -93,10 +98,18 @@ G_DEFINE_TYPE (ThunarShortcutGroup, thunar_shortcut_group, GTK_TYPE_EVENT_BOX) +static const GtkTargetEntry drop_targets[] = +{ + { "THUNAR_DND_TARGET_SHORTCUT", GTK_TARGET_SAME_APP, THUNAR_DND_TARGET_SHORTCUT }, +}; + + + static void thunar_shortcut_group_class_init (ThunarShortcutGroupClass *klass) { - GObjectClass *gobject_class; + GtkWidgetClass *gtkwidget_class; + GObjectClass *gobject_class; /* Determine the parent type class */ thunar_shortcut_group_parent_class = g_type_class_peek_parent (klass); @@ -108,6 +121,9 @@ thunar_shortcut_group_class_init (ThunarShortcutGroupClass *klass) gobject_class->get_property = thunar_shortcut_group_get_property; gobject_class->set_property = thunar_shortcut_group_set_property; + gtkwidget_class = GTK_WIDGET_CLASS (klass); + gtkwidget_class->drag_motion = thunar_shortcut_group_drag_motion; + g_object_class_install_property (gobject_class, PROP_LABEL, g_param_spec_string ("label", @@ -151,6 +167,11 @@ thunar_shortcut_group_init (ThunarShortcutGroup *group) group->shortcuts = gtk_vbox_new (TRUE, 0); gtk_container_add (GTK_CONTAINER (group->expander), group->shortcuts); gtk_widget_show (group->shortcuts); + + /* set the group up as a drop site to allow shortcuts to be re-ordered by DND */ + gtk_drag_dest_set (GTK_WIDGET (group), 0, + drop_targets, G_N_ELEMENTS (drop_targets), + GDK_ACTION_MOVE); } @@ -247,6 +268,27 @@ thunar_shortcut_group_set_property (GObject *object, +static gboolean +thunar_shortcut_group_drag_motion (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint timestamp) +{ +#if 0 + ThunarShortcutGroup *group = THUNAR_SHORTCUT_GROUP (widget); +#endif + + _thunar_return_val_if_fail (THUNAR_IS_SHORTCUT_GROUP (widget), FALSE); + _thunar_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), FALSE); + + g_debug ("shortcut group drag motion!"); + + return FALSE; +} + + + static void thunar_shortcut_group_attract_attention (ThunarShortcutGroup *group) { diff --git a/thunar/thunar-shortcut.c b/thunar/thunar-shortcut.c index a46e59b..ee1fee9 100644 --- a/thunar/thunar-shortcut.c +++ b/thunar/thunar-shortcut.c @@ -105,6 +105,8 @@ static gboolean thunar_shortcut_button_press_event (GtkWidget GdkEventButton *event); static gboolean thunar_shortcut_button_release_event (GtkWidget *widget, GdkEventButton *event); +static void thunar_shortcut_drag_begin (GtkWidget *widget, + GdkDragContext *context); static void thunar_shortcut_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, @@ -117,6 +119,8 @@ static gboolean thunar_shortcut_drag_drop (GtkWidget gint x, gint y, guint timestamp); +static void thunar_shortcut_drag_end (GtkWidget *widget, + GdkDragContext *context); static void thunar_shortcut_drag_leave (GtkWidget *widget, GdkDragContext *context, guint timestamp); @@ -253,9 +257,14 @@ G_DEFINE_TYPE_WITH_CODE (ThunarShortcut, thunar_shortcut, GTK_TYPE_EVENT_BOX, static guint shortcut_signals[LAST_SIGNAL]; +static const GtkTargetEntry drag_targets[] = +{ + { "THUNAR_DND_TARGET_SHORTCUT", GTK_TARGET_SAME_APP, THUNAR_DND_TARGET_SHORTCUT } +}; + static const GtkTargetEntry drop_targets[] = { - { "text/uri-list", 0, TARGET_TEXT_URI_LIST } + { "text/uri-list", 0, TARGET_TEXT_URI_LIST }, }; @@ -278,8 +287,10 @@ thunar_shortcut_class_init (ThunarShortcutClass *klass) gtkwidget_class = GTK_WIDGET_CLASS (klass); gtkwidget_class->button_press_event = thunar_shortcut_button_press_event; gtkwidget_class->button_release_event = thunar_shortcut_button_release_event; + gtkwidget_class->drag_begin = thunar_shortcut_drag_begin; gtkwidget_class->drag_data_received = thunar_shortcut_drag_data_received; gtkwidget_class->drag_drop = thunar_shortcut_drag_drop; + gtkwidget_class->drag_end = thunar_shortcut_drag_end; gtkwidget_class->drag_leave = thunar_shortcut_drag_leave; gtkwidget_class->drag_motion = thunar_shortcut_drag_motion; gtkwidget_class->key_press_event = thunar_shortcut_key_press_event; @@ -532,6 +543,14 @@ thunar_shortcut_constructed (GObject *object) /* mark as constructed so now all properties can be changed as usual */ shortcut->constructed = TRUE; + + if (shortcut->mutable) + { + /* set up drag support for re-ordering shortcuts */ + gtk_drag_source_set (GTK_WIDGET (shortcut), GDK_BUTTON1_MASK, + drag_targets, G_N_ELEMENTS (drag_targets), + GDK_ACTION_MOVE); + } } @@ -810,6 +829,35 @@ thunar_shortcut_button_release_event (GtkWidget *widget, static void +thunar_shortcut_drag_begin (GtkWidget *widget, + GdkDragContext *context) +{ + ThunarShortcut *shortcut = THUNAR_SHORTCUT (widget); + GdkPixmap *pixmap; + + _thunar_return_if_fail (THUNAR_IS_SHORTCUT (widget)); + _thunar_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); + + /* reset the pressed button state */ + shortcut->pressed_button = -1; + + /* take a snapshot of the shortcut and use it as the drag icon */ + pixmap = gtk_widget_get_snapshot (widget, NULL); + gtk_drag_set_icon_pixmap (context, gtk_widget_get_colormap (widget), + pixmap, NULL, 0, 0); + g_object_unref (pixmap); + + /* hide the shortcut as we are now dragging it */ + gtk_widget_hide (widget); + + /* call the parent's drag_begin() handler */ + if (GTK_WIDGET_CLASS (thunar_shortcut_parent_class)->drag_begin != NULL) + (*GTK_WIDGET_CLASS (thunar_shortcut_parent_class)->drag_begin) (widget, context); +} + + + +static void thunar_shortcut_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, @@ -933,6 +981,28 @@ thunar_shortcut_drag_drop (GtkWidget *widget, static void +thunar_shortcut_drag_end (GtkWidget *widget, + GdkDragContext *context) +{ + ThunarShortcut *shortcut = THUNAR_SHORTCUT (widget); + + _thunar_return_if_fail (THUNAR_IS_SHORTCUT (widget)); + _thunar_return_if_fail (GDK_IS_DRAG_CONTEXT (context)); + + /* reset the pressed button state */ + shortcut->pressed_button = -1; + + /* show the shortcut again as we are finished dragging it */ + gtk_widget_show (widget); + + /* call the parent's drag_begin() handler */ + if (GTK_WIDGET_CLASS (thunar_shortcut_parent_class)->drag_end != NULL) + (*GTK_WIDGET_CLASS (thunar_shortcut_parent_class)->drag_end) (widget, context); +} + + + +static void thunar_shortcut_drag_leave (GtkWidget *widget, GdkDragContext *context, guint timestamp) @@ -983,6 +1053,8 @@ thunar_shortcut_drag_motion (GtkWidget *widget, /* abort if the target is unsupported */ if (target != gdk_atom_intern_static_string ("text/uri-list")) { + g_debug ("shortcut drag motion: not a URI list"); + /* unsupported target, can't handle it, sorry */ return FALSE; } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits