/* demo.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski <jwz@netscape.com>
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
#endif
#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
/* We don't actually use any widget internals, but these are included
so that gdb will have debug info for the widgets... */
#else /* HAVE_ATHENA */
/* Athena demo code contributed by Jon A. Christopher <jac8782@tamu.edu> */
/* Copyright 1997, with the same permissions as above. */
-# include <X11/StringDefs.h>
# include <X11/Shell.h>
# include <X11/Xaw/Form.h>
# include <X11/Xaw/Box.h>
# include <X11/Xaw/Viewport.h>
# include <X11/Xaw/Dialog.h>
# include <X11/Xaw/Scrollbar.h>
+# include <X11/Xaw/Text.h>
#endif /* HAVE_ATHENA */
#include "xscreensaver.h"
#include <string.h>
#include <ctype.h>
+#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);
extern Widget verbose_toggle, cmap_toggle, fade_toggle, unfade_toggle,
lock_toggle;
+extern Widget splash_dialog;
+
#ifdef HAVE_MOTIF
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 */
}
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[] = ("<Key>Return: done()\n"
+ "<Key>Linefeed: done()\n"
+ "Ctrl<Key>M: done()\n"
+ "Ctrl<Key>J: done()\n");
+#endif /* HAVE_ATHENA */
static void
#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;
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 */
}
-#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
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,
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 */
demo_mode_hack (si, get_text_string (text_line));
#endif /* HAVE_MOTIF */
+ }
}
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);
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 */
demo_mode_hack (si, get_text_string (text_line));
#endif /* HAVE_MOTIF */
+ }
}
{
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);
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);
}
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 ();
}
XtManageChild (form);
#endif /* HAVE_MOTIF */
- steal_focus_and_colormap (dialog);
+ if (dialog != splash_dialog)
+ steal_focus_and_colormap (dialog);
}
-static void
+void
make_screenhack_dialog (saver_info *si)
{
saver_screen_info *ssi = si->default_screen;
select_cb, (XtPointer) si);
XtAddCallback (text_line, XmNactivateCallback, text_cb, (XtPointer) si);
- for (; *hacks; hacks++)
- {
- XmString xmstr = XmStringCreate (*hacks, XmSTRING_DEFAULT_CHARSET);
- XmListAddItem (demo_list, xmstr, 0);
- XmStringFree (xmstr);
- }
+ 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,
#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);
- /* #### still need to do the "select most-recently-run hack"
- #### thing for Athena.
+ /* 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,
/* for debugging -- don't ask */
(si->prefs.debug_p ? 69 : 0) +
0);
+
+#ifdef HAVE_ATHENA
+ /* For Athena, have to do this after the dialog is managed. */
+ ensure_selected_item_visible (demo_list);
+#endif /* HAVE_ATHENA */
}
\f
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());
}
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,
+ blurb(), p->timeout, p->cycle, p->lock_timeout,
#ifdef NO_LOCKING
0,
#else
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);
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;
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,
/* for debugging -- don't ask */
(si->prefs.debug_p ? 69 : 0) +
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->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;
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;
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;
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;
}