http://ftp.x.org/contrib/applications/xscreensaver-3.03.tar.gz
[xscreensaver] / driver / timers.c
index aba6d5a3f0d421973fa1b3ef198ae9ce6bb0d13d..a0d2392c33e26b36e8f5cfead384d3c4c9ad9619 100644 (file)
@@ -233,7 +233,7 @@ static void
 reset_timers (saver_info *si)
 {
   saver_preferences *p = &si->prefs;
-  if (p->use_mit_saver_extension || p->use_sgi_saver_extension)
+  if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
     return;
 
 #ifdef DEBUG_TIMERS
@@ -242,7 +242,8 @@ reset_timers (saver_info *si)
             blurb(), p->timeout, si->timer_id);
 #endif /* DEBUG_TIMERS */
 
-  XtRemoveTimeOut (si->timer_id);
+  if (si->timer_id)
+    XtRemoveTimeOut (si->timer_id);
   si->timer_id = XtAppAddTimeOut (si->app, p->timeout, idle_timer,
                                  (XtPointer) si);
   if (si->cycle_id) abort ();  /* no cycle timer when inactive */
@@ -268,9 +269,9 @@ check_pointer_timer (XtPointer closure, XtIntervalId *id)
   saver_preferences *p = &si->prefs;
   Bool active_p = False;
 
-  if (p->use_xidle_extension ||
-      p->use_mit_saver_extension ||
-      p->use_sgi_saver_extension)
+  if (si->using_xidle_extension ||
+      si->using_mit_saver_extension ||
+      si->using_sgi_saver_extension)
     /* If an extension is in use, we should not be polling the mouse. */
     abort ();
 
@@ -342,7 +343,7 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
 
   if (until_idle_p)
     {
-      if (!p->use_mit_saver_extension && !p->use_sgi_saver_extension)
+      if (!si->using_mit_saver_extension && !si->using_sgi_saver_extension)
        {
          /* Wake up periodically to ask the server if we are idle. */
          si->timer_id = XtAppAddTimeOut (si->app, p->timeout, idle_timer,
@@ -355,9 +356,9 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
 #endif /* DEBUG_TIMERS */
        }
 
-      if (!p->use_xidle_extension &&
-         !p->use_mit_saver_extension &&
-         !p->use_sgi_saver_extension)
+      if (!si->using_xidle_extension &&
+         !si->using_mit_saver_extension &&
+         !si->using_sgi_saver_extension)
        /* start polling the mouse position */
        check_pointer_timer ((XtPointer) si, 0);
     }
@@ -372,7 +373,7 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
          {
            Time idle;
 #ifdef HAVE_XIDLE_EXTENSION
-           if (p->use_xidle_extension)
+           if (si->using_xidle_extension)
              {
                if (! XGetIdleTime (si->dpy, &idle))
                  {
@@ -383,7 +384,7 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
            else
 #endif /* HAVE_XIDLE_EXTENSION */
 #ifdef HAVE_MIT_SAVER_EXTENSION
-             if (p->use_mit_saver_extension)
+             if (si->using_mit_saver_extension)
                {
                  /* We don't need to do anything in this case - the synthetic
                     event isn't necessary, as we get sent specific events
@@ -393,7 +394,7 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
            else
 #endif /* HAVE_MIT_SAVER_EXTENSION */
 #ifdef HAVE_SGI_SAVER_EXTENSION
-             if (p->use_sgi_saver_extension)
+             if (si->using_sgi_saver_extension)
                {
                  /* We don't need to do anything in this case - the synthetic
                     event isn't necessary, as we get sent specific events
@@ -408,8 +409,8 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
            
            if (idle >= p->timeout)
              goto DONE;
-           else if (!p->use_mit_saver_extension &&
-                    !p->use_sgi_saver_extension)
+           else if (!si->using_mit_saver_extension &&
+                    !si->using_sgi_saver_extension)
              {
                si->timer_id = XtAppAddTimeOut (si->app, p->timeout - idle,
                                                idle_timer, (XtPointer) si);
@@ -428,9 +429,9 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
        break;
 
       case CreateNotify:
-       if (!p->use_xidle_extension &&
-           !p->use_mit_saver_extension &&
-           !p->use_sgi_saver_extension)
+       if (!si->using_xidle_extension &&
+           !si->using_mit_saver_extension &&
+           !si->using_sgi_saver_extension)
          {
            start_notice_events_timer (si, event.xcreatewindow.window);
 #ifdef DEBUG_TIMERS
@@ -468,11 +469,27 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
        /* If any widgets want to handle this event, let them. */
        dispatch_event (si, &event);
 
-       /* We got a user event */
+       /* We got a user event.
+          If we're waiting for the user to become active, this is it.
+          If we're waiting until the user becomes idle, reset the timers
+          (since now we have longer to wait.)
+        */
        if (!until_idle_p)
-         goto DONE;
+         {
+           if (si->demoing_p &&
+               (event.xany.type == MotionNotify ||
+                event.xany.type == KeyRelease))
+             /* When we're demoing a single hack, mouse motion doesn't
+                cause deactivation.  Only clicks and keypresses do. */
+             ;
+           else
+             /* If we're not demoing, then any activity causes deactivation.
+              */
+             goto DONE;
+         }
        else
          reset_timers (si);
+
        break;
 
       default:
@@ -484,15 +501,13 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
              (XScreenSaverNotifyEvent *) &event;
            if (sevent->state == ScreenSaverOn)
              {
-# ifdef DEBUG_TIMERS
+               int i = 0;
                if (p->verbose_p)
-                 fprintf (stderr, "%s: ScreenSaverOn event received at %s\n",
-                          blurb(), timestring ());
-# endif /* DEBUG_TIMERS */
+                 fprintf (stderr, "%s: MIT ScreenSaverOn event received.\n",
+                          blurb());
 
                /* Get the "real" server window(s) out of the way as soon
                   as possible. */
-               int i = 0;
                for (i = 0; i < si->nscreens; i++)
                  {
                    saver_screen_info *ssi = &si->screens[i];
@@ -504,11 +519,9 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
 
                if (sevent->kind != ScreenSaverExternal)
                  {
-# ifdef DEBUG_TIMERS
                    fprintf (stderr,
                         "%s: ScreenSaverOn event wasn't of type External!\n",
                             blurb());
-# endif /* DEBUG_TIMERS */
                  }
 
                if (until_idle_p)
@@ -516,20 +529,16 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
              }
            else if (sevent->state == ScreenSaverOff)
              {
-# ifdef DEBUG_TIMERS
                if (p->verbose_p)
-                 fprintf (stderr, "%s: ScreenSaverOff event received at %s\n",
-                          blurb(), timestring ());
-# endif /* DEBUG_TIMERS */
+                 fprintf (stderr, "%s: MIT ScreenSaverOff event received.\n",
+                          blurb());
                if (!until_idle_p)
                  goto DONE;
              }
-# ifdef DEBUG_TIMERS
-           else if (p->verbose_p)
+           else
              fprintf (stderr,
-                      "%s: unknown MIT-SCREEN-SAVER event received at %s\n",
-                      blurb(), timestring ());
-# endif /* DEBUG_TIMERS */
+                      "%s: unknown MIT-SCREEN-SAVER event %d received!\n",
+                      blurb(), sevent->state);
          }
        else
 
@@ -539,11 +548,9 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
 #ifdef HAVE_SGI_SAVER_EXTENSION
        if (event.type == (si->sgi_saver_ext_event_number + ScreenSaverStart))
          {
-# ifdef DEBUG_TIMERS
            if (p->verbose_p)
-             fprintf (stderr, "%s: ScreenSaverStart event received at %s\n",
-                      blurb(), timestring ());
-# endif /* DEBUG_TIMERS */
+             fprintf (stderr, "%s: SGI ScreenSaverStart event received.\n",
+                      blurb());
 
            if (until_idle_p)
              goto DONE;
@@ -551,11 +558,9 @@ sleep_until_idle (saver_info *si, Bool until_idle_p)
        else if (event.type == (si->sgi_saver_ext_event_number +
                                ScreenSaverEnd))
          {
-# ifdef DEBUG_TIMERS
            if (p->verbose_p)
-             fprintf (stderr, "%s: ScreenSaverEnd event received at %s\n",
-                      blurb(), timestring ());
-# endif /* DEBUG_TIMERS */
+             fprintf (stderr, "%s: SGI ScreenSaverEnd event received.\n",
+                      blurb());
            if (!until_idle_p)
              goto DONE;
          }
@@ -620,29 +625,28 @@ static void
 watchdog_timer (XtPointer closure, XtIntervalId *id)
 {
   saver_info *si = (saver_info *) closure;
-  if (!si->demo_mode_p)
+
+  disable_builtin_screensaver (si, False);
+
+  if (si->screen_blanked_p)
     {
-      disable_builtin_screensaver (si, False);
-      if (si->screen_blanked_p)
-       {
-         Bool running_p = screenhack_running_p(si);
+      Bool running_p = screenhack_running_p(si);
 
 #ifdef DEBUG_TIMERS
-         if (si->prefs.verbose_p)
-           fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
-                    blurb(), (running_p ? "" : "and clearing "));
+      if (si->prefs.verbose_p)
+       fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
+                blurb(), (running_p ? "" : "and clearing "));
 #endif /* DEBUG_TIMERS */
 
-         raise_window (si, True, True, running_p);
+      raise_window (si, True, True, running_p);
 
-         if (!monitor_powered_on_p (si))
-           {
-             if (si->prefs.verbose_p)
-               fprintf (stderr,
-                        "%s: server reports that monitor has powered down; "
-                        "killing running hacks.\n", blurb());
-             kill_screenhack (si);
-           }
+      if (!monitor_powered_on_p (si))
+       {
+         if (si->prefs.verbose_p)
+           fprintf (stderr,
+                    "%s: server reports that monitor has powered down; "
+                    "killing running hacks.\n", blurb());
+         kill_screenhack (si);
        }
     }
 }