X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fdemo.c;h=c7a12ba3eb4b4c5e458440768e9672a8ff6f287a;hb=2a991a811de4c7b22f812682b267b616a809fd9a;hp=a0ae2dab66c1b2d0b09f4c833d4f75822724cb15;hpb=f3e0240915ed9f9b3a61781f5c7002d587563fe0;p=xscreensaver diff --git a/driver/demo.c b/driver/demo.c index a0ae2dab..c7a12ba3 100644 --- a/driver/demo.c +++ b/driver/demo.c @@ -1,5 +1,5 @@ /* demo.c --- implements the interactive demo-mode and options dialogs. - * xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski + * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -15,6 +15,12 @@ #endif #include +#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 @@ -25,7 +31,6 @@ #else /* HAVE_ATHENA */ /* Athena demo code contributed by Jon A. Christopher */ /* Copyright 1997, with the same permissions as above. */ -# include # include # include # include @@ -35,6 +40,7 @@ # include # include # include +# include #endif /* HAVE_ATHENA */ #include "xscreensaver.h" @@ -43,6 +49,10 @@ #include #include +#ifdef _VROOT_H_ +ERROR! You must not include vroot.h in this file. +#endif + static void demo_mode_hack (saver_info *si, char *); static void demo_mode_done (saver_info *si); @@ -99,7 +109,13 @@ get_text_string (Widget text_widget) return XmTextGetString (text_widget); #else /* HAVE_ATHENA */ char *string = 0; - XtVaGetValues (text_widget, XtNvalue, &string, 0); + if (XtIsSubclass(text_widget, textWidgetClass)) + XtVaGetValues (text_widget, XtNstring, &string, 0); + else if (XtIsSubclass(text_widget, dialogWidgetClass)) + XtVaGetValues (text_widget, XtNvalue, &string, 0); + else + string = 0; + return string; #endif /* HAVE_ATHENA */ } @@ -199,18 +215,39 @@ destroy_screenhack_dialogs (saver_info *si) XInstallColormap (si->dpy, ssi->cmap); } -#ifdef HAVE_MOTIF static void text_cb (Widget text_widget, XtPointer client_data, XtPointer call_data) { saver_info *si = (saver_info *) client_data; + saver_preferences *p = &si->prefs; char *line; line = get_text_string (text_widget); + + if (p->verbose_p) + fprintf (stderr, "%s: processing text \"%s\".\n", blurb(), line); + demo_mode_hack (si, line); } -#endif /* HAVE_MOTIF */ + +#ifdef HAVE_ATHENA +/* Bend over backwards to make hitting Return in the text field do the + right thing. + */ +extern saver_info *global_si_kludge; +static void text_enter (Widget w, XEvent *event, String *av, Cardinal *ac) +{ + text_cb (w, global_si_kludge, 0); +} + +static XtActionsRec actions[] = {{"done", text_enter} + }; +static char translations[] = ("Return: done()\n" + "Linefeed: done()\n" + "CtrlM: done()\n" + "CtrlJ: done()\n"); +#endif /* HAVE_ATHENA */ static void @@ -220,7 +257,12 @@ select_cb (Widget button, XtPointer client_data, XtPointer call_data) #ifdef HAVE_ATHENA XawListReturnStruct *item = (XawListReturnStruct*)call_data; + XtVaSetValues(text_line, XtNstring, item->string, 0); + 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 +270,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 */ @@ -236,19 +282,6 @@ select_cb (Widget button, XtPointer client_data, XtPointer call_data) } -#if 0 /* configure does this now */ -#ifdef HAVE_ATHENA -# if !defined(_Viewport_h) - /* The R4 Athena libs don't have this function. I don't know the right - way to tell, but I note that the R5 version of Viewport.h defines - _XawViewport_h, while the R4 version defines _Viewport_h. So we'll - try and key off of that... */ -# define HAVE_XawViewportSetCoordinates -# endif -#endif /* HAVE_ATHENA */ -#endif /* 0 */ - - /* Why this behavior isn't automatic in *either* toolkit, I'll never know. */ static void @@ -336,12 +369,17 @@ static void next_cb (Widget button, XtPointer client_data, XtPointer call_data) { saver_info *si = (saver_info *) client_data; + saver_preferences *p = &si->prefs; + + if (p->verbose_p) + fprintf (stderr, "%s: Run Next\n", blurb()); + { #ifdef HAVE_ATHENA int cnt; XawListReturnStruct *current = XawListShowCurrent(demo_list); if (current->list_index == XAW_LIST_NONE) - XawListHighlight(demo_list,1); + XawListHighlight(demo_list, 0); else { XtVaGetValues(demo_list, @@ -356,6 +394,7 @@ next_cb (Widget button, XtPointer client_data, XtPointer call_data) ensure_selected_item_visible (demo_list); current = XawListShowCurrent(demo_list); + XtVaSetValues(text_line, XtNstring, current->string, 0); demo_mode_hack (si, current->string); #else /* HAVE_MOTIF */ @@ -363,22 +402,24 @@ 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)); #endif /* HAVE_MOTIF */ + } } @@ -386,14 +427,19 @@ static void prev_cb (Widget button, XtPointer client_data, XtPointer call_data) { saver_info *si = (saver_info *) client_data; + saver_preferences *p = &si->prefs; + + if (p->verbose_p) + fprintf (stderr, "%s: Run Previous\n", blurb()); + { #ifdef HAVE_ATHENA XawListReturnStruct *current=XawListShowCurrent(demo_list); if (current->list_index == XAW_LIST_NONE) - XawListHighlight(demo_list,1); + XawListHighlight(demo_list, 0); else { - if (current->list_index>=1) + if (current->list_index >= 1) { current->list_index--; XawListHighlight(demo_list, current->list_index); @@ -402,6 +448,7 @@ prev_cb (Widget button, XtPointer client_data, XtPointer call_data) ensure_selected_item_visible (demo_list); current = XawListShowCurrent(demo_list); + XtVaSetValues(text_line, XtNstring, current->string, 0); demo_mode_hack (si, current->string); #else /* HAVE_MOTIF */ @@ -409,9 +456,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); } @@ -419,6 +470,7 @@ prev_cb (Widget button, XtPointer client_data, XtPointer call_data) demo_mode_hack (si, get_text_string (text_line)); #endif /* HAVE_MOTIF */ + } } @@ -430,7 +482,12 @@ edit_cb (Widget button, XtPointer client_data, XtPointer call_data) { saver_info *si = (saver_info *) client_data; saver_screen_info *ssi = si->default_screen; + saver_preferences *p = &si->prefs; Widget parent = ssi->toplevel_shell; + + if (p->verbose_p) + fprintf (stderr, "%s: Preferences\n", blurb()); + if (! resources_dialog) make_resources_dialog (si, parent); pop_resources_dialog (si); @@ -448,9 +505,13 @@ static void restart_cb (Widget button, XtPointer client_data, XtPointer call_data) { saver_info *si = (saver_info *) client_data; + saver_preferences *p = &si->prefs; + if (p->verbose_p) + fprintf (stderr, "%s: Restart\n", blurb()); demo_mode_restart_process (si); } + void pop_up_dialog_box (Widget dialog, Widget form, int where) { @@ -481,13 +542,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) { @@ -503,6 +563,10 @@ pop_up_dialog_box (Widget dialog, Widget form, int where) x = (sw + w) / 2 - w; y = (sh + h) / 2 - h; break; + case 3: /* center it in the top 2/3rds of the screen */ + x = (sw + w) / 2 - w; + y = (sh*2/3 + h) / 2 - h; + break; default: abort (); } @@ -530,7 +594,7 @@ pop_up_dialog_box (Widget dialog, Widget form, int where) } -static void +void make_screenhack_dialog (saver_info *si) { saver_screen_info *ssi = si->default_screen; @@ -568,28 +632,116 @@ make_screenhack_dialog (saver_info *si) select_cb, (XtPointer) si); XtAddCallback (text_line, XmNactivateCallback, text_cb, (XtPointer) si); - for (; *hacks; hacks++) + if (hacks) + for (; *hacks; hacks++) + { + XmString xmstr = XmStringCreate (*hacks, XmSTRING_DEFAULT_CHARSET); + XmListAddItem (demo_list, xmstr, 0); + 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) { - XmString xmstr = XmStringCreate (*hacks, XmSTRING_DEFAULT_CHARSET); - XmListAddItem (demo_list, xmstr, 0); - XmStringFree (xmstr); + 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 */ + /* Hook up the text line. */ + + XtAppAddActions(XtWidgetToApplicationContext(text_line), + actions, XtNumber(actions)); + XtOverrideTranslations(text_line, XtParseTranslationTable(translations)); + + + /* Must realize the widget before populating the list, or the dialog + will be as wide as the longest string. + */ + XtRealizeWidget (demo_dialog); + XtVaSetValues (demo_list, XtNlist, hacks, XtNnumberStrings, si->prefs.screenhacks_count, 0); XtAddCallback (demo_list, XtNcallback, select_cb, si); + if (ssi->current_hack > 0) + XawListHighlight(demo_list, ssi->current_hack); + + /* Now that we've populated the list, make sure that the list is as + wide as the dialog itself. + */ + { + Widget viewport = XtParent(demo_list); + Widget subform = XtParent(viewport); + Widget box = XtNameToWidget(demo_dialog, "*box"); + Widget label1 = XtNameToWidget(demo_dialog, "*label1"); + Widget label2 = XtNameToWidget(demo_dialog, "*label2"); + Dimension x=0, y=0, w=0, h=0, bw=0, w2=0; + XtVaGetValues(subform, + XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0); + XtVaGetValues(box, XtNwidth, &w2, 0); + if (w2 != w) + XtResizeWidget(subform, w2, h, bw); + + /* Why isn't the viewport getting centered? */ + XtVaGetValues(viewport, + XtNx, &x, XtNy, &y, XtNheight, &h, XtNborderWidth, &bw, 0); +/* printf("%d %d %d %d\n", x, y, w, h); */ + XtConfigureWidget(viewport, x, y, w2-x-x, h, bw); + + /* And the text line, too. */ + XtVaGetValues(text_line, + XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0); + XtVaGetValues(viewport, XtNwidth, &w2, 0); + if (w2 != w) + XtResizeWidget(text_line, w2, h, bw); + + /* And the labels too. */ + XtVaGetValues(label1, + XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0); + if (w2 != w) + XtResizeWidget(label1, w2, h, bw); + + XtVaGetValues(label2, + XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0); + if (w2 != w) + XtResizeWidget(label2, w2, h, bw); + + } #endif /* HAVE_ATHENA */ + monitor_power_on (si); 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 */ } @@ -660,9 +812,15 @@ res_bool_cb (Widget button, XtPointer client_data, XtPointer call_data) static void res_cancel_cb (Widget button, XtPointer client_data, XtPointer call_data) { + saver_info *si = (saver_info *) client_data; + saver_preferences *p = &si->prefs; + XtDestroyWidget (resources_dialog); resources_dialog = 0; raise_screenhack_dialog (); + + if (p->verbose_p) + fprintf (stderr, "%s: lowering preferences dialog.\n", blurb()); } @@ -703,21 +861,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 + blurb(), p->timeout, p->cycle, p->lock_timeout, +#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) @@ -733,13 +890,15 @@ res_done_cb (Widget button, XtPointer client_data, XtPointer call_data) if (p->verbose_p) fprintf (stderr, "%s: configuring server for saver timeout of %d seconds.\n", - progname, server_timeout); + blurb(), server_timeout); /* Leave all other parameters the same. */ XSetScreenSaver (si->dpy, server_timeout, server_interval, prefer_blank, allow_exp); } } #endif /* HAVE_MIT_SAVER_EXTENSION || HAVE_SGI_SAVER_EXTENSION */ + + write_init_file (si); } @@ -799,7 +958,7 @@ make_resources_dialog (saver_info *si, Widget parent) disable_widget (lock_time_text); disable_widget (lock_toggle); } - if (CellsOfScreen (XtScreen (parent)) <= 2) + if (!si->fading_possible_p) { disable_widget (fade_text); disable_widget (ticks_text); @@ -843,6 +1002,9 @@ pop_resources_dialog (saver_info *si) saver_preferences *p = &si->prefs; char buf [100]; + if (p->verbose_p) + fprintf (stderr, "%s: raising preferences dialog.\n", blurb()); + res.timeout = p->timeout / 1000; res.cycle = p->cycle / 1000; res.lock_time = p->lock_timeout / 1000; @@ -870,10 +1032,10 @@ pop_resources_dialog (saver_info *si) set_toggle_button_state (unfade_toggle, res.unfade); set_toggle_button_state (lock_toggle, res.lock_p); + monitor_power_on (si); pop_up_dialog_box (resources_dialog, resources_form, -#ifdef DEBUG + /* for debugging -- don't ask */ (si->prefs.debug_p ? 69 : 0) + -#endif 1); } @@ -885,10 +1047,20 @@ void demo_mode (saver_info *si) { saver_preferences *p = &si->prefs; + Bool prefs_p = (si->demo_mode_p == (Bool) 2); /* kludge! */ + + if (p->verbose_p) + fprintf (stderr, "%s: Demo Mode.\n", blurb()); + + si->selection_mode = 0; si->dbox_up_p = True; - initialize_screensaver_window (si); + monitor_power_on (si); raise_window (si, True, False, False); make_screenhack_dialog (si); + + if (prefs_p) + edit_cb (0, si, 0); /* pop up preferences panel */ + while (si->demo_mode_p) { XEvent event; @@ -910,10 +1082,11 @@ demo_mode (saver_info *si) start_notice_events_timer (si, event.xcreatewindow.window); #ifdef DEBUG_TIMERS if (p->verbose_p) - printf ("%s: starting notice_events_timer for 0x%X (%lu)\n", - progname, - (unsigned int) event.xcreatewindow.window, - p->notice_events_timeout); + fprintf (stderr, + "%s: starting notice_events_timer for 0x%X (%lu)\n", + blurb(), + (unsigned int) event.xcreatewindow.window, + p->notice_events_timeout); #endif /* DEBUG_TIMERS */ } break; @@ -946,9 +1119,18 @@ demo_mode (saver_info *si) break; } } + + if (p->verbose_p) + fprintf (stderr, "%s: Demo Mode done.\n", blurb()); + + kill_screenhack (si); + destroy_screenhack_dialogs (si); initialize_screensaver_window (si); + si->dbox_up_p = False; + si->demo_hack = 0; + si->demo_mode_p = True; /* kludge to inhibit unfade... */ unblank_screen (si); si->demo_mode_p = False; @@ -969,10 +1151,5 @@ demo_mode_hack (saver_info *si, char *hack) static void demo_mode_done (saver_info *si) { - kill_screenhack (si); - if (si->demo_hack) - unblank_screen (si); si->demo_mode_p = False; - si->dbox_up_p = False; - si->demo_hack = 0; }