[comp.sources.x] v06i032: vine, Patch1

argv@sun.com (03/15/90)

Submitted-by: argv@sun.com
Posting-number: Volume 6, Issue 32
Archive-name: vine/patch1
Patch-To: vine: Volume 6, Issue 25

The following patch to vine fixes the problem
with forking.  so, some of the more interesting
parameters now workd:
    vine -C -c
    vince -CfDc
Due to a bug with xnews, you're going to have a problem
allocating colors correctly.  It's been reported already.

*** Imakefile.orig	Sat Mar 10 12:41:04 1990
--- Imakefile	Wed Mar 14 11:19:36 1990
***************
*** 2,8 ****
  #include BandAidCompiler
  #endif
  
! DEFINES -DX11
  INCLUDES = -I$(TOP) -I$(TOP)/X11
  SYS_LIBRARIES = -lm
  LOCAL_LIBRARIES = $(XLIB)
--- 2,8 ----
  #include BandAidCompiler
  #endif
  
! DEFINES = -DX11
  INCLUDES = -I$(TOP) -I$(TOP)/X11
  SYS_LIBRARIES = -lm
  LOCAL_LIBRARIES = $(XLIB)
*** version.h.orig	Wed Mar 14 23:02:20 1990
--- version.h	Wed Mar 14 23:02:33 1990
***************
*** 1,2 ****
! #define PATCHLEVEL 0
! #define PATCHDATE  3/9/90
--- 1,2 ----
! #define PATCHLEVEL 1
! #define PATCHDATE  3/14/90
*** vine.c.orig	Fri Mar  9 18:44:25 1990
--- vine.c	Wed Mar 14 22:23:11 1990
***************
*** 5,10 ****
--- 5,13 ----
   *
   *  compile: cc -O -s vine.c -lsunwindow -lpixrect -lm -o vine
   *
+  *  Updating to work on X11 March 1990.
+  *  compile: cc -O -s vine.c -DX11 -lX11 -lm -o vine
+  *
   * The way vines works is a "stem" grows and leaves grow from that stem.
   * The stem and the leaf are arrays of "points" (struct pr_pos).  You can
   * add your own images (like flowers or something) with the -S and -L
***************
*** 49,55 ****
      "-R N: have N different leaf rotations (max 360)",
  #ifdef X11
      "-d display: use display:server[.screen]",
-     "-F: allow forking; off by default because X server gets confused",
  #else /* X11 */
      "-d device: use alternate frame buffer; default is /dev/fb",
      "-w:  vines grow around each window on the screen (not icons; no color)",
--- 52,57 ----
***************
*** 73,85 ****
  #include <X11/Xatom.h>
  #include <X11/Xlib.h>
  #include <X11/Xutil.h>
! struct pr_pos {
!     short x, y;
! };
  struct rect {
      int	r_left, r_top, r_width, r_height;
  };
  #else /* X11 */
  #include <suntool/tool_hs.h>
  #include <pixrect/pixrect_hs.h>
  #include <suntool/wmgr.h>
--- 75,86 ----
  #include <X11/Xatom.h>
  #include <X11/Xlib.h>
  #include <X11/Xutil.h>
! typedef XPoint point_t;
  struct rect {
      int	r_left, r_top, r_width, r_height;
  };
  #else /* X11 */
+ typedef struct pr_pos point_t;
  #include <suntool/tool_hs.h>
  #include <pixrect/pixrect_hs.h>
  #include <suntool/wmgr.h>
***************
*** 88,93 ****
--- 89,95 ----
  #define WidthOfScreen(s) s->pr_size.x
  #define HeightOfScreen(s) s->pr_size.y
  #define WUF_WMGR1 0x10
+ #define XFlush(dpy) /* not used in Suntools */
  #endif /* X11 */
  
  #include <sys/wait.h>
***************
*** 118,124 ****
  /*
   * each {x,y} is a relative point to 0,0. End is {0,0} pair
   */
! struct pr_pos leaf[] = {
      {-4,4}, {-9,6}, {-13,9}, {-15,11}, {-16,14}, {-17,16}, {-17,20},
      {-16,24}, {-13,28}, {-11,30}, {-9,32}, {-4,36}, {-1,38}, {4,39}, {6,37},
      {4,37}, {3,34}, {3,31}, {4,29}, {6,25}, {9,20}, {10,16}, {10,12},
--- 120,126 ----
  /*
   * each {x,y} is a relative point to 0,0. End is {0,0} pair
   */
! point_t leaf[] = {
      {-4,4}, {-9,6}, {-13,9}, {-15,11}, {-16,14}, {-17,16}, {-17,20},
      {-16,24}, {-13,28}, {-11,30}, {-9,32}, {-4,36}, {-1,38}, {4,39}, {6,37},
      {4,37}, {3,34}, {3,31}, {4,29}, {6,25}, {9,20}, {10,16}, {10,12},
***************
*** 125,139 ****
      {8,8}, {7,7}, {4,6}, {2,4}, {1,0}, {0,2}, {-1,4}, {-3,8},
      {-5,12}, {-6,16}, {-6,20}, {-5,24}, {-3,27}, {0,0}
  };
! int leafsize = sizeof (leaf) / sizeof (struct pr_pos);
  
! struct pr_pos stem[50] = {
      {0,7}, {1,8}, {2,7}, {1,12}, {0,11}, {-1,12}, {-3,15}, {-3,19}, {-2,22},
      {-1,24}, {1,26}, {3,28}, {4,30}, {5,32}, {5,36}, {7,40}, {8,42}, {9,43},
      {8,49}, {5,51}, {2,54}, {0,60}, {0,0}
  };
! int stemsize = sizeof (stem) / sizeof (struct pr_pos);
! struct pr_pos leaves[360][sizeof(leaf) / sizeof(struct pr_pos)];
  struct rect win_rects[32];
  
  int reverse;          /*  -r:  reverse video */
--- 127,141 ----
      {8,8}, {7,7}, {4,6}, {2,4}, {1,0}, {0,2}, {-1,4}, {-3,8},
      {-5,12}, {-6,16}, {-6,20}, {-5,24}, {-3,27}, {0,0}
  };
! int leafsize = sizeof (leaf) / sizeof (point_t);
  
! point_t stem[50] = {
      {0,7}, {1,8}, {2,7}, {1,12}, {0,11}, {-1,12}, {-3,15}, {-3,19}, {-2,22},
      {-1,24}, {1,26}, {3,28}, {4,30}, {5,32}, {5,36}, {7,40}, {8,42}, {9,43},
      {8,49}, {5,51}, {2,54}, {0,60}, {0,0}
  };
! int stemsize = sizeof (stem) / sizeof (point_t);
! point_t leaves[360][sizeof(leaf) / sizeof(point_t)];
  struct rect win_rects[32];
  
  int reverse;          /*  -r:  reverse video */
***************
*** 150,163 ****
  int do_edges;	      /*  -e:  just traverse the edges of the screen */
  int do_windows;       /*  -w:  grow around each open window in suntools */
  int season;	      /*  -f:  fall season */
- int do_fork;          /*  -F:  allow forking -- off for X */
  int fade;	      /*  -D:  fade the color down the colormap */
  
! unsigned long colors[256];
  int max_color;        /* maximum number of colors available */
  int win_no, my_win;   /* number of windows running / which win we are */
  int total_forks;      /* the total number of forks we've done so far */
  
  #ifdef X11
  unsigned long intensity;        /* shade of color to paint */
  Display *dpy; /* display */
--- 152,166 ----
  int do_edges;	      /*  -e:  just traverse the edges of the screen */
  int do_windows;       /*  -w:  grow around each open window in suntools */
  int season;	      /*  -f:  fall season */
  int fade;	      /*  -D:  fade the color down the colormap */
  
! unsigned long colors[255];
  int max_color;        /* maximum number of colors available */
  int win_no, my_win;   /* number of windows running / which win we are */
  int total_forks;      /* the total number of forks we've done so far */
  
+ char *prog_name;
+ 
  #ifdef X11
  unsigned long intensity;        /* shade of color to paint */
  Display *dpy; /* display */
***************
*** 185,190 ****
--- 188,195 ----
      int c;
      int dead_kids();
  
+     prog_name = argv[0];
+ 
      if (argc > 1)
  	parse_args(argc, argv);
      else
***************
*** 227,265 ****
  	}
      }
  
- #ifdef X11
- {
-     void x_error();
-     char *getenv(), *p = getenv("DISPLAY");
-     if (!(dpy = XOpenDisplay(device? device : p? p : ""))) {
- 	fprintf(stderr, "%s: unable to open display '%s'\n",
- 	    argv[0], XDisplayName(p));
- 	exit(1);
-     }
-     /* XSynchronize(dpy, 1); */
-     XSetErrorHandler(x_error);
-     screen = ScreenOfDisplay(dpy, DefaultScreen(dpy));
-     win = RootWindowOfScreen(screen);
-     gc = XCreateGC(dpy, win, 0L, NULL);
- }
- #else /* X11 */
- {
-     char groups[PIXPG_OVERLAY+1];
-     if (!(screen = pr_open(device)))
- 	exit(1); /* pr_open prints its own error messages (bad idea) */
- 
-     pr_available_plane_groups(screen, sizeof(groups), groups);
- 
-     if (groups[PIXPG_OVERLAY] && groups[PIXPG_OVERLAY_ENABLE] && !is_color) {
- 	pr_set_plane_group(screen, PIXPG_OVERLAY_ENABLE);
- 	pr_rop(screen, 0,0, WidthOfScreen(screen), HeightOfScreen(screen),
- 	    PIX_SET, (Pixrect *) 0,0,0);
- 	pr_set_plane_group(screen, PIXPG_OVERLAY);
-     }
-     do_fork++;
- }
- #endif /* X11 */
- 
      if (do_halt || from_center)
  	/* don't count this fork ... */
  	if (fork())
--- 232,237 ----
***************
*** 274,282 ****
  	    putchar('.');
      }
      puts(" done.");
!     if (is_color)
! 	initialize_color();
!     else if (do_windows) {
  	if (!get_windows())
  	    puts("No windows!");
  
--- 246,254 ----
  	    putchar('.');
      }
      puts(" done.");
!     init_display();
! #ifndef X11
!     if (!is_color && do_windows) {
  	if (!get_windows())
  	    puts("No windows!");
  
***************
*** 291,306 ****
  			    win_rects[my_win].r_top, FLOP);
  	exit(0);
      }
      y = 1;
      if (do_edges) {
! 	if (do_fork) {
! 	    if (!fork()) {
! 		edge_vines(WidthOfScreen(screen) / 2, 10, FLIP);
! 		exit(0);
! 	    }
! 	} else
  	    edge_vines(WidthOfScreen(screen) / 2, 10, FLIP);
! 	edge_vines(WidthOfScreen(screen) / 2, 10, FLOP);
  	exit(0);
      }
  #ifdef SIGCHLD
--- 263,276 ----
  			    win_rects[my_win].r_top, FLOP);
  	exit(0);
      }
+ #endif /* X11 */
      y = 1;
      if (do_edges) {
! 	if (!fork()) {
! 	    init_display();
  	    edge_vines(WidthOfScreen(screen) / 2, 10, FLIP);
! 	} else
! 	    edge_vines(WidthOfScreen(screen) / 2, 10, FLOP);
  	exit(0);
      }
  #ifdef SIGCHLD
***************
*** 312,320 ****
  	    random_vines(WidthOfScreen(screen)/2, HeightOfScreen(screen)/2);
  	else
  	    random_vines(x, y);
- #ifdef X11
-     XFlush(dpy);
- #endif /* X11 */
  }
  
  #ifdef SIGCHLD
--- 282,287 ----
***************
*** 357,362 ****
--- 324,330 ----
  	draw_stem(&x, &y,
  	    (random() % 2) * UP | ((which_way == FLIP) ? FLOP : FLIP));
      */
+     XFlush(dpy);
  }
  
  random_vines(xstart, ystart)
***************
*** 366,371 ****
--- 334,340 ----
  	total_forks++;
  	return;
      }
+     init_display();
      /* make the child think there are too many forks */
      total_forks = MAX_FORKS;
      srandom((int) (getpid() * time((long *) 0)));
***************
*** 375,380 ****
--- 344,350 ----
  	if (!(random() % (1 + (40 - branch_freq))))
  	    random_vines(xstart, ystart);
      }
+     XFlush(dpy);
      exit(0);
  }
  
***************
*** 422,428 ****
  
  do_leaf(x,y)
  {
!     int reverse_it;
      if (interleaf && (reverse_it = !(random() % interleaf)))
  	reverse = !reverse;
      /* start at x,y and rotate */
--- 392,398 ----
  
  do_leaf(x,y)
  {
!     int reverse_it = 0;
      if (interleaf && (reverse_it = !(random() % interleaf)))
  	reverse = !reverse;
      /* start at x,y and rotate */
***************
*** 439,446 ****
  long mirror;
  {
      static col;
!     int tmp, ox = x, oy = y, nx, ny, npts[1];
!     struct pr_pos leaf2[sizeof(leaf) / sizeof(struct pr_pos)];
  
      /* magnify, move leaf into position, and mirror, if necessary */
      for(tmp = 0; tmp < leafsize; tmp++) {
--- 409,419 ----
  long mirror;
  {
      static col;
!     int tmp, ox = x, oy = y, nx, ny;
! #ifndef X11
!     int npts[1];
! #endif
!     point_t leaf2[sizeof(leaf) / sizeof(point_t)];
  
      /* magnify, move leaf into position, and mirror, if necessary */
      for(tmp = 0; tmp < leafsize; tmp++) {
***************
*** 463,469 ****
      reverse = !reverse;
  #ifdef X11
      XFillPolygon(dpy, win, gc, leaf2, 28, Nonconvex, CoordModeOrigin);
-     XFlush(dpy);
  #else /* X11 */
      npts[0] = 28;   /* kludge for middle line of leaf! */
      pr_polygon_2(screen, 0, 0, 1, npts, leaf2, RAS_OP, (Pixrect *) 0,0,0);
--- 436,441 ----
***************
*** 500,506 ****
  
  /* foreach pt in object, rotate_pt() */
  rotate_obj(object, newobject, npts, rotation)
! struct pr_pos object[], newobject[];
  double rotation;
  {
      int i;
--- 472,478 ----
  
  /* foreach pt in object, rotate_pt() */
  rotate_obj(object, newobject, npts, rotation)
! point_t object[], newobject[];
  double rotation;
  {
      int i;
***************
*** 510,516 ****
  
  /* matrix multiplication */
  rotate_pt(oldpt,newpt,rot)
! struct pr_pos *oldpt, *newpt;
  double rot;
  {
      /* temp storage -- might want to copy to itself */
--- 482,488 ----
  
  /* matrix multiplication */
  rotate_pt(oldpt,newpt,rot)
! point_t *oldpt, *newpt;
  double rot;
  {
      /* temp storage -- might want to copy to itself */
***************
*** 592,605 ****
  		leaf_file = optarg;
  	    when 'S':
  		stem_file = optarg;
- 	    when 'F':
- 		do_fork = 1;
  	    when '?':
  		errors = 1;
  	}
  
      if (errors) {
! 	fprintf(stderr, err_msg[0], argv[0]);
          for (c = 1; err_msg[c]; c++)
  	    fprintf(stderr, "%s\n", err_msg[c]);
  	exit(1);
--- 564,575 ----
  		leaf_file = optarg;
  	    when 'S':
  		stem_file = optarg;
  	    when '?':
  		errors = 1;
  	}
  
      if (errors) {
! 	fprintf(stderr, err_msg[0], prog_name);
          for (c = 1; err_msg[c]; c++)
  	    fprintf(stderr, "%s\n", err_msg[c]);
  	exit(1);
***************
*** 608,619 ****
  
  #ifdef X11
  get_windows(){}
  initialize_color()
  {
-     u_char red[256], green[256], blue[256];
-     XColor color;
      Colormap cm = DefaultColormapOfScreen(screen);
  
      color.flags = DoRed | DoGreen | DoBlue;
      for (max_color = 0; max_color < 256; max_color++) {
  	if (season) {
--- 578,617 ----
  
  #ifdef X11
  get_windows(){}
+ 
+ /*
+  * Open the display (connection to the X server).  If it's already
+  * open, close it and reopen it since this is a child process and
+  * each child needs its own connection.
+  */
+ init_display()
+ {
+     int x_error(), first_time = !dpy;
+     char *getenv(), *p = getenv("DISPLAY");
+ 
+     if (dpy)
+ 	XCloseDisplay(dpy);
+     if (!(dpy = XOpenDisplay(device? device : p? p : ""))) {
+ 	fprintf(stderr, "%s: unable to open display '%s'\n",
+ 	    prog_name, XDisplayName(p));
+ 	exit(1);
+     }
+     XSetErrorHandler(x_error);
+     screen = ScreenOfDisplay(dpy, DefaultScreen(dpy));
+     win = RootWindowOfScreen(screen);
+     gc = XCreateGC(dpy, win, 0L, NULL);
+     if (first_time)
+ 	initialize_color();
+     XFlush(dpy);
+ }
+ 
+ XColor color;
  initialize_color()
  {
      Colormap cm = DefaultColormapOfScreen(screen);
  
+     if (!is_color)
+ 	return;
      color.flags = DoRed | DoGreen | DoBlue;
      for (max_color = 0; max_color < 256; max_color++) {
  	if (season) {
***************
*** 624,638 ****
  	    color.green = (255 - max_color/3)<<8;
  	}
  	color.blue = (max_color/5)<<8;
  	if (!XAllocColor(dpy, cm, &color)) {
  	    printf("ran out of colors at index %d\n", max_color--);
  	    break;
  	}
  	colors[max_color] = color.pixel;
      }
  }
  
! void
  x_error(display, error)
  Display	*display;
  XErrorEvent	*error;
--- 622,640 ----
  	    color.green = (255 - max_color/3)<<8;
  	}
  	color.blue = (max_color/5)<<8;
+ 	if (dbug)
+ 	    printf("%d=", max_color);
  	if (!XAllocColor(dpy, cm, &color)) {
  	    printf("ran out of colors at index %d\n", max_color--);
  	    break;
  	}
  	colors[max_color] = color.pixel;
+ 	if (dbug)
+ 	    printf("%d, ", color.pixel);
      }
  }
  
! int
  x_error(display, error)
  Display	*display;
  XErrorEvent	*error;
***************
*** 651,661 ****
      XGetErrorDatabaseText(display, "XRequest", num, num, buffer, BUFSIZ);
      fprintf(stderr, " %s\n", buffer);
  
      /* abort to core dump or global debug flag set.. */
!     abort(0);
  }
  
  #else /* X11 */
  get_windows()
  {
      char name[WIN_NAMESIZE];
--- 653,685 ----
      XGetErrorDatabaseText(display, "XRequest", num, num, buffer, BUFSIZ);
      fprintf(stderr, " %s\n", buffer);
  
+     printf("color.red = %d, green = %d, blue = %d, pixel = %d\n",
+ 	color.red>>8, color.green>>8, color.blue>>8, color.pixel);
      /* abort to core dump or global debug flag set.. */
!     /* abort(0); */
!     exit(0);
  }
  
  #else /* X11 */
+ 
+ init_display()
+ {
+     char groups[PIXPG_OVERLAY+1];
+     if (screen)
+ 	return;
+     if (!(screen = pr_open(device)))
+ 	exit(1); /* pr_open prints its own error messages (bad idea) */
+ 
+     pr_available_plane_groups(screen, sizeof(groups), groups);
+ 
+     if (groups[PIXPG_OVERLAY] && groups[PIXPG_OVERLAY_ENABLE] && !is_color) {
+ 	pr_set_plane_group(screen, PIXPG_OVERLAY_ENABLE);
+ 	pr_rop(screen, 0,0, WidthOfScreen(screen), HeightOfScreen(screen),
+ 	    PIX_SET, (Pixrect *) 0,0,0);
+ 	pr_set_plane_group(screen, PIXPG_OVERLAY);
+     }
+ }
+ 
  get_windows()
  {
      char name[WIN_NAMESIZE];
dan
-----------------------------------------------------------
		    O'Reilly && Associates
		argv@sun.com / argv@ora.com
	   632 Petaluma Ave, Sebastopol, CA 95472 
     800-338-NUTS, in CA: 800-533-NUTS, FAX 707-829-0104
    Opinions expressed reflect those of the author only.