[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