The attached patch was also attached to bug 44001 [1] which demands for spring-loaded folders. Since there is not yet a clear patent policy, I think it's safe to get this non-patent infridging partial implementation into Nautilus, which opens folders in the icon view that are hovered for more than 500 ms. To my understanding, the essence of the spring-loaded folder patent is the auto popdown. [1] http://bugzilla.gnome.org/show_bug.cgi?id=44001 -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-icon-dnd.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-icon-dnd.c,v retrieving revision 1.149 diff -u -p -r1.149 nautilus-icon-dnd.c --- libnautilus-private/nautilus-icon-dnd.c 29 Aug 2005 10:00:29 -0000 1.149 +++ libnautilus-private/nautilus-icon-dnd.c 1 Sep 2005 09:25:07 -0000 @@ -84,6 +84,8 @@ static void dnd_highlight_queue_redr static GtkTargetList *drop_types_list = NULL; static GtkTargetList *drop_types_list_root = NULL; +#define DROP_TARGET_ACTIVATION_TIMEOUT 500 + static EelCanvasItem * create_selection_shadow (NautilusIconContainer *container, GList *list) @@ -1082,6 +1084,43 @@ nautilus_icon_container_receive_dropped_ } static void +unschedule_drop_target_activation (NautilusIconContainer *container) +{ + if (container->details->drop_target_activate_id != 0) { + g_source_remove (container->details->drop_target_activate_id); + container->details->drop_target_activate_id = 0; + } +} + +static gboolean +drop_target_activate (NautilusIconContainer *container) +{ + GList list; + + unschedule_drop_target_activation (container); + + if (container->details->drop_target != NULL) { + list.prev = list.next = NULL; + list.data = container->details->drop_target->data; + + g_signal_emit_by_name (container, "activate", &list); + } + + return FALSE; +} + +static void +schedule_drop_target_activation (NautilusIconContainer *container) +{ + if (container->details->drop_target_activate_id == 0) { + container->details->drop_target_activate_id = + g_timeout_add (DROP_TARGET_ACTIVATION_TIMEOUT, + (GSourceFunc) drop_target_activate, + container); + } +} + +static void nautilus_icon_container_get_drop_action (NautilusIconContainer *container, GdkDragContext *context, int x, int y, @@ -1165,6 +1204,12 @@ set_drop_target (NautilusIconContainer * container->details->drop_target = icon; nautilus_icon_container_update_icon (container, old_icon); nautilus_icon_container_update_icon (container, icon); + + unschedule_drop_target_activation (container); + + if (icon != NULL) { + schedule_drop_target_activation (container); + } } static void
Attachment:
signature.asc
Description: This is a digitally signed message part