X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fdemo.c;h=2c90218d487fc5603e361e7ff762a0d9a801408c;hb=c6b273ef7292ba10943694df1656b05203d7b62f;hp=a0ae2dab66c1b2d0b09f4c833d4f75822724cb15;hpb=f3e0240915ed9f9b3a61781f5c7002d587563fe0;p=xscreensaver diff --git a/driver/demo.c b/driver/demo.c index a0ae2dab..2c90218d 100644 --- a/driver/demo.c +++ b/driver/demo.c @@ -16,6 +16,11 @@ #include +/* We don't actually use any widget internals, but these are included + so that gdb will have debug info for the widgets... */ +#include +#include + #ifdef HAVE_MOTIF # include # include @@ -221,6 +226,9 @@ select_cb (Widget button, XtPointer client_data, XtPointer call_data) #ifdef HAVE_ATHENA XawListReturnStruct *item = (XawListReturnStruct*)call_data; demo_mode_hack (si, item->string); + if (item->list_index >= 0) + si->default_screen->current_hack = item->list_index; + #else /* HAVE_MOTIF */ XmListCallbackStruct *lcb = (XmListCallbackStruct *) call_data; char *string = 0; @@ -228,7 +236,11 @@ select_cb (Widget button, XtPointer client_data, XtPointer call_data) XmStringGetLtoR (lcb->item, XmSTRING_DEFAULT_CHARSET, &string); set_text_string (text_line, (string ? string : "")); if (lcb->reason == XmCR_DEFAULT_ACTION && string) - demo_mode_hack (si, string); + { + demo_mode_hack (si, string); + if (lcb->item_position > 0) + si->default_screen->current_hack = lcb->item_position - 1; + } if (string) XtFree (string); #endif /* HAVE_MOTIF */ @@ -363,18 +375,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 +422,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 +468,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) { @@ -481,13 +499,12 @@ pop_up_dialog_box (Widget dialog, Widget form, int where) XtSetArg (av [ac], XtNheight, &h); ac++; XtGetValues (form, av, ac); -#ifdef DEBUG + /* for debugging -- don't ask */ if (where >= 69) { where -= 69; sw = (sw * 7) / 12; } -#endif switch (where) { @@ -575,6 +592,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, @@ -582,14 +625,20 @@ make_screenhack_dialog (saver_info *si) XtNnumberStrings, si->prefs.screenhacks_count, 0); XtAddCallback (demo_list, XtNcallback, select_cb, si); + if (ssi->current_hack > 0) + XawListHighlight(demo_list, ssi->current_hack); #endif /* HAVE_ATHENA */ pop_up_dialog_box(demo_dialog, demo_form, -#ifdef DEBUG + /* for debugging -- don't ask */ (si->prefs.debug_p ? 69 : 0) + -#endif 0); + +#ifdef HAVE_ATHENA + /* For Athena, have to do this after the dialog is managed. */ + ensure_selected_item_visible (demo_list); +#endif /* HAVE_ATHENA */ } @@ -703,21 +752,20 @@ res_done_cb (Widget button, XtPointer client_data, XtPointer call_data) p->unfade_p = res.unfade; p->lock_p = res.lock_p; -#ifdef DEBUG if (p->debug_p && p->verbose_p) fprintf (stderr, "%s: parameters changed:\n\ timeout: %d\n\tcycle: %d\n\tlock: %d\n\tpasswd: %d\n\ fade: %d\n\tfade: %d\n\tverbose: %d\n\tinstall: %d\n\ fade: %d\n\tunfade: %d\n\tlock: %d\n", progname, p->timeout, p->cycle, p->lock_timeout, -# ifdef NO_LOCKING +#ifdef NO_LOCKING 0, -# else +#else p->passwd_timeout, -# endif +#endif p->fade_seconds, p->fade_ticks, p->verbose_p, p->install_cmap_p, p->fade_p, p->unfade_p, p->lock_p); -#endif /* DEBUG */ + #if defined(HAVE_MIT_SAVER_EXTENSION) || defined(HAVE_SGI_SAVER_EXTENSION) if (p->use_mit_saver_extension || p->use_sgi_saver_extension) @@ -871,9 +919,8 @@ pop_resources_dialog (saver_info *si) set_toggle_button_state (lock_toggle, res.lock_p); pop_up_dialog_box (resources_dialog, resources_form, -#ifdef DEBUG + /* for debugging -- don't ask */ (si->prefs.debug_p ? 69 : 0) + -#endif 1); } @@ -886,7 +933,6 @@ demo_mode (saver_info *si) { saver_preferences *p = &si->prefs; si->dbox_up_p = True; - initialize_screensaver_window (si); raise_window (si, True, False, False); make_screenhack_dialog (si); while (si->demo_mode_p)