Hi, I've implemented a feature I wanted to have in nautilus, that is
double-clicking on the Desktop background will show desktop (minimise all
opened windows).

The typical usecase is that I have some windows opened covering the desktop,
I want to access some icon in the desktop so I have to spot the minimise
button on each window and click it.. or go to the "show desktop" button on
the left-bottom of the panel.. but is quickier to double click in some
desktop space that is not covered by the opened windows.. Besides, I think
it's a natural behaviour to bring the desktop up-front when you double click
on it...

Hope you like the idea.

The patch is attached to this email and in
http://bugzilla.gnome.org/show_bug.cgi?id=361796
Index: src/file-manager/fm-desktop-icon-view.c
===================================================================
--- src/file-manager/fm-desktop-icon-view.c	(revisión: 14183)
+++ src/file-manager/fm-desktop-icon-view.c	(copia de trabajo)
@@ -64,6 +64,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <libwnck/screen.h>
 
 /* Timeout to check the desktop directory for updates */
 #define RESCAN_TIMEOUT 4000
@@ -350,6 +351,21 @@ fm_desktop_icon_view_handle_middle_click
 }
 
 static void
+fm_desktop_icon_view_handle_double_click (NautilusIconContainer *icon_container,
+					  GdkEventButton *event,
+					  FMDesktopIconView *desktop_icon_view)
+{
+	GdkScreen       *screen;
+	WnckScreen *wnck_screen;
+	
+	screen = gtk_widget_get_screen (GTK_WIDGET (icon_container));
+	wnck_screen = wnck_screen_get (gdk_screen_get_number (screen));
+	if (wnck_screen != NULL) {
+		wnck_screen_toggle_showing_desktop (wnck_screen, TRUE);
+	}
+}
+
+static void
 unrealized_callback (GtkWidget *widget, FMDesktopIconView *desktop_icon_view)
 {
 	g_return_if_fail (desktop_icon_view->details->root_window != NULL);
@@ -571,6 +587,8 @@ fm_desktop_icon_view_init (FMDesktopIcon
 
 	g_signal_connect_object (icon_container, "middle_click",
 				 G_CALLBACK (fm_desktop_icon_view_handle_middle_click), desktop_icon_view, 0);
+	g_signal_connect_object (icon_container, "dbl_click",
+				 G_CALLBACK (fm_desktop_icon_view_handle_double_click), desktop_icon_view, 0);
 	g_signal_connect_object (desktop_icon_view, "realize",
 				 G_CALLBACK (realized_callback), desktop_icon_view, 0);
 	g_signal_connect_object (desktop_icon_view, "unrealize",
Index: configure.in
===================================================================
--- configure.in	(revisión: 14183)
+++ configure.in	(copia de trabajo)
@@ -20,6 +20,7 @@ m4_define(beagle_minver,               0
 m4_define(tracker_minver,              0.0.1)
 m4_define(exempi_minver,               1.99.2)
 m4_define(exempi_minver_newapi,        1.99.5)
+m4_define(wnck_minver,                 1.99.5)
 
 dnl 1. If the library code has changed at all since last release, then increment revision.
 dnl 2. If any interfaces have been added, then increment current and set revision to 0.
@@ -52,6 +53,7 @@ AC_SUBST(GTK_REQUIRED, [gtk_minver])
 AC_SUBST(RSVG_REQUIRED, [rsvg_minver])
 AC_SUBST(XML_REQUIRED, [xml_minver])
 AC_SUBST(STARTUP_NOTIFICATION_REQUIRED, [startup_notification_minver])
+AC_SUBST(WNCK_REQUIRED, [wnck_minver])
 
 dnl We need to decrement current by one in the calculation of the age because
 dnl the library was started with version "1:0:0" instead of "0:0:0"
@@ -99,6 +101,7 @@ PKG_CHECK_MODULES(ALL, [
 	libgnomeui-2.0		>= gnome_ui_minver
 	librsvg-2.0		>= rsvg_minver
 	libxml-2.0		>= xml_minver
+	libwnck-1.0		>= wnck_minver
 	$STARTUP_NOTIFICATION_PACKAGE
 ])
 dnl ==========================================================================
@@ -399,7 +402,7 @@ LIBNAUTILUS_EXTENSION_LIBS="`$PKG_CONFIG
 AC_SUBST(LIBNAUTILUS_EXTENSION_LIBS)
 
 dnl core nautilus (must list bonobo-activation and libbonobo because idldir does not respect "requires")
-CORE_MODULES="glib-2.0 eel-2.0 librsvg-2.0 bonobo-activation-2.0 libbonobo-2.0 gnome-desktop-2.0 gio-2.0 gio-unix-2.0 $EXTRA_CORE_MODULES"
+CORE_MODULES="glib-2.0 eel-2.0 librsvg-2.0 bonobo-activation-2.0 libbonobo-2.0 gnome-desktop-2.0 gio-2.0 gio-unix-2.0 libwnck-1.0 $EXTRA_CORE_MODULES"
 CORE_CFLAGS="`$PKG_CONFIG --cflags $CORE_MODULES` $x_cflags $WARNING_CFLAGS"
 AC_SUBST(CORE_CFLAGS)
 CORE_LIBS="`$PKG_CONFIG --libs $CORE_MODULES` $x_libs"
Index: libnautilus-private/nautilus-icon-container.c
===================================================================
--- libnautilus-private/nautilus-icon-container.c	(revisión: 14183)
+++ libnautilus-private/nautilus-icon-container.c	(copia de trabajo)
@@ -241,6 +241,7 @@ enum {
 	CONTEXT_CLICK_BACKGROUND,
 	CONTEXT_CLICK_SELECTION,
 	MIDDLE_CLICK,
+	DBL_CLICK,
 	GET_CONTAINER_URI,
 	GET_ICON_URI,
 	GET_ICON_DROP_TARGET_URI,
@@ -3672,10 +3673,11 @@ button_press_event (GtkWidget *widget,
 		return TRUE;
 	}
 
-	/* An item didn't take the press, so it's a background press.
-         * We ignore double clicks on the desktop for now.
-	 */
+	/* An item didn't take the press, so it's a background press.*/
+
 	if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) {
+		/* Double click on desktop background */
+		g_signal_emit (widget, signals[DBL_CLICK], 0, event);
 		return TRUE;
 	}
 
@@ -5045,6 +5047,16 @@ nautilus_icon_container_class_init (Naut
 		                g_cclosure_marshal_VOID__POINTER,
 		                G_TYPE_NONE, 1,
 				G_TYPE_POINTER);
+	signals[DBL_CLICK]
+		= g_signal_new ("dbl_click",
+		                G_TYPE_FROM_CLASS (class),
+		                G_SIGNAL_RUN_LAST,
+		                G_STRUCT_OFFSET (NautilusIconContainerClass,
+						 dbl_click),
+		                NULL, NULL,
+		                g_cclosure_marshal_VOID__POINTER,
+		                G_TYPE_NONE, 1,
+				G_TYPE_POINTER);
 	signals[ICON_POSITION_CHANGED]
 		= g_signal_new ("icon_position_changed",
 		                G_TYPE_FROM_CLASS (class),
Index: libnautilus-private/nautilus-icon-container.h
===================================================================
--- libnautilus-private/nautilus-icon-container.h	(revisión: 14183)
+++ libnautilus-private/nautilus-icon-container.h	(copia de trabajo)
@@ -85,6 +85,8 @@ typedef struct {
 						   GdkEventButton *event);
 	void         (* middle_click) 		  (NautilusIconContainer *container,
 						   GdkEventButton *event);
+	void         (* dbl_click) 		  (NautilusIconContainer *container,
+						   GdkEventButton *event);
 
 	/* Operations on icons. */
 	void         (* activate)	  	  (NautilusIconContainer *container,
--
nautilus-list mailing list
nautilus-list@gnome.org
http://mail.gnome.org/mailman/listinfo/nautilus-list

Reply via email to