X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fflag.c;h=1cd68094b7ec6e641616a71488f6b8218b4fc785;hb=7b34ef992563d7bcbb64cc5597dc45fa24470b05;hp=8d1ab15503ed094bb375cf00d0cab4700773a970;hpb=96a411663168b0ba5432b407a83be55f3df0c802;p=xscreensaver diff --git a/hacks/flag.c b/hacks/flag.c index 8d1ab155..1cd68094 100644 --- a/hacks/flag.c +++ b/hacks/flag.c @@ -32,24 +32,29 @@ static const char sccsid[] = "@(#)flag.c 4.02 97/04/01 xlockmore"; * 01-May-96: written. */ +#ifdef HAVE_COCOA +# define DEF_FONT "Monaco 15" +#else +# define DEF_FONT "fixed" +#endif + #ifdef STANDALONE -# define PROGCLASS "Flag" -# define HACK_INIT init_flag -# define HACK_DRAW draw_flag -# define flag_opts xlockmore_opts -# define DEFAULTS "*delay: 50000 \n" \ - "*cycles: 1000 \n" \ - "*size: -7 \n" \ - "*ncolors: 200 \n" +# define DEFAULTS "*delay: 50000 \n" \ + "*cycles: 1000 \n" \ + "*size: -7 \n" \ + "*ncolors: 200 \n" \ + "*bitmap: \n" \ + "*font: " DEF_FONT "\n" \ + "*text: \n" \ + "*fpsSolid: true \n" \ + # define BRIGHT_COLORS # define UNIFORM_COLORS -# define DEF_FONT "-*-helvetica-bold-r-*-240-*" -# define DEF_BITMAP "" -# define DEF_TEXT "" +# define reshape_flag 0 +# define flag_handle_event 0 # include "xlockmore.h" /* from the xscreensaver distribution */ #include "xpm-pixmap.h" - #include "images/bob.xbm" #else /* !STANDALONE */ @@ -71,7 +76,7 @@ static XrmOptionDescRec opts[] = #endif /* STANDALONE */ -ModeSpecOpt flag_opts = { +ENTRYPOINT ModeSpecOpt flag_opts = { #ifdef STANDALONE 2, opts, 0, NULL, NULL #else /* !STANDALONE */ @@ -79,9 +84,6 @@ ModeSpecOpt flag_opts = { #endif /* STANDALONE */ }; -#include -#include - #define MINSIZE 1 #define MAXSCALE 8 #define MINSCALE 2 @@ -103,6 +105,7 @@ typedef struct { int timer; int initialized; int stab[ANGLES]; + Bool dbufp; Pixmap cache; int width, height; int pointsize; @@ -165,6 +168,11 @@ affiche(ModeInfo * mi) XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (y + x + fp->sidx + fp->startcolor) % MI_NPIXELS(mi))); + if (fp->cache == MI_WINDOW(mi)) { /* not double-buffering */ + xp += fp->x_flag; + yp += fp->y_flag; + } + if (fp->pointsize <= 1) XDrawPoint(display, fp->cache, MI_GC(mi), xp, yp); else if (fp->pointsize < 6) @@ -183,8 +191,12 @@ make_flag_bits(ModeInfo *mi) { Display *dpy = MI_DISPLAY(mi); flagstruct *fp = &flags[MI_SCREEN(mi)]; - char *bitmap_name = get_string_resource ("bitmap", "Bitmap"); - char *text = get_string_resource ("text", "Text"); + char *bitmap_name = get_string_resource (dpy, "bitmap", "Bitmap"); + char *text = get_string_resource (dpy, "text", "Text"); + +#ifdef HAVE_COCOA + bitmap_name = 0; /* #### always use default */ +#endif /* If neither a bitmap nor text are specified, randomly select either the builtin bitmap or builtin text. */ @@ -222,7 +234,7 @@ make_flag_bits(ModeInfo *mi) else if (text && *text) { char *text2; - char *fn = get_string_resource ("font", "Font"); + char *fn = get_string_resource (dpy, "font", "Font"); char *def_fn = "fixed"; char *line, *token; int width, height; @@ -253,13 +265,42 @@ make_flag_bits(ModeInfo *mi) strlen(uts.sysname) + strlen(uts.version) + strlen(uts.release) + 10); -# ifdef _AIX +# if defined(_AIX) sprintf(text, "%s\n%s %s.%s", uts.nodename, uts.sysname, uts.version, uts.release); -# else /* !_AIX */ +# elif defined(__APPLE__) /* MacOS X + XDarwin */ + { + const char *file = + "/System/Library/CoreServices/SystemVersion.plist"; + FILE *f = fopen (file, "r"); + char *pbv = 0, *pn = 0, *puvv = 0; + if (f) { + char *s, buf[255]; + + while (fgets (buf, sizeof(buf)-1, f)) { +# define GRAB(S,V) \ + if (strstr(buf, S)) { \ + fgets (buf, sizeof(buf)-1, f); \ + if ((s = strchr (buf, '>'))) V = strdup(s+1); \ + if ((s = strchr (V, '<'))) *s = 0; \ + } + GRAB ("ProductName", pn) + GRAB ("ProductBuildVersion", pbv) + GRAB ("ProductUserVisibleVersion", puvv) +# undef GRAB + } + } + if (pbv) + sprintf (text, "%s\n%s\n%s", + uts.nodename, pn, puvv /*, uts.machine*/); + else + sprintf(text, "%s\n%s %s", + uts.nodename, uts.sysname, uts.release); + } +# else sprintf(text, "%s\n%s %s", uts.nodename, uts.sysname, uts.release); -# endif /* !_AIX */ +# endif /* special system types */ } #else /* !HAVE_UNAME */ # ifdef VMS @@ -341,7 +382,9 @@ make_flag_bits(ModeInfo *mi) fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, 1L, XYPixmap); XFreePixmap(dpy, bitmap); } - else + + + if (! fp->image) { char *bits = (char *) malloc (sizeof(bob_bits)); memcpy (bits, bob_bits, sizeof(bob_bits)); @@ -382,7 +425,7 @@ make_flag_bits(ModeInfo *mi) #endif /* !STANDALONE */ -void +ENTRYPOINT void init_flag(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); @@ -397,6 +440,7 @@ init_flag(ModeInfo * mi) fp = &flags[MI_SCREEN(mi)]; make_flag_bits(mi); + if (!fp->image) abort(); fp->width = MI_WIN_WIDTH(mi); fp->height = MI_WIN_HEIGHT(mi); @@ -415,9 +459,17 @@ init_flag(ModeInfo * mi) fp->sidx = fp->x_flag = fp->y_flag = 0; if (!fp->initialized) { + fp->dbufp = True; +# ifdef HAVE_COCOA /* Don't second-guess Quartz's double-buffering */ + fp->dbufp = False; +#endif fp->initialized = True; - if (!(fp->cache = XCreatePixmap(display, MI_WINDOW(mi), - MAXW(fp), MAXH(fp), MI_WIN_DEPTH(mi)))) + if (!fp->dbufp) + fp->cache = MI_WINDOW(mi); /* not double-buffering */ + else + if (!(fp->cache = XCreatePixmap(display, MI_WINDOW(mi), + MAXW(fp), MAXH(fp), + MI_WIN_DEPTH(mi)))) #ifdef STANDALONE exit(-1); #else /* !STANDALONE */ @@ -448,38 +500,39 @@ init_flag(ModeInfo * mi) XClearWindow(display, MI_WINDOW(mi)); } -void release_flag(ModeInfo * mi); +ENTRYPOINT void release_flag(ModeInfo * mi); -void +ENTRYPOINT void draw_flag(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); flagstruct *fp = &flags[MI_SCREEN(mi)]; - if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) { + if (!fp->image) abort(); + if (fp->cache == window) { /* not double-buffering */ + XClearWindow (display, window); + } else if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) { fp->size = MININITSIZE; /* fp->pointsize = MINPOINTSIZE; */ - XCopyArea(display, fp->cache, window, MI_GC(mi), - 0, 0, MINW(fp), MINH(fp), fp->x_flag, fp->y_flag); + XCopyArea(display, fp->cache, window, MI_GC(mi), + 0, 0, MINW(fp), MINH(fp), fp->x_flag, fp->y_flag); } else { if ((fp->size + fp->inctaille) > MAXSCALE) fp->inctaille = -fp->inctaille; if ((fp->size + fp->inctaille) < MINSCALE) fp->inctaille = -fp->inctaille; fp->size += fp->inctaille; - XCopyArea(display, fp->cache, window, MI_GC(mi), - 0, 0, MAXW(fp), MAXH(fp), fp->x_flag, fp->y_flag); + XCopyArea(display, fp->cache, window, MI_GC(mi), + 0, 0, MAXW(fp), MAXH(fp), fp->x_flag, fp->y_flag); } XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); XFillRectangle(display, fp->cache, MI_GC(mi), 0, 0, MAXW(fp), MAXH(fp)); - XFlush(display); affiche(mi); fp->sidx += 2; fp->sidx %= (ANGLES * MI_NPIXELS(mi)); - XFlush(display); fp->timer++; if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi))) { @@ -488,7 +541,7 @@ draw_flag(ModeInfo * mi) } } -void +ENTRYPOINT void release_flag(ModeInfo * mi) { if (flags != NULL) { @@ -496,7 +549,7 @@ release_flag(ModeInfo * mi) for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { - if (flags[screen].cache) + if (flags[screen].cache && flags[screen].dbufp) XFreePixmap(MI_DISPLAY(mi), flags[screen].cache); if (flags[screen].image) XDestroyImage(flags[screen].image); @@ -506,8 +559,10 @@ release_flag(ModeInfo * mi) } } -void +ENTRYPOINT void refresh_flag(ModeInfo * mi) { /* Do nothing, it will refresh by itself */ } + +XSCREENSAVER_MODULE ("Flag", flag)