ftp.nice.ch/pub/next/science/mathematics/hippoplotamus.2.0.s.tar.gz#/hippo2.0/x11test.c

This is x11test.c in view mode; [Download] [Up]

#include <X11/Xlib.h>
#define __TYPES
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "hippo.h"

static int width=600, height=600;

static void doHandleEvents();
int main()
{
     ntuple *nt_list;
     display d_list[9];
     FILE *outfile;
     int nnt,i;
     
     /*
      * read in example ntuple
      */
     if (h_read("example.hippo",d_list,&nt_list) != 0)
     {
	  fprintf(stderr,"Error reading file example.hippo\n");
	  exit(1);
     }

     /*
      * check a few things
      */
     for (nnt=0; nt_list[nnt] != NULL; nnt++);
     if (nnt != 1)
     {
	  fprintf(stderr,"There are %d ntuples in the file\n",nnt);
	  fprintf(stderr,"  There should only be 1!\n");
	  exit(1);
     }
     
     /*
      * create 9 displays
      */

     if ((d_list[0] = h_newDisp(HISTOGRAM)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[1] = h_newDisp(HISTOGRAM)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[2] = h_newDisp(HISTOGRAM)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[3] = h_newDisp(HISTOGRAM)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[4] = h_newDisp(HISTOGRAM)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[5] = h_newDisp(SCATTERPLOT)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[6] = h_newDisp(COLORPLOT)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[7] = h_newDisp(COLORPLOT)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     if ((d_list[8] = h_newDisp(LEGOPLOT)) == NULL)
     {
	  fprintf(stderr,"Error creating display\n");
	  exit(1);
     }
     
     /*
      * set display attributes
      */
     for (i=0; i<9; i++)
       {
         h_bindNtuple( d_list[i], nt_list[0] );
         h_bind(d_list[i],XAXIS, 3);
         h_bind(d_list[i],YAXIS, 10);
       }

     h_setDrawType(d_list[1],ERRBAR);
     h_setDrawType(d_list[2],POINT+LINE);
     h_setDrawType(d_list[3],POINT+LINE);
     h_setPlotSym(d_list[3],TIMES);
     h_setLineStyle(d_list[3],DOTDASH);
     h_bind(d_list[3],WEIGHT,10);

     h_setDrawType(d_list[7],COLOR);

     h_setPlotDrvr(X11PLOT); 
    /*
      * now create X output of display
      * we make one large window, then six sub-windows, one for each plot
      *
      */ 
     
     {
       Display *disp = XOpenDisplay(NULL);
       Screen  *scrn = XDefaultScreenOfDisplay(disp);
       GC       gc   = DefaultGCOfScreen(scrn);
       XSetWindowAttributes xswa;
       Window  main, wind[10];
      
       xswa.event_mask = ExposureMask | ButtonPressMask | StructureNotifyMask;
       xswa.background_pixel = WhitePixelOfScreen(scrn);

       main = XCreateWindow(disp,DefaultRootWindow(disp),
                            10,10,width,height,0,
                            DefaultDepthOfScreen(scrn), InputOutput, 
                            DefaultVisualOfScreen(scrn), 
                            CWEventMask | CWBackPixel, &xswa);
                                        
       xswa.event_mask = ExposureMask | ButtonPressMask;
       for (i=0; i<9; i++)
         {
           wind[i] = XCreateWindow(disp,main,
                                   (i-i/3*3)*200,(i/3)*200,200,200,0,
                                   DefaultDepthOfScreen(scrn), InputOutput, 
                                   DefaultVisualOfScreen(scrn), 
                                   CWEventMask | CWBackPixel, &xswa);
           XMapWindow(disp,wind[i]);
         }

       XStoreName(disp, main, "X-Hippo example display");
       XMapWindow(disp,main);
       wind[9]=main;                      
       doHandleEvents(d_list,disp,scrn,wind,gc);
     }

}
static void doHandleEvents(display disp[],Display *dpy,Screen *scrn,Window wind[],GC gc)
{
    XEvent event;
    XAnyEvent *any = (XAnyEvent *) &event;
    XExposeEvent *expose = (XExposeEvent *) &event;
    XConfigureEvent *config = (XConfigureEvent *) &event;
    int i;

    for ( ; ; ) {
        XNextEvent(dpy, &event);
        
        for (i=0; i<9; i++) if (any->window==wind[i]) break;

        switch (event.type) {
            case Expose:       if (expose->count==0)
                                 {
                                   printf("expose %d\n",i);
                                   if (i<9)
                                     h_plot(disp[i],dpy,scrn,wind[i],gc);
                                   if (i==4)
                                     {
                                       h_shade(disp[i],0. ,40. );   
                                       h_shade(disp[i],60.,100.);   
                                     }
                                 } 
                               break;
            case ButtonPress:  printf("Button press in window %d\n",i);
                               break;

            case ConfigureNotify:

                               if (config->width != width ||
                                   config->height != height)
                                 {
                                   int x,y,w,h;

                                   height = config->height;
                                   width  = config->width;

                                   w = width/3;
                                   h = height/3;
                                   x = 0;
                                   y = 0;
                                 
                                   for (i=0; i<9; i++)
                                     {
                                       XMoveResizeWindow(dpy,wind[i],x,y,w,h);
                                       x += w;
                                       if (i == 2 || i == 5)
                                         { x = 0; y += h; }
                                     }
                                 }
                               break;
        }
    }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.