diff -up --from-file orig/ orig/totem.c ./totem.c
--- orig/totem.c	2006-12-03 12:07:15.000000000 +0100
+++ ./totem.c	2006-12-03 14:15:13.000000000 +0100
@@ -48,7 +48,9 @@
 #include <X11/XF86keysym.h>
 #endif
 #endif
-
+#include <math.h>
+#include <sys/time.h>
+ 
 #include "bacon-video-widget.h"
 #include "bacon-video-widget-properties.h"
 #include "totem-statusbar.h"
@@ -83,6 +85,13 @@
 #define ZOOM_LOWER 10
 
 #define FULLSCREEN_POPUP_TIMEOUT 5 * 1000
+/* Distance the cursor needs to be moved for the controls to pop up */
+#define FULLSCREEN_POPUP_MOVEMENT_REQUIRED 15  /* percentage of screen width */
+/* Minimum number of milliseconds the cursor needs to have been moved for the controls to pop up */
+#define FULLSCREEN_POPUP_MOVEMENT_TIME_REQUIRED 250  /* milliseconds */
+/* Not moving the mouse in this amount of time resets the movement counter */
+#define FULLSCREEN_POPUP_MOVEMENT_TIMEOUT 1 * 1000     /* milliseconds */
+
 
 #define BVW_VBOX_BORDER_WIDTH 1
 
@@ -2281,6 +2290,8 @@ on_video_motion_notify_event (GtkWidget 
 		Totem *totem)
 {
 	GtkWidget *item;
+	gboolean show_controls = FALSE;
+	int movement_required;
 
 	if (totem_is_fullscreen (totem) == FALSE) 
 		return FALSE;
@@ -2289,20 +2300,61 @@ on_video_motion_notify_event (GtkWidget 
 		return FALSE;
 
 	totem->popup_in_progress = TRUE;
+	
+	
+	/* Wheel events propagate here with a NULL event variable */
+	if(event == NULL)
+		show_controls = TRUE;
+	else
+	{
+		struct timeval now;
+		gettimeofday(&now, NULL);
+		/* Timeout? Then reset the distance moved... */
+		if ( time_diff_msec(now, totem->fullscreen_movement->last_movement_time) > FULLSCREEN_POPUP_MOVEMENT_TIMEOUT)
+		{
+			gettimeofday(&(totem->fullscreen_movement->movement_init_time), NULL);
+	 		totem->fullscreen_movement->total_movement = 0;	 	
+			totem->fullscreen_movement->last_x = event->x;
+			totem->fullscreen_movement->last_y = event->y;
+		}
 
-	popup_timeout_remove (totem);
+		/* Calculate cursors distance since last event */
+		totem->fullscreen_movement->total_movement += \
+			(int) sqrt( pow(event->x - totem->fullscreen_movement->last_x, 2) + 
+				    pow(event->y - totem->fullscreen_movement->last_y,2));
+		
+		movement_required = (int)(totem->fullscreen_rect.width * 
+					  (FULLSCREEN_POPUP_MOVEMENT_REQUIRED / (double)100));
+
+		/* Enough distance travelled in a required amount of time? */
+		if(totem->fullscreen_movement->total_movement > movement_required  
+		         && time_diff_msec(now, totem->fullscreen_movement->movement_init_time) > FULLSCREEN_POPUP_MOVEMENT_TIME_REQUIRED)
+		{
+			show_controls = TRUE;
+		}
+		
+		gettimeofday(&(totem->fullscreen_movement->last_movement_time), NULL);
+		totem->fullscreen_movement->last_x = event->x;
+		totem->fullscreen_movement->last_y = event->y;
+	}
 
-	item = glade_xml_get_widget (totem->xml, "tcw_hbox");
-	gtk_widget_show_all (item);
-	gdk_flush ();
+	if(show_controls == TRUE)
+	{
+		popup_timeout_remove (totem);
 
-	move_popups (totem);
+		item = glade_xml_get_widget (totem->xml, "tcw_hbox");
+		gtk_widget_show_all (item);
+		gdk_flush ();
 
-	gtk_widget_show_all (totem->exit_popup);
-	gtk_widget_show_all (totem->control_popup);
-	totem_action_set_cursor (totem, TRUE);
+		move_popups (totem);
+
+		gtk_widget_show_all (totem->exit_popup);
+		gtk_widget_show_all (totem->control_popup);
+		totem_action_set_cursor (totem, TRUE);
+
+		popup_timeout_add (totem);
+	}
 
-	popup_timeout_add (totem);
 	totem->popup_in_progress = FALSE;
 
 	return FALSE;
@@ -3306,6 +3358,14 @@ main (int argc, char **argv)
 	totem->gc = gc;
 	totem->cursor_shown = TRUE;
 
+	/* Init tracking of mouse movement in fullscreen */
+	totem->fullscreen_movement = g_new0 (FullscreenMouseMovementTracker, 1);
+	totem->fullscreen_movement->last_x = 0;
+	totem->fullscreen_movement->last_y = 0;
+	totem->fullscreen_movement->total_movement = 0;
+	gettimeofday(&(totem->fullscreen_movement->last_movement_time), NULL);
+	gettimeofday(&(totem->fullscreen_movement->movement_init_time), NULL);
+
 	/* Main window */
 	totem->xml = totem_interface_load ("totem.glade", _("main window"),
 			TRUE, NULL);
diff -up --from-file orig/ orig/totem-private.h ./totem-private.h
--- orig/totem-private.h	2006-12-03 12:07:14.000000000 +0100
+++ ./totem-private.h	2006-12-03 14:17:01.000000000 +0100
@@ -58,6 +58,19 @@
 		gtk_action_set_sensitive (action, state);				\
 	}
 
+/* Information to track mouse movement in fullscreen mode */
+typedef struct FullscreenMouseMovementTracker FullscreenMouseMovementTracker;
+struct FullscreenMouseMovementTracker {
+        int last_x;  /* Last recorded coord odf the pointer */
+        int last_y;
+        int total_movement; /* Total distance moved so far */
+
+        struct timeval last_movement_time; /* The time stamp of the last recored movement */
+        struct timeval movement_init_time; /* The time the movement started (is reset after a certain time of non-movement */
+};
+/* Macro to calculate the difference in millisecs between two sys/time.h timeval structs */
+#define time_diff_msec(t1, t2) (long)(((t1.tv_sec - t2.tv_sec)*1000 + (t1.tv_usec - t2.tv_usec)/1000.0) + 0.5)
+
 typedef enum {
 	TOTEM_CONTROLS_VISIBLE,
 	TOTEM_CONTROLS_HIDDEN,
@@ -134,6 +147,7 @@ struct Totem {
 	ControlsVisibility controls_visibility;
 
 	/* control fullscreen Popup */
+        FullscreenMouseMovementTracker *fullscreen_movement;
 	GtkWidget *control_popup;
 	GtkWidget *fs_seek;
 	GtkAdjustment *fs_seekadj;

