aboutsummaryrefslogtreecommitdiffstats
path: root/lib/widgets/ephy-node-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/widgets/ephy-node-view.c')
-rw-r--r--lib/widgets/ephy-node-view.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/lib/widgets/ephy-node-view.c b/lib/widgets/ephy-node-view.c
index 23cc2fc60..010195e48 100644
--- a/lib/widgets/ephy-node-view.c
+++ b/lib/widgets/ephy-node-view.c
@@ -663,6 +663,42 @@ did_not_drag (EphyNodeView *view,
}
}
+typedef struct
+{
+ EphyNodeView *view;
+ gboolean result;
+}
+ForeachData;
+
+static void
+check_node_is_drag_source (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ ForeachData *data)
+{
+ EphyNode *node;
+
+ node = get_node_from_path (data->view, path);
+ data->result = data->result &&
+ node != NULL &&
+ ephy_node_get_is_drag_source (node);
+}
+
+static gboolean
+can_drag_selection (EphyNodeView *view)
+{
+ GtkTreeView *tree_view = GTK_TREE_VIEW (view);
+ GtkTreeSelection *selection;
+ ForeachData data = { view, TRUE };
+
+ selection = gtk_tree_view_get_selection (tree_view);
+ gtk_tree_selection_selected_foreach (selection,
+ (GtkTreeSelectionForeachFunc) check_node_is_drag_source,
+ &data);
+
+ return data.result;
+}
+
static void
drag_data_get_cb (GtkWidget *widget,
GdkDragContext *context,
@@ -707,6 +743,7 @@ button_release_cb (GtkWidget *widget,
did_not_drag (view, event);
return TRUE;
}
+ view->priv->drag_started = FALSE;
}
return FALSE;
}
@@ -727,7 +764,8 @@ motion_notify_cb (GtkWidget *widget,
{
if (gtk_drag_check_threshold (widget, view->priv->drag_x,
view->priv->drag_y, event->x,
- event->y))
+ event->y)
+ && can_drag_selection (view))
{
context = gtk_drag_begin
(widget, view->priv->source_target_list,