http://ftp.x.org/contrib/applications/xscreensaver-3.20.tar.gz
[xscreensaver] / driver / timers.c
index ef5d54331707332d30f1da63947d640ae3ddffa4..61a0155d097f26d2d73d1224d877ae2d1acc9e4b 100644 (file)
 #include <X11/extensions/XScreenSaver.h>
 #endif /* HAVE_SGI_SAVER_EXTENSION */
 
-#ifdef HAVE_XHPDISABLERESET
-# include <X11/XHPlib.h>
-  extern Bool hp_locked_p;     /* from windows.c */
-#endif /* HAVE_XHPDISABLERESET */
-
 #include "xscreensaver.h"
 
 #ifdef HAVE_PROC_INTERRUPTS
@@ -269,15 +264,7 @@ activate_lock_timer (XtPointer closure, XtIntervalId *id)
 
   if (p->verbose_p)
     fprintf (stderr, "%s: timed out; activating lock.\n", blurb());
-  si->locked_p = True;
-
-#ifdef HAVE_XHPDISABLERESET
-  if (!hp_locked_p)
-    {
-      XHPDisableReset (si->dpy);       /* turn off C-Sh-Reset */
-      hp_locked_p = True;
-    }
-#endif
+  set_locked_p (si, True);
 }
 
 
@@ -361,6 +348,16 @@ check_pointer_timer (XtPointer closure, XtIntervalId *id)
        else
          fprintf (stderr, "%s: pointer moved at %s on screen %d.\n",
                   blurb(), timestring(), i);
+
+# if 0
+      fprintf (stderr, "%s: old: %d %d 0x%x ; new: %d %d 0x%x\n",
+               blurb(), 
+               ssi->poll_mouse_last_root_x,
+               ssi->poll_mouse_last_root_y,
+               (unsigned int) ssi->poll_mouse_last_child,
+               root_x, root_y, (unsigned int) child);
+# endif /* 0 */
+
 #endif /* DEBUG_TIMERS */
 
       si->last_activity_screen    = ssi;
@@ -453,6 +450,63 @@ dispatch_event (saver_info *si, XEvent *event)
 }
 
 
+static void
+swallow_unlock_typeahead_events (saver_info *si, XEvent *e)
+{
+  XEvent event;
+  char buf [100];
+  int i = 0;
+
+  memset (buf, 0, sizeof(buf));
+
+  event = *e;
+
+  do
+    {
+      if (event.xany.type == KeyPress)
+        {
+          char s[2];
+          int size = XLookupString ((XKeyEvent *) &event, s, 1, 0, 0);
+          if (size != 1) continue;
+          switch (*s)
+            {
+            case '\010': case '\177':                  /* Backspace */
+              if (i > 0) i--;
+              break;
+            case '\025': case '\030':                  /* Erase line */
+            case '\012': case '\015':                  /* Enter */
+              i = 0;
+              break;
+            case '\040':                               /* Space */
+              if (i == 0)
+                break;  /* ignore space at beginning of line */
+              /* else, fall through */
+            default:
+              buf [i++] = *s;
+              break;
+            }
+        }
+
+    } while (i < sizeof(buf)-1 &&
+             XCheckMaskEvent (si->dpy, KeyPressMask, &event));
+
+  buf[i] = 0;
+
+  if (si->unlock_typeahead)
+    {
+      memset (si->unlock_typeahead, 0, strlen(si->unlock_typeahead));
+      free (si->unlock_typeahead);
+    }
+
+  if (i > 0)
+    si->unlock_typeahead = strdup (buf);
+  else
+    si->unlock_typeahead = 0;
+
+  memset (buf, 0, sizeof(buf));
+}
+
+
 /* methods of detecting idleness:
 
       explicitly informed by SGI SCREEN_SAVER server event;
@@ -765,8 +819,13 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
      doesn't exhibit itself without an extension, because in that case,
      there's only one event generated by user activity, not two.)
    */
-  XCheckMaskEvent (si->dpy, (KeyPressMask|ButtonPressMask|PointerMotionMask),
-                  &event);
+  if (!until_idle_p && si->locked_p)
+    swallow_unlock_typeahead_events (si, &event);
+  else
+    while (XCheckMaskEvent (si->dpy,
+                            (KeyPressMask|ButtonPressMask|PointerMotionMask),
+                     &event))
+      ;
 
 
   if (si->check_pointer_timer_id)