/* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997, 1998, 2001, 2002, 2004
+ * 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
#include <stdio.h>
#include <math.h>
#include <string.h>
+#include <time.h>
+#include <sys/time.h>
#include "screenhack.h"
#include "xlockmoreI.h"
+#include <X11/Intrinsic.h>
#define countof(x) (sizeof((x))/sizeof(*(x)))
+#define MAX_COLORS (1L<<13)
+
+extern XtAppContext app;
extern ModeSpecOpt xlockmore_opts[];
extern const char *app_defaults;
/* Add extra args, if they're mentioned in the defaults... */
{
char *args[] = { "-count", "-cycles", "-delay", "-ncolors",
- "-size", "-wireframe", "-use3d", "-useSHM" };
+ "-size", "-font", "-wireframe", "-use3d", "-useSHM",
+ "-showFPS" };
for (j = 0; j < countof(args); j++)
if (strstr(app_defaults, args[j]+1))
{
new->argKind = XrmoptionNoArg;
new->value = "False";
}
+ else if (!strcmp(new->option, "-showFPS"))
+ {
+ new->option = "-fps";
+ new->argKind = XrmoptionNoArg;
+ new->value = "True";
+ new = &options[i++];
+ new->option = "-no-fps";
+ new->specifier = options[i-2].specifier;
+ new->argKind = XrmoptionNoArg;
+ new->value = "False";
+ }
else
{
new->argKind = XrmoptionSepArg;
}
+static void
+xlockmore_handle_events (ModeInfo *mi,
+ void (*reshape) (ModeInfo *, int, int),
+ Bool (*hook) (ModeInfo *, XEvent *))
+{
+ if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+ XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+
+ while (XPending (mi->dpy))
+ {
+ XEvent event;
+ XNextEvent (mi->dpy, &event);
+ if (reshape && event.xany.type == ConfigureNotify)
+ {
+ XGetWindowAttributes (mi->dpy, mi->window, &mi->xgwa);
+ reshape (mi, mi->xgwa.width, mi->xgwa.height);
+ }
+ else if (hook && hook (mi, &event))
+ {
+ }
+ else
+ {
+ screenhack_handle_event (mi->dpy, &event);
+ }
+ }
+}
+
void
xlockmore_screenhack (Display *dpy, Window window,
Bool want_uniform_colors,
Bool want_smooth_colors,
Bool want_bright_colors,
+ unsigned long event_mask,
void (*hack_init) (ModeInfo *),
void (*hack_draw) (ModeInfo *),
+ void (*hack_reshape) (ModeInfo *, int, int),
+ Bool (*hack_handle_events) (ModeInfo *, XEvent *),
void (*hack_free) (ModeInfo *))
{
ModeInfo mi;
int i;
time_t start, now;
int orig_pause;
+ Bool root_p;
memset(&mi, 0, sizeof(mi));
mi.dpy = dpy;
mi.window = window;
XGetWindowAttributes (dpy, window, &mi.xgwa);
+ root_p = (window == RootWindowOfScreen (mi.xgwa.screen));
+
+ /* If this is the root window, don't allow ButtonPress to be selected.
+ Bad Things Happen. */
+ if (root_p)
+ event_mask &= (~(ButtonPressMask|ButtonReleaseMask));
+
+ /* If this hack wants additional events, select them. */
+ if (event_mask && ! (mi.xgwa.your_event_mask & event_mask))
+ XSelectInput (dpy, window, (mi.xgwa.your_event_mask | event_mask));
color.flags = DoRed|DoGreen|DoBlue;
color.red = color.green = color.blue = 0;
mi.npixels = get_integer_resource ("ncolors", "Integer");
if (mi.npixels <= 0)
mi.npixels = 64;
- else if (mi.npixels > 256)
- mi.npixels = 256;
+ else if (mi.npixels > MAX_COLORS)
+ mi.npixels = MAX_COLORS;
mi.colors = (XColor *) calloc (mi.npixels, sizeof (*mi.colors));
goto MONO;
else
{
- int i;
mi.pixels = (unsigned long *)
calloc (mi.npixels, sizeof (*mi.pixels));
for (i = 0; i < mi.npixels; i++)
mi.xgwa.colormap);
mi.wireframe_p = get_boolean_resource ("wireframe", "Boolean");
- mi.root_p = (window == RootWindowOfScreen (mi.xgwa.screen));
+ mi.root_p = root_p;
+ mi.fps_p = get_boolean_resource ("showFPS", "Boolean");
#ifdef HAVE_XSHM_EXTENSION
mi.use_shm = get_boolean_resource ("useSHM", "Boolean");
#endif /* !HAVE_XSHM_EXTENSION */
mi.pause = 100000000;
orig_pause = mi.pause;
+ /* If this hack uses fonts (meaning, mentioned "font" in DEFAULTS)
+ then load it. */
+ {
+ char *name = get_string_resource ("font", "Font");
+ if (name)
+ {
+ XFontStruct *f = XLoadQueryFont (dpy, name);
+ const char *def1 = "-*-times-bold-r-normal-*-180-*";
+ const char *def2 = "fixed";
+ if (!f)
+ {
+ fprintf (stderr, "%s: font %s does not exist, using %s\n",
+ progname, name, def1);
+ f = XLoadQueryFont (dpy, def1);
+ }
+ if (!f)
+ {
+ fprintf (stderr, "%s: font %s does not exist, using %s\n",
+ progname, def1, def2);
+ f = XLoadQueryFont (dpy, def2);
+ }
+ if (f) XSetFont (dpy, mi.gc, f->fid);
+ if (f) XFreeFont (dpy, f);
+ }
+ }
+
xlockmore_read_resources ();
XClearWindow (dpy, window);
do {
hack_draw (&mi);
XSync(dpy, False);
- screenhack_handle_events (dpy);
+ xlockmore_handle_events (&mi, hack_reshape, hack_handle_events);
if (mi.pause)
usleep(mi.pause);
mi.pause = orig_pause;