[Xfce4-commits] r23627 - xfdesktop/trunk/src

Brian Tarricone kelnos at xfce.org
Sat Nov 4 09:55:16 CET 2006


Author: kelnos
Date: 2006-11-04 08:55:15 +0000 (Sat, 04 Nov 2006)
New Revision: 23627

Modified:
   xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
   xfdesktop/trunk/src/xfdesktop-icon-view.c
   xfdesktop/trunk/src/xfdesktop-icon-view.h
   xfdesktop/trunk/src/xfdesktop-icon.c
   xfdesktop/trunk/src/xfdesktop-icon.h
   xfdesktop/trunk/src/xfdesktop-regular-file-icon.c
   xfdesktop/trunk/src/xfdesktop-special-file-icon.c
   xfdesktop/trunk/src/xfdesktop-volume-icon.c
   xfdesktop/trunk/src/xfdesktop-window-icon-manager.c
   xfdesktop/trunk/src/xfdesktop-window-icon.c
Log:
first step to making DnD much less sucky and unmaintainable.  XfdesktopIcon
has two more vfuncs: get_allowed_drag_actions() and get_allowed_drop_actions()
to help determining what kinds of drags and drops are allowed for a particular
icon.  XfdesktopIconView has lost the set_allow_overlapping_drops property,
because it's just really not necessary.

most of xfdesktop_icon_view_drag_motion() has been redone, and it now looks
a lot cleaner and makes way more sense than before.

no, the multiple DnD bug still isn't fixed.  but now it should be easier to
fix it.


Modified: xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-file-icon-manager.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-file-icon-manager.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -2747,7 +2747,6 @@
     } else
         g_object_ref(G_OBJECT(thunar_mime_database));
     
-    xfdesktop_icon_view_set_allow_overlapping_drops(icon_view, TRUE);
     xfdesktop_icon_view_set_selection_mode(icon_view, GTK_SELECTION_MULTIPLE);
     xfdesktop_icon_view_enable_drag_source(icon_view,
                                            GDK_SHIFT_MASK | GDK_CONTROL_MASK,

Modified: xfdesktop/trunk/src/xfdesktop-icon-view.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon-view.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-icon-view.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -122,7 +122,6 @@
     GHashTable *repaint_queue;
     
     GtkSelectionMode sel_mode;
-    gboolean allow_overlapping_drops;
     gboolean maybe_begin_drag;
     gboolean definitely_dragging;
     gint press_start_x;
@@ -291,7 +290,9 @@
 
 static guint __signals[SIG_N_SIGNALS] = { 0, };
 
+static GQuark xfdesktop_cell_highlight_quark = 0;
 
+
 G_DEFINE_TYPE(XfdesktopIconView, xfdesktop_icon_view, GTK_TYPE_WIDGET)
 
 
@@ -340,6 +341,8 @@
                                                              "Alpha value for the text label's background",
                                                              0, 255, 155,
                                                              G_PARAM_READABLE));
+    
+    xfdesktop_cell_highlight_quark = g_quark_from_static_string("xfdesktop-icon-view-cell-highlight");
 }
 
 static void
@@ -992,6 +995,66 @@
     *col = (x - icon_view->priv->xorigin - SCREEN_MARGIN) / CELL_SIZE;
 }
 
+static inline void
+xfdesktop_icon_view_clear_drag_highlight(XfdesktopIconView *icon_view,
+                                         GdkDragContext *context)
+{
+    GdkRectangle *cell_highlight;
+    
+    cell_highlight = g_object_get_qdata(G_OBJECT(context),
+                                        xfdesktop_cell_highlight_quark);
+    if(!cell_highlight)
+        return;
+    
+    if(0 == cell_highlight->width || 0 == cell_highlight->height)
+        return;
+    
+    gtk_widget_queue_draw_area(GTK_WIDGET(icon_view),
+                               cell_highlight->x,
+                               cell_highlight->y,
+                               cell_highlight->width + 1,
+                               cell_highlight->height + 1);
+    /* is this necessary? */
+    /*xfdesktop_icon_view_repaint_icons(icon_view, cell_highlight);*/
+    
+    cell_highlight->width = cell_highlight->height = 0;
+}
+
+static inline void
+xfdesktop_icon_view_draw_drag_highlight(XfdesktopIconView *icon_view,
+                                        GdkDragContext *context,
+                                        guint16 row,
+                                        guint16 col)
+{
+    GtkWidget *widget = GTK_WIDGET(icon_view);
+    GdkRectangle *cell_highlight;
+    gint newx, newy;
+    
+    newx = SCREEN_MARGIN + icon_view->priv->xorigin + col * CELL_SIZE;
+    newy = SCREEN_MARGIN + icon_view->priv->yorigin + row * CELL_SIZE;
+    
+    cell_highlight = g_object_get_qdata(G_OBJECT(context),
+                                        xfdesktop_cell_highlight_quark);
+    
+    if(cell_highlight) {
+        if(newx != cell_highlight->x || newy != cell_highlight->y)
+            xfdesktop_icon_view_clear_drag_highlight(icon_view, context);
+    } else {
+        cell_highlight = g_new0(GdkRectangle, 1);
+        g_object_set_qdata_full(G_OBJECT(context),
+                               xfdesktop_cell_highlight_quark,
+                               cell_highlight, (GDestroyNotify)g_free);
+    }
+    
+    cell_highlight->x = newx;
+    cell_highlight->y = newy;
+    cell_highlight->width = cell_highlight->height = CELL_SIZE;
+    
+    gdk_draw_rectangle(GDK_DRAWABLE(widget->window),
+                       widget->style->bg_gc[GTK_STATE_SELECTED], FALSE,
+                       newx, newy, CELL_SIZE, CELL_SIZE);
+}
+
 static gboolean
 xfdesktop_icon_view_drag_motion(GtkWidget *widget,
                                 GdkDragContext *context,
@@ -1002,8 +1065,9 @@
     XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget);
     GdkAtom target = GDK_NONE;
     guint16 row, col, icon_row = 0, icon_col = 0;
-    GdkRectangle *cell_highlight;
     XfdesktopIcon *icon_on_dest = NULL;
+    GdkDragAction our_action = 0;
+    gboolean is_local_drag;
     
     target = gtk_drag_dest_find_target(widget, context, 
                                        icon_view->priv->native_targets);
@@ -1014,88 +1078,79 @@
             return FALSE;
     }
     
-    if(target == gdk_atom_intern("XFDESKTOP_ICON", FALSE)) {
-        if(!xfdesktop_icon_get_position(icon_view->priv->last_clicked_item,
-                                        &icon_row, &icon_col))
-        {
-            return FALSE;
-        }
-    }
-    
+    /* can we drop here? */
     xfdesktop_xy_to_rowcol(icon_view, x, y, &row, &col);
     if(row >= icon_view->priv->nrows || col >= icon_view->priv->ncols)
         return FALSE;
+    icon_on_dest = xfdesktop_icon_view_icon_in_cell(icon_view, row, col);
+    if(icon_on_dest) {
+        if(!xfdesktop_icon_is_drop_dest(icon_on_dest))
+            return FALSE;
+    } else if(!xfdesktop_grid_is_free_position(icon_view, row, col))
+        return FALSE;
     
-    if(icon_view->priv->allow_overlapping_drops) {
-        icon_on_dest = xfdesktop_icon_view_icon_in_cell(icon_view, row, col);
-        if(icon_on_dest) {
-            if(!xfdesktop_icon_is_drop_dest(icon_on_dest))
-                return FALSE;
-        }
-    }
+    is_local_drag = (target == gdk_atom_intern("XFDESKTOP_ICON", FALSE));
     
-    if(!icon_on_dest && !xfdesktop_grid_is_free_position(icon_view, row, col))
+    if(is_local_drag
+       && !xfdesktop_icon_get_position(icon_view->priv->last_clicked_item,
+                                        &icon_row, &icon_col))
+    {
+        xfdesktop_icon_view_clear_drag_highlight(icon_view, context);
         return FALSE;
+    }
     
-    if(icon_view->priv->allow_overlapping_drops && !icon_on_dest
-       && target == gdk_atom_intern("XFDESKTOP_ICON", FALSE)) {
-        /* FIXME: support copy on desktop of file already on desktop?  need
-         * to handle window icons somehow if so. */
-        gdk_drag_status(context, GDK_ACTION_MOVE, time);
-    } else
-        gdk_drag_status(context, context->suggested_action, time);
+    /* at this point there are four cases to account for:
+     * 1.  local drag, empty space -> MOVE
+     * 2.  local drag, icon is there -> depends on icon_on_dest
+     * 3.  foreign drag, empty space -> depends on the source
+     * 4.  foreign drag, icon is there -> depends on source and icon_on_dest
+     */
     
-    cell_highlight = g_object_get_data(G_OBJECT(context),
-                                       "xfce-desktop-cell-highlight");
-    
-    if(((icon_view->priv->allow_overlapping_drops
-         && (target != gdk_atom_intern("XFDESKTOP_ICON", FALSE)
-             || icon_row != row || icon_col != col))
-       || xfdesktop_grid_is_free_position(icon_view, row, col)))
-    {
-        gint newx, newy;
+    if(!icon_on_dest) {
+        if(is_local_drag)  /* # 1 */
+            our_action = GDK_ACTION_MOVE;
+        else  /* #3 */
+            our_action = context->suggested_action;
+    } else {
+        GdkDragAction allowed_actions = 0xffffffff;
         
-        newx = SCREEN_MARGIN + icon_view->priv->xorigin + col * CELL_SIZE;
-        newy = SCREEN_MARGIN + icon_view->priv->yorigin + row * CELL_SIZE;
-        
-        if(cell_highlight) {
-            if(cell_highlight->x != newx || cell_highlight->y != newy) {
-                gtk_widget_queue_draw_area(widget,
-                                           cell_highlight->x,
-                                           cell_highlight->y,
-                                           cell_highlight->width + 1,
-                                           cell_highlight->height + 1);
-                if(icon_view->priv->allow_overlapping_drops)
-                    xfdesktop_icon_view_repaint_icons(icon_view, cell_highlight);
-            }
-        } else {
-            cell_highlight = g_new0(GdkRectangle, 1);
-            g_object_set_data_full(G_OBJECT(context),
-                                   "xfce-desktop-cell-highlight",
-                                   cell_highlight, (GDestroyNotify)g_free);
+        /* check to make sure we aren't just hovering over ourself */
+        if(row == icon_row && col == icon_col) {
+            xfdesktop_icon_view_clear_drag_highlight(icon_view, context);
+            return FALSE;
         }
         
-        cell_highlight->x = newx;
-        cell_highlight->y = newy;
-        cell_highlight->width = cell_highlight->height = CELL_SIZE;
+        if(is_local_drag)  /* #2 */
+            allowed_actions &= xfdesktop_icon_get_allowed_drag_actions(icon_view->priv->last_clicked_item);
         
-        gdk_draw_rectangle(GDK_DRAWABLE(widget->window),
-                           widget->style->bg_gc[GTK_STATE_SELECTED], FALSE,
-                           newx, newy, CELL_SIZE, CELL_SIZE);
+        /* #2 or #4 */
+        allowed_actions &= xfdesktop_icon_get_allowed_drop_actions(icon_on_dest);
         
-        return TRUE;
-    } else {
-        if(cell_highlight) {
-            gtk_widget_queue_draw_area(widget,
-                                       cell_highlight->x,
-                                       cell_highlight->y,
-                                       cell_highlight->width + 1,
-                                       cell_highlight->height+ 1);
-            if(icon_view->priv->allow_overlapping_drops)
-                xfdesktop_icon_view_repaint_icons(icon_view, cell_highlight);
+        if(allowed_actions & context->suggested_action)
+            our_action = context->suggested_action;
+        else {
+            /* priority: move, copy, link */
+            if(allowed_actions & GDK_ACTION_MOVE)
+                our_action = GDK_ACTION_MOVE;
+            else if(allowed_actions & GDK_ACTION_COPY)
+                our_action = GDK_ACTION_COPY;
+            else if(allowed_actions & GDK_ACTION_LINK)
+                our_action = GDK_ACTION_LINK;
         }
+    }
+    
+    if(!our_action) {
+        xfdesktop_icon_view_clear_drag_highlight(icon_view, context);
         return FALSE;
     }
+    
+    /* at this point we can be reasonably sure that a drop is possible */
+    
+    gdk_drag_status(context, our_action, time);
+    
+    xfdesktop_icon_view_draw_drag_highlight(icon_view, context, row, col);
+        
+    return TRUE;
 }
 
 static void
@@ -1103,18 +1158,8 @@
                                GdkDragContext *context,
                                guint time)
 {
-    GdkRectangle *cell_highlight = g_object_get_data(G_OBJECT(context),
-                                                     "xfce-desktop-cell-highlight");
-    if(cell_highlight) {
-        XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget);
-        gtk_widget_queue_draw_area(widget,
-                                   cell_highlight->x,
-                                   cell_highlight->y,
-                                   cell_highlight->width + 1,
-                                   cell_highlight->height + 1);
-        if(icon_view->priv->allow_overlapping_drops)
-            xfdesktop_icon_view_repaint_icons(icon_view, cell_highlight);
-    }
+    xfdesktop_icon_view_clear_drag_highlight(XFDESKTOP_ICON_VIEW(widget),
+                                             context);
 }
 
 
@@ -1131,7 +1176,6 @@
     guint16 old_row, old_col, row, col;
     GdkRectangle extents;
     XfdesktopIcon *icon_on_dest = NULL;
-    XfdesktopIconDragResult res;
     
     TRACE("entering: (%d,%d)", x, y);
     
@@ -1146,15 +1190,6 @@
     DBG("target=%d (%s)", (gint)target, gdk_atom_name(target));
     
     xfdesktop_xy_to_rowcol(icon_view, x, y, &row, &col);
-    if(row >= icon_view->priv->nrows || col >= icon_view->priv->ncols
-       || ((!icon_view->priv->allow_overlapping_drops
-            || !xfdesktop_icon_view_icon_in_cell(icon_view, row, col))
-           && !xfdesktop_grid_is_free_position(icon_view, row, col)))
-    {
-        gtk_drag_finish(context, FALSE, FALSE, time);
-        return FALSE;
-    }
-    
     icon_on_dest = xfdesktop_icon_view_icon_in_cell(icon_view, row, col);
     
     if(target == gdk_atom_intern("XFDESKTOP_ICON", FALSE)) {
@@ -1162,25 +1197,10 @@
         g_return_val_if_fail(icon, FALSE);
         
         if(icon_on_dest) {
-            res = xfdesktop_icon_do_drop_dest(icon_on_dest, icon,
-                                              context->suggested_action);
-            switch(res) {
-                case XFDESKTOP_ICON_DRAG_FAILED:
-                    xfdesktop_icon_view_clear_icon_extents(icon_view,
-                                                           icon_on_dest);
-                    gtk_drag_finish(context, FALSE, FALSE, time);
-                    return TRUE;
-                
-                case XFDESKTOP_ICON_DRAG_SUCCEEDED_NO_ACTION:
-                    xfdesktop_icon_view_clear_icon_extents(icon_view,
-                                                           icon_on_dest);
-                    gtk_drag_finish(context, TRUE, FALSE, time);
-                    return TRUE;
-                
-                case XFDESKTOP_ICON_DRAG_SUCCEEDED_MOVE_ICON:
-                    /* do the stuff below */
-                    break;
-            }
+            gboolean ret = xfdesktop_icon_do_drop_dest(icon_on_dest, icon,
+                                                       context->suggested_action);
+            gtk_drag_finish(context, ret, FALSE, time);
+            return ret;
         }
         
         /* clear out old position */
@@ -2224,7 +2244,12 @@
                                  guint16 row,
                                  guint16 col)
 {
-    gint idx = col * icon_view->priv->nrows + row;
+    gint idx;
+    
+    g_return_val_if_fail(row < icon_view->priv->nrows
+                         && col < icon_view->priv->ncols, NULL);
+    
+    idx = col * icon_view->priv->nrows + row;
     return xfdesktop_icon_view_icon_in_cell_raw(icon_view, idx);
 }
 
@@ -2652,23 +2677,6 @@
 }
 
 void
-xfdesktop_icon_view_set_allow_overlapping_drops(XfdesktopIconView *icon_view,
-                                                gboolean allow_overlap)
-{
-    g_return_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view));
-    
-    icon_view->priv->allow_overlapping_drops = allow_overlap;
-}
-
-gboolean
-xfdesktop_icon_view_get_allow_overlapping_drops(XfdesktopIconView *icon_view)
-{
-    g_return_val_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view), FALSE);
-    
-    return icon_view->priv->allow_overlapping_drops;
-}
-
-void
 xfdesktop_icon_view_enable_drag_source(XfdesktopIconView *icon_view,
                                        GdkModifierType start_button_mask,
                                        const GtkTargetEntry *targets,

Modified: xfdesktop/trunk/src/xfdesktop-icon-view.h
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon-view.h	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-icon-view.h	2006-11-04 08:55:15 UTC (rev 23627)
@@ -71,10 +71,6 @@
                                             GtkSelectionMode mode);
 GtkSelectionMode xfdesktop_icon_view_get_selection_mode(XfdesktopIconView *icon_view);
 
-void xfdesktop_icon_view_set_allow_overlapping_drops(XfdesktopIconView *icon_view,
-                                                     gboolean allow_overlap);
-gboolean xfdesktop_icon_view_get_allow_overlapping_drops(XfdesktopIconView *icon_view);
-
 void xfdesktop_icon_view_enable_drag_source(XfdesktopIconView *icon_view,
                                             GdkModifierType start_button_mask,
                                             const GtkTargetEntry *targets,

Modified: xfdesktop/trunk/src/xfdesktop-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -31,6 +31,8 @@
 
 #include "xfdesktop-icon.h"
 
+#define DEFAULT_ACTIONS  (GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK)
+
 struct _XfdesktopIconPrivate
 {
     gint16 row;
@@ -209,6 +211,7 @@
 
 
 
+/*< required >*/
 GdkPixbuf *
 xfdesktop_icon_peek_pixbuf(XfdesktopIcon *icon,
                            gint size)
@@ -221,6 +224,7 @@
     return klass->peek_pixbuf(icon, size);
 }
 
+/*< required >*/
 G_CONST_RETURN gchar *
 xfdesktop_icon_peek_label(XfdesktopIcon *icon)
 {
@@ -232,6 +236,20 @@
     return klass->peek_label(icon);
 }
 
+/*< optional >*/
+GdkDragAction
+xfdesktop_icon_get_allowed_drag_actions(XfdesktopIcon *icon)
+{
+    XfdesktopIconClass *klass = XFDESKTOP_ICON_GET_CLASS(icon);
+    
+    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
+    if(!klass->get_allowed_drag_actions)
+        return DEFAULT_ACTIONS;
+    
+    return klass->get_allowed_drag_actions(icon);
+}
+
+/*< required >*/
 gboolean
 xfdesktop_icon_is_drop_dest(XfdesktopIcon *icon)
 {
@@ -243,7 +261,21 @@
     return klass->is_drop_dest(icon);
 }
 
-XfdesktopIconDragResult
+/*< optional >*/
+GdkDragAction
+xfdesktop_icon_get_allowed_drop_actions(XfdesktopIcon *icon)
+{
+    XfdesktopIconClass *klass = XFDESKTOP_ICON_GET_CLASS(icon);
+    
+    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
+    if(!klass->get_allowed_drop_actions)
+        return DEFAULT_ACTIONS;
+    
+    return klass->get_allowed_drop_actions(icon);
+}
+
+/*< optional, required if is_drop_dest() can return TRUE >*/
+gboolean
 xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
                             XfdesktopIcon *src_icon,
                             GdkDragAction action)
@@ -256,6 +288,7 @@
     return klass->do_drop_dest(icon, src_icon, action);
 }
 
+/*< optional >*/
 G_CONST_RETURN gchar *
 xfdesktop_icon_peek_tooltip(XfdesktopIcon *icon)
 {
@@ -269,6 +302,7 @@
     return klass->peek_tooltip(icon);
 }
 
+/*< optional >*/
 GtkWidget *
 xfdesktop_icon_get_popup_menu(XfdesktopIcon *icon)
 {

Modified: xfdesktop/trunk/src/xfdesktop-icon.h
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon.h	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-icon.h	2006-11-04 08:55:15 UTC (rev 23627)
@@ -31,13 +31,6 @@
 #define XFDESKTOP_IS_ICON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), XFDESKTOP_TYPE_ICON))
 #define XFDESKTOP_ICON_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), XFDESKTOP_TYPE_ICON, XfdesktopIconClass))
 
-typedef enum
-{
-    XFDESKTOP_ICON_DRAG_FAILED = 0,
-    XFDESKTOP_ICON_DRAG_SUCCEEDED_MOVE_ICON,
-    XFDESKTOP_ICON_DRAG_SUCCEEDED_NO_ACTION,
-} XfdesktopIconDragResult;
-
 typedef struct _XfdesktopIcon        XfdesktopIcon;
 typedef struct _XfdesktopIconClass   XfdesktopIconClass;
 typedef struct _XfdesktopIconPrivate XfdesktopIconPrivate;
@@ -74,8 +67,11 @@
     GdkPixbuf *(*peek_pixbuf)(XfdesktopIcon *icon, gint size);
     G_CONST_RETURN gchar *(*peek_label)(XfdesktopIcon *icon);
     
+    GdkDragAction (*get_allowed_drag_actions)(XfdesktopIcon *icon);
+    
     gboolean (*is_drop_dest)(XfdesktopIcon *icon);
-    XfdesktopIconDragResult (*do_drop_dest)(XfdesktopIcon *icon, XfdesktopIcon *src_icon, GdkDragAction action);
+    GdkDragAction (*get_allowed_drop_actions)(XfdesktopIcon *icon);
+    gboolean (*do_drop_dest)(XfdesktopIcon *icon, XfdesktopIcon *src_icon, GdkDragAction action);
     
     G_CONST_RETURN gchar *(*peek_tooltip)(XfdesktopIcon *icon);
     
@@ -103,10 +99,13 @@
 gboolean xfdesktop_icon_get_extents(XfdesktopIcon *icon,
                                     GdkRectangle *extents);
 
+GdkDragAction xfdesktop_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
+
 gboolean xfdesktop_icon_is_drop_dest(XfdesktopIcon *icon);
-XfdesktopIconDragResult xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
-                                                    XfdesktopIcon *src_icon,
-                                                    GdkDragAction action);
+GdkDragAction xfdesktop_icon_get_allowed_drop_actions(XfdesktopIcon *icon);
+gboolean xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
+                                     XfdesktopIcon *src_icon,
+                                     GdkDragAction action);
 
 GtkWidget *xfdesktop_icon_get_popup_menu(XfdesktopIcon *icon);
 

Modified: xfdesktop/trunk/src/xfdesktop-regular-file-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-regular-file-icon.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-regular-file-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -71,9 +71,9 @@
 static G_CONST_RETURN gchar *xfdesktop_regular_file_icon_peek_label(XfdesktopIcon *icon);
 static G_CONST_RETURN gchar *xfdesktop_regular_file_icon_peek_tooltip(XfdesktopIcon *icon);
 static gboolean xfdesktop_regular_file_icon_is_drop_dest(XfdesktopIcon *icon);
-static XfdesktopIconDragResult xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
-                                                                        XfdesktopIcon *src_icon,
-                                                                        GdkDragAction action);
+static gboolean xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
+                                                         XfdesktopIcon *src_icon,
+                                                         GdkDragAction action);
 
 static G_CONST_RETURN ThunarVfsInfo *xfdesktop_regular_file_icon_peek_info(XfdesktopFileIcon *icon);
 static void xfdesktop_regular_file_icon_update_info(XfdesktopFileIcon *icon,
@@ -306,7 +306,7 @@
     g_object_unref(G_OBJECT(regular_file_icon));
 }
 
-static XfdesktopIconDragResult
+gboolean
 xfdesktop_regular_file_icon_do_drop_dest(XfdesktopIcon *icon,
                                          XfdesktopIcon *src_icon,
                                          GdkDragAction action)
@@ -317,14 +317,12 @@
     
     DBG("entering");
     
-    g_return_val_if_fail(regular_file_icon && src_file_icon,
-                         XFDESKTOP_ICON_DRAG_FAILED);
-    g_return_val_if_fail(xfdesktop_regular_file_icon_is_drop_dest(icon),
-                         XFDESKTOP_ICON_DRAG_FAILED);
+    g_return_val_if_fail(regular_file_icon && src_file_icon, FALSE);
+    g_return_val_if_fail(xfdesktop_regular_file_icon_is_drop_dest(icon), FALSE);
     
     src_info = xfdesktop_file_icon_peek_info(src_file_icon);
     if(!src_info)
-        return XFDESKTOP_ICON_DRAG_FAILED;
+        return FALSE;
     
     if(regular_file_icon->priv->info->flags & THUNAR_VFS_FILE_FLAGS_EXECUTABLE) {
         GList *path_list = g_list_prepend(NULL, src_info->path);
@@ -347,21 +345,21 @@
             g_free(primary);
             g_error_free(error);
             
-            return XFDESKTOP_ICON_DRAG_FAILED;
+            return FALSE;
         }
         
-        return XFDESKTOP_ICON_DRAG_SUCCEEDED_NO_ACTION;
+        return TRUE;
     } else {
         ThunarVfsJob *job = NULL;
         const gchar *name;
         ThunarVfsPath *dest_path;
         
         name = thunar_vfs_path_get_name(src_info->path);
-        g_return_val_if_fail(name, XFDESKTOP_ICON_DRAG_FAILED);
+        g_return_val_if_fail(name, FALSE);
         
         dest_path = thunar_vfs_path_relative(regular_file_icon->priv->info->path,
                                              name);
-        g_return_val_if_fail(dest_path, XFDESKTOP_ICON_DRAG_FAILED);
+        g_return_val_if_fail(dest_path, FALSE);
         
         switch(action) {
             case GDK_ACTION_MOVE:
@@ -417,12 +415,12 @@
                              G_CALLBACK(xfdesktop_regular_file_icon_drag_job_finished),
                              regular_file_icon);
             
-            return XFDESKTOP_ICON_DRAG_SUCCEEDED_NO_ACTION;
+            return TRUE;
         } else
-            return XFDESKTOP_ICON_DRAG_FAILED;
+            return FALSE;
     }
     
-    return XFDESKTOP_ICON_DRAG_FAILED;
+    return FALSE;
 }
 
 static G_CONST_RETURN gchar *

Modified: xfdesktop/trunk/src/xfdesktop-special-file-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-special-file-icon.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-special-file-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -73,9 +73,9 @@
 static G_CONST_RETURN gchar *xfdesktop_special_file_icon_peek_label(XfdesktopIcon *icon);
 static G_CONST_RETURN gchar *xfdesktop_special_file_icon_peek_tooltip(XfdesktopIcon *icon);
 static gboolean xfdesktop_special_file_icon_is_drop_dest(XfdesktopIcon *icon);
-static XfdesktopIconDragResult xfdesktop_special_file_icon_do_drop_dest(XfdesktopIcon *icon,
-                                                                        XfdesktopIcon *src_icon,
-                                                                        GdkDragAction action);
+static gboolean xfdesktop_special_file_icon_do_drop_dest(XfdesktopIcon *icon,
+                                                         XfdesktopIcon *src_icon,
+                                                         GdkDragAction action);
 static GtkWidget *xfdesktop_special_file_icon_get_popup_menu(XfdesktopIcon *icon);
 
 static G_CONST_RETURN ThunarVfsInfo *xfdesktop_special_file_icon_peek_info(XfdesktopFileIcon *icon);
@@ -317,7 +317,7 @@
     g_object_unref(G_OBJECT(special_file_icon));
 }
 
-static XfdesktopIconDragResult
+static gboolean
 xfdesktop_special_file_icon_do_drop_dest(XfdesktopIcon *icon,
                                          XfdesktopIcon *src_icon,
                                          GdkDragAction action)
@@ -332,20 +332,20 @@
     DBG("entering");
     
     g_return_val_if_fail(special_file_icon && src_file_icon,
-                         XFDESKTOP_ICON_DRAG_FAILED);
+                         FALSE);
     g_return_val_if_fail(xfdesktop_special_file_icon_is_drop_dest(icon),
-                         XFDESKTOP_ICON_DRAG_FAILED);
+                         FALSE);
     
     src_info = xfdesktop_file_icon_peek_info(src_file_icon);
     if(!src_info)
-        return XFDESKTOP_ICON_DRAG_FAILED;
+        return FALSE;
     
     name = thunar_vfs_path_get_name(src_info->path);
-    g_return_val_if_fail(name, XFDESKTOP_ICON_DRAG_FAILED);
+    g_return_val_if_fail(name, FALSE);
         
     dest_path = thunar_vfs_path_relative(special_file_icon->priv->info->path,
                                          name);
-    g_return_val_if_fail(dest_path, XFDESKTOP_ICON_DRAG_FAILED);
+    g_return_val_if_fail(dest_path, FALSE);
     
     if(special_file_icon->priv->type == XFDESKTOP_SPECIAL_FILE_ICON_TRASH)  {
         /* any drop to the trash is a move */
@@ -406,11 +406,11 @@
                          G_CALLBACK(xfdesktop_special_file_icon_drag_job_finished),
                          special_file_icon);
         
-        return XFDESKTOP_ICON_DRAG_SUCCEEDED_NO_ACTION;
+        return TRUE;
     } else
-        return XFDESKTOP_ICON_DRAG_FAILED;
+        return FALSE;
     
-    return XFDESKTOP_ICON_DRAG_FAILED;
+    return FALSE;
 }
 
 static G_CONST_RETURN gchar *

Modified: xfdesktop/trunk/src/xfdesktop-volume-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-volume-icon.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-volume-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -66,9 +66,9 @@
 static G_CONST_RETURN gchar *xfdesktop_volume_icon_peek_label(XfdesktopIcon *icon);
 static G_CONST_RETURN gchar *xfdesktop_volume_icon_peek_tooltip(XfdesktopIcon *icon);
 static gboolean xfdesktop_volume_icon_is_drop_dest(XfdesktopIcon *icon);
-static XfdesktopIconDragResult xfdesktop_volume_icon_do_drop_dest(XfdesktopIcon *icon,
-                                                                  XfdesktopIcon *src_icon,
-                                                                  GdkDragAction action);
+static gboolean xfdesktop_volume_icon_do_drop_dest(XfdesktopIcon *icon,
+                                                   XfdesktopIcon *src_icon,
+                                                   GdkDragAction action);
 static GtkWidget *xfdesktop_volume_icon_get_popup_menu(XfdesktopIcon *icon);
 
 static G_CONST_RETURN ThunarVfsInfo *xfdesktop_volume_icon_peek_info(XfdesktopFileIcon *icon);
@@ -272,7 +272,7 @@
     g_object_unref(G_OBJECT(volume_icon));
 }
 
-static XfdesktopIconDragResult
+static gboolean
 xfdesktop_volume_icon_do_drop_dest(XfdesktopIcon *icon,
                                  XfdesktopIcon *src_icon,
                                  GdkDragAction action)
@@ -287,20 +287,20 @@
     DBG("entering");
     
     g_return_val_if_fail(volume_icon && src_file_icon,
-                         XFDESKTOP_ICON_DRAG_FAILED);
+                         FALSE);
     g_return_val_if_fail(xfdesktop_volume_icon_is_drop_dest(icon),
-                         XFDESKTOP_ICON_DRAG_FAILED);
+                         FALSE);
     
     src_info = xfdesktop_file_icon_peek_info(src_file_icon);
     if(!src_info)
-        return XFDESKTOP_ICON_DRAG_FAILED;
+        return FALSE;
     
     name = thunar_vfs_path_get_name(src_info->path);
-    g_return_val_if_fail(name, XFDESKTOP_ICON_DRAG_FAILED);
+    g_return_val_if_fail(name, FALSE);
         
     dest_path = thunar_vfs_path_relative(volume_icon->priv->info->path,
                                          name);
-    g_return_val_if_fail(dest_path, XFDESKTOP_ICON_DRAG_FAILED);
+    g_return_val_if_fail(dest_path, FALSE);
     
     switch(action) {
         case GDK_ACTION_MOVE:
@@ -358,11 +358,11 @@
         
         g_object_ref(G_OBJECT(job));
         
-        return XFDESKTOP_ICON_DRAG_SUCCEEDED_NO_ACTION;
+        return TRUE;
     } else
-        return XFDESKTOP_ICON_DRAG_FAILED;
+        return FALSE;
     
-    return XFDESKTOP_ICON_DRAG_FAILED;
+    return FALSE;
 }
 
 static G_CONST_RETURN gchar *

Modified: xfdesktop/trunk/src/xfdesktop-window-icon-manager.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-window-icon-manager.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-window-icon-manager.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -514,7 +514,6 @@
     gint i;
     
     wmanager->priv->icon_view = icon_view;
-    xfdesktop_icon_view_set_allow_overlapping_drops(icon_view, FALSE);
     xfdesktop_icon_view_set_selection_mode(icon_view, GTK_SELECTION_SINGLE);
     g_signal_connect(G_OBJECT(icon_view), "icon-selected",
                      G_CALLBACK(xfdesktop_window_icon_manager_icon_selected_cb),

Modified: xfdesktop/trunk/src/xfdesktop-window-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-window-icon.c	2006-11-04 00:29:23 UTC (rev 23626)
+++ xfdesktop/trunk/src/xfdesktop-window-icon.c	2006-11-04 08:55:15 UTC (rev 23627)
@@ -48,12 +48,6 @@
                                                    gint size);
 static G_CONST_RETURN gchar *xfdesktop_window_icon_peek_label(XfdesktopIcon *icon);
 
-static gboolean xfdesktop_window_icon_is_drop_dest(XfdesktopIcon *icon);
-static XfdesktopIconDragResult xfdesktop_window_icon_do_drop_dest(XfdesktopIcon *icon,
-                                                                  XfdesktopIcon *src_icon,
-                                                                  GdkDragAction action);
-
-static void xfdesktop_window_icon_selected(XfdesktopIcon *icon);
 static gboolean xfdesktop_window_icon_activated(XfdesktopIcon *icon);
 static void xfdesktop_window_icon_menu_popup(XfdesktopIcon *icon);
 
@@ -78,9 +72,7 @@
     
     icon_class->peek_pixbuf = xfdesktop_window_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_window_icon_peek_label;
-    icon_class->is_drop_dest = xfdesktop_window_icon_is_drop_dest;
-    icon_class->do_drop_dest = xfdesktop_window_icon_do_drop_dest;
-    icon_class->selected = xfdesktop_window_icon_selected;
+    icon_class->is_drop_dest = (gboolean (*)(XfdesktopIcon *))gtk_false;
     icon_class->activated = xfdesktop_window_icon_activated;
     icon_class->menu_popup = xfdesktop_window_icon_menu_popup;
 }
@@ -156,43 +148,7 @@
 
 
 
-XfdesktopWindowIcon *
-xfdesktop_window_icon_new(NetkWindow *window,
-                          gint workspace)
-{
-    XfdesktopWindowIcon *icon = g_object_new(XFDESKTOP_TYPE_WINDOW_ICON, NULL);
-    gchar data_name[256];
-    gint row, col;
-    
-    icon->priv->window = window;
-    icon->priv->workspace = workspace;
-    
-    /* check for availability of old position (if any) */
-    g_snprintf(data_name, 256, "--xfdesktop-last-row-%d", workspace);
-    row = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(window),
-                                             data_name));
-    g_snprintf(data_name, 256, "--xfdesktop-last-col-%d", workspace);
-    col = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(window),
-                                             data_name));
-    if(row > 0 && col > 0)
-        xfdesktop_icon_set_position(XFDESKTOP_ICON(icon), row - 1, col - 1);
-    
-    g_signal_connect(G_OBJECT(window), "name-changed",
-                     G_CALLBACK(xfdesktop_window_name_changed_cb),
-                     icon);
-    g_signal_connect(G_OBJECT(window), "icon-changed",
-                     G_CALLBACK(xfdesktop_window_icon_changed_cb),
-                     icon);
-    
-    return icon;
-}
 
-gint
-xfdesktop_window_icon_get_workspace(XfdesktopWindowIcon *window_icon)
-{
-    g_return_val_if_fail(XFDESKTOP_IS_WINDOW_ICON(window_icon), -1);
-    return window_icon->priv->workspace;
-}
 
 static GdkPixbuf *
 xfdesktop_window_icon_peek_pixbuf(XfdesktopIcon *icon,
@@ -232,26 +188,6 @@
 }
 
 static gboolean
-xfdesktop_window_icon_is_drop_dest(XfdesktopIcon *icon)
-{
-    return FALSE;
-}
-
-static XfdesktopIconDragResult
-xfdesktop_window_icon_do_drop_dest(XfdesktopIcon *icon,
-                                   XfdesktopIcon *src_icon,
-                                   GdkDragAction action)
-{
-    return XFDESKTOP_ICON_DRAG_FAILED;
-}
-
-static void
-xfdesktop_window_icon_selected(XfdesktopIcon *icon)
-{
-    /* nada */
-}
-
-static gboolean
 xfdesktop_window_icon_activated(XfdesktopIcon *icon)
 {
     XfdesktopWindowIcon *window_icon = XFDESKTOP_WINDOW_ICON(icon);
@@ -261,7 +197,6 @@
     return TRUE;
 }
 
-
 static gboolean
 xfdesktop_action_menu_destroy_idled(gpointer data)
 {
@@ -295,3 +230,43 @@
     gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
                    3, gtk_get_current_event_time());
 }
+
+
+
+XfdesktopWindowIcon *
+xfdesktop_window_icon_new(NetkWindow *window,
+                          gint workspace)
+{
+    XfdesktopWindowIcon *icon = g_object_new(XFDESKTOP_TYPE_WINDOW_ICON, NULL);
+    gchar data_name[256];
+    gint row, col;
+    
+    icon->priv->window = window;
+    icon->priv->workspace = workspace;
+    
+    /* check for availability of old position (if any) */
+    g_snprintf(data_name, 256, "--xfdesktop-last-row-%d", workspace);
+    row = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(window),
+                                             data_name));
+    g_snprintf(data_name, 256, "--xfdesktop-last-col-%d", workspace);
+    col = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(window),
+                                             data_name));
+    if(row > 0 && col > 0)
+        xfdesktop_icon_set_position(XFDESKTOP_ICON(icon), row - 1, col - 1);
+    
+    g_signal_connect(G_OBJECT(window), "name-changed",
+                     G_CALLBACK(xfdesktop_window_name_changed_cb),
+                     icon);
+    g_signal_connect(G_OBJECT(window), "icon-changed",
+                     G_CALLBACK(xfdesktop_window_icon_changed_cb),
+                     icon);
+    
+    return icon;
+}
+
+gint
+xfdesktop_window_icon_get_workspace(XfdesktopWindowIcon *window_icon)
+{
+    g_return_val_if_fail(XFDESKTOP_IS_WINDOW_ICON(window_icon), -1);
+    return window_icon->priv->workspace;
+}



More information about the Xfce4-commits mailing list