home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume10 / xlock / part01 / qix.c < prev    next >
C/C++ Source or Header  |  1990-12-07  |  5KB  |  164 lines

  1. #ifndef lint
  2. static char sccsid[] = "@(#)qix.c    23.7 90/10/28 XLOCK SMI";
  3. #endif
  4. /*-
  5.  * qix.c - The old standby vector swirl for the xlock X11 terminal locker.
  6.  *
  7.  * Copyright (c) 1989-90 by Sun Microsystems Inc.
  8.  *
  9.  * Permission to use, copy, modify, and distribute this software and its
  10.  * documentation for any purpose and without fee is hereby granted,
  11.  * provided that the above copyright notice appear in all copies and that
  12.  * both that copyright notice and this permission notice appear in
  13.  * supporting documentation.
  14.  *
  15.  * This file is provided AS IS with no warranties of any kind.  The author
  16.  * shall have no liability with respect to the infringement of copyrights,
  17.  * trade secrets or any patents by this file or any part thereof.  In no
  18.  * event will the author be liable for any lost revenue or profits or
  19.  * other special, indirect and consequential damages.
  20.  *
  21.  * Comments and additions should be sent to the author:
  22.  *
  23.  *               naughton@eng.sun.com
  24.  *
  25.  *               Patrick J. Naughton
  26.  *               MS 14-01
  27.  *               Windows and Graphics Group
  28.  *               Sun Microsystems, Inc.
  29.  *               2550 Garcia Ave
  30.  *               Mountain View, CA  94043
  31.  *
  32.  * Revision History:
  33.  * 29-Jul-90: support for multiple heads.
  34.  *          made check_bounds_?() a macro.
  35.  *          fixed initial parameter setup.
  36.  * 15-Dec-89: Fix for proper skipping of {White,Black}Pixel() in colors.
  37.  * 08-Oct-89: Fixed bug in memory allocation in initqix().
  38.  *          Moved seconds() to an extern.
  39.  * 23-Sep-89: Switch to random() and fixed bug w/ less than 4 lines.
  40.  * 20-Sep-89: Lint.
  41.  * 24-Mar-89: Written.
  42.  */
  43.  
  44. #include "xlock.h"
  45.  
  46. typedef struct {
  47.     int         x;
  48.     int         y;
  49. }           point;
  50.  
  51. typedef struct {
  52.     int         pix;
  53.     long        startTime;
  54.     int         first;
  55.     int         last;
  56.     int         dx1;
  57.     int         dy1;
  58.     int         dx2;
  59.     int         dy2;
  60.     int         x1;
  61.     int         y1;
  62.     int         x2;
  63.     int         y2;
  64.     int         offset;
  65.     int         delta;
  66.     int         width;
  67.     int         height;
  68.     int         nlines;
  69.     point      *lineq;
  70. }           qixstruct;
  71.  
  72. static qixstruct qixs[MAXSCREENS];
  73.  
  74. void
  75. initqix(win)
  76.     Window      win;
  77. {
  78.     XWindowAttributes xgwa;
  79.     qixstruct  *qp = &qixs[screen];
  80.  
  81.     qp->startTime = seconds();
  82.     srandom(time((long *) 0));
  83.  
  84.     qp->nlines = (batchcount + 1) * 2;
  85.     if (!qp->lineq) {
  86.     qp->lineq = (point *) malloc(qp->nlines * sizeof(point));
  87.     memset(qp->lineq, '\0', qp->nlines * sizeof(point));
  88.     }
  89.  
  90.     XGetWindowAttributes(dsp, win, &xgwa);
  91.     qp->width = xgwa.width;
  92.     qp->height = xgwa.height;
  93.     qp->delta = 16;
  94.  
  95.     if (qp->width < 100) {    /* icon window */
  96.     qp->nlines /= 4;
  97.     qp->delta /= 4;
  98.     }
  99.     qp->offset = qp->delta / 3;
  100.     qp->last = 0;
  101.     qp->pix = 0;
  102.     qp->dx1 = random() % qp->delta + qp->offset;
  103.     qp->dy1 = random() % qp->delta + qp->offset;
  104.     qp->dx2 = random() % qp->delta + qp->offset;
  105.     qp->dy2 = random() % qp->delta + qp->offset;
  106.     qp->x1 = random() % qp->width;
  107.     qp->y1 = random() % qp->height;
  108.     qp->x2 = random() % qp->width;
  109.     qp->y2 = random() % qp->height;
  110.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  111.     XFillRectangle(dsp, win, Scr[screen].gc, 0, 0, qp->width, qp->height);
  112. }
  113.  
  114. #define check_bounds(qp, val, del, max)                \
  115. {                                \
  116.     if ((val) < 0) {                        \
  117.     *(del) = (random() % (qp)->delta) + (qp)->offset;    \
  118.     } else if ((val) > (max)) {                    \
  119.     *(del) = -(random() % (qp)->delta) - (qp)->offset;    \
  120.     }                                \
  121. }
  122.  
  123. void
  124. drawqix(win)
  125.     Window      win;
  126. {
  127.     qixstruct  *qp = &qixs[screen];
  128.  
  129.     qp->first = (qp->last + 2) % qp->nlines;
  130.  
  131.     qp->x1 += qp->dx1;
  132.     qp->y1 += qp->dy1;
  133.     qp->x2 += qp->dx2;
  134.     qp->y2 += qp->dy2;
  135.     check_bounds(qp, qp->x1, &qp->dx1, qp->width);
  136.     check_bounds(qp, qp->y1, &qp->dy1, qp->height);
  137.     check_bounds(qp, qp->x2, &qp->dx2, qp->width);
  138.     check_bounds(qp, qp->y2, &qp->dy2, qp->height);
  139.     XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
  140.     XDrawLine(dsp, win, Scr[screen].gc,
  141.           qp->lineq[qp->first].x, qp->lineq[qp->first].y,
  142.           qp->lineq[qp->first + 1].x, qp->lineq[qp->first + 1].y);
  143.     if (!mono && Scr[screen].npixels > 2) {
  144.     XSetForeground(dsp, Scr[screen].gc, Scr[screen].pixels[qp->pix]);
  145.     if (++qp->pix >= Scr[screen].npixels)
  146.         qp->pix = 0;
  147.     } else
  148.     XSetForeground(dsp, Scr[screen].gc, WhitePixel(dsp, screen));
  149.  
  150.     XDrawLine(dsp, win, Scr[screen].gc, qp->x1, qp->y1, qp->x2, qp->y2);
  151.  
  152.     qp->lineq[qp->last].x = qp->x1;
  153.     qp->lineq[qp->last].y = qp->y1;
  154.     qp->last++;
  155.     if (qp->last >= qp->nlines)
  156.     qp->last = 0;
  157.  
  158.     qp->lineq[qp->last].x = qp->x2;
  159.     qp->lineq[qp->last].y = qp->y2;
  160.     qp->last++;
  161.     if (qp->last >= qp->nlines)
  162.     qp->last = 0;
  163. }
  164.