diff options
Diffstat (limited to 'lib/egg/eggtreemultidnd.c')
-rw-r--r-- | lib/egg/eggtreemultidnd.c | 270 |
1 files changed, 128 insertions, 142 deletions
diff --git a/lib/egg/eggtreemultidnd.c b/lib/egg/eggtreemultidnd.c index f140c2591..cb584856e 100644 --- a/lib/egg/eggtreemultidnd.c +++ b/lib/egg/eggtreemultidnd.c @@ -24,8 +24,7 @@ #define EGG_TREE_MULTI_DND_STRING "EggTreeMultiDndString" -typedef struct -{ +typedef struct { guint pressed_button; gint x; gint y; @@ -37,8 +36,7 @@ typedef struct /* CUT-N-PASTE from gtktreeview.c */ typedef struct _TreeViewDragInfo TreeViewDragInfo; -struct _TreeViewDragInfo -{ +struct _TreeViewDragInfo { GdkModifierType start_button_mask; GtkTargetList *source_target_list; GdkDragAction source_actions; @@ -55,24 +53,23 @@ egg_tree_multi_drag_source_get_type (void) { static GType our_type = 0; - if (!our_type) + if (!our_type) { + static const GTypeInfo our_info = { - static const GTypeInfo our_info = - { - sizeof (EggTreeMultiDragSourceIface), /* class_size */ - NULL, /* base_init */ - NULL, /* base_finalize */ - NULL, - NULL, /* class_finalize */ - NULL, /* class_data */ - 0, - 0, /* n_preallocs */ - NULL - }; - - our_type = g_type_register_static (G_TYPE_INTERFACE, "EggTreeMultiDragSource", &our_info, 0); - } - + sizeof (EggTreeMultiDragSourceIface), /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL + }; + + our_type = g_type_register_static (G_TYPE_INTERFACE, "EggTreeMultiDragSource", &our_info, 0); + } + return our_type; } @@ -81,7 +78,7 @@ egg_tree_multi_drag_source_get_type (void) * egg_tree_multi_drag_source_row_draggable: * @drag_source: a #EggTreeMultiDragSource * @path: row on which user is initiating a drag - * + * * Asks the #EggTreeMultiDragSource whether a particular row can be used as * the source of a DND operation. If the source doesn't implement * this interface, the row is assumed draggable. @@ -90,7 +87,7 @@ egg_tree_multi_drag_source_get_type (void) **/ gboolean egg_tree_multi_drag_source_row_draggable (EggTreeMultiDragSource *drag_source, - GList *path_list) + GList *path_list) { EggTreeMultiDragSourceIface *iface = EGG_TREE_MULTI_DRAG_SOURCE_GET_IFACE (drag_source); @@ -99,7 +96,7 @@ egg_tree_multi_drag_source_row_draggable (EggTreeMultiDragSource *drag_source, g_return_val_if_fail (path_list != NULL, FALSE); if (iface->row_draggable) - return (* iface->row_draggable) (drag_source, path_list); + return (*iface->row_draggable)(drag_source, path_list); else return TRUE; } @@ -109,18 +106,18 @@ egg_tree_multi_drag_source_row_draggable (EggTreeMultiDragSource *drag_source, * egg_tree_multi_drag_source_drag_data_delete: * @drag_source: a #EggTreeMultiDragSource * @path: row that was being dragged - * + * * Asks the #EggTreeMultiDragSource to delete the row at @path, because * it was moved somewhere else via drag-and-drop. Returns %FALSE * if the deletion fails because @path no longer exists, or for * some model-specific reason. Should robustly handle a @path no * longer found in the model! - * + * * Return value: %TRUE if the row was successfully deleted **/ gboolean egg_tree_multi_drag_source_drag_data_delete (EggTreeMultiDragSource *drag_source, - GList *path_list) + GList *path_list) { EggTreeMultiDragSourceIface *iface = EGG_TREE_MULTI_DRAG_SOURCE_GET_IFACE (drag_source); @@ -128,7 +125,7 @@ egg_tree_multi_drag_source_drag_data_delete (EggTreeMultiDragSource *drag_source g_return_val_if_fail (iface->drag_data_delete != NULL, FALSE); g_return_val_if_fail (path_list != NULL, FALSE); - return (* iface->drag_data_delete) (drag_source, path_list); + return (*iface->drag_data_delete)(drag_source, path_list); } /** @@ -136,18 +133,18 @@ egg_tree_multi_drag_source_drag_data_delete (EggTreeMultiDragSource *drag_source * @drag_source: a #EggTreeMultiDragSource * @path: row that was dragged * @selection_data: a #EggSelectionData to fill with data from the dragged row - * + * * Asks the #EggTreeMultiDragSource to fill in @selection_data with a * representation of the row at @path. @selection_data->target gives * the required type of the data. Should robustly handle a @path no * longer found in the model! - * - * Return value: %TRUE if data of the required type was provided + * + * Return value: %TRUE if data of the required type was provided **/ gboolean -egg_tree_multi_drag_source_drag_data_get (EggTreeMultiDragSource *drag_source, - GList *path_list, - GtkSelectionData *selection_data) +egg_tree_multi_drag_source_drag_data_get (EggTreeMultiDragSource *drag_source, + GList *path_list, + GtkSelectionData *selection_data) { EggTreeMultiDragSourceIface *iface = EGG_TREE_MULTI_DRAG_SOURCE_GET_IFACE (drag_source); @@ -156,7 +153,7 @@ egg_tree_multi_drag_source_drag_data_get (EggTreeMultiDragSource *drag_source g_return_val_if_fail (path_list != NULL, FALSE); g_return_val_if_fail (selection_data != NULL, FALSE); - return (* iface->drag_data_get) (drag_source, path_list, selection_data); + return (*iface->drag_data_get)(drag_source, path_list, selection_data); } static void @@ -166,10 +163,10 @@ stop_drag_check (GtkWidget *widget) GSList *l; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); - + for (l = priv_data->event_list; l != NULL; l = l->next) gdk_event_free (l->data); - + g_slist_free (priv_data->event_list); priv_data->event_list = NULL; g_signal_handler_disconnect (widget, priv_data->motion_notify_handler); @@ -178,17 +175,17 @@ stop_drag_check (GtkWidget *widget) static gboolean egg_tree_multi_drag_button_release_event (GtkWidget *widget, - GdkEventButton *event, - gpointer data) + GdkEventButton *event, + gpointer data) { EggTreeMultiDndData *priv_data; GSList *l; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); - for (l = priv_data->event_list; l != NULL; l = l->next) + for (l = priv_data->event_list; l != NULL; l = l->next) gtk_propagate_event (widget, l->data); - + stop_drag_check (widget); return FALSE; @@ -196,13 +193,13 @@ egg_tree_multi_drag_button_release_event (GtkWidget *widget, static void selection_foreach (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer data) + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) { GList **list_ptr; - list_ptr = (GList **) data; + list_ptr = (GList **)data; *list_ptr = g_list_prepend (*list_ptr, gtk_tree_row_reference_new (model, path)); } @@ -210,29 +207,29 @@ selection_foreach (GtkTreeModel *model, static void path_list_free (GList *path_list) { - g_list_foreach (path_list, (GFunc) gtk_tree_row_reference_free, NULL); + g_list_foreach (path_list, (GFunc)gtk_tree_row_reference_free, NULL); g_list_free (path_list); } static void set_context_data (GdkDragContext *context, - GList *path_list) + GList *path_list) { g_object_set_data_full (G_OBJECT (context), "egg-tree-view-multi-source-row", path_list, - (GDestroyNotify) path_list_free); + (GDestroyNotify)path_list_free); } static GList * get_context_data (GdkDragContext *context) { return g_object_get_data (G_OBJECT (context), - "egg-tree-view-multi-source-row"); + "egg-tree-view-multi-source-row"); } /* CUT-N-PASTE from gtktreeview.c */ -static TreeViewDragInfo* +static TreeViewDragInfo * get_info (GtkTreeView *tree_view) { return g_object_get_data (G_OBJECT (tree_view), "gtk-tree-view-drag-info"); @@ -241,10 +238,10 @@ get_info (GtkTreeView *tree_view) static void egg_tree_multi_drag_drag_data_get (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time) + GdkDragContext *context, + GtkSelectionData *selection_data, + guint info, + guint time) { GtkTreeView *tree_view; GtkTreeModel *model; @@ -273,71 +270,65 @@ egg_tree_multi_drag_drag_data_get (GtkWidget *widget, * we also support. */ - if (EGG_IS_TREE_MULTI_DRAG_SOURCE (model)) - { - egg_tree_multi_drag_source_drag_data_get (EGG_TREE_MULTI_DRAG_SOURCE (model), - path_list, - selection_data); - } + if (EGG_IS_TREE_MULTI_DRAG_SOURCE (model)) { + egg_tree_multi_drag_source_drag_data_get (EGG_TREE_MULTI_DRAG_SOURCE (model), + path_list, + selection_data); + } } static gboolean egg_tree_multi_drag_motion_event (GtkWidget *widget, - GdkEventMotion *event, - gpointer data) + GdkEventMotion *event, + gpointer data) { EggTreeMultiDndData *priv_data; priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING); if (gtk_drag_check_threshold (widget, - priv_data->x, - priv_data->y, - event->x, - event->y)) - { - GList *path_list = NULL; - GtkTreeSelection *selection; - GtkTreeModel *model; - GdkDragContext *context; - TreeViewDragInfo *di; - - di = get_info (GTK_TREE_VIEW (widget)); - - if (di == NULL) - return FALSE; - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); - stop_drag_check (widget); - gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); - path_list = g_list_reverse (path_list); - model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); - if (egg_tree_multi_drag_source_row_draggable (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list)) - { - context = gtk_drag_begin_with_coordinates (widget, - gtk_drag_source_get_target_list (widget), - di->source_actions, - priv_data->pressed_button, - (GdkEvent*)event, - event->x, - event->y); - set_context_data (context, path_list); - gtk_drag_set_icon_default (context); - - } - else - { - path_list_free (path_list); - } + priv_data->x, + priv_data->y, + event->x, + event->y)) { + GList *path_list = NULL; + GtkTreeSelection *selection; + GtkTreeModel *model; + GdkDragContext *context; + TreeViewDragInfo *di; + + di = get_info (GTK_TREE_VIEW (widget)); + + if (di == NULL) + return FALSE; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); + stop_drag_check (widget); + gtk_tree_selection_selected_foreach (selection, selection_foreach, &path_list); + path_list = g_list_reverse (path_list); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); + if (egg_tree_multi_drag_source_row_draggable (EGG_TREE_MULTI_DRAG_SOURCE (model), path_list)) { + context = gtk_drag_begin_with_coordinates (widget, + gtk_drag_source_get_target_list (widget), + di->source_actions, + priv_data->pressed_button, + (GdkEvent *)event, + event->x, + event->y); + set_context_data (context, path_list); + gtk_drag_set_icon_default (context); + } else { + path_list_free (path_list); } + } return TRUE; } static gboolean egg_tree_multi_drag_button_press_event (GtkWidget *widget, - GdkEventButton *event, - gpointer data) + GdkEventButton *event, + gpointer data) { GtkTreeView *tree_view; GtkTreePath *path = NULL; @@ -348,58 +339,53 @@ egg_tree_multi_drag_button_press_event (GtkWidget *widget, tree_view = GTK_TREE_VIEW (widget); priv_data = g_object_get_data (G_OBJECT (tree_view), EGG_TREE_MULTI_DND_STRING); - if (priv_data == NULL) - { - priv_data = g_new0 (EggTreeMultiDndData, 1); - g_object_set_data (G_OBJECT (tree_view), EGG_TREE_MULTI_DND_STRING, priv_data); - } + if (priv_data == NULL) { + priv_data = g_new0 (EggTreeMultiDndData, 1); + g_object_set_data (G_OBJECT (tree_view), EGG_TREE_MULTI_DND_STRING, priv_data); + } - if (g_slist_find (priv_data->event_list, event)) + if (g_slist_find (priv_data->event_list, event)) return FALSE; - if (priv_data->event_list) - { - /* save the event to be propagated in order */ - priv_data->event_list = g_slist_append (priv_data->event_list, gdk_event_copy ((GdkEvent*)event)); - return TRUE; - } - + if (priv_data->event_list) { + /* save the event to be propagated in order */ + priv_data->event_list = g_slist_append (priv_data->event_list, gdk_event_copy ((GdkEvent *)event)); + return TRUE; + } + if (event->type == GDK_2BUTTON_PRESS) return FALSE; gtk_tree_view_get_path_at_pos (tree_view, - event->x, event->y, - &path, &column, - &cell_x, &cell_y); + event->x, event->y, + &path, &column, + &cell_x, &cell_y); selection = gtk_tree_view_get_selection (tree_view); - if (path && gtk_tree_selection_path_is_selected (selection, path)) - { - priv_data->pressed_button = event->button; - priv_data->x = event->x; - priv_data->y = event->y; - priv_data->event_list = g_slist_append (priv_data->event_list, gdk_event_copy ((GdkEvent*)event)); - priv_data->motion_notify_handler = - g_signal_connect (G_OBJECT (tree_view), "motion_notify_event", G_CALLBACK (egg_tree_multi_drag_motion_event), NULL); - priv_data->button_release_handler = - g_signal_connect (G_OBJECT (tree_view), "button_release_event", G_CALLBACK (egg_tree_multi_drag_button_release_event), NULL); - - if (priv_data->drag_data_get_handler == 0) - { - priv_data->drag_data_get_handler = - g_signal_connect (G_OBJECT (tree_view), "drag_data_get", G_CALLBACK (egg_tree_multi_drag_drag_data_get), NULL); - } - - gtk_tree_path_free (path); - - return TRUE; + if (path && gtk_tree_selection_path_is_selected (selection, path)) { + priv_data->pressed_button = event->button; + priv_data->x = event->x; + priv_data->y = event->y; + priv_data->event_list = g_slist_append (priv_data->event_list, gdk_event_copy ((GdkEvent *)event)); + priv_data->motion_notify_handler = + g_signal_connect (G_OBJECT (tree_view), "motion_notify_event", G_CALLBACK (egg_tree_multi_drag_motion_event), NULL); + priv_data->button_release_handler = + g_signal_connect (G_OBJECT (tree_view), "button_release_event", G_CALLBACK (egg_tree_multi_drag_button_release_event), NULL); + + if (priv_data->drag_data_get_handler == 0) { + priv_data->drag_data_get_handler = + g_signal_connect (G_OBJECT (tree_view), "drag_data_get", G_CALLBACK (egg_tree_multi_drag_drag_data_get), NULL); } - if (path) - { - gtk_tree_path_free (path); - } + gtk_tree_path_free (path); + + return TRUE; + } + + if (path) { + gtk_tree_path_free (path); + } return FALSE; } |