diff options
Diffstat (limited to 'driver/splash.c')
-rw-r--r-- | driver/splash.c | 917 |
1 files changed, 0 insertions, 917 deletions
diff --git a/driver/splash.c b/driver/splash.c deleted file mode 100644 index b971ade..0000000 --- a/driver/splash.c +++ /dev/null @@ -1,917 +0,0 @@ -/* xscreensaver, Copyright (c) 1991-2018 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 - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <X11/Intrinsic.h> - -#include "xscreensaver.h" -#include "resources.h" -#include "font-retry.h" - -#undef MAX -#define MAX(a,b) ((a)>(b)?(a):(b)) - -void -draw_shaded_rectangle (Display *dpy, Window window, - int x, int y, - int width, int height, - int thickness, - unsigned long top_color, - unsigned long bottom_color) -{ - XPoint points[4]; - XGCValues gcv; - GC gc1, gc2; - if (thickness == 0) return; - - gcv.foreground = top_color; - gc1 = XCreateGC (dpy, window, GCForeground, &gcv); - gcv.foreground = bottom_color; - gc2 = XCreateGC (dpy, window, GCForeground, &gcv); - - points [0].x = x; - points [0].y = y; - points [1].x = x + width; - points [1].y = y; - points [2].x = x + width - thickness; - points [2].y = y + thickness; - points [3].x = x; - points [3].y = y + thickness; - XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin); - - points [0].x = x; - points [0].y = y + thickness; - points [1].x = x; - points [1].y = y + height; - points [2].x = x + thickness; - points [2].y = y + height - thickness; - points [3].x = x + thickness; - points [3].y = y + thickness; - XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin); - - points [0].x = x + width; - points [0].y = y; - points [1].x = x + width - thickness; - points [1].y = y + thickness; - points [2].x = x + width - thickness; - points [2].y = y + height - thickness; - points [3].x = x + width; - points [3].y = y + height - thickness; - XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin); - - points [0].x = x; - points [0].y = y + height; - points [1].x = x + width; - points [1].y = y + height; - points [2].x = x + width; - points [2].y = y + height - thickness; - points [3].x = x + thickness; - points [3].y = y + height - thickness; - XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin); - - XFreeGC (dpy, gc1); - XFreeGC (dpy, gc2); -} - - -int -string_width (XFontStruct *font, char *s) -{ - return XTextWidth(font, s, strlen(s)); -} - - -static void update_splash_window (saver_info *si); -static void draw_splash_window (saver_info *si); -static void destroy_splash_window (saver_info *si); -static void unsplash_timer (XtPointer closure, XtIntervalId *id); - -static void do_demo (saver_screen_info *ssi); -#ifdef PREFS_BUTTON -static void do_prefs (saver_screen_info *ssi); -#endif /* PREFS_BUTTON */ -static void do_help (saver_screen_info *ssi); - - -XFontStruct * -splash_load_font (Display *dpy, char *name, char *class) -{ - char *s = get_string_resource (dpy, name, class); - XFontStruct *f; - if (!s || !*s) - s = "-*-helvetica-bold-r-*-*-*-140-*-*-*-*-*-*"; - f = load_font_retry (dpy, s); - if (!f) abort(); - return f; -} - - -struct splash_dialog_data { - - saver_screen_info *prompt_screen; - XtIntervalId timer; - - Dimension width; - Dimension height; - - char *heading_label; - char *body_label; - char *body2_label; - char *body3_label; - char *body4_label; - char *demo_label; -#ifdef PREFS_BUTTON - char *prefs_label; -#endif /* PREFS_BUTTON */ - char *help_label; - - XFontStruct *heading_font; - XFontStruct *body_font; - XFontStruct *button_font; - - Pixel foreground; - Pixel background; - Pixel border; - Pixel button_foreground; - Pixel button_background; - Pixel shadow_top; - Pixel shadow_bottom; - - Dimension logo_width; - Dimension logo_height; - Dimension internal_border; - Dimension shadow_width; - - Dimension button_width, button_height; - Dimension demo_button_x, demo_button_y; -#ifdef PREFS_BUTTON - Dimension prefs_button_x, prefs_button_y; -#endif /* PREFS_BUTTON */ - Dimension help_button_x, help_button_y; - - Pixmap logo_pixmap; - Pixmap logo_clipmask; - int logo_npixels; - unsigned long *logo_pixels; - - int pressed; -}; - - -void -make_splash_dialog (saver_info *si) -{ - saver_preferences *p = &si->prefs; - int x, y, bw; - XSetWindowAttributes attrs; - unsigned long attrmask = 0; - splash_dialog_data *sp; - saver_screen_info *ssi; - Colormap cmap; - - Bool whyne = senesculent_p (); - - if (whyne) - { - /* If locking is not enabled, make sure they see the message. */ - if (!p->lock_p) - { - si->prefs.splash_p = True; - if (si->prefs.splash_duration < 5000) - si->prefs.splash_duration = 5000; - } - si->prefs.splash_duration += 3000; - } - - if (si->sp_data) - return; - if (!si->prefs.splash_p || - si->prefs.splash_duration <= 0) - return; - - ssi = &si->screens[mouse_screen (si)]; - - if (!ssi || !ssi->screen) - return; /* WTF? Trying to splash while no screens connected? */ - - cmap = DefaultColormapOfScreen (ssi->screen); - - sp = (splash_dialog_data *) calloc (1, sizeof(*sp)); - sp->prompt_screen = ssi; - - sp->heading_label = get_string_resource (si->dpy, - "splash.heading.label", - "Dialog.Label.Label"); - sp->body_label = get_string_resource (si->dpy, - "splash.body.label", - "Dialog.Label.Label"); - sp->body2_label = get_string_resource (si->dpy, - "splash.body2.label", - "Dialog.Label.Label"); - sp->demo_label = get_string_resource (si->dpy, - "splash.demo.label", - "Dialog.Button.Label"); -#ifdef PREFS_BUTTON - sp->prefs_label = get_string_resource (si->dpy, - "splash.prefs.label", - "Dialog.Button.Label"); -#endif /* PREFS_BUTTON */ - sp->help_label = get_string_resource (si->dpy, - "splash.help.label", - "Dialog.Button.Label"); - - - - if (whyne) - { - sp->body3_label = strdup("WARNING: This version is very old!"); - sp->body4_label = strdup("Please upgrade!"); - } - - if (!sp->heading_label) - sp->heading_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY"); - if (!sp->body_label) - sp->body_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY"); - if (!sp->body2_label) - sp->body2_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY"); - if (!sp->demo_label) sp->demo_label = strdup("ERROR"); -#ifdef PREFS_BUTTON - if (!sp->prefs_label) sp->prefs_label = strdup("ERROR"); -#endif /* PREFS_BUTTON */ - if (!sp->help_label) sp->help_label = strdup("ERROR"); - - /* Put the version number in the label. */ - { - char *s = (char *) malloc (strlen(sp->heading_label) + 20); - sprintf(s, sp->heading_label, si->version); - free (sp->heading_label); - sp->heading_label = s; - } - - sp->heading_font = - splash_load_font (si->dpy, "splash.headingFont", "Dialog.Font"); - sp->body_font = - splash_load_font (si->dpy, "splash.bodyFont", "Dialog.Font"); - sp->button_font = - splash_load_font (si->dpy, "splash.buttonFont", "Dialog.Font"); - - sp->foreground = get_pixel_resource (si->dpy, cmap, - "splash.foreground", - "Dialog.Foreground"); - sp->background = get_pixel_resource (si->dpy, cmap, - "splash.background", - "Dialog.Background"); - sp->border = get_pixel_resource (si->dpy, cmap, - "splash.borderColor", - "Dialog.borderColor"); - - if (sp->foreground == sp->background) - { - /* Make sure the error messages show up. */ - sp->foreground = BlackPixelOfScreen (ssi->screen); - sp->background = WhitePixelOfScreen (ssi->screen); - } - - sp->button_foreground = get_pixel_resource (si->dpy, cmap, - "splash.Button.foreground", - "Dialog.Button.Foreground"); - sp->button_background = get_pixel_resource (si->dpy, cmap, - "splash.Button.background", - "Dialog.Button.Background"); - sp->shadow_top = get_pixel_resource (si->dpy, cmap, - "splash.topShadowColor", - "Dialog.Foreground"); - sp->shadow_bottom = get_pixel_resource (si->dpy, cmap, - "splash.bottomShadowColor", - "Dialog.Background"); - - sp->logo_width = get_integer_resource (si->dpy, - "splash.logo.width", - "Dialog.Logo.Width"); - sp->logo_height = get_integer_resource (si->dpy, - "splash.logo.height", - "Dialog.Logo.Height"); - sp->internal_border = get_integer_resource (si->dpy, - "splash.internalBorderWidth", - "Dialog.InternalBorderWidth"); - sp->shadow_width = get_integer_resource (si->dpy, - "splash.shadowThickness", - "Dialog.ShadowThickness"); - - if (sp->logo_width == 0) sp->logo_width = 150; - if (sp->logo_height == 0) sp->logo_height = 150; - if (sp->internal_border == 0) sp->internal_border = 15; - if (sp->shadow_width == 0) sp->shadow_width = 4; - - { - int direction, ascent, descent; - XCharStruct overall; - - sp->width = 0; - sp->height = 0; - - /* Measure the heading_label. */ - XTextExtents (sp->heading_font, - sp->heading_label, strlen(sp->heading_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += ascent + descent; - - /* Measure the body_label. */ - XTextExtents (sp->body_font, - sp->body_label, strlen(sp->body_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += ascent + descent; - - /* Measure the body2_label. */ - XTextExtents (sp->body_font, - sp->body2_label, strlen(sp->body2_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += ascent + descent; - - /* Measure the optional body3_label. */ - if (sp->body3_label) - { - XTextExtents (sp->heading_font, - sp->body3_label, strlen(sp->body3_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - XTextExtents (sp->heading_font, - sp->body4_label, strlen(sp->body4_label), - &direction, &ascent, &descent, &overall); - if (overall.width > sp->width) sp->width = overall.width; - sp->height += (ascent + descent) * 5; - } - - { - Dimension w2 = 0, w3 = 0, w4 = 0; - Dimension h2 = 0, h3 = 0, h4 = 0; - - /* Measure the Demo button. */ - XTextExtents (sp->button_font, - sp->demo_label, strlen(sp->demo_label), - &direction, &ascent, &descent, &overall); - w2 = overall.width; - h2 = ascent + descent; - -#ifdef PREFS_BUTTON - /* Measure the Prefs button. */ - XTextExtents (sp->button_font, - sp->prefs_label, strlen(sp->prefs_label), - &direction, &ascent, &descent, &overall); - w3 = overall.width; - h3 = ascent + descent; -#else /* !PREFS_BUTTON */ - w3 = 0; - h3 = 0; -#endif /* !PREFS_BUTTON */ - - /* Measure the Help button. */ - XTextExtents (sp->button_font, - sp->help_label, strlen(sp->help_label), - &direction, &ascent, &descent, &overall); - w4 = overall.width; - h4 = ascent + descent; - - w2 = MAX(w2, w3); w2 = MAX(w2, w4); - h2 = MAX(h2, h3); h2 = MAX(h2, h4); - - /* Add some horizontal padding inside the buttons. */ - w2 += ascent; - - w2 += ((ascent + descent) / 2) + (sp->shadow_width * 2); - h2 += ((ascent + descent) / 2) + (sp->shadow_width * 2); - - sp->button_width = w2; - sp->button_height = h2; - -#ifdef PREFS_BUTTON - w2 *= 3; -#else /* !PREFS_BUTTON */ - w2 *= 2; -#endif /* !PREFS_BUTTON */ - - w2 += ((ascent + descent) * 2); /* for space between buttons */ - - if (w2 > sp->width) sp->width = w2; - sp->height += h2; - } - - sp->width += (sp->internal_border * 2); - sp->height += (sp->internal_border * 3); - - if (sp->logo_height > sp->height) - sp->height = sp->logo_height; - else if (sp->height > sp->logo_height) - sp->logo_height = sp->height; - - sp->logo_width = sp->logo_height; - - sp->width += sp->logo_width; - } - - attrmask |= CWOverrideRedirect; attrs.override_redirect = True; - attrmask |= CWEventMask; - attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask); - - { - int sx = 0, sy = 0, w, h; - - x = ssi->x; - y = ssi->y; - w = ssi->width; - h = ssi->height; - if (si->prefs.debug_p) w /= 2; - x = sx + (((w + sp->width) / 2) - sp->width); - y = sy + (((h + sp->height) / 2) - sp->height); - if (x < sx) x = sx; - if (y < sy) y = sy; - } - - bw = get_integer_resource (si->dpy, - "splash.borderWidth", - "Dialog.BorderWidth"); - - si->splash_dialog = - XCreateWindow (si->dpy, - RootWindowOfScreen(ssi->screen), - x, y, sp->width, sp->height, bw, - DefaultDepthOfScreen (ssi->screen), InputOutput, - DefaultVisualOfScreen(ssi->screen), - attrmask, &attrs); - XSetWindowBackground (si->dpy, si->splash_dialog, sp->background); - XSetWindowBorder (si->dpy, si->splash_dialog, sp->border); - - - sp->logo_pixmap = xscreensaver_logo (ssi->screen, - /* same visual as si->splash_dialog */ - DefaultVisualOfScreen (ssi->screen), - si->splash_dialog, cmap, - sp->background, - &sp->logo_pixels, &sp->logo_npixels, - &sp->logo_clipmask, True); - - XMapRaised (si->dpy, si->splash_dialog); - XSync (si->dpy, False); - - si->sp_data = sp; - - sp->timer = XtAppAddTimeOut (si->app, si->prefs.splash_duration, - unsplash_timer, (XtPointer) si); - - draw_splash_window (si); - XSync (si->dpy, False); -} - - -static void -draw_splash_window (saver_info *si) -{ - splash_dialog_data *sp = si->sp_data; - XGCValues gcv; - GC gc1, gc2; - int vspacing, height; - int x1, x2, x3, y1, y2; - int sw; - -#ifdef PREFS_BUTTON - int hspacing; - int nbuttons = 3; -#endif /* !PREFS_BUTTON */ - - height = (sp->heading_font->ascent + sp->heading_font->descent + - sp->body_font->ascent + sp->body_font->descent + - sp->body_font->ascent + sp->body_font->descent + - sp->button_font->ascent + sp->button_font->descent); - vspacing = ((sp->height - - (4 * sp->shadow_width) - - (2 * sp->internal_border) - - height) / 5); - if (vspacing < 0) vspacing = 0; - if (vspacing > (sp->heading_font->ascent * 2)) - vspacing = (sp->heading_font->ascent * 2); - - gcv.foreground = sp->foreground; - gc1 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv); - gc2 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv); - x1 = sp->logo_width; - x3 = sp->width - (sp->shadow_width * 2); - y1 = sp->internal_border; - - /* top heading - */ - XSetFont (si->dpy, gc1, sp->heading_font->fid); - sw = string_width (sp->heading_font, sp->heading_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - y1 += sp->heading_font->ascent; - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->heading_label, strlen(sp->heading_label)); - y1 += sp->heading_font->descent; - - /* text below top heading - */ - XSetFont (si->dpy, gc1, sp->body_font->fid); - y1 += vspacing + sp->body_font->ascent; - sw = string_width (sp->body_font, sp->body_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body_label, strlen(sp->body_label)); - y1 += sp->body_font->descent; - - y1 += sp->body_font->ascent; - sw = string_width (sp->body_font, sp->body2_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body2_label, strlen(sp->body2_label)); - y1 += sp->body_font->descent; - - if (sp->body3_label) - { - XSetFont (si->dpy, gc1, sp->heading_font->fid); - y1 += sp->heading_font->ascent + sp->heading_font->descent; - y1 += sp->heading_font->ascent; - sw = string_width (sp->heading_font, sp->body3_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body3_label, strlen(sp->body3_label)); - y1 += sp->heading_font->descent + sp->heading_font->ascent; - sw = string_width (sp->heading_font, sp->body4_label); - x2 = (x1 + ((x3 - x1 - sw) / 2)); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1, - sp->body4_label, strlen(sp->body4_label)); - y1 += sp->heading_font->descent; - XSetFont (si->dpy, gc1, sp->body_font->fid); - } - - /* The buttons - */ - XSetForeground (si->dpy, gc1, sp->button_foreground); - XSetForeground (si->dpy, gc2, sp->button_background); - -/* y1 += (vspacing * 2);*/ - y1 = sp->height - sp->internal_border - sp->button_height; - - x1 += sp->internal_border; - y2 = (y1 + ((sp->button_height - - (sp->button_font->ascent + sp->button_font->descent)) - / 2) - + sp->button_font->ascent); -#ifdef PREFS_BUTTON - hspacing = ((sp->width - x1 - (sp->shadow_width * 2) - - sp->internal_border - (sp->button_width * nbuttons)) - / 2); -#endif - - x2 = x1 + ((sp->button_width - string_width(sp->button_font, sp->demo_label)) - / 2); - XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1, - sp->button_width, sp->button_height); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2, - sp->demo_label, strlen(sp->demo_label)); - sp->demo_button_x = x1; - sp->demo_button_y = y1; - -#ifdef PREFS_BUTTON - x1 += hspacing + sp->button_width; - x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->prefs_label)) - / 2); - XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1, - sp->button_width, sp->button_height); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2, - sp->prefs_label, strlen(sp->prefs_label)); - sp->prefs_button_x = x1; - sp->prefs_button_y = y1; -#endif /* PREFS_BUTTON */ - -#ifdef PREFS_BUTTON - x1 += hspacing + sp->button_width; -#else /* !PREFS_BUTTON */ - x1 = (sp->width - sp->button_width - - sp->internal_border - (sp->shadow_width * 2)); -#endif /* !PREFS_BUTTON */ - - x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->help_label)) - / 2); - XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1, - sp->button_width, sp->button_height); - XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2, - sp->help_label, strlen(sp->help_label)); - sp->help_button_x = x1; - sp->help_button_y = y1; - - - /* The logo - */ - x1 = sp->shadow_width * 6; - y1 = sp->shadow_width * 6; - x2 = sp->logo_width - (sp->shadow_width * 12); - y2 = sp->logo_height - (sp->shadow_width * 12); - - if (sp->logo_pixmap) - { - Window root; - int x, y; - unsigned int w, h, bw, d; - XGetGeometry (si->dpy, sp->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d); - XSetForeground (si->dpy, gc1, sp->foreground); - XSetBackground (si->dpy, gc1, sp->background); - XSetClipMask (si->dpy, gc1, sp->logo_clipmask); - XSetClipOrigin (si->dpy, gc1, x1 + ((x2 - (int)w) /2), y1 + ((y2 - (int)h) / 2)); - if (d == 1) - XCopyPlane (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1, - 0, 0, w, h, - x1 + ((x2 - (int)w) / 2), - y1 + ((y2 - (int)h) / 2), - 1); - else - XCopyArea (si->dpy, sp->logo_pixmap, si->splash_dialog, gc1, - 0, 0, w, h, - x1 + ((x2 - (int)w) / 2), - y1 + ((y2 - (int)h) / 2)); - } - - /* Solid border inside the logo box. */ -#if 0 - XSetForeground (si->dpy, gc1, sp->foreground); - XDrawRectangle (si->dpy, si->splash_dialog, gc1, x1, y1, x2-1, y2-1); -#endif - - /* The shadow around the logo - */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->shadow_width * 4, - sp->shadow_width * 4, - sp->logo_width - (sp->shadow_width * 8), - sp->logo_height - (sp->shadow_width * 8), - sp->shadow_width, - sp->shadow_bottom, sp->shadow_top); - - /* The shadow around the whole window - */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - 0, 0, sp->width, sp->height, sp->shadow_width, - sp->shadow_top, sp->shadow_bottom); - - XFreeGC (si->dpy, gc1); - XFreeGC (si->dpy, gc2); - - update_splash_window (si); -} - - -static void -update_splash_window (saver_info *si) -{ - splash_dialog_data *sp = si->sp_data; - int pressed; - if (!sp) return; - pressed = sp->pressed; - - /* The shadows around the buttons - */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->demo_button_x, sp->demo_button_y, - sp->button_width, sp->button_height, sp->shadow_width, - (pressed == 1 ? sp->shadow_bottom : sp->shadow_top), - (pressed == 1 ? sp->shadow_top : sp->shadow_bottom)); -#ifdef PREFS_BUTTON - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->prefs_button_x, sp->prefs_button_y, - sp->button_width, sp->button_height, sp->shadow_width, - (pressed == 2 ? sp->shadow_bottom : sp->shadow_top), - (pressed == 2 ? sp->shadow_top : sp->shadow_bottom)); -#endif /* PREFS_BUTTON */ - draw_shaded_rectangle (si->dpy, si->splash_dialog, - sp->help_button_x, sp->help_button_y, - sp->button_width, sp->button_height, sp->shadow_width, - (pressed == 3 ? sp->shadow_bottom : sp->shadow_top), - (pressed == 3 ? sp->shadow_top : sp->shadow_bottom)); -} - -static void -destroy_splash_window (saver_info *si) -{ - splash_dialog_data *sp = si->sp_data; - saver_screen_info *ssi = sp->prompt_screen; - Colormap cmap = DefaultColormapOfScreen (ssi->screen); - Pixel black = BlackPixelOfScreen (ssi->screen); - Pixel white = WhitePixelOfScreen (ssi->screen); - - if (sp->timer) - XtRemoveTimeOut (sp->timer); - - if (si->splash_dialog) - { - XDestroyWindow (si->dpy, si->splash_dialog); - si->splash_dialog = 0; - } - - if (sp->heading_label) free (sp->heading_label); - if (sp->body_label) free (sp->body_label); - if (sp->body2_label) free (sp->body2_label); - if (sp->body3_label) free (sp->body3_label); - if (sp->body4_label) free (sp->body4_label); - if (sp->demo_label) free (sp->demo_label); -#ifdef PREFS_BUTTON - if (sp->prefs_label) free (sp->prefs_label); -#endif /* PREFS_BUTTON */ - if (sp->help_label) free (sp->help_label); - - if (sp->heading_font) XFreeFont (si->dpy, sp->heading_font); - if (sp->body_font) XFreeFont (si->dpy, sp->body_font); - if (sp->button_font) XFreeFont (si->dpy, sp->button_font); - - if (sp->foreground != black && sp->foreground != white) - XFreeColors (si->dpy, cmap, &sp->foreground, 1, 0L); - if (sp->background != black && sp->background != white) - XFreeColors (si->dpy, cmap, &sp->background, 1, 0L); - if (sp->button_foreground != black && sp->button_foreground != white) - XFreeColors (si->dpy, cmap, &sp->button_foreground, 1, 0L); - if (sp->button_background != black && sp->button_background != white) - XFreeColors (si->dpy, cmap, &sp->button_background, 1, 0L); - if (sp->shadow_top != black && sp->shadow_top != white) - XFreeColors (si->dpy, cmap, &sp->shadow_top, 1, 0L); - if (sp->shadow_bottom != black && sp->shadow_bottom != white) - XFreeColors (si->dpy, cmap, &sp->shadow_bottom, 1, 0L); - - if (sp->logo_pixmap) - XFreePixmap (si->dpy, sp->logo_pixmap); - if (sp->logo_clipmask) - XFreePixmap (si->dpy, sp->logo_clipmask); - if (sp->logo_pixels) - { - if (sp->logo_npixels) - XFreeColors (si->dpy, cmap, sp->logo_pixels, sp->logo_npixels, 0L); - free (sp->logo_pixels); - sp->logo_pixels = 0; - sp->logo_npixels = 0; - } - - memset (sp, 0, sizeof(*sp)); - free (sp); - si->sp_data = 0; -} - -void -handle_splash_event (saver_info *si, XEvent *event) -{ - splash_dialog_data *sp = si->sp_data; - saver_screen_info *ssi; - int which = 0; - if (!sp) return; - ssi = sp->prompt_screen; - - switch (event->xany.type) - { - case Expose: - draw_splash_window (si); - break; - - case ButtonPress: case ButtonRelease: - - if (event->xbutton.x >= sp->demo_button_x && - event->xbutton.x < sp->demo_button_x + sp->button_width && - event->xbutton.y >= sp->demo_button_y && - event->xbutton.y < sp->demo_button_y + sp->button_height) - which = 1; - -#ifdef PREFS_BUTTON - else if (event->xbutton.x >= sp->prefs_button_x && - event->xbutton.x < sp->prefs_button_x + sp->button_width && - event->xbutton.y >= sp->prefs_button_y && - event->xbutton.y < sp->prefs_button_y + sp->button_height) - which = 2; -#endif /* PREFS_BUTTON */ - - else if (event->xbutton.x >= sp->help_button_x && - event->xbutton.x < sp->help_button_x + sp->button_width && - event->xbutton.y >= sp->help_button_y && - event->xbutton.y < sp->help_button_y + sp->button_height) - which = 3; - - if (event->xany.type == ButtonPress) - { - sp->pressed = which; - update_splash_window (si); - if (which == 0) - XBell (si->dpy, False); - } - else if (event->xany.type == ButtonRelease) - { - if (which && sp->pressed == which) - { - destroy_splash_window (si); - sp = si->sp_data; - switch (which) - { - case 1: do_demo (ssi); break; -#ifdef PREFS_BUTTON - case 2: do_prefs (ssi); break; -#endif /* PREFS_BUTTON */ - case 3: do_help (ssi); break; - default: abort(); - } - } - else if (which == 0 && sp->pressed == 0) - { - /* click and release on the window but not in a button: - treat that as "dismiss the splash dialog." */ - destroy_splash_window (si); - sp = si->sp_data; - } - if (sp) sp->pressed = 0; - update_splash_window (si); - } - break; - - default: - break; - } -} - -static void -unsplash_timer (XtPointer closure, XtIntervalId *id) -{ - saver_info *si = (saver_info *) closure; - if (si && si->sp_data) - destroy_splash_window (si); -} - - -/* Button callbacks */ - -#ifdef VMS -# define pid_t int -# define fork vfork -#endif /* VMS */ - - -static void -do_demo (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - const char *cmd = p->demo_command; - - if (cmd && *cmd) - fork_and_exec (ssi, cmd); - else - fprintf (stderr, "%s: no demo-mode command has been specified.\n", - blurb()); -} - -#ifdef PREFS_BUTTON -static void -do_prefs (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - const char *cmd = p->prefs_command; - - if (cmd && *cmd) - fork_and_exec (ssi, cmd); - else - fprintf (stderr, "%s: no preferences command has been specified.\n", - blurb()); -} -#endif /* PREFS_BUTTON */ - -static void -do_help (saver_screen_info *ssi) -{ - saver_info *si = ssi->global; - saver_preferences *p = &si->prefs; - char *help_command = 0; - - if (!p->load_url_command || !*p->load_url_command) - { - fprintf (stderr, "%s: no URL command has been specified.\n", blurb()); - return; - } - if (!p->help_url || !*p->help_url) - { - fprintf (stderr, "%s: no Help URL has been specified.\n", blurb()); - return; - } - - help_command = (char *) malloc (strlen (p->load_url_command) + - (strlen (p->help_url) * 4) + 10); - sprintf (help_command, p->load_url_command, - p->help_url, p->help_url, p->help_url, p->help_url); - - fork_and_exec (ssi, help_command); - free (help_command); -} |