[Xfce4-commits] <xfce4-panel:master> Add a sorting mode for tasklist reordering with dnd (bug #7058).

Nick Schermer noreply at xfce.org
Sun Jun 19 20:18:01 CEST 2011


Updating branch refs/heads/master
         to e316c7f40bb43373629c8e4bd4a19b2960c9f486 (commit)
       from e3e6be1c591c8e9cce625722866a1c7b129ecdfd (commit)

commit e316c7f40bb43373629c8e4bd4a19b2960c9f486
Author: Nick Schermer <nick at xfce.org>
Date:   Sun Jun 19 20:15:04 2011 +0200

    Add a sorting mode for tasklist reordering with dnd (bug #7058).

 plugins/tasklist/tasklist-dialog.glade |    3 +
 plugins/tasklist/tasklist-widget.c     |   65 ++++++++++++++++++++++++++++++-
 plugins/tasklist/tasklist-widget.h     |    3 +-
 3 files changed, 67 insertions(+), 4 deletions(-)

diff --git a/plugins/tasklist/tasklist-dialog.glade b/plugins/tasklist/tasklist-dialog.glade
index 86a2be0..835449e 100644
--- a/plugins/tasklist/tasklist-dialog.glade
+++ b/plugins/tasklist/tasklist-dialog.glade
@@ -399,6 +399,9 @@
       <row>
         <col id="0" translatable="yes">Group title and window title</col>
       </row>
+      <row>
+        <col id="0" translatable="yes">None, allow drag-and-drop</col>
+      </row>
     </data>
   </object>
 </interface>
diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c
index 9bae441..a301b65 100644
--- a/plugins/tasklist/tasklist-widget.c
+++ b/plugins/tasklist/tasklist-widget.c
@@ -1751,9 +1751,10 @@ xfce_tasklist_sort (XfceTasklist *tasklist)
 {
   panel_return_if_fail (XFCE_IS_TASKLIST (tasklist));
 
-  tasklist->windows = g_list_sort_with_data (tasklist->windows,
-                                             xfce_tasklist_button_compare,
-                                             tasklist);
+  if (tasklist->sort_order != XFCE_TASKLIST_SORT_ORDER_DND)
+    tasklist->windows = g_list_sort_with_data (tasklist->windows,
+                                               xfce_tasklist_button_compare,
+                                               tasklist);
 
   gtk_widget_queue_resize (GTK_WIDGET (tasklist));
 }
@@ -2215,6 +2216,10 @@ xfce_tasklist_button_compare (gconstpointer child_a,
   panel_return_val_if_fail (b->type == CHILD_TYPE_GROUP
                             || WNCK_IS_WINDOW (b->window), 0);
 
+  /* just append to the list */
+  if (tasklist->sort_order == XFCE_TASKLIST_SORT_ORDER_DND)
+    return a->unique_id - b->unique_id;
+
   if (tasklist->all_workspaces)
     {
       /* get workspace (this is slightly inefficient because the WnckWindow
@@ -2887,6 +2892,55 @@ xfce_tasklist_button_drag_begin (GtkWidget         *button,
 
 
 
+static void
+xfce_tasklist_button_drag_data_received (GtkWidget         *button,
+                                         GdkDragContext    *context,
+                                         gint               x,
+                                         gint               y,
+                                         GtkSelectionData  *selection_data,
+                                         guint              info,
+                                         guint              drag_time,
+                                         XfceTasklistChild *child2)
+{
+  GList             *li, *sibling;
+  gulong             xid;
+  XfceTasklistChild *child;
+  XfceTasklist      *tasklist = XFCE_TASKLIST (child2->tasklist);
+
+  panel_return_if_fail (XFCE_IS_TASKLIST (tasklist));
+
+  if (tasklist->sort_order != XFCE_TASKLIST_SORT_ORDER_DND)
+    return;
+
+  sibling = g_list_find (tasklist->windows, child2);
+  panel_return_if_fail (sibling != NULL);
+
+  if ((tasklist->horizontal && x >= button->allocation.width / 2)
+      || (!tasklist->horizontal && y >= button->allocation.height / 2))
+    sibling = g_list_next (sibling);
+
+  xid = *((gulong *) gtk_selection_data_get_data (selection_data));
+  for (li = tasklist->windows; li != NULL; li = li->next)
+    {
+      child = li->data;
+
+      if (child != child2
+          && child->window != NULL
+          && wnck_window_get_xid (child->window) == xid)
+        {
+          /* swap items */
+          tasklist->windows = g_list_delete_link (tasklist->windows, li);
+          tasklist->windows = g_list_insert_before (tasklist->windows, sibling, child);
+
+          gtk_widget_queue_resize (GTK_WIDGET (tasklist));
+
+          break;
+        }
+    }
+}
+
+
+
 static XfceTasklistChild *
 xfce_tasklist_button_new (WnckWindow   *window,
                           XfceTasklist *tasklist)
@@ -2911,10 +2965,15 @@ xfce_tasklist_button_new (WnckWindow   *window,
   gtk_drag_source_set (child->button, GDK_BUTTON1_MASK,
                        source_targets, G_N_ELEMENTS (source_targets),
                        GDK_ACTION_MOVE);
+  gtk_drag_dest_set (child->button, GTK_DEST_DEFAULT_ALL,
+                     source_targets, G_N_ELEMENTS (source_targets),
+                     GDK_ACTION_MOVE);
   g_signal_connect (G_OBJECT (child->button), "drag-data-get",
       G_CALLBACK (xfce_tasklist_button_drag_data_get), child);
   g_signal_connect (G_OBJECT (child->button), "drag-begin",
       G_CALLBACK (xfce_tasklist_button_drag_begin), child);
+  g_signal_connect (G_OBJECT (child->button), "drag-data-received",
+      G_CALLBACK (xfce_tasklist_button_drag_data_received), child);
 
   /* note that the same signals should be in the proxy menu item too */
   g_signal_connect (G_OBJECT (child->button), "enter-notify-event",
diff --git a/plugins/tasklist/tasklist-widget.h b/plugins/tasklist/tasklist-widget.h
index f1f6b11..3a0eaf4 100644
--- a/plugins/tasklist/tasklist-widget.h
+++ b/plugins/tasklist/tasklist-widget.h
@@ -54,9 +54,10 @@ enum _XfceTasklistSortOrder
   XFCE_TASKLIST_SORT_ORDER_GROUP_TIMESTAMP, /* sort by group and then by timestamp */
   XFCE_TASKLIST_SORT_ORDER_TITLE, /* sort by window title */
   XFCE_TASKLIST_SORT_ORDER_GROUP_TITLE, /* sort by group and then by title */
+  XFCE_TASKLIST_SORT_ORDER_DND, /* append and support dnd */
 
   XFCE_TASKLIST_SORT_ORDER_MIN = XFCE_TASKLIST_SORT_ORDER_TIMESTAMP,
-  XFCE_TASKLIST_SORT_ORDER_MAX = XFCE_TASKLIST_SORT_ORDER_GROUP_TITLE,
+  XFCE_TASKLIST_SORT_ORDER_MAX = XFCE_TASKLIST_SORT_ORDER_DND,
   XFCE_TASKLIST_SORT_ORDER_DEFAULT = XFCE_TASKLIST_SORT_ORDER_GROUP_TIMESTAMP
 };
 



More information about the Xfce4-commits mailing list