diff -aur xscreensaver-4.16/driver/timers.c xscreensaver-ivan/driver/timers.c
--- xscreensaver-4.16/driver/timers.c	2004-05-06 05:12:50.000000000 +0100
+++ xscreensaver-ivan/driver/timers.c	2005-01-13 12:28:01.000000000 +0000
@@ -539,6 +539,42 @@
   memset (buf, 0, sizeof(buf));
 }
 
+/* check if the mouse has been bumped */
+# undef ABS
+# define ABS(x)((x)<0?-(x):(x))
+int check_bump(saver_info *si, XEvent event)
+{
+    int rv=0;
+
+    if (event.xany.type == MotionNotify) {
+        saver_preferences *p = &si->prefs;
+        if (si->check_bump_x == -1) {
+            /* we don't have previous coordinate yet so just eat 
+               up this event, there will be more */
+            rv = 1;
+        } else {
+            if (p->verbose_p) {
+                fprintf (stderr, "mouse displacement (%d, %d)\n",
+                         ABS(si->check_bump_x - event.xmotion.x_root),
+                         ABS(si->check_bump_y - event.xmotion.y_root));
+            }
+            
+            if (ABS(si->check_bump_x - event.xmotion.x_root) <= 1 &&
+                ABS(si->check_bump_y - event.xmotion.y_root) <= 1) {
+                if (p->verbose_p) {
+                    fprintf (stderr, "%s %s",
+                             blurb(), "mouse bump detected\n");
+                }
+                rv = 1;
+            }
+        }
+        si->check_bump_x = event.xmotion.x_root;
+        si->check_bump_y = event.xmotion.y_root;
+    }
+    
+    return rv;
+# undef ABS
+}
 
 /* methods of detecting idleness:
 
@@ -776,9 +812,9 @@
 	 */
 	if (!until_idle_p)
 	  {
-	    if (si->demoing_p &&
+	    if ((si->demoing_p &&
 		(event.xany.type == MotionNotify ||
-		 event.xany.type == KeyRelease))
+		 event.xany.type == KeyRelease)) || check_bump(si, event))
 	      /* When we're demoing a single hack, mouse motion doesn't
 		 cause deactivation.  Only clicks and keypresses do. */
 	      ;
--- xscreensaver-4.16/driver/xscreensaver.c	2005-01-13 12:29:07.000000000 +0000
+++ xscreensaver-ivan/driver/xscreensaver.c	2005-01-13 11:03:43.000000000 +0000
@@ -1167,6 +1167,10 @@
 
       check_for_leaks ("unblanked A");
       sleep_until_idle (si, True);
+
+      /* Initiallize bump detection */
+      si->check_bump_x = -1;
+
       check_for_leaks ("unblanked B");
 
       if (p->verbose_p)
diff -aur xscreensaver-4.16/driver/xscreensaver.h xscreensaver-ivan/driver/xscreensaver.h
--- xscreensaver-4.16/driver/xscreensaver.h	2004-05-05 03:08:03.000000000 +0100
+++ xscreensaver-ivan/driver/xscreensaver.h	2005-01-13 11:50:27.000000000 +0000
@@ -101,6 +101,8 @@
   time_t blank_time;		/* The time at which the screen was blanked
                                    (if currently blanked) or unblanked (if
                                    not blanked.) */
+  int check_bump_x;         /* These are to keep track of small mouse   */
+  int check_bump_y;         /* movement like if someone bumps on a desk */
 
 
   /* =======================================================================

