summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Cisler <pavel@eazel.com>2000-07-06 03:14:35 +0000
committerPavel Cisler <pce@src.gnome.org>2000-07-06 03:14:35 +0000
commitc4f886f820f82d1aa165a92c61850e3448358287 (patch)
tree9aa7c4c8bb866bd711f436797cd09cb33e84b741
parent00e2f4e2fcac845ea9be52741b8931064b3948ef (diff)
downloadnautilus-c4f886f820f82d1aa165a92c61850e3448358287.tar.gz
Fixed 1095 - need to draw dragged icon when dragging from list view.
2000-07-05 Pavel Cisler <pavel@eazel.com> * libnautilus-extensions/nautilus-list.c: (nautilus_list_initialize_class), (nautilus_list_button_press), (nautilus_list_button_release), (nautilus_list_drag_start): * libnautilus-extensions/nautilus-list.h: * src/file-manager/fm-list-view.c: (fm_list_drag_data_get), (fm_list_get_drag_pixmap), (create_list): Fixed 1095 - need to draw dragged icon when dragging from list view. * libnautilus-extensions/nautilus-gtk-extensions.c: * libnautilus-extensions/nautilus-gtk-extensions.h: (nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER): I swore the next time I need a new marshaling function, I'll set Nautilus to auto-generate them like the gtk build and here I am adding another one manually.
-rw-r--r--ChangeLog17
-rw-r--r--libnautilus-extensions/nautilus-gtk-extensions.c15
-rw-r--r--libnautilus-extensions/nautilus-gtk-extensions.h4
-rw-r--r--libnautilus-extensions/nautilus-list.c35
-rw-r--r--libnautilus-extensions/nautilus-list.h6
-rw-r--r--libnautilus-private/nautilus-gtk-extensions.c15
-rw-r--r--libnautilus-private/nautilus-gtk-extensions.h4
-rw-r--r--libnautilus-private/nautilus-list.c35
-rw-r--r--libnautilus-private/nautilus-list.h6
-rw-r--r--src/file-manager/fm-list-view.c29
10 files changed, 135 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index f108cd99c..0b91cbc97 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2000-07-05 Pavel Cisler <pavel@eazel.com>
+
+ * libnautilus-extensions/nautilus-list.c:
+ (nautilus_list_initialize_class), (nautilus_list_button_press),
+ (nautilus_list_button_release), (nautilus_list_drag_start):
+ * libnautilus-extensions/nautilus-list.h:
+ * src/file-manager/fm-list-view.c: (fm_list_drag_data_get),
+ (fm_list_get_drag_pixmap), (create_list):
+ Fixed 1095 - need to draw dragged icon when dragging from list view.
+
+ * libnautilus-extensions/nautilus-gtk-extensions.c:
+ * libnautilus-extensions/nautilus-gtk-extensions.h:
+ (nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER):
+ I swore the next time I need a new marshaling function, I'll
+ set Nautilus to auto-generate them like the gtk build and here
+ I am adding another one manually.
+
2000-07-05 Maciej Stachowiak <mjs@eazel.com>
* libnautilus-extensions/nautilus-search-async.c: include
diff --git a/libnautilus-extensions/nautilus-gtk-extensions.c b/libnautilus-extensions/nautilus-gtk-extensions.c
index 2fbe550c6..caba512b2 100644
--- a/libnautilus-extensions/nautilus-gtk-extensions.c
+++ b/libnautilus-extensions/nautilus-gtk-extensions.c
@@ -453,6 +453,21 @@ nautilus_gtk_marshal_NONE__POINTER_INT_INT_INT (GtkObject *object,
func_data);
}
+void
+nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER (GtkObject *object,
+ GtkSignalFunc func,
+ gpointer func_data,
+ GtkArg *args)
+{
+ (* (void (*)(GtkObject *, gpointer, int, gpointer, gpointer, gpointer)) func)
+ (object,
+ GTK_VALUE_POINTER (args[0]),
+ GTK_VALUE_INT (args[1]),
+ GTK_VALUE_POINTER (args[2]),
+ GTK_VALUE_POINTER (args[3]),
+ func_data);
+}
+
void
nautilus_gtk_marshal_NONE__POINTER_POINTER_INT_INT_INT (GtkObject *object,
GtkSignalFunc func,
diff --git a/libnautilus-extensions/nautilus-gtk-extensions.h b/libnautilus-extensions/nautilus-gtk-extensions.h
index 9182a8ada..367d58e6e 100644
--- a/libnautilus-extensions/nautilus-gtk-extensions.h
+++ b/libnautilus-extensions/nautilus-gtk-extensions.h
@@ -155,6 +155,10 @@ void nautilus_gtk_marshal_NONE__POINTER_POINTER_POINTER
GtkSignalFunc func,
gpointer func_data,
GtkArg *args);
+void nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER (GtkObject *object,
+ GtkSignalFunc func,
+ gpointer func_data,
+ GtkArg *args);
void nautilus_gtk_marshal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,
diff --git a/libnautilus-extensions/nautilus-list.c b/libnautilus-extensions/nautilus-list.c
index f47f030aa..f9fa1121a 100644
--- a/libnautilus-extensions/nautilus-list.c
+++ b/libnautilus-extensions/nautilus-list.c
@@ -85,6 +85,7 @@ struct NautilusListDetails
/* Drag state */
NautilusDragInfo *drag_info;
gboolean drag_started;
+ int clicked_row;
/* Delayed selection information */
int dnd_select_pending;
@@ -159,6 +160,7 @@ enum {
SELECT_PREVIOUS_NAME,
SELECT_NEXT_NAME,
HANDLE_DROPPED_ICONS,
+ GET_DRAG_PIXMAP,
LAST_SIGNAL
};
@@ -354,6 +356,17 @@ nautilus_list_initialize_class (NautilusListClass *klass)
GTK_TYPE_INT,
GTK_TYPE_INT,
GTK_TYPE_INT);
+ list_signals[GET_DRAG_PIXMAP] =
+ gtk_signal_new ("get_drag_pixmap",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusListClass, get_drag_pixmap),
+ nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER,
+ GTK_TYPE_NONE, 4,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_INT,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_POINTER);
gtk_object_class_add_signals (object_class, list_signals, LAST_SIGNAL);
@@ -740,7 +753,8 @@ nautilus_list_button_press (GtkWidget *widget, GdkEventButton *event)
on_row = gtk_clist_get_selection_info (clist, event->x, event->y, &row_index, &column_index);
list->details->button_down_time = event->time;
list->details->drag_started = FALSE;
-
+ list->details->clicked_row = -1;
+
switch (event->type) {
case GDK_BUTTON_PRESS:
if (event->button == 1 || event->button == 2) {
@@ -771,6 +785,7 @@ nautilus_list_button_press (GtkWidget *widget, GdkEventButton *event)
if (!list->details->dnd_select_pending) {
select_row_from_mouse (list, row_index, event->state);
+ list->details->clicked_row = row_index;
}
} else {
gtk_clist_unselect_all (clist);
@@ -855,6 +870,7 @@ nautilus_list_button_release (GtkWidget *widget, GdkEventButton *event)
list->details->dnd_press_x = 0;
list->details->dnd_press_y = 0;
list->details->drag_started = TRUE;
+ list->details->clicked_row = -1;
if (on_row) {
/* Clean up after abortive drag-and-drop attempt (since user can't
@@ -2107,11 +2123,6 @@ nautilus_list_resize_column (GtkCList *clist, int column_index, int width)
}
/* Macros borrowed from gtkclist.c */
-/* returns the GList item for the nth row */
-#define ROW_ELEMENT(clist, row) (((row) == (clist)->rows - 1) ? \
- (clist)->row_list_end : \
- g_list_nth ((clist)->row_list, (row)))
-
#define GTK_CLIST_CLASS_FW(_widget_) GTK_CLIST_CLASS (((GtkObject*) (_widget_))->klass)
@@ -2288,15 +2299,12 @@ nautilus_list_drag_start (GtkWidget *widget, GdkEventMotion *event)
{
NautilusList *list;
GdkDragContext *context;
- GdkPixbuf *pixbuf;
GdkPixmap *pixmap_for_dragged_file;
GdkBitmap *mask_for_dragged_file;
int x_offset, y_offset;
g_return_if_fail (NAUTILUS_IS_LIST (widget));
list = NAUTILUS_LIST (widget);
-
- pixbuf = NULL;
list->details->drag_started = TRUE;
list->details->dnd_select_pending = FALSE;
@@ -2308,12 +2316,11 @@ nautilus_list_drag_start (GtkWidget *widget, GdkEventMotion *event)
x_offset = 10;
y_offset = 10;
- if (pixbuf) {
- gdk_pixbuf_render_pixmap_and_mask (pixbuf,
- &pixmap_for_dragged_file,
- &mask_for_dragged_file,
- 2);
+ gtk_signal_emit (GTK_OBJECT (list), list_signals[GET_DRAG_PIXMAP],
+ list->details->clicked_row, &pixmap_for_dragged_file,
+ &mask_for_dragged_file);
+ if (pixmap_for_dragged_file) {
/* set the pixmap and mask for dragging */
gtk_drag_set_icon_pixmap (context,
gtk_widget_get_colormap (widget),
diff --git a/libnautilus-extensions/nautilus-list.h b/libnautilus-extensions/nautilus-list.h
index 9a3d7c8fd..5d9152d7f 100644
--- a/libnautilus-extensions/nautilus-list.h
+++ b/libnautilus-extensions/nautilus-list.h
@@ -56,6 +56,11 @@ typedef enum
#define NAUTILUS_CELL_PIXBUF_LIST(cell) ((NautilusCellPixbufList *) &(cell))
/* no #define for NAUTILUS_CELL_LINK_TEXT, use GTK_CELL_TEXT instead */
+/* returns the GList item for the nth row */
+#define ROW_ELEMENT(clist, row) (((row) == (clist)->rows - 1) ? \
+ (clist)->row_list_end : \
+ g_list_nth ((clist)->row_list, (row)))
+
typedef struct NautilusCellPixbufList NautilusCellPixbufList;
/* no struct for NautilusCellLinkText, use GtkCellText instead */
@@ -113,6 +118,7 @@ struct NautilusListClass {
void (* select_previous_name) (GtkWidget *widget);
void (* select_next_name) (GtkWidget *widget);
void (* handle_dropped_icons) (GtkWidget *widget, GList *icons, int x, int y, int action);
+ void (* get_drag_pixmap) (GtkWidget *widget, int row_index, GdkPixmap **pixmap, GdkBitmap **mask);
};
typedef gboolean (* NautilusEachRowFunction) (GtkCListRow *, gpointer);
diff --git a/libnautilus-private/nautilus-gtk-extensions.c b/libnautilus-private/nautilus-gtk-extensions.c
index 2fbe550c6..caba512b2 100644
--- a/libnautilus-private/nautilus-gtk-extensions.c
+++ b/libnautilus-private/nautilus-gtk-extensions.c
@@ -453,6 +453,21 @@ nautilus_gtk_marshal_NONE__POINTER_INT_INT_INT (GtkObject *object,
func_data);
}
+void
+nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER (GtkObject *object,
+ GtkSignalFunc func,
+ gpointer func_data,
+ GtkArg *args)
+{
+ (* (void (*)(GtkObject *, gpointer, int, gpointer, gpointer, gpointer)) func)
+ (object,
+ GTK_VALUE_POINTER (args[0]),
+ GTK_VALUE_INT (args[1]),
+ GTK_VALUE_POINTER (args[2]),
+ GTK_VALUE_POINTER (args[3]),
+ func_data);
+}
+
void
nautilus_gtk_marshal_NONE__POINTER_POINTER_INT_INT_INT (GtkObject *object,
GtkSignalFunc func,
diff --git a/libnautilus-private/nautilus-gtk-extensions.h b/libnautilus-private/nautilus-gtk-extensions.h
index 9182a8ada..367d58e6e 100644
--- a/libnautilus-private/nautilus-gtk-extensions.h
+++ b/libnautilus-private/nautilus-gtk-extensions.h
@@ -155,6 +155,10 @@ void nautilus_gtk_marshal_NONE__POINTER_POINTER_POINTER
GtkSignalFunc func,
gpointer func_data,
GtkArg *args);
+void nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER (GtkObject *object,
+ GtkSignalFunc func,
+ gpointer func_data,
+ GtkArg *args);
void nautilus_gtk_marshal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,
diff --git a/libnautilus-private/nautilus-list.c b/libnautilus-private/nautilus-list.c
index f47f030aa..f9fa1121a 100644
--- a/libnautilus-private/nautilus-list.c
+++ b/libnautilus-private/nautilus-list.c
@@ -85,6 +85,7 @@ struct NautilusListDetails
/* Drag state */
NautilusDragInfo *drag_info;
gboolean drag_started;
+ int clicked_row;
/* Delayed selection information */
int dnd_select_pending;
@@ -159,6 +160,7 @@ enum {
SELECT_PREVIOUS_NAME,
SELECT_NEXT_NAME,
HANDLE_DROPPED_ICONS,
+ GET_DRAG_PIXMAP,
LAST_SIGNAL
};
@@ -354,6 +356,17 @@ nautilus_list_initialize_class (NautilusListClass *klass)
GTK_TYPE_INT,
GTK_TYPE_INT,
GTK_TYPE_INT);
+ list_signals[GET_DRAG_PIXMAP] =
+ gtk_signal_new ("get_drag_pixmap",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (NautilusListClass, get_drag_pixmap),
+ nautilus_gtk_marshal_NONE__POINTER_INT_POINTER_POINTER,
+ GTK_TYPE_NONE, 4,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_INT,
+ GTK_TYPE_POINTER,
+ GTK_TYPE_POINTER);
gtk_object_class_add_signals (object_class, list_signals, LAST_SIGNAL);
@@ -740,7 +753,8 @@ nautilus_list_button_press (GtkWidget *widget, GdkEventButton *event)
on_row = gtk_clist_get_selection_info (clist, event->x, event->y, &row_index, &column_index);
list->details->button_down_time = event->time;
list->details->drag_started = FALSE;
-
+ list->details->clicked_row = -1;
+
switch (event->type) {
case GDK_BUTTON_PRESS:
if (event->button == 1 || event->button == 2) {
@@ -771,6 +785,7 @@ nautilus_list_button_press (GtkWidget *widget, GdkEventButton *event)
if (!list->details->dnd_select_pending) {
select_row_from_mouse (list, row_index, event->state);
+ list->details->clicked_row = row_index;
}
} else {
gtk_clist_unselect_all (clist);
@@ -855,6 +870,7 @@ nautilus_list_button_release (GtkWidget *widget, GdkEventButton *event)
list->details->dnd_press_x = 0;
list->details->dnd_press_y = 0;
list->details->drag_started = TRUE;
+ list->details->clicked_row = -1;
if (on_row) {
/* Clean up after abortive drag-and-drop attempt (since user can't
@@ -2107,11 +2123,6 @@ nautilus_list_resize_column (GtkCList *clist, int column_index, int width)
}
/* Macros borrowed from gtkclist.c */
-/* returns the GList item for the nth row */
-#define ROW_ELEMENT(clist, row) (((row) == (clist)->rows - 1) ? \
- (clist)->row_list_end : \
- g_list_nth ((clist)->row_list, (row)))
-
#define GTK_CLIST_CLASS_FW(_widget_) GTK_CLIST_CLASS (((GtkObject*) (_widget_))->klass)
@@ -2288,15 +2299,12 @@ nautilus_list_drag_start (GtkWidget *widget, GdkEventMotion *event)
{
NautilusList *list;
GdkDragContext *context;
- GdkPixbuf *pixbuf;
GdkPixmap *pixmap_for_dragged_file;
GdkBitmap *mask_for_dragged_file;
int x_offset, y_offset;
g_return_if_fail (NAUTILUS_IS_LIST (widget));
list = NAUTILUS_LIST (widget);
-
- pixbuf = NULL;
list->details->drag_started = TRUE;
list->details->dnd_select_pending = FALSE;
@@ -2308,12 +2316,11 @@ nautilus_list_drag_start (GtkWidget *widget, GdkEventMotion *event)
x_offset = 10;
y_offset = 10;
- if (pixbuf) {
- gdk_pixbuf_render_pixmap_and_mask (pixbuf,
- &pixmap_for_dragged_file,
- &mask_for_dragged_file,
- 2);
+ gtk_signal_emit (GTK_OBJECT (list), list_signals[GET_DRAG_PIXMAP],
+ list->details->clicked_row, &pixmap_for_dragged_file,
+ &mask_for_dragged_file);
+ if (pixmap_for_dragged_file) {
/* set the pixmap and mask for dragging */
gtk_drag_set_icon_pixmap (context,
gtk_widget_get_colormap (widget),
diff --git a/libnautilus-private/nautilus-list.h b/libnautilus-private/nautilus-list.h
index 9a3d7c8fd..5d9152d7f 100644
--- a/libnautilus-private/nautilus-list.h
+++ b/libnautilus-private/nautilus-list.h
@@ -56,6 +56,11 @@ typedef enum
#define NAUTILUS_CELL_PIXBUF_LIST(cell) ((NautilusCellPixbufList *) &(cell))
/* no #define for NAUTILUS_CELL_LINK_TEXT, use GTK_CELL_TEXT instead */
+/* returns the GList item for the nth row */
+#define ROW_ELEMENT(clist, row) (((row) == (clist)->rows - 1) ? \
+ (clist)->row_list_end : \
+ g_list_nth ((clist)->row_list, (row)))
+
typedef struct NautilusCellPixbufList NautilusCellPixbufList;
/* no struct for NautilusCellLinkText, use GtkCellText instead */
@@ -113,6 +118,7 @@ struct NautilusListClass {
void (* select_previous_name) (GtkWidget *widget);
void (* select_next_name) (GtkWidget *widget);
void (* handle_dropped_icons) (GtkWidget *widget, GList *icons, int x, int y, int action);
+ void (* get_drag_pixmap) (GtkWidget *widget, int row_index, GdkPixmap **pixmap, GdkBitmap **mask);
};
typedef gboolean (* NautilusEachRowFunction) (GtkCListRow *, gpointer);
diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c
index 7497777d1..2c1118347 100644
--- a/src/file-manager/fm-list-view.c
+++ b/src/file-manager/fm-list-view.c
@@ -610,8 +610,8 @@ each_icon_get_data_binder (NautilusDragEachSelectedItemDataGet iteratee,
static void
fm_list_drag_data_get (GtkWidget *widget, GdkDragContext *context,
- GtkSelectionData *selection_data, guint info, guint time,
- FMListView *list_view)
+ GtkSelectionData *selection_data, guint info, guint time,
+ FMListView *list_view)
{
g_assert (widget != NULL);
g_assert (NAUTILUS_IS_LIST (widget));
@@ -626,6 +626,26 @@ fm_list_drag_data_get (GtkWidget *widget, GdkDragContext *context,
}
static void
+fm_list_get_drag_pixmap (GtkWidget *widget, int row_index, GdkPixmap **pixmap,
+ GdkBitmap **mask, FMListView *list_view)
+{
+ GtkCList *clist;
+ GtkCListRow *row;
+
+ g_assert (widget != NULL);
+ g_assert (NAUTILUS_IS_LIST (widget));
+
+ clist = GTK_CLIST (widget);
+ row = ROW_ELEMENT (clist, row_index)->data;
+
+ g_assert (row != NULL);
+
+ *pixmap = GTK_CELL_PIXMAP (row->cell[LIST_VIEW_COLUMN_ICON])->pixmap;
+ *mask = GTK_CELL_PIXMAP (row->cell[LIST_VIEW_COLUMN_ICON])->mask;
+
+}
+
+static void
create_list (FMListView *list_view)
{
NautilusList *list;
@@ -754,7 +774,10 @@ create_list (FMListView *list_view)
"drag_data_get",
fm_list_drag_data_get,
list_view);
-
+ gtk_signal_connect (GTK_OBJECT (list),
+ "get_drag_pixmap",
+ fm_list_get_drag_pixmap,
+ list_view);
gtk_container_add (GTK_CONTAINER (list_view), GTK_WIDGET (list));