home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume8 / chaos / part07 < prev    next >
Internet Message Format  |  1990-08-20  |  57KB

  1. Path: uunet!cs.utexas.edu!sun-barr!newstop!sun!uunet.UU.NET
  2. From: balr!panasun!ken@uunet.UU.NET (Ken Marks (x2425))
  3. Newsgroups: comp.sources.x
  4. Subject: v08i083: chaos, Part07/10
  5. Message-ID: <140961@sun.Eng.Sun.COM>
  6. Date: 20 Aug 90 18:04:04 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2102
  9. Approved: argv@sun.com
  10.  
  11. Submitted-by: balr!panasun!ken@uunet.UU.NET (Ken Marks (x2425))
  12. Posting-number: Volume 8, Issue 83
  13. Archive-name: chaos/part07
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 7 (of 10)."
  22. # Contents:  common/colormap.c drone/mandelbrot.c master/chaos.man
  23. #   master/fileDb.c master/settingsDb.c widgets/Push.c
  24. # Wrapped by ken@panasun on Mon Jul 30 14:59:50 1990
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'common/colormap.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'common/colormap.c'\"
  28. else
  29. echo shar: Extracting \"'common/colormap.c'\" \(8780 characters\)
  30. sed "s/^X//" >'common/colormap.c' <<'END_OF_FILE'
  31. X/*
  32. X * Copyright (c) Ken W. Marks 1989, 1990.
  33. X */
  34. X
  35. X#include <stdio.h>
  36. X#include <fcntl.h>
  37. X#include <math.h>
  38. X#include <X11/IntrinsicP.h>
  39. X#include <X11/StringDefs.h>
  40. X#include <Chaos.h>
  41. X#include <Colormap.h>
  42. X
  43. Xstatic unsigned char red[NUM_COLORS], green[NUM_COLORS], blue[NUM_COLORS];
  44. Xstatic XColor colorcell_defs[NUM_COLORS];
  45. Xstatic char *default_filename = "default.map";
  46. X
  47. Xvoid GetReservedColors(dpy, screen)
  48. XDisplay *dpy;
  49. XScreen *screen;
  50. X{
  51. X    int ii;
  52. X
  53. X    for (ii = 0; ii < NUM_RESERVED; ++ii)
  54. X    colorcell_defs[ii].pixel = ii;
  55. X
  56. X    XQueryColors(dpy, DefaultColormapOfScreen(screen), colorcell_defs,
  57. X      NUM_RESERVED);
  58. X
  59. X    for (ii = 0; ii < NUM_RESERVED; ++ii)
  60. X    {
  61. X    red[ii] = colorcell_defs[ii].red & 0xff;
  62. X    green[ii] = colorcell_defs[ii].green & 0xff;
  63. X    blue[ii] = colorcell_defs[ii].blue & 0xff;
  64. X    }
  65. X}
  66. X
  67. X
  68. XColormap CreateColormap(dpy, screen, window)
  69. XDisplay *dpy;
  70. XScreen *screen;
  71. XWindow window;
  72. X{
  73. X    Colormap colormap;
  74. X    XSetWindowAttributes attributes;
  75. X
  76. X    colormap = XCreateColormap(dpy, window, DefaultVisualOfScreen(screen),
  77. X      AllocAll);
  78. X    StoreColormap(dpy, colormap);
  79. X
  80. X    attributes.colormap = colormap;
  81. X    XChangeWindowAttributes(dpy, window, CWColormap, &attributes);
  82. X
  83. X    return (colormap);
  84. X}
  85. X
  86. X
  87. Xvoid StoreColormap(dpy, colormap)
  88. XDisplay *dpy;
  89. XColormap colormap;
  90. X{
  91. X    int ii;
  92. X
  93. X    for (ii = 0; ii < NUM_COLORS; ii++)
  94. X    {
  95. X    colorcell_defs[ii].pixel = ii;
  96. X    colorcell_defs[ii].red = red[ii] | red[ii] << 8;
  97. X    colorcell_defs[ii].green = green[ii] | green[ii] << 8;
  98. X    colorcell_defs[ii].blue = blue[ii] | blue[ii] << 8;
  99. X    colorcell_defs[ii].flags = DoRed | DoGreen | DoBlue;
  100. X    }
  101. X
  102. X    XStoreColors(dpy, colormap, colorcell_defs, NUM_COLORS);
  103. X}
  104. X
  105. X
  106. Xvoid RotateColormap(dpy, colormap, rotation)
  107. XDisplay *dpy;
  108. XColormap colormap;
  109. XRotation rotation;
  110. X{
  111. X    register int ii;
  112. X    unsigned long temp;
  113. X
  114. X    if (rotation == forward)
  115. X    {
  116. X    temp = colorcell_defs[NUM_RESERVED].pixel;
  117. X    for (ii = NUM_RESERVED; ii < NUM_COLORS - 1; ii++)
  118. X    {
  119. X        colorcell_defs[ii].pixel = colorcell_defs[ii + 1].pixel;
  120. X    }
  121. X    colorcell_defs[NUM_COLORS - 1].pixel = temp;
  122. X    }
  123. X    else if (rotation == backward)
  124. X    {
  125. X    temp = colorcell_defs[NUM_COLORS - 1].pixel;
  126. X    for (ii = NUM_COLORS - 1; ii > NUM_RESERVED; ii--)
  127. X    {
  128. X        colorcell_defs[ii].pixel = colorcell_defs[ii - 1].pixel;
  129. X    }
  130. X    colorcell_defs[NUM_RESERVED].pixel = temp;
  131. X    }
  132. X    else
  133. X    {
  134. X    eprintf("Invalid rotation specified\n");
  135. X    abort();
  136. X    }
  137. X    XStoreColors(dpy, colormap, colorcell_defs, NUM_COLORS);
  138. X}
  139. X
  140. X
  141. Xint GetColormapAlignment()
  142. X{
  143. X
  144. X    return (colorcell_defs[NUM_RESERVED].pixel);
  145. X}
  146. X
  147. X
  148. Xvoid AlignColormap(dpy, colormap, pixel)
  149. XDisplay *dpy;
  150. XColormap colormap;
  151. Xint pixel;
  152. X{
  153. X    register int ii;
  154. X
  155. X    for (ii = NUM_RESERVED; ii < NUM_COLORS; ii++, pixel++)
  156. X    {
  157. X    if (pixel == NUM_COLORS)
  158. X        pixel = NUM_RESERVED;
  159. X    colorcell_defs[ii].pixel = pixel;
  160. X    }
  161. X
  162. X    XStoreColors(dpy, colormap, colorcell_defs, NUM_COLORS);
  163. X}
  164. X
  165. X
  166. Xvoid GetColorRGB(pixel, r, g, b)
  167. Xint pixel;
  168. Xunsigned char *r;
  169. Xunsigned char *g;
  170. Xunsigned char *b;
  171. X{
  172. X    *r = red[pixel];
  173. X    *g = green[pixel];
  174. X    *b = blue[pixel];
  175. X}
  176. X
  177. X
  178. Xvoid SetColorRGB(dpy, colormap, pixel, r, g, b)
  179. XDisplay *dpy;
  180. XColormap colormap;
  181. Xint pixel;
  182. Xunsigned char r;
  183. Xunsigned char g;
  184. Xunsigned char b;
  185. X{
  186. X    red[pixel] = r;
  187. X    green[pixel] = g;
  188. X    blue[pixel] = b;
  189. X
  190. X    colorcell_defs[pixel].pixel = pixel;
  191. X    colorcell_defs[pixel].red = red[pixel] | red[pixel] << 8;
  192. X    colorcell_defs[pixel].green = green[pixel] | green[pixel] << 8;
  193. X    colorcell_defs[pixel].blue = blue[pixel] | blue[pixel] << 8;
  194. X
  195. X    XStoreColors(dpy, colormap, &colorcell_defs[pixel], 1);
  196. X}
  197. X
  198. X
  199. XXColor *GetColors(num_colors)
  200. Xint num_colors;
  201. X{
  202. X    XColor *colors =
  203. X    (XColor *) malloc((unsigned) (sizeof(XColor) * num_colors));
  204. X    (void) memcpy((char *) colors, (char *) colorcell_defs,
  205. X      sizeof(XColor) * num_colors);
  206. X    return (colors);
  207. X}
  208. X
  209. X
  210. Xvoid PutColors(colors, num_colors)
  211. XXColor *colors;
  212. Xint num_colors;
  213. X{
  214. X    int ii;
  215. X    int pixel;
  216. X
  217. X    for (ii = 0; ii < num_colors; ++ii)
  218. X    {
  219. X    pixel = colors[ii].pixel;
  220. X    red[pixel] = colors[ii].red & 0xff;
  221. X    green[pixel] = colors[ii].green & 0xff;
  222. X    blue[pixel] = colors[ii].blue & 0xff;
  223. X    }
  224. X}
  225. X
  226. X
  227. Xvoid HSB2RGB(h, s, i, r, g, b)
  228. Xdouble h, s, i;
  229. Xdouble *r, *g, *b;
  230. X{
  231. X    int j;
  232. X    double f, p, q, t;
  233. X
  234. X    if (s == 0.0)
  235. X    *r = *g = *b = i;
  236. X    else
  237. X    {
  238. X    h -= floor(h);
  239. X    h *= 6.0;
  240. X    j = (int) floor(h);
  241. X    f = h - (double) j;
  242. X    p = i * (1.0 - s);
  243. X    q = i * (1.0 - s * f);
  244. X    t = i * (1.0 - (s * (1.0 - f)));
  245. X
  246. X    switch (j)
  247. X    {
  248. X    case 0:
  249. X        *r = i;
  250. X        *g = t;
  251. X        *b = p;
  252. X        break;
  253. X    case 1:
  254. X        *r = q;
  255. X        *g = i;
  256. X        *b = p;
  257. X        break;
  258. X    case 2:
  259. X        *r = p;
  260. X        *g = i;
  261. X        *b = t;
  262. X        break;
  263. X    case 3:
  264. X        *r = p;
  265. X        *g = q;
  266. X        *b = i;
  267. X        break;
  268. X    case 4:
  269. X        *r = t;
  270. X        *g = p;
  271. X        *b = i;
  272. X        break;
  273. X    case 5:
  274. X        *r = i;
  275. X        *g = p;
  276. X        *b = q;
  277. X        break;
  278. X    }
  279. X    }
  280. X}
  281. X
  282. X
  283. Xvoid RGB2HSB(r, g, b, h, s, i)
  284. Xdouble r, g, b;
  285. Xdouble *h, *s, *i;
  286. X{
  287. X    int j;
  288. X    double f;
  289. X
  290. X    if (r == g && g == b)
  291. X    {
  292. X    *i = r;
  293. X    *s = 0.0;
  294. X    *h = 0.0;
  295. X    return;
  296. X    }
  297. X
  298. X    if (r < g)
  299. X    if (r > b)
  300. X        j = 1;
  301. X    else if (g > b)
  302. X        j = 2;
  303. X    else
  304. X        j = 3;
  305. X    else if (r > g)
  306. X    if (r < b)
  307. X        j = 4;
  308. X    else if (g < b)
  309. X        j = 5;
  310. X    else
  311. X        j = 0;
  312. X    else if (r < b)
  313. X    j = 4;
  314. X    else
  315. X    j = 1;
  316. X
  317. X    switch (j)
  318. X    {
  319. X    case 0:
  320. X    *i = r;
  321. X    *s = 1.0 - b / r;
  322. X    f = (1.0 - ((1.0 - g / r) / (*s)));
  323. X    break;
  324. X    case 1:
  325. X    *i = g;
  326. X    *s = 1.0 - b / g;
  327. X    f = (1.0 - r / g) / (*s);
  328. X    break;
  329. X    case 2:
  330. X    *i = g;
  331. X    *s = 1.0 - r / g;
  332. X    f = (1.0 - ((1.0 - b / g) / (*s)));
  333. X    break;
  334. X    case 3:
  335. X    *i = b;
  336. X    *s = 1.0 - r / b;
  337. X    f = (1.0 - g / b) / (*s);
  338. X    break;
  339. X    case 4:
  340. X    *i = b;
  341. X    *s = 1.0 - g / b;
  342. X    f = (1.0 - ((1.0 - r / b) / (*s)));
  343. X    break;
  344. X    case 5:
  345. X    *i = r;
  346. X    *s = 1.0 - g / r;
  347. X    f = (1.0 - b / r) / (*s);
  348. X    break;
  349. X    }
  350. X    *h = ((double) j + f) / 6.0;
  351. X}
  352. X
  353. X
  354. Xvoid StoreHSB(reps)
  355. Xint reps;
  356. X{
  357. X    int ii;
  358. X    double hue, sat, bright;
  359. X    double r, g, b;
  360. X
  361. X    sat = 0.9;
  362. X    bright = 1.0;
  363. X
  364. X    for (ii = NUM_RESERVED; ii < NUM_COLORS; ii++)
  365. X    {
  366. X    hue = (double) ii / (double) (NUM_COLORS -
  367. X      NUM_RESERVED) * (double) reps;
  368. X
  369. X    HSB2RGB(hue, sat, bright, &r, &g, &b);
  370. X
  371. X    red[ii] = (unsigned char) (r * (double) MAX_INTENSITY);
  372. X    green[ii] = (unsigned char) (g * (double) MAX_INTENSITY);
  373. X    blue[ii] = (unsigned char) (b * (double) MAX_INTENSITY);
  374. X    }
  375. X}
  376. X
  377. X
  378. Xvoid StoreGray(reps)
  379. Xint reps;
  380. X{
  381. X    int ii;
  382. X
  383. X    for (ii = NUM_RESERVED; ii < NUM_COLORS; ii++)
  384. X    red[ii] = green[ii] = blue[ii] = (ii % ((NUM_COLORS -
  385. X          NUM_RESERVED) / reps)) * reps;
  386. X}
  387. X
  388. X
  389. Xvoid StoreRandom()
  390. X{
  391. X    int ii;
  392. X    extern int rand();
  393. X
  394. X    for (ii = NUM_RESERVED; ii < NUM_COLORS; ii++)
  395. X    {
  396. X    red[ii] = (unsigned char) ((rand() >> 16) & MAX_INTENSITY);
  397. X    green[ii] = (unsigned char) ((rand() >> 16) & MAX_INTENSITY);
  398. X    blue[ii] = (unsigned char) ((rand() >> 16) & MAX_INTENSITY);
  399. X    }
  400. X}
  401. X
  402. X
  403. Xvoid StoreTriColor()
  404. X{
  405. X    int ii;
  406. X
  407. X    for (ii = NUM_RESERVED; ii < NUM_COLORS; ii++)
  408. X    {
  409. X    switch (ii % 3)
  410. X    {
  411. X    case 0:
  412. X        red[ii] = MAX_INTENSITY;
  413. X        green[ii] = 0;
  414. X        blue[ii] = 0;
  415. X        break;
  416. X
  417. X    case 1:
  418. X        red[ii] = 0;
  419. X        green[ii] = MAX_INTENSITY;
  420. X        blue[ii] = 0;
  421. X        break;
  422. X    case 2:
  423. X        red[ii] = 0;
  424. X        green[ii] = 0;
  425. X        blue[ii] = MAX_INTENSITY;
  426. X        break;
  427. X    }
  428. X    }
  429. X}
  430. X
  431. X
  432. Xvoid StoreOctoColor()
  433. X{
  434. X    int ii;
  435. X
  436. X    for (ii = NUM_RESERVED; ii < NUM_COLORS; ii++)
  437. X    {
  438. X    red[ii] = (ii & 1) ? MAX_INTENSITY : 0;
  439. X    green[ii] = (ii & 2) ? MAX_INTENSITY : 0;
  440. X    blue[ii] = (ii & 4) ? MAX_INTENSITY : 0;
  441. X    }
  442. X}
  443. X
  444. X
  445. Xvoid StoreColors(function, closure)
  446. Xvoid (*function) ();
  447. Xcaddr_t closure;
  448. X{
  449. X    int ii;
  450. X
  451. X    for (ii = NUM_RESERVED; ii < NUM_COLORS; ii++)
  452. X    (*function) (ii, &red[ii], &green[ii], &blue[ii], closure);
  453. X}
  454. X
  455. X
  456. XBoolean ReadColors(dir, filename)
  457. Xchar *dir;
  458. Xchar *filename;
  459. X{
  460. X    FILE *file;
  461. X    int ii;
  462. X    int r, g, b;
  463. X    char path[128];
  464. X
  465. X    if (filename == NULL)
  466. X    filename = default_filename;
  467. X
  468. X    (void) sprintf(path, "%s/%s", dir, filename);
  469. X
  470. X    if ((file = fopen(path, "r")) == NULL)
  471. X    {
  472. X#ifdef DEBUG
  473. X    dprintf("Can't open '%s'\n", path);
  474. X#endif
  475. X    return (False);
  476. X    }
  477. X
  478. X    for (ii = 0; ii < NUM_COLORS; ii++)
  479. X    {
  480. X    (void) fscanf(file, "%d %d %d\n", &r, &g, &b);
  481. X
  482. X    /* Ignore color definitions for colors 0 to NUM_RESERVED-1 */
  483. X    if (ii >= NUM_RESERVED)
  484. X    {
  485. X        red[ii] = (unsigned char) r;
  486. X        green[ii] = (unsigned char) g;
  487. X        blue[ii] = (unsigned char) b;
  488. X    }
  489. X    }
  490. X    (void) fclose(file);
  491. X    return (True);
  492. X}
  493. X
  494. X
  495. XBoolean WriteColors(dir, filename)
  496. Xchar *dir;
  497. Xchar *filename;
  498. X{
  499. X    FILE *file;
  500. X    int ii;
  501. X    char path[128];
  502. X
  503. X    if (filename == NULL)
  504. X    filename = default_filename;
  505. X
  506. X    (void) sprintf(path, "%s/%s", dir, filename);
  507. X
  508. X    if ((file = fopen(path, "w")) == NULL)
  509. X    {
  510. X#ifdef DEBUG
  511. X    dprintf("Can't open '%s'\n", path);
  512. X#endif
  513. X    return (False);
  514. X    }
  515. X
  516. X    for (ii = 0; ii < NUM_COLORS; ii++)
  517. X    (void) fprintf(file, "%d %d %d\n", red[ii], green[ii], blue[ii]);
  518. X    (void) fclose(file);
  519. X    return (True);
  520. X}
  521. END_OF_FILE
  522. if test 8780 -ne `wc -c <'common/colormap.c'`; then
  523.     echo shar: \"'common/colormap.c'\" unpacked with wrong size!
  524. fi
  525. # end of 'common/colormap.c'
  526. fi
  527. if test -f 'drone/mandelbrot.c' -a "${1}" != "-c" ; then 
  528.   echo shar: Will not clobber existing file \"'drone/mandelbrot.c'\"
  529. else
  530. echo shar: Extracting \"'drone/mandelbrot.c'\" \(3200 characters\)
  531. sed "s/^X//" >'drone/mandelbrot.c' <<'END_OF_FILE'
  532. X/*
  533. X * Copyright (c) Ken W. Marks 1989, 1990.
  534. X */
  535. X
  536. X#include <stdio.h>
  537. X#include <math.h>
  538. X#include <X11/Intrinsic.h>
  539. X#include <Ipc.h>
  540. X#include <Chaos.h>
  541. X#include <Colormap.h>
  542. X
  543. X#define MANDEL_INFINITY        5
  544. X
  545. X/* The Mandelbrot computation is defined here as a macro since it is
  546. X * used at many places below but is not a function for efficiency sake. */
  547. X
  548. X#define MANDEL_MACRO \
  549. X{ \
  550. X    register double real = 0.0; \
  551. X    register double imag = 0.0; \
  552. X    register double real_squared = 0.0; \
  553. X    register double imag_squared = 0.0; \
  554. X \
  555. X    iter = 0; \
  556. X    while ((real_squared + imag_squared) < MANDEL_INFINITY && iter <= limit) \
  557. X    { \
  558. X    imag = 2 * real * imag + q0; \
  559. X    real = real_squared - imag_squared + p0; \
  560. X    real_squared = real * real; \
  561. X    imag_squared = imag * imag; \
  562. X    ++iter; \
  563. X    } \
  564. X    --iter; \
  565. X}
  566. X
  567. X
  568. Xvoid ComputeMandelbrot(req, resp)
  569. XImageRequest *req;
  570. XImageResponse *resp;
  571. X{
  572. X    unsigned char *dp;
  573. X    unsigned int width;
  574. X    unsigned int height;
  575. X    unsigned int limit;
  576. X    unsigned int w, h;
  577. X    unsigned int iter;
  578. X    unsigned int max_iter = 0;
  579. X    double p_min;
  580. X    double p_max;
  581. X    double q_min;
  582. X    double q_max;
  583. X    double p_inc, q_inc;
  584. X    register double p0, q0;
  585. X    double atof();
  586. X
  587. X    p_min = atof(req->p_lo);
  588. X    p_max = atof(req->p_hi);
  589. X    q_min = atof(req->q_lo);
  590. X    q_max = atof(req->q_hi);
  591. X    width = req->width;
  592. X    height = req->height;
  593. X    limit = req->limit;
  594. X
  595. X    resp->byte_order = req->byte_order;
  596. X    resp->serial = req->serial;
  597. X    resp->width = req->width;
  598. X    resp->height = req->height;
  599. X
  600. X    /* dp points past the ImageResponse header */
  601. X    dp = (unsigned char *) &resp[1];
  602. X
  603. X#ifdef DEBUG
  604. X    (void) printf("width: %d   height: %d  limit: %d\n", width, height, limit);
  605. X    (void) printf("p_min: % f\n", p_min);
  606. X    (void) printf("p_max: % f\n", p_max);
  607. X    (void) printf("q_min: % f\n", q_min);
  608. X    (void) printf("q_max: % f\n", q_max);
  609. X#endif
  610. X
  611. X    p_inc = (p_max - p_min) / (width - 1);
  612. X    q_inc = (q_max - q_min) / (height - 1);
  613. X
  614. X    w = 0;
  615. X    p0 = p_min + w * p_inc;
  616. X    for (h = 0; h < height; h++)
  617. X    {
  618. X    q0 = q_min + h * q_inc;
  619. X
  620. X    MANDEL_MACRO
  621. X
  622. X      if (iter != limit)
  623. X        goto compute_all;
  624. X    }
  625. X
  626. X    w = width - 1;
  627. X    p0 = p_min + w * p_inc;
  628. X    for (h = 0; h < height; h++)
  629. X    {
  630. X    q0 = q_min + h * q_inc;
  631. X
  632. X    MANDEL_MACRO
  633. X
  634. X      if (iter != limit)
  635. X        goto compute_all;
  636. X    }
  637. X
  638. X    h = 0;
  639. X    q0 = q_min + h * q_inc;
  640. X    for (w = 0; w < width; w++)
  641. X    {
  642. X    p0 = p_min + w * p_inc;
  643. X
  644. X    MANDEL_MACRO
  645. X
  646. X      if (iter != limit)
  647. X        goto compute_all;
  648. X    }
  649. X
  650. X    h = height - 1;
  651. X    q0 = q_min + h * q_inc;
  652. X    for (w = 0; w < width; w++)
  653. X    {
  654. X    p0 = p_min + w * p_inc;
  655. X
  656. X    MANDEL_MACRO
  657. X
  658. X      if (iter != limit)
  659. X        goto compute_all;
  660. X    }
  661. X
  662. X    (void) memset((char *) dp, BLACK, (int) (height * width *
  663. X    sizeof(unsigned char)));
  664. X    resp->max_iter = limit;
  665. X    return;
  666. X
  667. Xcompute_all:
  668. X
  669. X    for (h = 0; h < height; h++)
  670. X    {
  671. X    q0 = q_min + h * q_inc;
  672. X    for (w = 0; w < width; w++)
  673. X    {
  674. X        p0 = p_min + w * p_inc;
  675. X
  676. X        MANDEL_MACRO
  677. X
  678. X          if (iter < limit)
  679. X        *dp++ = (unsigned char) ((iter % (NUM_COLORS - NUM_RESERVED)) +
  680. X          NUM_RESERVED);
  681. X        else
  682. X        *dp++ = (unsigned char) BLACK;
  683. X
  684. X        if (iter > max_iter)
  685. X        max_iter = iter;
  686. X    }
  687. X    }
  688. X
  689. X    resp->max_iter = max_iter;
  690. X}
  691. END_OF_FILE
  692. if test 3200 -ne `wc -c <'drone/mandelbrot.c'`; then
  693.     echo shar: \"'drone/mandelbrot.c'\" unpacked with wrong size!
  694. fi
  695. # end of 'drone/mandelbrot.c'
  696. fi
  697. if test -f 'master/chaos.man' -a "${1}" != "-c" ; then 
  698.   echo shar: Will not clobber existing file \"'master/chaos.man'\"
  699. else
  700. echo shar: Extracting \"'master/chaos.man'\" \(9683 characters\)
  701. sed "s/^X//" >'master/chaos.man' <<'END_OF_FILE'
  702. X.TH CHAOS 6 "7 June 1990" "X Version 11"
  703. X.SH NAME
  704. Xchaos \- Explore the Mandelbrot set under X11.
  705. X.SH SYNOPSIS
  706. X.B chaos
  707. X[ \fIoptions\fR ]
  708. X.SH DESCRIPTION
  709. X.I Chaos
  710. Xprovides a simple tool for exploring the Mandelbrot set.  The main window
  711. Xis a canvas where the images are displayed.  The images are computed by
  712. X.I drone
  713. Xdaemons under the direction of the
  714. X.I chaos
  715. Xprocess.
  716. X.PP
  717. XWhen
  718. X.I drone
  719. Xprocesses are started, they locate the
  720. X.I chaos
  721. Xprocess using the selection CHAOS_WINDOW.  For this reason only 1
  722. X.I chaos
  723. Xprocess is allowed to run per server.
  724. X.PP
  725. XThe right mouse button will bring up a menu that will support both click
  726. Xand drag modes of operation.  From this menu, the following commands may be
  727. Xaccessed:
  728. X.IP Draw\ 
  729. XThis will start the drawing of the current image.  If the image is partially
  730. Xdrawn, it will continue from that point.  This command is not available if
  731. Xthere are no 
  732. X.I drone
  733. Xprocesses running.
  734. X.IP Redraw
  735. XThis will start the drawing of the current image.  If the image is partially
  736. Xdrawn, the previous image is cleared and the image is redrawn from the start.
  737. XThis command is not available if there are no 
  738. X.I drone
  739. Xprocesses running.
  740. X.IP Zoom\ 
  741. XThis will zoom into the previously specified zoom region.  A zoom region is 
  742. Xselected by dragging out a rectangle with the left mouse button.  If no zoom
  743. Xregion is currently specified, this option is not available.  If the option
  744. Xfor retaining aspect ratios is set, then the area that is zoomed in on is 
  745. Xcentered at the selected zoom region but the height or width is adjusted out 
  746. Xso that the aspect ratio remains the same.  With this option reset, the 
  747. Xspecified zoom region is zoomed to exactly - potentially changing the aspect 
  748. Xratio.  Drawing of the next level image starts automatically after a zoom 
  749. Xcommand.
  750. X.IP Unzoom
  751. XThis will return to the next image up the zoom stack.  This option remains 
  752. Xavailable until the top level (initial) image is returned to.  Since the zoom
  753. Xstack is linear, a new zoom command after an unzoom command will erase the
  754. Xportion of the stack below the current point.  To continue drawing of a partial
  755. Ximage at this level, the draw command may be given.
  756. X.IP Rezoom
  757. XThis performs the opposite function as the unzoom command returning to the
  758. Xnext image down the zoom stack.  This option remains available until the lowest
  759. Xlevel image is returned to.  To continue drawing of a partial image at this 
  760. Xlevel, the draw command may be given.
  761. X.IP Top\ \ 
  762. XThis pops back to the top of the zoom stack.  This option remains available
  763. Xwhile the current level is not already the top level.  To continue drawing of 
  764. Xa partial image at this level, the draw command may be given.
  765. X.IP Files
  766. XThis will pop up the File I/O Dialogbox.  This dialogbox will contain a list
  767. Xof any previously saved images in the image directory.  Image files have the
  768. Xextention .cif (chaos image format) which is simply an extension of the
  769. X.I xwd
  770. Xformat.  This allows these files to be loaded with
  771. X.I xwud
  772. Xor processed by any utilities that recognize standard X window dumps.
  773. XWhen loading or removing an image, select the image from this list and press 
  774. Xthe appropriate button.  When saving an image, type the name in the text input
  775. Xbox and select the Save File button.  An extension of .cif will be added if 
  776. Xnecessary.
  777. X.IP Drones
  778. XThis will pop up the Drone Control Dialogbox.  This dialogbox will allow
  779. Xdrones to be spawned or killed on the local host and on any other hosts that
  780. Xare known.  The toggle list contains a button for each host and another button
  781. Xlabeled "All Hosts".  The "All Hosts" button allows all the hosts to be toggled
  782. Xas a group.  To the left of each hostname, there is a number in parenthesis.
  783. XThis number indicates the number of drones running on that host.  The commands
  784. Xfrom this dialogbox are to spawn another drone, kill 1 drone, or kill all 
  785. Xdrones on each of the hosts selected.
  786. X.IP Colormap
  787. XThis will pop up the Colormap Control Dialogbox. This dialogbox will allow
  788. Xthe current colormap to be altered and colormaps to be saved and loaded.
  789. XColor cells are edited by selecting one from the palette and adjusting the
  790. XRed, Green, and Blue values with the sliders to the right.  The color mixing
  791. Xmode may be changed to Hue, Saturation, Brightness values by pressing the
  792. XRGB/HSB button.
  793. X.IP
  794. XThe header file contains a define for NUM_RESERVED which specifies the number 
  795. Xof colors to reserve at the beginning of the colormap.  The minimum is 2 so 
  796. Xthat there will always be at least black and white.  The minimum number
  797. Xfor use with 
  798. X.I olwm
  799. Xrunning in 3-D mode should be 5 (white, black, and 3 shades 
  800. Xof gray) although reserving 6 colors leaves 250 available which, being even,
  801. Xallows colormaps to be defined that match up better at the ends when the 
  802. Xcolormap is rotated.
  803. X.IP Settings
  804. XThis will pop up the Settings Dialogbox.  This dialogbox will allow various
  805. Xsettings to be adjusted.  Two sliders control the width and height of a task.
  806. XAs an image is being drawn, it is broken up into tasks of this size and given
  807. Xto the drones for computation.  There are toggles to keep tasks square
  808. Xand to retain the aspect ratio for zooms.  A text input box allows the 
  809. Xiteration limit to be modified.  Changing the task size or the iteration limit
  810. Xwill not change any drawing that is in progress but will take effect after a 
  811. Xzoom or redraw command.  These settings are saved and loaded with each image 
  812. X(as is the colormap).
  813. X.IP Quit\ 
  814. XThis will terminate the application.  This also has the effect of terminating
  815. Xall 
  816. X.I drone
  817. Xprocesses.  Typing 'q' or Ctrl-C in the main window has the same
  818. Xeffect.
  819. X.PP
  820. X.I Chaos 
  821. Xwill allow drones to be started or terminated at any time (even while 
  822. Xdrawing).  Tasks unfinished by drones are picked up by other drones.
  823. X.PP
  824. XColormap rotation can be toggled by pressing the 
  825. X.I spacebar
  826. Xin the main window.  The direction of the rotation may be toggled by pressing 
  827. Xthe 
  828. X.I return 
  829. Xkey.
  830. X.PP
  831. X.SH OPTIONS
  832. XIn addition to the standard X toolkit command line and resource options, 
  833. X.I chaos
  834. Xunderstands the following:
  835. X.TP
  836. X.B -help
  837. XProvides usage statement of the chaos specific options.
  838. X.TP
  839. X.BI -map \ path
  840. XUse 
  841. X.I path
  842. Xas the directory path to look for colormap specification files.
  843. X.PP
  844. X.TP
  845. X.BI -image \ path
  846. XUse 
  847. X.I path
  848. Xas the directory path when loading or saving chaos images.
  849. X.TP
  850. X.BI -zoom \ path
  851. XUse 
  852. X.I path
  853. Xas the directory path for the zoom stack where the chaos image at each
  854. Xlevel is stored and retrieved.
  855. X.TP
  856. X.BI -task_width \ w
  857. XUse
  858. X.I w
  859. Xas the width of the tasks given to the drone processes.
  860. X.TP
  861. X.BI -task_height \ h
  862. XUse
  863. X.I h
  864. Xas the height of the tasks given to the drone processes.
  865. X.TP
  866. X.B -square
  867. XTurn off limitation that task regions be square.
  868. X.TP
  869. X.B -aspect
  870. XTurn off aspect ration preservation when zooming.
  871. X.TP
  872. X.BI -limit \ n
  873. XUse
  874. X.I n
  875. Xas the maximum number of iterations the calculation will be performed before
  876. Xthe point is considered to be within the Mandelbrot set.  Choosing lower values
  877. Xwill speed up calculations near the edge of the set but will also result in
  878. Xa less detailed edge.
  879. X.TP
  880. X.BI -hosts \ list
  881. XUse
  882. X.I list
  883. Xas a list of hosts that are available to execute drone processes.  If the list
  884. Xcontains more than one hostname it must be enclosed in quotes.
  885. X.SH DIALOGBOXES
  886. XThe dialogboxes in
  887. X.I chaos
  888. Xare modal.  While a dialogbox is displayed, both the keyboard and the pointer
  889. Xare grabbed.  Although this is anti-social, it was the simplest method to
  890. Xdirect keyboard input to where it was needed regardless of the position of
  891. Xthe pointer and to make reasonably sure that another application's window 
  892. Xcould not be placed on top of the dialogbox once it was displayed.
  893. X.PP
  894. XDialogboxes may be controlled with a combination of pointer and keyboard
  895. Xactions.  Only one control at a time has keyboard focus directed to it.  This
  896. Xcontrol is marked with a small input focus arrow.  To change the currently
  897. Xfocused control, the 
  898. X.I tab
  899. Xand
  900. X.I reverse-tab
  901. X(shifted
  902. X.I tab)
  903. Xkeys are used.  When the pointer is pressed in a control, the keyboard focus
  904. Xjumps to that control.  In addition to using the pointer, button controls 
  905. X(push, toggle, and radio) and the listbox control may be activated using the
  906. X.I return
  907. Xkey.  Some or all of the arrow keys 
  908. X(up, down, left, and right) will work for the controls (except pushbuttons).
  909. XTheir actions are defined by the widget and are fairly intuitive.  The text
  910. Xinput widget supports a minimal subset of translations from the Xaw Text 
  911. Xwidget.
  912. X.SH RESOURCES
  913. XThe resource file 
  914. X.I Chaos.ad
  915. Xis placed in the app_defaults directory during installation.  The contents of
  916. Xthis file may be tacked on to a user's private 
  917. X.I .Xdefaults
  918. Xfile to allow custom defaults.
  919. X.SH BUGS
  920. XIf
  921. X.I xhost
  922. Xis not used to allow access by other hosts, then drones spawned on these
  923. Xremote machines will terminate silently.
  924. X.PP
  925. XIf the window manager being used is
  926. X.I twm,
  927. Xthere is a annoying bug when popping up dialogboxes from
  928. X.I chaos.
  929. XIf the pointer is outside the top level
  930. X.I chaos
  931. Xwindow when the dialogbox is mapped, the private colormap is not installed.
  932. XThis is do to the partially anti-social nature of the dialogboxes which
  933. Xuse override-redirect shells and grab the pointer and keyboard to implement
  934. Xa modal interface style.  This bug does not appear with 
  935. X.I olwm
  936. Xbut may appear with other window managers.
  937. X.PP
  938. XThe resource
  939. X.I dronePath
  940. Xspecifies the full path of the executable that
  941. X.I chaos
  942. Xwill use to execute the drone daemons from remote shells.  If the drone
  943. Xexecutables have not been installed in this path,
  944. X.I chaos
  945. Xwill not be able to spawn remote processes.
  946. X.PP
  947. XGiven some colormaps, the rectangle for the zoom region can be hard to see
  948. Xor even invisible.
  949. X.SH SEE ALSO
  950. Xdrone(6), gencmap(6)
  951. X.SH AUTHOR
  952. XKen W. Marks
  953. END_OF_FILE
  954. if test 9683 -ne `wc -c <'master/chaos.man'`; then
  955.     echo shar: \"'master/chaos.man'\" unpacked with wrong size!
  956. fi
  957. # end of 'master/chaos.man'
  958. fi
  959. if test -f 'master/fileDb.c' -a "${1}" != "-c" ; then 
  960.   echo shar: Will not clobber existing file \"'master/fileDb.c'\"
  961. else
  962. echo shar: Extracting \"'master/fileDb.c'\" \(10779 characters\)
  963. sed "s/^X//" >'master/fileDb.c' <<'END_OF_FILE'
  964. X/*
  965. X * Copyright (c) Ken W. Marks 1989, 1990.
  966. X */
  967. X
  968. X#include <stdio.h>
  969. X#include <signal.h>
  970. X#include <ctype.h>
  971. X#include <X11/Intrinsic.h>
  972. X#include <X11/StringDefs.h>
  973. X#include <X11/Xaw/Form.h>
  974. X#include <Chaos.h>
  975. X#include <LocalDefs.h>
  976. X#include <Colormap.h>
  977. X#include <Task.h>
  978. X#include <Canvas.h>
  979. X#include <DlgShell.h>
  980. X#include <Menu.h>
  981. X#include <MenuItems.h>
  982. X#include <Push.h>
  983. X#include <Text.h>
  984. X#include <List.h>
  985. X#include <Label.h>
  986. X
  987. X#define FILE_LABEL    widgets[6]
  988. X#define FILE_TEXT    widgets[1]
  989. X#define FILE_LIST    widgets[2]
  990. X
  991. X#define FILE_LOAD    widgets[3]
  992. X#define FILE_SAVE    widgets[4]
  993. X#define FILE_REMOVE    widgets[5]
  994. X#define DISMISS        widgets[0]
  995. X
  996. X#define NUM_CONTROLS    (unsigned) 6
  997. X#define NUM_LABELS    (unsigned) 1
  998. X
  999. Xstatic void FilePushActivate();
  1000. Xstatic void FileListActivate();
  1001. Xstatic void FileLoadFile();
  1002. Xstatic void FileSaveFile();
  1003. Xstatic void FileRemoveFile();
  1004. X
  1005. Xvoid FileUpdateFileList();
  1006. Xvoid SaveFileProceed();
  1007. Xvoid RemoveFileProceed();
  1008. X
  1009. Xextern void ConfirmSetup();
  1010. Xextern void MessageSetup();
  1011. X
  1012. Xextern Widget confirm_dialogbox;
  1013. Xextern Widget message_dialogbox;
  1014. X
  1015. Xstatic Widget form, widgets[NUM_CONTROLS + NUM_LABELS];
  1016. X
  1017. Xstatic char file_buffer[64];
  1018. Xstatic ListItem *file_list_items;
  1019. X
  1020. Xstatic char *file_not_found_msg =
  1021. X"The file '%s/%s' does not exist!\nPlease specify a valid filename.";
  1022. X
  1023. Xstatic char *save_file_msg =
  1024. X"The file '%s/%s' already exists!\nDo you really wish to overwrite this image file?";
  1025. X
  1026. Xstatic char *save_failed_msg =
  1027. X"Cannot write to file '%s/%s'!";
  1028. X
  1029. Xstatic char *load_file_msg =
  1030. X"Cannot load file '%s/%s'!\nPlease specify a valid image filename.";
  1031. X
  1032. Xstatic char *remove_file_msg =
  1033. X"The file '%s/%s' will be lost!\nDo you really wish to remove this image file?";
  1034. X
  1035. Xstatic char *remove_failed_msg =
  1036. X"Cannot remove file '%s/%s'!";
  1037. X
  1038. Xstatic XtCallbackRec push_callbacks[] = {
  1039. X    {FilePushActivate, NULL},
  1040. X    {NULL, NULL},
  1041. X};
  1042. X
  1043. Xstatic XtCallbackRec list_callbacks[] = {
  1044. X    {FileListActivate, NULL},
  1045. X    {NULL, NULL},
  1046. X};
  1047. X
  1048. Xstatic Arg PopupArgs[] = {
  1049. X    {XtNborderWidth, (XtArgVal) 3},
  1050. X};
  1051. X
  1052. Xstatic Arg LabelArgs[] = {
  1053. X    {XtNfromHoriz, (XtArgVal) NULL},
  1054. X    {XtNfromVert, (XtArgVal) NULL},
  1055. X    {XtNhorizDistance, (XtArgVal) 10},
  1056. X    {XtNvertDistance, (XtArgVal) 10},
  1057. X    {XtNlabel, (XtArgVal) NULL},
  1058. X    {XtNresizable, (XtArgVal) False},
  1059. X    {XtNborderWidth, (XtArgVal) 0},
  1060. X};
  1061. X
  1062. Xstatic Arg PushArgs[] = {
  1063. X    {XtNfromHoriz, (XtArgVal) NULL},
  1064. X    {XtNfromVert, (XtArgVal) NULL},
  1065. X    {XtNhorizDistance, (XtArgVal) 10},
  1066. X    {XtNvertDistance, (XtArgVal) 10},
  1067. X    {XtNlabel, (XtArgVal) NULL},
  1068. X    {XtNdialogbox, (XtArgVal) NULL},
  1069. X    {XtNcallback, (XtArgVal) push_callbacks},
  1070. X    {XtNresizable, (XtArgVal) False},
  1071. X};
  1072. X
  1073. Xstatic Arg ListArgs[] = {
  1074. X    {XtNfromHoriz, (XtArgVal) NULL},
  1075. X    {XtNfromVert, (XtArgVal) NULL},
  1076. X    {XtNhorizDistance, (XtArgVal) 10},
  1077. X    {XtNvertDistance, (XtArgVal) 10},
  1078. X    {XtNlistItems, (XtArgVal) NULL},
  1079. X    {XtNdialogbox, (XtArgVal) NULL},
  1080. X    {XtNresizable, (XtArgVal) False},
  1081. X    {XtNborderWidth, (XtArgVal) 1},
  1082. X    {XtNcallback, (XtArgVal) list_callbacks},
  1083. X    {XtNlistDefault, (XtArgVal) NULL},
  1084. X    {XtNcharsWide, (XtArgVal) 31},
  1085. X    {XtNnumberVisible, (XtArgVal) 8},
  1086. X    {XtNlistDefault, (XtArgVal) - 1},
  1087. X};
  1088. X
  1089. Xstatic Arg TextArgs[] = {
  1090. X    {XtNfromHoriz, (XtArgVal) NULL},
  1091. X    {XtNfromVert, (XtArgVal) NULL},
  1092. X    {XtNhorizDistance, (XtArgVal) 10},
  1093. X    {XtNvertDistance, (XtArgVal) 10},
  1094. X    {XtNbuffer, (XtArgVal) NULL},
  1095. X    {XtNdialogbox, (XtArgVal) NULL},
  1096. X    {XtNresizable, (XtArgVal) False},
  1097. X    {XtNbufferLen, (XtArgVal) NULL},
  1098. X    {XtNinitialText, (XtArgVal) NULL},
  1099. X    {XtNcharsWide, (XtArgVal) NULL},
  1100. X};
  1101. X
  1102. X
  1103. X/*ARGSUSED*/
  1104. Xstatic void FilePushActivate(widget, client_data, call_data)
  1105. XWidget widget;
  1106. Xcaddr_t client_data;
  1107. Xcaddr_t call_data;
  1108. X{
  1109. X    extern Widget file_dialogbox;
  1110. X    extern char *FileCheckFilename();
  1111. X    char *new_filename;
  1112. X
  1113. X    if (widget == DISMISS)
  1114. X    DialogPopdown(file_dialogbox);
  1115. X    else
  1116. X    {
  1117. X    new_filename = FileCheckFilename(file_buffer, ".cif");
  1118. X    TextChangeText(FILE_TEXT, new_filename);
  1119. X    if (new_filename == NULL)
  1120. X        return;
  1121. X
  1122. X    if (widget == FILE_LOAD)
  1123. X        FileLoadFile();
  1124. X    else if (widget == FILE_SAVE)
  1125. X        FileSaveFile();
  1126. X    else if (widget == FILE_REMOVE)
  1127. X        FileRemoveFile();
  1128. X    }
  1129. X}
  1130. X
  1131. X
  1132. X/*ARGSUSED*/
  1133. Xstatic void FileListActivate(widget, client_data, call_data)
  1134. XWidget widget;
  1135. Xcaddr_t client_data;
  1136. Xcaddr_t call_data;
  1137. X{
  1138. X    int item = (int) call_data;
  1139. X
  1140. X    TextChangeText(FILE_TEXT, file_list_items[item].label);
  1141. X}
  1142. X
  1143. X
  1144. Xstatic void FileLoadFile()
  1145. X{
  1146. X    char message[256];
  1147. X    extern char *image_dir;
  1148. X    extern Boolean LoadEverything();
  1149. X    extern Boolean FileExists();
  1150. X    extern void BlatzZoomStack();
  1151. X    extern int zoom_level;
  1152. X    extern Widget menu;
  1153. X    extern Widget canvas;
  1154. X
  1155. X    if (FileExists(image_dir, file_buffer) == False)
  1156. X    {
  1157. X    /* Popup an error message box here */
  1158. X    (void) sprintf(message, file_not_found_msg, image_dir, file_buffer);
  1159. X    MessageSetup(message, (XtCallbackProc) NULL);
  1160. X    DialogPopup(message_dialogbox);
  1161. X    return;
  1162. X    }
  1163. X
  1164. X    /* We reset the zoom stack when a load is performed */
  1165. X    zoom_level = 0;
  1166. X    BlatzZoomStack();
  1167. X
  1168. X    /* cannot top any more */
  1169. X    (void) MenuChangeSensitivity(menu, MENU_TOP_ITEM, False);
  1170. X
  1171. X    /* cannot unzoom any more */
  1172. X    (void) MenuChangeSensitivity(menu, MENU_UNZOOM_ITEM, False);
  1173. X
  1174. X    /* zoom not allowed until another region is specified */
  1175. X    (void) MenuChangeSensitivity(menu, MENU_ZOOM_ITEM, False);
  1176. X
  1177. X    /* rezoom are not allowed */
  1178. X    (void) MenuChangeSensitivity(menu, MENU_REZOOM_ITEM, False);
  1179. X
  1180. X    MakeTasksStale();
  1181. X    WasteTasks();
  1182. X
  1183. X    if (LoadEverything(image_dir, file_buffer) == False)
  1184. X    {
  1185. X    /* Popup an error message box here */
  1186. X    (void) sprintf(message, load_file_msg, image_dir, file_buffer);
  1187. X    MessageSetup(message, (XtCallbackProc) NULL);
  1188. X    DialogPopup(message_dialogbox);
  1189. X    return;
  1190. X    }
  1191. X
  1192. X    /* Because this image was loaded, we must make sure this image gets saved
  1193. X     * in case we zoom */
  1194. X    CanvasTouchCanvas(canvas);
  1195. X}
  1196. X
  1197. X
  1198. Xstatic void FileSaveFile()
  1199. X{
  1200. X    char message[256];
  1201. X    extern char *image_dir;
  1202. X    extern Boolean FileExists();
  1203. X    extern Boolean SaveEverything();
  1204. X
  1205. X    if (FileExists(image_dir, file_buffer))
  1206. X    {
  1207. X    /* throw a dialogbox up for confirmation first */
  1208. X    (void) sprintf(message, save_file_msg, image_dir, file_buffer);
  1209. X    ConfirmSetup(message, SaveFileProceed);
  1210. X    DialogPopup(confirm_dialogbox);
  1211. X    }
  1212. X    else
  1213. X    SaveFileProceed((Widget) NULL, (caddr_t) NULL, (caddr_t) NULL);
  1214. X}
  1215. X
  1216. X
  1217. X/*ARGSUSED*/
  1218. Xvoid SaveFileProceed(widget, client_data, call_data)
  1219. XWidget widget;            /* unused */
  1220. Xcaddr_t client_data;        /* unused */
  1221. Xcaddr_t call_data;        /* unused */
  1222. X{
  1223. X    char message[256];
  1224. X
  1225. X    if (SaveEverything(image_dir, file_buffer, False) == False)
  1226. X    {
  1227. X    /* Popup an error message box here */
  1228. X    (void) sprintf(message, save_failed_msg, image_dir, file_buffer);
  1229. X    MessageSetup(message, (XtCallbackProc) NULL);
  1230. X    DialogPopup(message_dialogbox);
  1231. X    return;
  1232. X    }
  1233. X    FileUpdateFileList();
  1234. X}
  1235. X
  1236. X
  1237. Xstatic void FileRemoveFile()
  1238. X{
  1239. X    char message[256];
  1240. X    extern Boolean FileExists();
  1241. X
  1242. X    if (FileExists(image_dir, file_buffer) == False)
  1243. X    {
  1244. X    /* Popup an error message box here */
  1245. X    (void) sprintf(message, file_not_found_msg, image_dir, file_buffer);
  1246. X    MessageSetup(message, (XtCallbackProc) NULL);
  1247. X    DialogPopup(message_dialogbox);
  1248. X    return;
  1249. X    }
  1250. X    /* throw a dialogbox up for confirmation first */
  1251. X    (void) sprintf(message, remove_file_msg, image_dir, file_buffer);
  1252. X    ConfirmSetup(message, RemoveFileProceed);
  1253. X    DialogPopup(confirm_dialogbox);
  1254. X}
  1255. X
  1256. X
  1257. X/*ARGSUSED*/
  1258. Xvoid RemoveFileProceed(widget, client_data, call_data)
  1259. XWidget widget;            /* unused */
  1260. Xcaddr_t client_data;        /* unused */
  1261. Xcaddr_t call_data;        /* unused */
  1262. X{
  1263. X    char message[256];
  1264. X    extern char *image_dir;
  1265. X    extern Boolean RemoveFile();
  1266. X
  1267. X    if (RemoveFile(image_dir, file_buffer) == False)
  1268. X    {
  1269. X    /* Popup an error message box here */
  1270. X    (void) sprintf(message, remove_failed_msg, image_dir, file_buffer);
  1271. X    MessageSetup(message, (XtCallbackProc) NULL);
  1272. X    DialogPopup(message_dialogbox);
  1273. X    return;
  1274. X    }
  1275. X
  1276. X    TextChangeText(FILE_TEXT, (String) NULL);
  1277. X    FileUpdateFileList();
  1278. X}
  1279. X
  1280. X
  1281. Xvoid FileUpdateFileList()
  1282. X{
  1283. X    extern char **GetFileList();
  1284. X    extern void FreeFileList();
  1285. X    extern char *image_dir;
  1286. X
  1287. X    if (file_list_items)
  1288. X    FreeFileList((char **) file_list_items);
  1289. X
  1290. X    file_list_items = (ListItem *) GetFileList(image_dir, "*.cif");
  1291. X    if (file_list_items != NULL)
  1292. X    (void) ListChangeItems(FILE_LIST, file_list_items);
  1293. X}
  1294. X
  1295. X
  1296. XWidget FileCreateDialogbox(parent)
  1297. XWidget parent;
  1298. X{
  1299. X    Widget popup;
  1300. X
  1301. X    popup = XtCreatePopupShell("file_dialogbox_popup",
  1302. X      dialogShellWidgetClass, parent, PopupArgs, XtNumber(PopupArgs));
  1303. X
  1304. X    form = XtCreateManagedWidget("file_dialogbox_form", formWidgetClass,
  1305. X      popup, (ArgList) NULL, (Cardinal) 0);
  1306. X
  1307. X    LabelArgs[0].value = (XtArgVal) NULL;
  1308. X    LabelArgs[1].value = (XtArgVal) NULL;
  1309. X    LabelArgs[4].value = (XtArgVal) "File:";
  1310. X    FILE_LABEL = XtCreateManagedWidget("file_label", labelWidgetClass,
  1311. X      form, LabelArgs, XtNumber(LabelArgs));
  1312. X
  1313. X    TextArgs[0].value = (XtArgVal) FILE_LABEL;
  1314. X    TextArgs[1].value = (XtArgVal) NULL;
  1315. X    TextArgs[4].value = (XtArgVal) file_buffer;
  1316. X    TextArgs[5].value = (XtArgVal) popup;
  1317. X    TextArgs[7].value = (XtArgVal) 64;
  1318. X    TextArgs[9].value = (XtArgVal) 16;
  1319. X    FILE_TEXT = XtCreateManagedWidget("file_text", textWidgetClass,
  1320. X      form, TextArgs, XtNumber(TextArgs));
  1321. X
  1322. X    ListArgs[0].value = (XtArgVal) NULL;
  1323. X    ListArgs[1].value = (XtArgVal) FILE_LABEL;
  1324. X    ListArgs[5].value = (XtArgVal) popup;
  1325. X    FILE_LIST = XtCreateManagedWidget("file_list", listWidgetClass,
  1326. X      form, ListArgs, XtNumber(ListArgs));
  1327. X
  1328. X    PushArgs[0].value = (XtArgVal) FILE_LIST;
  1329. X    PushArgs[1].value = (XtArgVal) FILE_LABEL;
  1330. X    PushArgs[4].value = (XtArgVal) "Load File";
  1331. X    PushArgs[5].value = (XtArgVal) popup;
  1332. X    FILE_LOAD = XtCreateManagedWidget("load_file_push", pushWidgetClass,
  1333. X      form, PushArgs, XtNumber(PushArgs));
  1334. X
  1335. X    PushArgs[0].value = (XtArgVal) FILE_LIST;
  1336. X    PushArgs[1].value = (XtArgVal) FILE_LOAD;
  1337. X    PushArgs[4].value = (XtArgVal) "Save File";
  1338. X    PushArgs[5].value = (XtArgVal) popup;
  1339. X    FILE_SAVE = XtCreateManagedWidget("save_file_push", pushWidgetClass,
  1340. X      form, PushArgs, XtNumber(PushArgs));
  1341. X
  1342. X    PushArgs[0].value = (XtArgVal) FILE_LIST;
  1343. X    PushArgs[1].value = (XtArgVal) FILE_SAVE;
  1344. X    PushArgs[4].value = (XtArgVal) "Remove File";
  1345. X    PushArgs[5].value = (XtArgVal) popup;
  1346. X    FILE_REMOVE = XtCreateManagedWidget("remove_file_push",
  1347. X      pushWidgetClass, form, PushArgs, XtNumber(PushArgs));
  1348. X
  1349. X    PushArgs[0].value = (XtArgVal) FILE_LIST;
  1350. X    PushArgs[1].value = (XtArgVal) FILE_REMOVE;
  1351. X    PushArgs[4].value = (XtArgVal) "Dismiss";
  1352. X    PushArgs[5].value = (XtArgVal) popup;
  1353. X    DISMISS = XtCreateManagedWidget("dismiss_push", pushWidgetClass,
  1354. X      form, PushArgs, XtNumber(PushArgs));
  1355. X
  1356. X    DialogSetFocusOrder(popup, widgets, NUM_CONTROLS);
  1357. X    return (popup);
  1358. X}
  1359. END_OF_FILE
  1360. if test 10779 -ne `wc -c <'master/fileDb.c'`; then
  1361.     echo shar: \"'master/fileDb.c'\" unpacked with wrong size!
  1362. fi
  1363. # end of 'master/fileDb.c'
  1364. fi
  1365. if test -f 'master/settingsDb.c' -a "${1}" != "-c" ; then 
  1366.   echo shar: Will not clobber existing file \"'master/settingsDb.c'\"
  1367. else
  1368. echo shar: Extracting \"'master/settingsDb.c'\" \(8679 characters\)
  1369. sed "s/^X//" >'master/settingsDb.c' <<'END_OF_FILE'
  1370. X/*
  1371. X * Copyright (c) Ken W. Marks 1989, 1990.
  1372. X */
  1373. X
  1374. X#include <stdio.h>
  1375. X#include <signal.h>
  1376. X#include <ctype.h>
  1377. X#include <X11/Intrinsic.h>
  1378. X#include <X11/StringDefs.h>
  1379. X#include <X11/Xaw/Form.h>
  1380. X#include <Chaos.h>
  1381. X#include <LocalDefs.h>
  1382. X#include <Task.h>
  1383. X#include <Colormap.h>
  1384. X#include <Canvas.h>
  1385. X#include <DlgShell.h>
  1386. X#include <Push.h>
  1387. X#include <Compound.h>
  1388. X#include <Text.h>
  1389. X#include <List.h>
  1390. X#include <Slider.h>
  1391. X#include <Palette.h>
  1392. X#include <Label.h>
  1393. X
  1394. X#define WIDTH_LABEL    widgets[6]
  1395. X#define WIDTH_SLIDER    widgets[1]
  1396. X
  1397. X#define HEIGHT_LABEL    widgets[7]
  1398. X#define HEIGHT_SLIDER    widgets[2]
  1399. X
  1400. X#define SQUARE_TOGGLE    widgets[3]
  1401. X#define ASPECT_TOGGLE    widgets[4]
  1402. X
  1403. X#define LIMIT_LABEL    widgets[8]
  1404. X#define LIMIT_TEXT    widgets[5]
  1405. X
  1406. X#define DISMISS        widgets[0]
  1407. X
  1408. X
  1409. X#define NUM_CONTROLS    (unsigned) 6
  1410. X#define NUM_LABELS    (unsigned) 3
  1411. X
  1412. Xextern Boolean keep_tasks_square;
  1413. Xextern Boolean retain_aspect_ratio;
  1414. Xextern int task_width, task_height;
  1415. Xextern int iteration_limit;
  1416. X
  1417. Xstatic void SettingsPushActivate();
  1418. Xstatic void SettingsSliderActivate();
  1419. Xstatic void SettingsToggleActivate();
  1420. X
  1421. Xstatic Widget form, widgets[NUM_CONTROLS + NUM_LABELS];
  1422. Xstatic char initial_limit[8];
  1423. Xstatic char limit_buffer[16];
  1424. X
  1425. Xstatic ToggleItem square_item[] = {
  1426. X    {"Keep tasks square", True},
  1427. X    {NULL, NULL},
  1428. X};
  1429. X
  1430. Xstatic ToggleItem aspect_item[] = {
  1431. X    {"Retain aspect ration (for zooms)", True},
  1432. X    {NULL, NULL},
  1433. X};
  1434. X
  1435. Xstatic XtCallbackRec push_callbacks[] = {
  1436. X    {SettingsPushActivate, NULL},
  1437. X    {NULL, NULL},
  1438. X};
  1439. X
  1440. Xstatic XtCallbackRec slider_callbacks[] = {
  1441. X    {SettingsSliderActivate, NULL},
  1442. X    {NULL, NULL},
  1443. X};
  1444. X
  1445. Xstatic XtCallbackRec toggle_callbacks[] = {
  1446. X    {SettingsToggleActivate, NULL},
  1447. X    {NULL, NULL},
  1448. X};
  1449. X
  1450. Xstatic Arg PopupArgs[] = {
  1451. X    {XtNborderWidth, (XtArgVal) 3},
  1452. X};
  1453. X
  1454. Xstatic Arg LabelArgs[] = {
  1455. X    {XtNfromHoriz, (XtArgVal) NULL},
  1456. X    {XtNfromVert, (XtArgVal) NULL},
  1457. X    {XtNhorizDistance, (XtArgVal) 10},
  1458. X    {XtNvertDistance, (XtArgVal) 10},
  1459. X    {XtNlabel, (XtArgVal) NULL},
  1460. X    {XtNresizable, (XtArgVal) False},
  1461. X    {XtNborderWidth, (XtArgVal) 0},
  1462. X};
  1463. X
  1464. Xstatic Arg PushArgs[] = {
  1465. X    {XtNfromHoriz, (XtArgVal) NULL},
  1466. X    {XtNfromVert, (XtArgVal) NULL},
  1467. X    {XtNhorizDistance, (XtArgVal) 10},
  1468. X    {XtNvertDistance, (XtArgVal) 10},
  1469. X    {XtNlabel, (XtArgVal) NULL},
  1470. X    {XtNdialogbox, (XtArgVal) NULL},
  1471. X    {XtNcallback, (XtArgVal) push_callbacks},
  1472. X    {XtNresizable, (XtArgVal) False},
  1473. X};
  1474. X
  1475. Xstatic Arg ToggleArgs[] = {
  1476. X    {XtNfromHoriz, (XtArgVal) NULL},
  1477. X    {XtNfromVert, (XtArgVal) NULL},
  1478. X    {XtNhorizDistance, (XtArgVal) 10},
  1479. X    {XtNvertDistance, (XtArgVal) 10},
  1480. X    {XtNtoggleItems, (XtArgVal) NULL},
  1481. X    {XtNdialogbox, (XtArgVal) NULL},
  1482. X    {XtNresizable, (XtArgVal) False},
  1483. X    {XtNborderWidth, (XtArgVal) 0},
  1484. X    {XtNcallback, (XtArgVal) toggle_callbacks},
  1485. X    {XtNbuttonType, (XtArgVal) ToggleButton},
  1486. X};
  1487. X
  1488. Xstatic Arg SliderArgs[] = {
  1489. X    {XtNfromHoriz, (XtArgVal) NULL},
  1490. X    {XtNfromVert, (XtArgVal) NULL},
  1491. X    {XtNhorizDistance, (XtArgVal) 10},
  1492. X    {XtNvertDistance, (XtArgVal) 10},
  1493. X    {XtNdialogbox, (XtArgVal) NULL},
  1494. X    {XtNcallback, (XtArgVal) slider_callbacks},
  1495. X    {XtNresizable, (XtArgVal) False},
  1496. X    {XtNminValue, (XtArgVal) 16},
  1497. X    {XtNmaxValue, (XtArgVal) 128},
  1498. X    {XtNdefaultPos, (XtArgVal) NULL},
  1499. X};
  1500. X
  1501. Xstatic Arg TextArgs[] = {
  1502. X    {XtNfromHoriz, (XtArgVal) NULL},
  1503. X    {XtNfromVert, (XtArgVal) NULL},
  1504. X    {XtNhorizDistance, (XtArgVal) 10},
  1505. X    {XtNvertDistance, (XtArgVal) 10},
  1506. X    {XtNbuffer, (XtArgVal) limit_buffer},
  1507. X    {XtNdialogbox, (XtArgVal) NULL},
  1508. X    {XtNresizable, (XtArgVal) False},
  1509. X    {XtNbufferLen, (XtArgVal) 16},
  1510. X    {XtNinitialText, (XtArgVal) initial_limit},
  1511. X    {XtNcharsWide, (XtArgVal) 8},
  1512. X};
  1513. X
  1514. X
  1515. Xvoid SettingsSetLimit(new_limit)
  1516. Xint new_limit;
  1517. X{
  1518. X    char new_limit_buffer[8];
  1519. X
  1520. X    (void) sprintf(new_limit_buffer, "%d", new_limit);
  1521. X    TextChangeText(LIMIT_TEXT, new_limit_buffer);
  1522. X    iteration_limit = new_limit;
  1523. X}
  1524. X
  1525. X
  1526. X/*ARGSUSED*/
  1527. Xstatic void SettingsPushActivate(widget, client_data, call_data)
  1528. XWidget widget;
  1529. Xcaddr_t client_data;
  1530. Xcaddr_t call_data;
  1531. X{
  1532. X    extern Widget settings_dialogbox;
  1533. X    int new_limit;
  1534. X
  1535. X    DialogPopdown(settings_dialogbox);
  1536. X    new_limit = atoi(limit_buffer);
  1537. X    SettingsSetLimit(new_limit);
  1538. X}
  1539. X
  1540. X
  1541. X/*ARGSUSED*/
  1542. Xstatic void SettingsSliderActivate(widget, client_data, call_data)
  1543. XWidget widget;
  1544. Xcaddr_t client_data;
  1545. Xcaddr_t call_data;
  1546. X{
  1547. X    extern Widget canvas;
  1548. X
  1549. X    if (widget == WIDTH_SLIDER)
  1550. X    {
  1551. X    task_width = (unsigned int) call_data;
  1552. X    if (keep_tasks_square)
  1553. X    {
  1554. X        task_height = task_width;
  1555. X        SliderChangePosition(HEIGHT_SLIDER, (int) task_height);
  1556. X    }
  1557. X    }
  1558. X    else if (widget == HEIGHT_SLIDER)
  1559. X    {
  1560. X    task_height = (unsigned int) call_data;
  1561. X    if (keep_tasks_square)
  1562. X    {
  1563. X        task_width = task_height;
  1564. X        SliderChangePosition(WIDTH_SLIDER, (int) task_width);
  1565. X    }
  1566. X    }
  1567. X}
  1568. X
  1569. X
  1570. X/*ARGSUSED*/
  1571. Xstatic void SettingsToggleActivate(widget, client_data, call_data)
  1572. XWidget widget;
  1573. Xcaddr_t client_data;
  1574. Xcaddr_t call_data;
  1575. X{
  1576. X    extern Widget canvas;
  1577. X
  1578. X    if (widget == ASPECT_TOGGLE)
  1579. X    CanvasChangeRetainAspect(canvas);
  1580. X    else if (widget == SQUARE_TOGGLE)
  1581. X    {
  1582. X    keep_tasks_square = ToggleGetState(widget, (unsigned) 0);
  1583. X    if (keep_tasks_square)
  1584. X    {
  1585. X        /* we take the average of the width and height and set the new
  1586. X         * width and hight from this (to make it square) */
  1587. X        task_width = task_height = (task_width + task_height) / 2;
  1588. X
  1589. X        SliderChangePosition(WIDTH_SLIDER, (int) task_width);
  1590. X        SliderChangePosition(HEIGHT_SLIDER, (int) task_height);
  1591. X    }
  1592. X    }
  1593. X}
  1594. X
  1595. X
  1596. XWidget SettingsCreateDialogbox(parent)
  1597. XWidget parent;
  1598. X{
  1599. X    Widget popup;
  1600. X
  1601. X    popup = XtCreatePopupShell("settings_dialogbox_popup",
  1602. X      dialogShellWidgetClass, parent, PopupArgs, XtNumber(PopupArgs));
  1603. X
  1604. X    form = XtCreateManagedWidget("settings_dialogbox_form", formWidgetClass,
  1605. X      popup, (ArgList) NULL, (Cardinal) 0);
  1606. X
  1607. X    LabelArgs[0].value = (XtArgVal) NULL;
  1608. X    LabelArgs[1].value = (XtArgVal) NULL;
  1609. X    LabelArgs[4].value = (XtArgVal) "Task width: ";
  1610. X    WIDTH_LABEL = XtCreateManagedWidget("width_label", labelWidgetClass,
  1611. X      form, LabelArgs, XtNumber(LabelArgs));
  1612. X
  1613. X    SliderArgs[0].value = (XtArgVal) WIDTH_LABEL;
  1614. X    SliderArgs[1].value = (XtArgVal) NULL;
  1615. X    SliderArgs[4].value = (XtArgVal) popup;
  1616. X    SliderArgs[9].value = (XtArgVal) task_width;
  1617. X    WIDTH_SLIDER = XtCreateManagedWidget("width_slider", sliderWidgetClass,
  1618. X      form, SliderArgs, XtNumber(SliderArgs));
  1619. X
  1620. X    LabelArgs[0].value = (XtArgVal) NULL;
  1621. X    LabelArgs[1].value = (XtArgVal) WIDTH_SLIDER;
  1622. X    LabelArgs[4].value = (XtArgVal) "Task height:";
  1623. X    HEIGHT_LABEL = XtCreateManagedWidget("height_label", labelWidgetClass,
  1624. X      form, LabelArgs, XtNumber(LabelArgs));
  1625. X
  1626. X    SliderArgs[0].value = (XtArgVal) HEIGHT_LABEL;
  1627. X    SliderArgs[1].value = (XtArgVal) WIDTH_SLIDER;
  1628. X    SliderArgs[4].value = (XtArgVal) popup;
  1629. X    SliderArgs[9].value = (XtArgVal) task_height;
  1630. X    HEIGHT_SLIDER = XtCreateManagedWidget("height_slider", sliderWidgetClass,
  1631. X      form, SliderArgs, XtNumber(SliderArgs));
  1632. X
  1633. X    /* Pull the value from the application resource */
  1634. X    square_item[0].state = keep_tasks_square;
  1635. X
  1636. X    ToggleArgs[0].value = (XtArgVal) NULL;
  1637. X    ToggleArgs[1].value = (XtArgVal) HEIGHT_SLIDER;
  1638. X    ToggleArgs[4].value = (XtArgVal) square_item;
  1639. X    ToggleArgs[5].value = (XtArgVal) popup;
  1640. X    SQUARE_TOGGLE = XtCreateManagedWidget("square_toggle", compoundWidgetClass,
  1641. X      form, ToggleArgs, XtNumber(ToggleArgs));
  1642. X
  1643. X    /* Pull the value from the application resource */
  1644. X    aspect_item[0].state = retain_aspect_ratio;
  1645. X
  1646. X    ToggleArgs[0].value = (XtArgVal) NULL;
  1647. X    ToggleArgs[1].value = (XtArgVal) SQUARE_TOGGLE;
  1648. X    ToggleArgs[4].value = (XtArgVal) aspect_item;
  1649. X    ToggleArgs[5].value = (XtArgVal) popup;
  1650. X    ASPECT_TOGGLE = XtCreateManagedWidget("aspect_toggle", compoundWidgetClass,
  1651. X      form, ToggleArgs, XtNumber(ToggleArgs));
  1652. X
  1653. X    LabelArgs[0].value = (XtArgVal) NULL;
  1654. X    LabelArgs[1].value = (XtArgVal) ASPECT_TOGGLE;
  1655. X    LabelArgs[4].value = (XtArgVal) "Iteration Limit:";
  1656. X    LIMIT_LABEL = XtCreateManagedWidget("limit_label", labelWidgetClass,
  1657. X      form, LabelArgs, XtNumber(LabelArgs));
  1658. X
  1659. X    (void) sprintf(initial_limit, "%d", iteration_limit);
  1660. X
  1661. X    TextArgs[0].value = (XtArgVal) LIMIT_LABEL;
  1662. X    TextArgs[1].value = (XtArgVal) ASPECT_TOGGLE;
  1663. X    TextArgs[5].value = (XtArgVal) popup;
  1664. X    LIMIT_TEXT = XtCreateManagedWidget("limit_text", textWidgetClass,
  1665. X      form, TextArgs, XtNumber(TextArgs));
  1666. X
  1667. X    PushArgs[0].value = (XtArgVal) NULL;
  1668. X    PushArgs[1].value = (XtArgVal) LIMIT_LABEL;
  1669. X    PushArgs[4].value = (XtArgVal) "Dismiss";
  1670. X    PushArgs[5].value = (XtArgVal) popup;
  1671. X    DISMISS = XtCreateManagedWidget("dismiss_push", pushWidgetClass,
  1672. X      form, PushArgs, XtNumber(PushArgs));
  1673. X
  1674. X    DialogSetFocusOrder(popup, widgets, NUM_CONTROLS);
  1675. X
  1676. X    return (popup);
  1677. X}
  1678. END_OF_FILE
  1679. if test 8679 -ne `wc -c <'master/settingsDb.c'`; then
  1680.     echo shar: \"'master/settingsDb.c'\" unpacked with wrong size!
  1681. fi
  1682. # end of 'master/settingsDb.c'
  1683. fi
  1684. if test -f 'widgets/Push.c' -a "${1}" != "-c" ; then 
  1685.   echo shar: Will not clobber existing file \"'widgets/Push.c'\"
  1686. else
  1687. echo shar: Extracting \"'widgets/Push.c'\" \(9363 characters\)
  1688. sed "s/^X//" >'widgets/Push.c' <<'END_OF_FILE'
  1689. X/*
  1690. X * Copyright (c) Ken W. Marks 1989, 1990.
  1691. X */
  1692. X
  1693. X#include <stdio.h>
  1694. X#include <X11/Intrinsic.h>
  1695. X#include <X11/StringDefs.h>
  1696. X#include <Chaos.h>
  1697. X#include <LocalDefs.h>
  1698. X#include <PushP.h>
  1699. X#include <DlgShell.h>
  1700. X
  1701. X#define LEFT_ARC        '\034'
  1702. X#define RIGHT_ARC        '\035'
  1703. X#define ARROW            '\037'
  1704. X#define BLANK            '\036'
  1705. X
  1706. Xstatic void PushInitialize();
  1707. Xstatic void PushResize();
  1708. Xstatic void PushRedisplay();
  1709. Xstatic void PushDestroy();
  1710. Xstatic void PushSet();
  1711. Xstatic void PushNotify();
  1712. Xstatic void PushReset();
  1713. Xstatic void PushMark();
  1714. Xstatic void PushGoto();
  1715. Xstatic void PushFocusIn();
  1716. Xstatic void PushFocusOut();
  1717. X
  1718. X
  1719. X#define offset(field) XtOffset(PushWidget, push.field)
  1720. Xstatic XtResource push_resources[] = {
  1721. X    {XtNcallback, XtCCallback, XtRCallback, sizeof(caddr_t),
  1722. X    offset(callbacks), XtRCallback, (caddr_t) NULL},
  1723. X    {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
  1724. X    offset(foreground), XtRString, "XtDefaultForeground"},
  1725. X    {XtNfontNormal, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
  1726. X    offset(normal_font), XtRString, "push-norm"},
  1727. X    {XtNfontReverse, XtCFont, XtRFontStruct, sizeof(XFontStruct *),
  1728. X    offset(reverse_font), XtRString, "push-rev"},
  1729. X    {XtNlabel, XtCLabel, XtRString, sizeof(String),
  1730. X    offset(label), XtRString, NULL},
  1731. X    {XtNdialogbox, XtCWidget, XtRWidget, sizeof(Widget),
  1732. X    offset(dialogbox), XtRWidget, (caddr_t) NULL},
  1733. X};
  1734. X
  1735. Xstatic XtActionsRec push_actions[] =
  1736. X{
  1737. X    {"mark", PushMark},
  1738. X    {"goto", PushGoto},
  1739. X    {"set", PushSet},
  1740. X    {"notify", PushNotify},
  1741. X    {"reset", PushReset},
  1742. X    {"focus_in", PushFocusIn},
  1743. X    {"focus_out", PushFocusOut},
  1744. X
  1745. X};
  1746. X
  1747. X#define superclass        (&simpleClassRec)
  1748. X
  1749. Xstatic char push_translations[] =
  1750. X"<BtnDown>:        mark() set()\n\
  1751. X <BtnUp>:        notify(BUTTON) reset()\n\
  1752. X Button1<LeaveWindow>:    reset()\n\
  1753. X Button2<LeaveWindow>:    reset()\n\
  1754. X Button3<LeaveWindow>:    reset()\n\
  1755. X Button1<EnterWindow>:    set()\n\
  1756. X Button2<EnterWindow>:    set()\n\
  1757. X Button3<EnterWindow>:    set()\n\
  1758. X <Key>Return:        notify(KEY)\n\
  1759. X Shift<Key>Tab:        goto(PREV)\n\
  1760. X <Key>Tab:        goto(NEXT)\n\
  1761. X <FocusIn>:        focus_in()\n\
  1762. X <FocusOut>:        focus_out()\n\
  1763. X";
  1764. X
  1765. XPushClassRec pushClassRec = {
  1766. X    {
  1767. X    /* core fields          */
  1768. X     /* superclass         */ (WidgetClass) superclass,
  1769. X     /* class_name         */ "Push",
  1770. X     /* widget_size         */ sizeof(PushRec),
  1771. X     /* class_initialize     */ NULL,
  1772. X     /* class_part_initialize */ NULL,
  1773. X     /* class_inited     */ FALSE,
  1774. X     /* initialize         */ PushInitialize,
  1775. X     /* initialize_hook     */ NULL,
  1776. X     /* realize         */ XtInheritRealize,
  1777. X     /* actions         */ push_actions,
  1778. X     /* num_actions         */ XtNumber(push_actions),
  1779. X     /* resources         */ push_resources,
  1780. X     /* resource_count     */ XtNumber(push_resources),
  1781. X     /* xrm_class         */ NULLQUARK,
  1782. X     /* compress_motion     */ TRUE,
  1783. X     /* compress_exposure     */ TRUE,
  1784. X     /* compress_enterleave     */ TRUE,
  1785. X     /* visible_interest     */ FALSE,
  1786. X     /* destroy         */ PushDestroy,
  1787. X     /* resize         */ PushResize,
  1788. X     /* expose         */ PushRedisplay,
  1789. X     /* set_values         */ NULL,
  1790. X     /* set_values_hook     */ NULL,
  1791. X     /* set_values_almost     */ XtInheritSetValuesAlmost,
  1792. X     /* get_values_hook     */ NULL,
  1793. X     /* accept_focus     */ NULL,
  1794. X     /* version         */ XtVersion,
  1795. X     /* callback_private     */ NULL,
  1796. X     /* tm_table         */ push_translations,
  1797. X     /* query_geometry       */ NULL,
  1798. X     /* display_accelerator     */ XtInheritDisplayAccelerator,
  1799. X     /* extension         */ NULL
  1800. X    },
  1801. X    {
  1802. X    /* Simple class fields initialization */
  1803. X     /* change_sensitive     */ XtInheritChangeSensitive
  1804. X    }
  1805. X};
  1806. X
  1807. XWidgetClass pushWidgetClass = (WidgetClass) & pushClassRec;
  1808. X
  1809. X
  1810. X/************************************************************/
  1811. X/******************** Private Procedures ********************/
  1812. X/************************************************************/
  1813. X
  1814. X
  1815. Xstatic GC PushGetGC(w, font)
  1816. XPushWidget w;
  1817. XFont font;
  1818. X{
  1819. X    XGCValues values;
  1820. X
  1821. X    values.foreground = w->push.foreground;
  1822. X    values.background = w->core.background_pixel;
  1823. X    values.font = font;
  1824. X
  1825. X    return (XtGetGC((Widget) w,
  1826. X    (unsigned) GCForeground | GCBackground | GCFont, &values));
  1827. X}
  1828. X
  1829. X
  1830. Xstatic void PushSetSize(w)
  1831. XPushWidget w;
  1832. X{
  1833. X    XtWidgetGeometry my_request;
  1834. X    XFontStruct *fs = w->push.normal_font;
  1835. X
  1836. X    w->push.baseline = fs->max_bounds.ascent;
  1837. X
  1838. X    my_request.request_mode = CWWidth | CWHeight | CWBorderWidth;
  1839. X    my_request.width = XTextWidth(fs, w->push.label, strlen(w->push.label));
  1840. X    my_request.height = fs->max_bounds.ascent + fs->max_bounds.descent;
  1841. X    my_request.border_width = 0;
  1842. X
  1843. X    XtMakeGeometryRequest((Widget) w, &my_request, NULL);
  1844. X}
  1845. X
  1846. X
  1847. Xstatic void PushStoreLabel(w, label)
  1848. XPushWidget w;
  1849. Xchar *label;
  1850. X{
  1851. X    w->push.label_len = strlen(label) + 3;
  1852. X    w->push.label = malloc((unsigned) w->push.label_len + 1);
  1853. X    (void) strcpy(&(w->push.label[2]), label);
  1854. X    w->push.label[0] = BLANK;
  1855. X    w->push.label[1] = LEFT_ARC;
  1856. X    w->push.label[w->push.label_len - 1] = RIGHT_ARC;
  1857. X    w->push.label[w->push.label_len] = 0;
  1858. X}
  1859. X
  1860. X
  1861. X/* ARGSUSED */
  1862. Xstatic void PushInitialize(request, new)
  1863. XWidget request;
  1864. XWidget new;
  1865. X{
  1866. X    PushWidget w = (PushWidget) new;
  1867. X
  1868. X    if (w->push.dialogbox == NULL)
  1869. X    {
  1870. X    eprintf("XtNdialogbox not set\n");
  1871. X    abort();
  1872. X    }
  1873. X
  1874. X    if (w->push.label == NULL)
  1875. X    {
  1876. X    eprintf("XtNLabel not set\n");
  1877. X    abort();
  1878. X    }
  1879. X
  1880. X    PushStoreLabel(w, w->push.label);
  1881. X
  1882. X    w->push.normal_gc = PushGetGC(w, w->push.normal_font->fid);
  1883. X    w->push.reverse_gc = PushGetGC(w, w->push.reverse_font->fid);
  1884. X
  1885. X    w->push.set = False;
  1886. X    w->push.active = False;
  1887. X
  1888. X    PushResize((Widget) w);
  1889. X}
  1890. X
  1891. X
  1892. X/* ARGSUSED */
  1893. Xstatic void PushRedisplay(widget, event, region)
  1894. XWidget widget;
  1895. XXEvent *event;
  1896. XRegion region;
  1897. X{
  1898. X    PushWidget w = (PushWidget) widget;
  1899. X    GC gc;
  1900. X
  1901. X    if (XtIsRealized(widget) == False)
  1902. X    return;
  1903. X
  1904. X    gc = w->push.set ? w->push.reverse_gc : w->push.normal_gc;
  1905. X
  1906. X    if (w->push.active == True)
  1907. X    w->push.label[0] = ARROW;
  1908. X    else
  1909. X    w->push.label[0] = BLANK;
  1910. X
  1911. X    XDrawImageString(XtDisplay(w), XtWindow(w), gc, 0, w->push.baseline,
  1912. X      w->push.label, w->push.label_len);
  1913. X}
  1914. X
  1915. X
  1916. Xstatic void PushResize(widget)
  1917. XWidget widget;
  1918. X{
  1919. X    PushSetSize((PushWidget) widget);
  1920. X}
  1921. X
  1922. X
  1923. Xstatic void PushDestroy(widget)
  1924. XWidget widget;
  1925. X{
  1926. X    PushWidget w = (PushWidget) widget;
  1927. X
  1928. X    XtReleaseGC(widget, w->push.normal_gc);
  1929. X    XtReleaseGC(widget, w->push.reverse_gc);
  1930. X}
  1931. X
  1932. X
  1933. Xstatic void PushDrawArrow(widget)
  1934. XWidget widget;
  1935. X{
  1936. X    PushWidget w = (PushWidget) widget;
  1937. X    Display *dpy = XtDisplay(w);
  1938. X    Window window = XtWindow(w);
  1939. X    char active_string[1];
  1940. X
  1941. X    /* must convert the arrow/blank char into string for printing */
  1942. X    active_string[0] = w->push.active ? ARROW : BLANK;
  1943. X
  1944. X    XDrawImageString(dpy, window, w->push.normal_gc, 0,
  1945. X      w->push.baseline, active_string, 1);
  1946. X}
  1947. X
  1948. X
  1949. X/***********************************************************/
  1950. X/******************** Action Procedures ********************/
  1951. X/***********************************************************/
  1952. X
  1953. X
  1954. X/*ARGSUSED*/
  1955. Xstatic void PushFocusIn(widget, event, params, num_params)
  1956. XWidget widget;
  1957. XXEvent *event;
  1958. XString *params;
  1959. XCardinal *num_params;        /* unused */
  1960. X{
  1961. X    PushWidget w = (PushWidget) widget;
  1962. X
  1963. X    if (w->push.active == False)
  1964. X    {
  1965. X    w->push.active = True;
  1966. X    PushDrawArrow(widget);
  1967. X    }
  1968. X}
  1969. X
  1970. X
  1971. X/*ARGSUSED*/
  1972. Xstatic void PushFocusOut(widget, event, params, num_params)
  1973. XWidget widget;
  1974. XXEvent *event;
  1975. XString *params;
  1976. XCardinal *num_params;        /* unused */
  1977. X{
  1978. X    PushWidget w = (PushWidget) widget;
  1979. X
  1980. X    if (w->push.active == True)
  1981. X    {
  1982. X    w->push.active = False;
  1983. X    PushDrawArrow(widget);
  1984. X    }
  1985. X}
  1986. X
  1987. X
  1988. X/* ARGSUSED */
  1989. Xstatic void PushSet(widget, event, params, num_params)
  1990. XWidget widget;
  1991. XXEvent *event;
  1992. XString *params;            /* unused */
  1993. XCardinal *num_params;        /* unused */
  1994. X{
  1995. X    PushWidget w = (PushWidget) widget;
  1996. X
  1997. X    w->push.set = True;
  1998. X    PushRedisplay(widget, (XEvent *) NULL, (Region) NULL);
  1999. X}
  2000. X
  2001. X
  2002. X/* ARGSUSED */
  2003. Xstatic void PushReset(widget, event, params, num_params)
  2004. XWidget widget;
  2005. XXEvent *event;
  2006. XString *params;            /* unused */
  2007. XCardinal *num_params;
  2008. X{
  2009. X    PushWidget w = (PushWidget) widget;
  2010. X
  2011. X    w->push.set = False;
  2012. X    PushRedisplay(widget, (XEvent *) NULL, (Region) NULL);
  2013. X}
  2014. X
  2015. X
  2016. X/* ARGSUSED */
  2017. Xstatic void PushNotify(widget, event, params, num_params)
  2018. XWidget widget;
  2019. XXEvent *event;
  2020. XString *params;
  2021. XCardinal *num_params;        /* unused */
  2022. X{
  2023. X    PushWidget w = (PushWidget) widget;
  2024. X
  2025. X    if (w->push.set || params[0][0] == 'K')
  2026. X    XtCallCallbacks(widget, XtNcallback, (XtPointer) w->push.dialogbox);
  2027. X}
  2028. X
  2029. X
  2030. X/* ARGSUSED */
  2031. Xstatic void PushMark(widget, event, params, num_params)
  2032. XWidget widget;
  2033. XXEvent *event;            /* unused */
  2034. XString *params;            /* unused */
  2035. XCardinal *num_params;        /* unused */
  2036. X{
  2037. X    PushWidget w = (PushWidget) widget;
  2038. X
  2039. X    w->push.active = True;
  2040. X
  2041. X    DialogSetNewFocus(w->push.dialogbox, widget);
  2042. X}
  2043. X
  2044. X
  2045. X/* ARGSUSED */
  2046. Xstatic void PushGoto(widget, event, params, num_params)
  2047. XWidget widget;
  2048. XXEvent *event;            /* unused */
  2049. XString *params;
  2050. XCardinal *num_params;        /* unused */
  2051. X{
  2052. X    PushWidget w = (PushWidget) widget;
  2053. X
  2054. X    switch (params[0][0])
  2055. X    {
  2056. X    case 'P':
  2057. X    DialogSetPrevFocus(w->push.dialogbox);
  2058. X    break;
  2059. X
  2060. X    case 'N':
  2061. X    DialogSetNextFocus(w->push.dialogbox);
  2062. X    break;
  2063. X    }
  2064. X
  2065. X    w->push.active = False;
  2066. X    PushDrawArrow(widget);
  2067. X}
  2068. X
  2069. X
  2070. X/***********************************************************/
  2071. X/******************** Public Procedures ********************/
  2072. X/***********************************************************/
  2073. X
  2074. Xvoid PushChangeLabel(widget, label)
  2075. XWidget widget;
  2076. Xchar *label;
  2077. X{
  2078. X    PushWidget w = (PushWidget) widget;
  2079. X
  2080. X    free(w->push.label);
  2081. X    PushStoreLabel(w, label);
  2082. X    PushSetSize(w);
  2083. X    PushRedisplay(widget, (XEvent *) NULL, (Region) NULL);
  2084. X}
  2085. END_OF_FILE
  2086. if test 9363 -ne `wc -c <'widgets/Push.c'`; then
  2087.     echo shar: \"'widgets/Push.c'\" unpacked with wrong size!
  2088. fi
  2089. # end of 'widgets/Push.c'
  2090. fi
  2091. echo shar: End of archive 7 \(of 10\).
  2092. cp /dev/null ark7isdone
  2093. MISSING=""
  2094. for I in 1 2 3 4 5 6 7 8 9 10 ; do
  2095.     if test ! -f ark${I}isdone ; then
  2096.     MISSING="${MISSING} ${I}"
  2097.     fi
  2098. done
  2099. if test "${MISSING}" = "" ; then
  2100.     echo You have unpacked all 10 archives.
  2101.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2102. else
  2103.     echo You still need to unpack the following archives:
  2104.     echo "        " ${MISSING}
  2105. fi
  2106. ##  End of shell archive.
  2107. exit 0
  2108.  
  2109. dan
  2110. ----------------------------------------------------
  2111. O'Reilly && Associates   argv@sun.com / argv@ora.com
  2112. Opinions expressed reflect those of the author only.
  2113.