ftp://ftp.demon.nl/disk1/redhat-contrib/libc5/SRPMS/xscreensaver-2.14-1.src.rpm
[xscreensaver] / driver / demo.c
index a0ae2dab66c1b2d0b09f4c833d4f75822724cb15..b13622e175828704f30fa7fbf60edce7b5de3aa5 100644 (file)
 
 #include <X11/Intrinsic.h>
 
+#ifdef DEBUG
+# include <X11/IntrinsicP.h>   /* just to get debug info for gdb... */
+# include <X11/ShellP.h>
+#endif
+
 #ifdef HAVE_MOTIF
 # include <Xm/Xm.h>
 # include <Xm/Text.h>
@@ -363,18 +368,19 @@ next_cb (Widget button, XtPointer client_data, XtPointer call_data)
   int *pos_list;
   int pos_count;
   if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count))
-    XmListSelectPos (demo_list, 1, True);
+    {
+      XmListDeselectAllItems(demo_list);       /* LessTif lossage */
+      XmListSelectPos (demo_list, 1, True);
+    }
   else
     {
-      int pos = pos_list [0];
-      XmListSelectPos (demo_list, pos + 1, True);
-      XtFree ((char *) pos_list);
-      if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count))
-       abort ();
-      if (pos_list [0] == pos)
-       XmListSelectPos (demo_list, 1, True);
-      XtFree ((char *) pos_list);
+      int pos = pos_list[0] + 1;
+      if (pos > si->prefs.screenhacks_count)
+       pos = 1;
+      XmListDeselectAllItems(demo_list);       /* LessTif lossage */
+      XmListSelectPos (demo_list, pos, True);
     }
+  XtFree ((char *) pos_list);
   ensure_selected_item_visible (demo_list);
   demo_mode_hack (si, get_text_string (text_line));
 
@@ -409,9 +415,13 @@ prev_cb (Widget button, XtPointer client_data, XtPointer call_data)
   int *pos_list;
   int pos_count;
   if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count))
-    XmListSelectPos (demo_list, 0, True);
+    {
+      XmListDeselectAllItems(demo_list);       /* LessTif lossage */
+      XmListSelectPos (demo_list, 0, True);
+    }
   else
     {
+      XmListDeselectAllItems(demo_list);       /* LessTif lossage */
       XmListSelectPos (demo_list, pos_list [0] - 1, True);
       XtFree ((char *) pos_list);
     }
@@ -451,6 +461,7 @@ restart_cb (Widget button, XtPointer client_data, XtPointer call_data)
   demo_mode_restart_process (si);
 }
 
+
 void
 pop_up_dialog_box (Widget dialog, Widget form, int where)
 {
@@ -575,6 +586,32 @@ make_screenhack_dialog (saver_info *si)
       XmStringFree (xmstr);
     }
 
+  /* Cause the most-recently-run hack to be selected in the list.
+     Do some voodoo to make it be roughly centered in the list (really,
+     just make it not be within +/- 5 of the top/bottom if possible.)
+   */
+  if (ssi->current_hack > 0)
+    {
+      int i = ssi->current_hack+1;
+      int top = i + 5;
+      int bot = i - 5;
+      if (bot < 1) bot = 1;
+      if (top > si->prefs.screenhacks_count)
+       top = si->prefs.screenhacks_count;
+
+      XmListDeselectAllItems(demo_list);       /* LessTif lossage */
+      XmListSelectPos (demo_list, bot, False);
+      ensure_selected_item_visible (demo_list);
+
+      XmListDeselectAllItems(demo_list);       /* LessTif lossage */
+      XmListSelectPos (demo_list, top, False);
+      ensure_selected_item_visible (demo_list);
+
+      XmListDeselectAllItems(demo_list);       /* LessTif lossage */
+      XmListSelectPos (demo_list, i, False);
+      ensure_selected_item_visible (demo_list);
+    }
+
 #else  /* HAVE_ATHENA */
 
   XtVaSetValues (demo_list,
@@ -583,6 +620,10 @@ make_screenhack_dialog (saver_info *si)
                 0);
   XtAddCallback (demo_list, XtNcallback, select_cb, si);
 
+  /* ####   still need to do the "select most-recently-run hack"
+     ####   thing for Athena.
+  */
+
 #endif /* HAVE_ATHENA */
 
   pop_up_dialog_box(demo_dialog, demo_form,