home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / graphics / _xview.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  41.0 KB  |  1,977 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _xview.c
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <math.h>
  16. #include <string.h>
  17. #include <stdio.h>
  18. #include <values.h>
  19.  
  20. #include <X11/X.h>
  21. #include <X11/Xlib.h>
  22.  
  23. #include <xview/xview.h>
  24. #include <xview/canvas.h>
  25. #include <xview/cms.h>
  26. #include <xview/scrollbar.h>
  27. #include <xview/xv_xrect.h>
  28. #include <xview/panel.h>
  29. #include <xview/font.h>
  30. #include <xview/notice.h>
  31. #include <xview/openmenu.h>
  32. #include <xview/icon.h>
  33.  
  34.  
  35. #undef TRACE 
  36.  
  37. #ifdef TRACE
  38. #define DPRINT(x) printf x
  39. #else
  40. #define DPRINT(x)
  41. #endif
  42.  
  43.  
  44. #define XPIX(coord) (int)(xorigin + (coord)*x_draw_scale)
  45. #define YPIX(coord) (int)(yorigin - (coord)*x_draw_scale)
  46.  
  47. #define XREAL(pix)  ((double)(pix-xorigin)/x_draw_scale)
  48. #define YREAL(pix)  ((double)(yorigin-pix)/x_draw_scale)
  49.  
  50.  
  51. extern Notify_error notify_dispatch();
  52.  
  53. static repaint_count;
  54.  
  55.  
  56. static short icon_image[] = {
  57.  
  58. #include "leda.icon"
  59.  
  60. };
  61.  
  62. static mpr_static(leda_icon_pixrect,64,64,1,icon_image);
  63.  
  64.  
  65. static char default_frame_label[128];
  66.  
  67. /* pr_tex_dashed */
  68. static unsigned char dotted[2] = { 2,6 };
  69. static unsigned char dashed[2] = { 4,4 };
  70.  
  71. static char frame_label[80];
  72.  
  73. static char read_frame_format[] = "%8.2f %8.2f      %s";
  74.  
  75. static Frame    frame;
  76. static Canvas    canvas;
  77. static Pixwin  *pw = 0;
  78.  
  79. static Pixmap   buffer_pixmap[8];
  80. static int      buffer_width[8];
  81. static int      buffer_height[8];
  82.  
  83. static int              pixel_table[8];
  84. static Xv_cmsdata    cms_data;    
  85. static unsigned char    red[8], green[8], blue[8];
  86.  
  87.  
  88. static char     text_panel_answer[256];
  89.  
  90. static Frame   panel_frame;
  91. static Panel   panel;
  92. static Icon    icon;
  93.  
  94. static void panel_input_notify();
  95. static void init_panel_frame();
  96. static void panel_input_text_notify();
  97. static void init_panel_text_frame();
  98. static void text_panel_menu_proc();
  99.  
  100.  
  101. typedef void (*PRD)();
  102. typedef void (*PMA)();
  103.  
  104. static void x_draw_mouse_default_action(x,y) 
  105. double x,y;
  106. { /* do nothing */}
  107.  
  108. PRD x_draw_redraw = 0;
  109. PMA x_draw_mouse_action = x_draw_mouse_default_action;
  110.  
  111. static int x_draw_done;
  112.  
  113. static Xv_Font text_font,bold_font,message_font;
  114. static Display *display;
  115. static Drawable drawable;
  116. static int screen;
  117.  
  118. static GC  gc;
  119.  
  120. static int xpix_mode_op;
  121.  
  122. static int draw_init_done = FALSE;
  123.  
  124. static int xdots,ydots, xorigin,yorigin;  /* pixels          */
  125.  
  126. static int mouse_key,mouse_xpix, mouse_ypix; 
  127. static int mouse_last_xpix, mouse_last_ypix;
  128. static int mouse_start_xpix, mouse_start_ypix;  /* start for segments  ... */
  129. static int mouse_read_kind;
  130.  
  131.  
  132. static double mouse_xreal,mouse_yreal;
  133. static double mouse_last_xreal,mouse_last_yreal;
  134. static double mouse_start_xreal,mouse_start_yreal;
  135.  
  136.  
  137. /* external variables */
  138.  
  139. int SCREEN_WIDTH = 1152;
  140. int SCREEN_HEIGHT = 900;
  141.    
  142. double x_draw_xmax,x_draw_xmin,x_draw_ymax,x_draw_ymin,x_draw_scale;   
  143.  
  144. int    x_draw_grid_mode;
  145. int    x_draw_depth;
  146.  
  147. int    x_draw_line_width, x_draw_node_width, x_draw_line_style, x_draw_color,
  148.        x_draw_text_mode, x_draw_drawing_mode, x_draw_screen_flush;
  149.  
  150.  
  151.  
  152. static int  screen_width, screen_height;
  153.  
  154.  
  155.  
  156.  
  157. static Xv_singlecolor x_draw_color_map[] = {
  158.  
  159.  {  255,  255,  255 },  /* white  */
  160.  {    0,    0,    0 },  /* black  */
  161.  {  255,    0,    0 },  /* red    */
  162.  {    0,  255,    0 },  /* green  */
  163.  {    0,  100,  255 },  /* blue   */
  164.  {  128,  128,    0 },  /* yellow */
  165.  {  128,    0,  178 },  /* violet */
  166.  {  192,   64,    0 }   /* orange */
  167.  
  168. };
  169.  
  170.  
  171. static int Line_style = 0;
  172.  
  173.  
  174.  
  175. x_draw_flush() { XFlush(display); }
  176.  
  177. x_draw_set_redraw(f)
  178. PRD f;
  179. { x_draw_redraw = f; }
  180.  
  181. x_draw_set_frame_label(message)
  182. char* message;
  183. { /* strcpy(frame_label,message);  */
  184.   window_set(frame,FRAME_LABEL,message,0);
  185. }
  186.  
  187.  
  188. x_draw_reset_frame_label() 
  189. { /* strcpy(frame_label,default_frame_label); } */
  190.   window_set(frame,FRAME_LABEL,default_frame_label,0);
  191.  }
  192.  
  193.  
  194. x_draw_set_gc_read_mouse()
  195. { XGCValues gc_val;
  196.   gc_val.function = GXxor; 
  197.   gc_val.foreground = pixel_table[1];
  198.   gc_val.line_style = LineSolid;
  199.   gc_val.line_width = 1;
  200.   XChangeGC(display,gc,GCForeground|GCFunction|GCLineStyle|GCLineWidth,&gc_val);
  201.   XFlush(display);
  202. }
  203.  
  204. x_draw_reset_gc()
  205. { XGCValues gc_val;
  206.   gc_val.function   = xpix_mode_op; 
  207.   gc_val.foreground = pixel_table[x_draw_color];
  208.   gc_val.line_style = Line_style;
  209.   gc_val.line_width = x_draw_line_width;
  210.   XChangeGC(display,gc,GCForeground|GCFunction|GCLineStyle|GCLineWidth,&gc_val);
  211.   XFlush(display);
  212. }
  213.  
  214. void x_draw_mouse_segment_action(x,y)
  215. double x,y;
  216. {
  217.   XDrawLine(display,drawable,gc,mouse_start_xpix,mouse_start_ypix,XPIX(x),YPIX(y));
  218.  
  219. }
  220.  
  221. void x_draw_mouse_rect_action(x,y)
  222. double x,y;
  223.     x_draw_rectangle(mouse_start_xreal,mouse_start_yreal,x,y,1,1);
  224.  } 
  225.  
  226. void x_draw_mouse_circle_action(x,y)
  227. double x,y;
  228. {   double r = hypot(x - mouse_start_xreal, y - mouse_start_yreal);
  229.     x_draw_circle(mouse_start_xreal, mouse_start_yreal, r, 1, 1);    
  230. }
  231.  
  232.  
  233. x_draw_init_fonts()
  234. { /* initialize fonts: text_font, bold_font, message_font */
  235.  
  236.   XGCValues gc_val;
  237.  
  238.  text_font = (Xv_Font)xv_find(frame, FONT,
  239.                          FONT_FAMILY, FONT_FAMILY_DEFAULT_FIXEDWIDTH,
  240.                          FONT_STYLE,  FONT_STYLE_NORMAL,
  241.                          FONT_SIZE,   14,
  242.                          0);
  243.  
  244.  bold_font = (Xv_Font)xv_find(frame, FONT,
  245.                          FONT_FAMILY, FONT_FAMILY_DEFAULT_FIXEDWIDTH,
  246.                          FONT_STYLE,  FONT_STYLE_BOLD,
  247.                          FONT_SIZE,   14,
  248.                          0);
  249.  
  250.  message_font = (Xv_Font)xv_find(frame, FONT,
  251.                          FONT_FAMILY, FONT_FAMILY_LUCIDA_FIXEDWIDTH,
  252.                          FONT_STYLE,  FONT_STYLE_NORMAL,
  253.                          FONT_SIZE,   24,
  254.                          0);
  255.  
  256.     if (!text_font)    
  257.      { fprintf(stderr,"Cannot open text font\n");
  258.        text_font = (Xv_Font)xv_get(frame,XV_FONT);
  259.       }
  260.  
  261.     if (!bold_font)    
  262.      { fprintf(stderr,"Cannot open bold font\n");
  263.        bold_font = (Xv_Font)xv_get(frame,XV_FONT);
  264.       }
  265.  
  266.     if (!message_font) 
  267.      { fprintf(stderr,"Cannot open message font\n");
  268.        message_font = (Xv_Font)xv_get(frame,XV_FONT);
  269.       }
  270.  
  271.  
  272.       gc_val.font = (Font)xv_get(text_font,XV_XID);
  273.       XChangeGC(display,gc,GCFont,&gc_val);
  274. }
  275.  
  276. x_draw_set_font(fname)
  277. char* fname;
  278. {
  279.   XGCValues gc_val;
  280.   Xv_Font f;
  281.  
  282.   xv_set(frame,FRAME_BUSY,TRUE,NULL);
  283.   f = (Xv_Font)xv_find(frame,FONT,FONT_NAME,fname,NULL);
  284.   xv_set(frame,FRAME_BUSY,FALSE,NULL);
  285.  
  286.   if (f) 
  287.   { text_font = f;
  288.     gc_val.font = (Font)xv_get(text_font,XV_XID);
  289.     XChangeGC(display,gc,GCFont,&gc_val);
  290.    }
  291.  
  292. }
  293.  
  294.  
  295. int x_draw_set_color(col)
  296. int col;
  297. { int save = x_draw_color;
  298.   x_draw_color = (x_draw_depth==1 && col > 1) ? 1 : col;
  299.   XSetForeground(display,gc,pixel_table[x_draw_color]);
  300.   return save;
  301.  }
  302.  
  303.  
  304. int x_draw_set_line_width(w)
  305. int w;
  306. { XGCValues gc_val;
  307.   int save = x_draw_line_width;
  308.   x_draw_line_width = w;
  309.   gc_val.line_width = x_draw_line_width;
  310.   XChangeGC(display,gc,GCLineWidth,&gc_val);
  311.   return save;
  312. }
  313.  
  314.  
  315. int x_draw_set_line_style(s)
  316. int s;
  317. { XGCValues gc_val;
  318.  
  319.   int save = x_draw_line_style;
  320.  
  321.   x_draw_line_style = s;
  322.  
  323.    switch (x_draw_line_style)  {
  324.  
  325.    case 0 : Line_style = LineSolid;
  326.             break;
  327.  
  328.    case 1 : Line_style = LineOnOffDash;
  329.             XSetDashes(display,gc,0,dashed,2);
  330.             break;
  331.  
  332.    case 2 : Line_style = LineOnOffDash;
  333.             XSetDashes(display,gc,0,dotted,2);
  334.             break;
  335.  
  336.    default: Line_style = LineSolid;
  337.             break;
  338.  
  339.    }
  340.  
  341.   gc_val.line_style = Line_style;
  342.   XChangeGC(display,gc,GCLineStyle,&gc_val);
  343.   return save;
  344. }
  345.  
  346. int x_draw_set_node_width(w)
  347. int w;
  348. { int save = x_draw_node_width;
  349.   x_draw_node_width = w;
  350.   return save;
  351.  }
  352.  
  353. int x_draw_set_text_mode(m)
  354. int m;
  355. { int save = x_draw_text_mode;
  356.   x_draw_text_mode = m;
  357.   return save;
  358.  }
  359.  
  360. int x_draw_set_mode(m)
  361. int m;
  362.   XGCValues gc_val;
  363.  
  364.   int save = x_draw_drawing_mode;
  365.  
  366.   x_draw_drawing_mode = m;
  367.  
  368.  
  369.   DPRINT(("x_draw_set_mode %d\n",x_draw_drawing_mode));
  370.  
  371.    switch (x_draw_drawing_mode)  {
  372.  
  373.    case 0 : xpix_mode_op = GXcopy;
  374.             break;
  375.  
  376.    case 1 : xpix_mode_op = GXxor;
  377.             break;
  378.  
  379.    case 2 : xpix_mode_op = GXor;
  380.             break;
  381.  
  382.    default: break;
  383.  
  384.    }
  385.  
  386.   gc_val.function = xpix_mode_op; 
  387.   XChangeGC(display,gc,GCFunction,&gc_val);
  388.  
  389.   return save;
  390. }
  391.  
  392.  
  393. static void x_draw_event_proc(canvas,event)
  394. Canvas canvas;
  395. Event* event;
  396.   char s[32];
  397.  
  398.  
  399.   int k = event_id(event); 
  400.  
  401.  
  402.   switch (k) {
  403.  
  404.   case ACTION_SELECT:
  405.   case MS_LEFT:   if (event_is_up(event)) break;
  406.                   mouse_key = 1;
  407.  
  408.                   if (event_ctrl_is_down(event))  mouse_key +=3;
  409.                   if (event_shift_is_down(event)) mouse_key = -mouse_key;
  410.                   break;
  411.  
  412.   case ACTION_ADJUST:
  413.   case MS_MIDDLE: if (event_is_up(event)) break;
  414.                   mouse_key = 2;
  415.                   if (event_ctrl_is_down(event))  mouse_key +=3;
  416.                   if (event_shift_is_down(event)) mouse_key = -mouse_key;
  417.                   break;
  418.  
  419.   case ACTION_MENU:
  420.   case MS_RIGHT:  if (event_is_up(event)) break;
  421.                   mouse_key = 3;
  422.                   if (event_ctrl_is_down(event))  mouse_key +=3;
  423.                   if (event_shift_is_down(event)) mouse_key = -mouse_key;
  424.                   break;
  425.  
  426.  
  427.   case LOC_MOVE: 
  428.   case LOC_WINENTER : 
  429.   case LOC_WINEXIT : 
  430.            mouse_xpix = event_x(event);
  431.            mouse_ypix = event_y(event);
  432.  
  433.            if (x_draw_grid_mode)  x_draw_cursor();
  434.          
  435.            mouse_xreal =  x_draw_xmin+((double)mouse_xpix)/x_draw_scale;
  436.            mouse_yreal =  x_draw_ymax-((double)mouse_ypix)/x_draw_scale;
  437.          
  438.          if (x_draw_grid_mode) 
  439.          { 
  440.            mouse_xreal = x_draw_grid_mode * (int)(mouse_xreal/x_draw_grid_mode + ((mouse_xreal > 0) ? 0.5 : -0.5));
  441.  
  442.            mouse_yreal = x_draw_grid_mode * (int)(mouse_yreal/x_draw_grid_mode + ((mouse_yreal > 0) ? 0.5 : -0.5));
  443.  
  444.            mouse_xpix  = XPIX(mouse_xreal);
  445.            mouse_ypix  = YPIX(mouse_yreal);
  446.          
  447.            x_draw_cursor();
  448.          }
  449.        
  450.        /* sprintf(s,read_frame_format, mouse_xreal,mouse_yreal,frame_label);
  451.           window_set(frame,FRAME_LABEL,s,0);
  452.        */
  453.  
  454.          sprintf(s,"%8.2f %8.2f", mouse_xreal,mouse_yreal);
  455.  
  456.          XDrawImageString(display,drawable,gc,xdots-160,13,s,strlen(s));
  457.        
  458.        
  459.          if (x_draw_mouse_action) /* user defined action */
  460.          { x_draw_mouse_action(mouse_last_xreal,mouse_last_yreal);
  461.            x_draw_mouse_action(mouse_xreal,mouse_yreal);
  462.           }
  463.        
  464.          mouse_last_xpix = mouse_xpix;
  465.          mouse_last_ypix = mouse_ypix;
  466.        
  467.          mouse_last_xreal = mouse_xreal;
  468.          mouse_last_yreal = mouse_yreal;
  469.        
  470.          break;
  471.  
  472.      } /* switch */
  473.  
  474. /*
  475. printf("event_if = %d  key = %d  xreal = %f yreal = %f\n",k,mouse_key, mouse_xreal,mouse_yreal);
  476. fflush(stdout);
  477. */
  478.  
  479.  
  480. }
  481.  
  482. int x_read_mouse(kind, xstart,ystart,x,y)
  483. int    kind;   /* 0: point, 1: segment, 2:rectangle, 3: circle */
  484. double xstart;
  485. double ystart;
  486. double *x;
  487. double *y;
  488.   PMA f;
  489.   int key;
  490.   
  491.   switch(kind) {
  492.  
  493.   case 0 : f = x_draw_mouse_default_action;
  494.           break;
  495.  
  496.   case 1:  f = x_draw_mouse_segment_action;
  497.            break;
  498.  
  499.   case 2:  f = x_draw_mouse_rect_action;
  500.            break;
  501.  
  502.   case 3:  f = x_draw_mouse_circle_action;
  503.            break;
  504.  
  505.   default: f = x_draw_mouse_default_action;
  506.            break;
  507.  
  508.   }
  509.  
  510.   key = x_read_mouse_action(f,xstart,ystart,x,y);
  511.  
  512.   return key;
  513.  
  514. }
  515.  
  516. int x_read_mouse_action(action, xstart,ystart,x,y)
  517. PMA   action;
  518. double xstart;
  519. double ystart;
  520. double *x;
  521. double *y;
  522.   DPRINT(("x_read_mouse_action\n"));
  523.   x_draw_mouse_action = action;
  524.  
  525.   x_draw_set_gc_read_mouse();
  526.  
  527.  
  528.   mouse_key = 0;
  529.  
  530.   mouse_start_xreal = xstart;
  531.   mouse_start_yreal = ystart;
  532.  
  533.   mouse_start_xpix = XPIX(xstart);
  534.   mouse_start_ypix = YPIX(ystart);
  535.  
  536.   if (x_draw_grid_mode) x_draw_cursor();
  537.  
  538.   if (x_draw_mouse_action)  /* user defined action */
  539.   { x_draw_mouse_action(mouse_last_xreal,mouse_last_yreal);
  540.    }
  541.  
  542.  
  543.   /* notify-loop */
  544.  
  545.   while (!mouse_key && !x_draw_done)  notify_dispatch();
  546.  
  547.   
  548.  
  549.   if (x_draw_mouse_action)  /* user defined action */
  550.   { x_draw_mouse_action(mouse_xreal,mouse_yreal);
  551.    }
  552.  
  553.   if (x_draw_grid_mode) x_draw_cursor();
  554.  
  555.   *x = mouse_xreal;
  556.   *y = mouse_yreal;
  557.  
  558.   x_draw_reset_gc();
  559.  
  560.   if (x_draw_done) return 0;
  561.  
  562.   return mouse_key;
  563. }
  564.   
  565.  
  566. static void x_draw_canvas_repaint_proc(canvas,paint_window,dpy,xwin,xrects)
  567. Canvas canvas;
  568. Xv_Window paint_window;
  569. Display *dpy;
  570. Window  xwin;
  571. Xv_xrectlist *xrects;
  572. {
  573.   repaint_count++;
  574.  
  575.   if (repaint_count > 2)
  576.   fprintf(stderr,"LEDA warning: repaint count = %d\n", repaint_count);
  577.   fflush(stderr);
  578. /*
  579.   if (draw_init_done)
  580.       x_draw_init(x_draw_xmin,x_draw_xmax,x_draw_ymin,x_draw_grid_mode); 
  581. */
  582. }
  583.  
  584. static void x_draw_canvas_resize_proc(canvas,width,height)
  585. Canvas canvas;
  586. int    width;
  587. int    height;
  588. {
  589. /*
  590.  printf("RESIZE canvas = %d  widht = %d  height =%d\n",canvas,width,height);
  591.  fflush(stdout);
  592. */
  593.   if (draw_init_done)
  594.       x_draw_init(x_draw_xmin,x_draw_xmax,x_draw_ymin,x_draw_grid_mode); 
  595. }
  596.  
  597.  
  598.  
  599.  
  600. Notify_value x_draw_notice_destroy(frame, status)
  601. Frame frame;
  602. Destroy_status status;
  603. {
  604.   DPRINT(("x_draw_notice_destroy called\n"));
  605.  
  606.   /*if (status != DESTROY_CHECKING) */
  607.     x_draw_done = 1;
  608.  
  609.   return (notify_next_destroy_func(frame,status));
  610. }
  611.  
  612.  
  613. /*
  614. static error_proc(object,avlist)
  615. Xv_object    object;
  616. Attr_avlist  avlist;
  617. { char  buf[32];
  618.   printf("%s\n", xv_error_format(object,avlist));
  619.   printf("Dump core ? ");
  620.   fflush(stdout);
  621.   if (gets(buf) && (buf[0] == 'y')) abort();
  622.   return XV_OK;
  623.  }
  624. */
  625.   
  626.  
  627.  
  628. x_draw_init_window(w_width,w_height,w_xpos,w_ypos,frame_label)
  629. int w_width,
  630.     w_height,
  631.     w_xpos,
  632.     w_ypos;
  633. char* frame_label;
  634.   int       i, *xpixels;
  635.   Xv_Screen xv_screen;
  636.   XGCValues gc_val;
  637.   Rect      *r;
  638.  
  639.  
  640.   DPRINT(("x_draw_init_window\n"));
  641.   if (pw!=0) 
  642.   { fprintf(stderr,"warning: second initialization of window ignored.\n");
  643.     return;
  644.    } 
  645.  
  646.   strcpy(default_frame_label,frame_label);
  647.  
  648. /*
  649.   xv_init(XV_ERROR_PROC, error_proc,0);
  650. */
  651.  
  652.  
  653.   /* initalize the colormap segment data and set the required RGB values */
  654.  
  655.   (red)[0] =  255; (green)[0] = 255; (blue)[0] =  255 ;  /* white  */
  656.   (red)[1] =    0; (green)[1] =   0; (blue)[1] =    0 ;  /* black  */
  657.   (red)[2] =  255; (green)[2] =   0; (blue)[2] =    0 ;  /* red    */
  658.   (red)[3] =    0; (green)[3] = 255; (blue)[3] =    0 ;  /* green  */
  659.   (red)[4] =    0; (green)[4] = 100; (blue)[4] =  255 ;  /* blue   */
  660.   (red)[5] =  128; (green)[5] = 128; (blue)[5] =    0 ;  /* yellow */
  661.   (red)[6] =  128; (green)[6] =   0; (blue)[6] =  178 ;  /* violet */
  662.   (red)[7] =  192; (green)[7] =  64; (blue)[7] =    0 ;  /* orange */
  663.  
  664.     cms_data.type = XV_STATIC_CMS;
  665.     cms_data.size = 8;
  666.     cms_data.rgb_count = 8;
  667.     cms_data.index = 0;
  668.     cms_data.red = red;
  669.     cms_data.green = green;
  670.     cms_data.blue = blue;
  671.  
  672.   icon = icon_create(ICON_IMAGE, &leda_icon_pixrect, 0);
  673.  
  674.  
  675.   repaint_count = 0;
  676.  
  677.  
  678.   frame = window_create(0, FRAME, 
  679.               WIN_X,        w_xpos,
  680.               WIN_Y,        w_ypos,
  681.               WIN_WIDTH,    w_width-10,
  682.               WIN_HEIGHT,   w_height-30,
  683.               WIN_IGNORE_EVENT,      WIN_REPAINT,
  684.               FRAME_NO_CONFIRM, TRUE,
  685.               FRAME_LABEL, default_frame_label, 
  686.               0);
  687.  
  688. /*
  689.   icon = (Icon)xv_create(frame,ICON,
  690.                          ICON_IMAGE,icon_image,
  691.                          XV_X, 100,
  692.                          XV_Y, 100,
  693.                          0);
  694.  
  695. */
  696.  
  697.   window_set(frame, FRAME_ICON, icon,0);
  698.  
  699.   window_set(frame, WIN_SHOW, TRUE, 0);
  700.  
  701.   canvas = window_create(frame, CANVAS,
  702.               WIN_EVENT_PROC,        x_draw_event_proc,
  703.               CANVAS_REPAINT_PROC,   x_draw_canvas_repaint_proc,
  704.               CANVAS_RESIZE_PROC,    x_draw_canvas_resize_proc,
  705.               CANVAS_X_PAINT_WINDOW, TRUE,
  706.               WIN_CMS_NAME,          "palette",
  707.               WIN_CMS_DATA,          &cms_data,
  708.               WIN_IGNORE_EVENT,      WIN_REPAINT,
  709.               0); 
  710.  
  711.  
  712.  
  713. /*
  714.   xv_create(canvas,SCROLLBAR,
  715.             SCROLLBAR_DIRECTION, SCROLLBAR_HORIZONTAL, 0);
  716.  
  717.   xv_create(canvas,SCROLLBAR,
  718.             SCROLLBAR_DIRECTION, SCROLLBAR_VERTICAL, 0);
  719. */
  720.  
  721.  
  722.  
  723.  
  724.  
  725.   /* Get the actual indices into the colormap and store them in pixel_table */
  726.  
  727.   xpixels = (int *)xv_get(canvas, WIN_X_COLOR_INDICES);
  728.  
  729.   for (i = 0; i < 8; i++) pixel_table[i] = xpixels[i];
  730.     
  731.   pw = canvas_pixwin(canvas);
  732.  
  733.   xv_set(canvas_paint_window(canvas),
  734.     WIN_EVENT_PROC,          x_draw_event_proc,
  735.     WIN_CONSUME_EVENTS,      WIN_RIGHT_KEYS, LOC_MOVE,
  736.                              LOC_WINENTER, LOC_WINEXIT,
  737.                              WIN_MOUSE_BUTTONS,
  738.                              0,
  739.     WIN_IGNORE_EVENTS,       WIN_REPAINT,WIN_UP_EVENTS,0,
  740.     0); 
  741.  
  742.   notify_interpose_destroy_func(frame,x_draw_notice_destroy);
  743.  
  744.  
  745.  
  746.   display   = (Display *)xv_get(frame,XV_DISPLAY);
  747.   drawable  = (Drawable)xv_get(pw,XV_XID);
  748.   xv_screen = (Xv_Screen)xv_get(frame,XV_SCREEN);
  749.   screen    = (int)xv_get(xv_screen,SCREEN_NUMBER);
  750.  
  751.   gc    = DefaultGC(display,screen);
  752.   x_draw_depth = DefaultDepth(display,screen);
  753.  
  754.   screen_width = DisplayWidth(display,screen);
  755.   screen_height = DisplayHeight(display,screen);
  756.  
  757.   XSetLineAttributes(display,gc,1,LineSolid,CapButt,JoinMiter);
  758.  
  759.   x_draw_init_fonts();
  760.  
  761.   x_draw_set_line_style(0);
  762.   x_draw_set_line_width(1);
  763.   x_draw_set_mode(0);
  764.   x_draw_set_node_width(12);
  765.   x_draw_set_text_mode(0); 
  766.  
  767.   x_draw_color = 1;
  768.   gc_val.foreground = BlackPixel(display,screen); 
  769.   XChangeGC(display,gc,GCForeground,&gc_val);
  770.  
  771.   for(i=0;i<8;i++)
  772.   { buffer_width[i] = 0;
  773.     buffer_height[i] = 0;
  774.    }
  775.  
  776.   x_draw_xmin = 0;
  777.   x_draw_ymin = 0;
  778.   x_draw_xmax = 0;
  779.   x_draw_ymax = 0;
  780.   x_draw_scale = 1;
  781.   mouse_xpix = 0;
  782.   mouse_ypix = 0;
  783.  
  784.  
  785.  
  786.  
  787.   i = 0;
  788.   while (repaint_count < 2 && i < 100000)  /* wait for 2 REPAINT events */
  789.   { notify_dispatch();
  790.     i++;
  791.    }
  792.  
  793.   repaint_count = 2;
  794.  
  795. /*
  796.   printf("i = %d  count = %d\n",i,repaint_count);
  797.   fflush(stdout);
  798. */
  799.  
  800.   x_draw_reset_frame_label();
  801.  
  802.   XFlush(display);
  803.  
  804. }
  805.  
  806. x_draw_init(x0,x1,y0,g_mode)
  807. double x0,x1,y0;
  808. int g_mode;
  809. {
  810.   double x,y;
  811.  
  812.   DPRINT(("x_draw_init\n"));
  813.  
  814.   draw_init_done = TRUE;
  815.  
  816.   if (x0>=x1) 
  817.   {fprintf(stderr,"Illegal arguments in draw_init: x0 (%f) >= x1 (%f)\n",x0,x1);
  818.    abort();
  819.    }
  820.  
  821.   x_draw_grid_mode = g_mode; 
  822.  
  823.   x_draw_reset_frame_label();
  824.  
  825.   xdots = (int)window_get(canvas, CANVAS_WIDTH);
  826.   ydots = (int)window_get(canvas, CANVAS_HEIGHT);
  827.  
  828.  
  829.   x_draw_scale = ((double)xdots)/(x1-x0);
  830.  
  831.   /* at least grid distance of 2 pixels */
  832.   if ((x_draw_grid_mode) && (x_draw_grid_mode*x_draw_scale < 2)) 
  833.   { x_draw_grid_mode=0;  
  834.     fprintf(stderr,"warning: grid distance to small.\n");
  835.    }
  836.  
  837.   if (x_draw_grid_mode) 
  838.   { if (x_draw_scale < 1) x_draw_scale = 1;
  839.     else x_draw_scale = (int)x_draw_scale;
  840.     DPRINT(("grid mode %d ; draw scale %d\n",x_draw_grid_mode,x_draw_scale));
  841.   }
  842.  
  843.   x_draw_xmin = x0;
  844.   x_draw_ymin = y0;
  845.   x_draw_xmax = x0+xdots/x_draw_scale;
  846.   x_draw_ymax = y0+ydots/x_draw_scale;
  847.  
  848.   xorigin = -x0*x_draw_scale;
  849.   yorigin = ydots+y0*x_draw_scale;
  850.  
  851.   mouse_xreal = 0;
  852.   mouse_yreal = 0;
  853.  
  854.   x_draw_clear(0);   
  855.  
  856.   if (x_draw_grid_mode)  x_draw_cursor();
  857.  
  858.   notify_dispatch();
  859.  
  860.   if (x_draw_grid_mode)  x_draw_cursor();
  861.  
  862.   if (x_draw_redraw) (*x_draw_redraw)();
  863.  
  864.   XFlush(display);
  865.  
  866. }
  867.  
  868.  
  869. x_show_window() 
  870. { while (!x_draw_done) notify_dispatch();
  871.  }
  872.  
  873. x_draw_end()
  874. { if (pw)
  875.   { pw_close(pw);
  876.     /* window_destroy(frame); */
  877.     pw = 0;
  878.    }
  879. }
  880.  
  881. x_draw_line(x1, y1, x2, y2, col)
  882. double x1,y1,x2,y2;
  883. int col;
  884.   int C[4];
  885.   int i;
  886.  
  887.   int M = 32768;   /* 2^15    */ 
  888.  
  889.   double slope;
  890.  
  891.   DPRINT(("x_draw_line %d\n",xpix_mode_op));
  892.  
  893.   C[0] = XPIX(x1);
  894.   C[1] = YPIX(y1);
  895.   C[2] = XPIX(x2);
  896.   C[3] = YPIX(y2);
  897.  
  898.   DPRINT(("x_draw_line %d  %d  %d  %d\n\n",C[0],C[1],C[2],C[3]));
  899.  
  900.   /* 
  901.     Fehler beim Clipping fuer Koordinaten mit Absolutwert in
  902.     [i*2^15..(i+1)*2^15-1],i ungerade.
  903.   */
  904.  
  905.   for(i=0; i<4; i++)
  906.     if ((C[i]/M) % 2) C[i] = -C[i];
  907.  
  908.  
  909.  
  910.  
  911.   if (col != x_draw_color) x_draw_set_color(col);
  912.  
  913.   XDrawLine(display,drawable,gc,C[0],C[1],C[2],C[3]);
  914.  
  915.   if (x_draw_screen_flush)
  916.     XFlush(display);
  917. }
  918.  
  919.  
  920. x_draw_point(x,y,col)
  921. double x,y;
  922. int col;
  923.   int X = XPIX(x);
  924.   int Y = YPIX(y);
  925.  
  926.   xv_vector(pw,X-2,Y-2,X+2,Y+2,PIX_SRC^PIX_DST,1);
  927.   xv_vector(pw,X+1,Y-1,X+2,Y-2,PIX_SRC^PIX_DST,1);
  928.   xv_vector(pw,X-1,Y+1,X-2,Y+2,PIX_SRC^PIX_DST,1);
  929.  
  930.   if (x_draw_screen_flush) XFlush(display);
  931. }
  932.  
  933. x_draw_arc(x0,y0,a,b,col)
  934. double x0,y0;
  935. int a,b,col;
  936.  
  937.   if (col != x_draw_color) x_draw_set_color(col);
  938.  
  939.   XDrawArc(display,drawable,gc,XPIX(x0)-a,YPIX(y0)-b,2*a,2*b,0,360*64);
  940.  
  941.   if (x_draw_screen_flush)
  942.     XFlush(display);
  943.  
  944. }
  945.  
  946. x_draw_filled_arc(x0,y0,a,b,col)
  947. double x0,y0;
  948. int a,b,col;
  949.   if (col != x_draw_color) x_draw_set_color(col);
  950.  
  951.   XFillArc(display,drawable,gc,XPIX(x0)-a,YPIX(y0)-b,2*a,2*b,0,360*64);
  952.  
  953.   if (x_draw_screen_flush)
  954.     XFlush(display);
  955.  
  956. }
  957.  
  958. x_draw_node(x0,y0,col)
  959. double x0,y0;
  960. int col;
  961. { int save = x_draw_set_line_width(1); 
  962.   x_draw_arc(x0,y0,x_draw_node_width,x_draw_node_width,col); 
  963.   x_draw_set_line_width(save); 
  964.  }
  965.  
  966. x_draw_filled_node(x0,y0,col)
  967. double x0,y0;
  968. int col;
  969. { x_draw_filled_arc(x0,y0,x_draw_node_width,x_draw_node_width,col); }
  970.  
  971.  
  972. x_draw_text_node(x0,y0,s,col)
  973. double x0,y0;
  974. int col;
  975. char* s;
  976. { XGCValues gc_val;
  977.   int save;
  978.  
  979.   gc_val.font = (Font)xv_get(bold_font,XV_XID);
  980.   XChangeGC(display,gc,GCFont,&gc_val);
  981.   save = x_draw_text_mode;
  982.   x_draw_text_mode = 0;  /* transparent */
  983.  
  984.   if (x_draw_depth==1 || col == 1)
  985.      x_draw_node(x0,y0,1);
  986.   else
  987.      x_draw_filled_node(x0,y0,col);
  988.  
  989.   x_draw_ctext(x0,y0,s,1);
  990.   x_draw_text_mode = save;
  991.  
  992.   gc_val.font = (Font)xv_get(text_font,XV_XID);
  993.   XChangeGC(display,gc,GCFont,&gc_val);
  994.  }
  995.  
  996. x_draw_int_node(x0,y0,i,col)
  997. double x0,y0;
  998. int i,col;
  999. { char buf[16];
  1000.   sprintf(buf,"%d",i);
  1001.   x_draw_text_node(x0,y0,buf,col);
  1002.  }
  1003.  
  1004. x_draw_ellipse(x0,y0,a,b,col)
  1005. double x0,y0,a,b; 
  1006. int col;
  1007. { int A = (int)(a*x_draw_scale);
  1008.   int B = (int)(b*x_draw_scale);
  1009.   x_draw_arc(x0,y0,A,B,col); }
  1010.  
  1011. x_draw_filled_ellipse(x0,y0,a,b,col)
  1012. double x0,y0,a,b; 
  1013. int col;
  1014. { int A = (int)(a*x_draw_scale);
  1015.   int B = (int)(b*x_draw_scale);
  1016.   x_draw_filled_arc(x0,y0,A,B,col); }
  1017.  
  1018.  
  1019. x_draw_circle(x0,y0,r,col)
  1020. double x0,y0,r; 
  1021. int col;
  1022. { int R = (int)(r*x_draw_scale);
  1023.   x_draw_arc(x0,y0,R,R,col); }
  1024.  
  1025.  
  1026. x_draw_filled_circle(x0,y0,r,col)
  1027. double x0,y0,r; 
  1028. int col;
  1029. { int R = (int)(r*x_draw_scale);
  1030.   x_draw_filled_arc(x0,y0,R,R,col); }
  1031.  
  1032.  
  1033. x_draw_xpix(x)
  1034. double x;
  1035. { return XPIX(x); }
  1036.  
  1037. x_draw_ypix(x)
  1038. double x;
  1039. { return YPIX(x); }
  1040.  
  1041. x_draw_pix(x,y,col)
  1042. double x,y;
  1043. int col;
  1044.   if (col != x_draw_color) x_draw_set_color(col);
  1045.  
  1046.  
  1047.   XDrawPoint(display,drawable,gc,XPIX(x),YPIX(y));
  1048.  
  1049.   if (x_draw_screen_flush)
  1050.     XFlush(display);
  1051. }
  1052.  
  1053.  
  1054. x_draw_plot_xy(x0,x1,f,col)
  1055. double x0,x1;
  1056. double (*f)();
  1057. int col;
  1058.   XPoint *points;
  1059.  
  1060.   int x = XPIX(x0);
  1061.   int y_old = YPIX((*f)(x0));
  1062.   int i,y_new;
  1063.   int size = 0;
  1064.   int n = 0;
  1065.  
  1066.   if (col != x_draw_color) x_draw_set_color(col);
  1067.  
  1068.   for(x = XPIX(x0)+1; x <= XPIX(x1); x++)
  1069.   { y_new = YPIX((*f)(XREAL(x)));
  1070.     if (y_new > y_old)
  1071.        size += (y_new-y_old+1);
  1072.     else
  1073.        size += (y_old-y_new+1);
  1074.     y_old = y_new;
  1075.    }
  1076.  
  1077.   points = (XPoint *) malloc(2*size*sizeof(short));
  1078.  
  1079.   y_old = YPIX((*f)(x0));
  1080.  
  1081.   for(x = XPIX(x0)+1; x <= XPIX(x1); x++)
  1082.   { y_new = YPIX((*f)(XREAL(x)));
  1083.     if (y_new > y_old)
  1084.       for(i=y_old; i<=y_new; i++)  
  1085.       { points[n].x = (short) x; 
  1086.         points[n].y = (short) i;
  1087.         n++;
  1088.        }
  1089.     else
  1090.       for(i=y_old; i>=y_new; i--)  
  1091.       { points[n].x = (short) x; 
  1092.         points[n].y = (short) i;
  1093.         n++;
  1094.        }
  1095.     y_old = y_new;
  1096.   }
  1097.  
  1098.  XDrawPoints(display,drawable,gc,points,size,CoordModeOrigin);
  1099.   
  1100.  free((char*)points);
  1101.  
  1102.  
  1103.   if (x_draw_screen_flush)
  1104.     XFlush(display);
  1105. }
  1106.  
  1107. x_draw_plot_yx(y0,y1,f,col)
  1108. double y0,y1;
  1109. double (*f)();
  1110. int col;
  1111.   XPoint *points;
  1112.  
  1113.   int y;
  1114.   int i,x_new;
  1115.   int x_old = XPIX((*f)(y0));
  1116.   int size = 0;
  1117.   int n = 0;
  1118.  
  1119.   if (col != x_draw_color) x_draw_set_color(col);
  1120.  
  1121.   for(y = YPIX(y0)-1; y >= YPIX(y1); y++)
  1122.   { x_new = XPIX((*f)(YREAL(y)));
  1123.     if (x_new > x_old)
  1124.        size += (x_new-x_old+1);
  1125.     else
  1126.        size += (x_old-x_new+1);
  1127.     x_old = x_new;
  1128.    }
  1129.  
  1130.   points = (XPoint *) malloc(2*size*sizeof(short));
  1131.  
  1132.   x_old = XPIX((*f)(y0));
  1133.  
  1134.   for(y = YPIX(y0)-1; y >= YPIX(y1); y--)
  1135.   {
  1136.     x_new = XPIX((*f)(YREAL(y)));
  1137.     if (x_new > x_old)
  1138.       for(i=x_old; i<=x_new; i++)  
  1139.       { points[n].x = (short) i; 
  1140.         points[n].y = (short) y;
  1141.         n++;
  1142.        }
  1143.     else
  1144.       for(i=x_old; i>=x_new; i--)  
  1145.       { points[n].x = (short) i; 
  1146.         points[n].y = (short) y;
  1147.         n++;
  1148.        }
  1149.     x_old = x_new;
  1150.   }
  1151.  
  1152.  XDrawPoints(display,drawable,gc,points,size,CoordModeOrigin);
  1153.   
  1154.  free((char*)points);
  1155.  
  1156.  
  1157.   if (x_draw_screen_flush)
  1158.     XFlush(display);
  1159. }
  1160.  
  1161.  
  1162. x_draw_filled_polygon(n,xcoord,ycoord,col)
  1163. int col, n;
  1164. double *xcoord, *ycoord;
  1165. {
  1166.  XPoint *edges;
  1167.  int i;
  1168.  
  1169.  edges = (XPoint *) malloc(2*n*sizeof(short));
  1170.  
  1171.  for(i=0;i<n;i++) 
  1172.  { edges[i].x = (short) XPIX(xcoord[i]);
  1173.    edges[i].y = (short) YPIX(ycoord[i]);
  1174.   }
  1175.  
  1176.   if (col != x_draw_color) x_draw_set_color(col);
  1177.  
  1178.  XFillPolygon(display,drawable,gc,edges,n,Convex,CoordModeOrigin);
  1179.  
  1180.  free((char*)edges);
  1181.  
  1182.   if (x_draw_screen_flush)
  1183.     XFlush(display);
  1184.  
  1185.  }
  1186.  
  1187. x_draw_polygon(n,xcoord,ycoord,col)
  1188. int col, n;
  1189. double *xcoord, *ycoord;
  1190. { int i;
  1191.  
  1192.   for(i=0;i<n-1;i++) 
  1193.     x_draw_line(xcoord[i],ycoord[i], xcoord[i+1],ycoord[i+1],col);
  1194.  
  1195.   x_draw_line(xcoord[n-1],ycoord[n-1],xcoord[0],ycoord[0],col);
  1196.  
  1197.  }
  1198.  
  1199. x_draw_rectangle(x1,y1,x2,y2,col)
  1200. double x1,y1,x2,y2;
  1201. int col;
  1202. {
  1203.  x_draw_line(x1,y1,x1,y2,col);
  1204.  x_draw_line(x1,y2,x2,y2,col);
  1205.  x_draw_line(x2,y2,x2,y1,col);
  1206.  x_draw_line(x2,y1,x1,y1,col);
  1207.  
  1208.  }
  1209.  
  1210.  
  1211. x_draw_filled_rectangle(x1,y1,x2,y2,col)
  1212. double x1,y1,x2,y2; 
  1213. int col;
  1214. { double xcoord[4], ycoord[4];
  1215.  
  1216.  xcoord[0] = x1;   
  1217.  ycoord[0] = y1;   
  1218.  xcoord[1] = x1;  
  1219.  ycoord[1] = y2;   
  1220.  xcoord[2] = x2; 
  1221.  ycoord[2] = y2;   
  1222.  xcoord[3] = x2;
  1223.  ycoord[3] = y1;
  1224.  
  1225.  x_draw_filled_polygon(4,xcoord,ycoord,col);
  1226.  
  1227.  }
  1228.  
  1229.  
  1230. x_draw_copy(x1,y1,x2,y2,buf)
  1231. double x1,y1,x2,y2;
  1232. int buf;
  1233. {
  1234.   int w = (int)((x2-x1)*x_draw_scale);
  1235.   int h = (int)((y2-y1)*x_draw_scale);
  1236.  
  1237.   if (w<=0 || h <=0) return;
  1238.  
  1239.   buffer_pixmap[buf] = XCreatePixmap(display,drawable,w,h,x_draw_depth);
  1240.   buffer_width[buf] = w;
  1241.   buffer_height[buf] = h;
  1242.  
  1243.   XCopyArea(display,drawable,buffer_pixmap[buf],gc, XPIX(x1),YPIX(y2),w,h,0,0);
  1244.  
  1245.  }
  1246.  
  1247.  
  1248. x_draw_cut(x1,y1,x2,y2,buf)
  1249. double x1,y1,x2,y2;
  1250. int buf;
  1251. { x_draw_copy(x1,y1,x2,y2,buf);
  1252.   x_draw_filled_rectangle(x1,y1,x2,y2,0);
  1253.  }
  1254.  
  1255. x_draw_paste(buf,x,y)
  1256. double x,y;
  1257. int buf;
  1258. { int w = buffer_width[buf];
  1259.   int h = buffer_height[buf];
  1260.   if(w>0 && h>0)
  1261.   XCopyArea(display,buffer_pixmap[buf],drawable,gc,0,0,w,h,XPIX(x),YPIX(y)-h);
  1262.  }
  1263.  
  1264.  
  1265. x_draw_clear_buf(i)
  1266. int i;
  1267. { buffer_height[i] = buffer_width[i] = 0; }
  1268.  
  1269.  
  1270. /*
  1271. x_draw_copy_rect(x1,y1,x2,y2,x,y)
  1272. { x_draw_copy(x1,y1,x2,y2,0);
  1273.   x_draw_paste(0,x,y);
  1274.  }
  1275. */
  1276.  
  1277. x_draw_copy_rect(x1,y1,x2,y2,x,y)
  1278. double x1,y1,x2,y2,x,y;
  1279. {
  1280.   Pixmap P;
  1281.  
  1282.   int w = (int)((x2-x1)*x_draw_scale);
  1283.   int h = (int)((y2-y1)*x_draw_scale);
  1284.  
  1285.   int X1 = XPIX(x1);
  1286.   int Y1 = YPIX(y2);
  1287.  
  1288.   int X = XPIX(x);
  1289.   int Y = YPIX(y)-h;
  1290.  
  1291.   int save;
  1292.  
  1293.   P = XCreatePixmap(display,drawable,w,h,x_draw_depth);
  1294.  
  1295.   save  = x_draw_set_mode(0);   /* src-mode */
  1296.  
  1297.   XCopyArea(display,drawable,P,gc, X1,Y1,w,h,0,0);
  1298.  
  1299.   XCopyArea(display,P,drawable,gc,0,0,w,h,X,Y);
  1300.  
  1301.   x_draw_set_mode(save);
  1302.  
  1303.   if (x_draw_screen_flush)
  1304.     XFlush(display);
  1305.  }
  1306.  
  1307.  
  1308. x_draw_move_rect(x1,y1,x2,y2,x,y)
  1309. double x1,y1,x2,y2,x,y;
  1310. {
  1311.   Pixmap P;
  1312.  
  1313.   int w = (int)((x2-x1)*x_draw_scale);
  1314.   int h = (int)((y2-y1)*x_draw_scale);
  1315.  
  1316.   int X1 = XPIX(x1);
  1317.   int Y1 = YPIX(y2);
  1318.  
  1319.   int X = XPIX(x);
  1320.   int Y = YPIX(y)-h;
  1321.  
  1322.   int i,j;
  1323.  
  1324.   int save;
  1325.  
  1326.   P = XCreatePixmap(display,drawable,w,h,x_draw_depth);
  1327.  
  1328.   save  = x_draw_set_mode(0);   /* src-mode */
  1329.  
  1330.   XCopyArea(display,drawable,P,gc, X1,Y1,w,h,0,0);
  1331.  
  1332.   save  = x_draw_set_mode(1);   /* xor-mode */
  1333.  
  1334.   while (X1!=X || Y1!=Y)
  1335.   {
  1336.     if (X1<X) i = X1+1;
  1337.     if (X1>X) i = X1-1;
  1338.     if (Y1<Y) j = Y1+1;
  1339.     if (Y1>Y) j = Y1-1;
  1340.     
  1341.     XCopyArea(display,P,drawable,gc,0,0,w,h,i,j);
  1342.     XCopyArea(display,P,drawable,gc,0,0,w,h,X1,Y1);
  1343.  
  1344.     X1 = i;
  1345.     Y1 = j;
  1346.    }
  1347.  
  1348.   x_draw_set_mode(save);
  1349.  
  1350.  
  1351.   if (x_draw_screen_flush)
  1352.     XFlush(display);
  1353.  }
  1354.  
  1355.  
  1356.  
  1357. x_draw_clear(col)
  1358. int col;
  1359. {
  1360.  int i=0;
  1361.  int n = 4;
  1362.  double x,y;
  1363.  
  1364.  
  1365.  XPoint *grid_points;
  1366.  
  1367. /*
  1368.  x_draw_filled_rectangle(x_draw_xmin,x_draw_xmax,x_draw_ymin,x_draw_ymax,col);
  1369. */
  1370.  
  1371.  XClearWindow(display,drawable);
  1372.  
  1373.  n = 0;
  1374.  if (x_draw_grid_mode) /* draw grid */
  1375.  { for(x = (int)(x_draw_xmin/x_draw_grid_mode)*x_draw_grid_mode; x<=x_draw_xmax; x+=x_draw_grid_mode)
  1376.    for(y = (int)(x_draw_ymin/x_draw_grid_mode)*x_draw_grid_mode; y<=x_draw_ymax; y+=x_draw_grid_mode)
  1377.      n++;
  1378.  
  1379.    grid_points = (XPoint *) malloc(2*n*sizeof(short));
  1380.  
  1381.    for(x = (int)(x_draw_xmin/x_draw_grid_mode)*x_draw_grid_mode; x<=x_draw_xmax; x+=x_draw_grid_mode)
  1382.    for(y = (int)(x_draw_ymin/x_draw_grid_mode)*x_draw_grid_mode; y<=x_draw_ymax; y+=x_draw_grid_mode)
  1383.    { if (x*y == 0) x_draw_filled_arc(x,y,2,2,1);
  1384.      else { grid_points[i].x = (short) XPIX(x);
  1385.             grid_points[i].y = (short) YPIX(y);
  1386.             i++;
  1387.            }
  1388.     }
  1389.  
  1390.    XDrawPoints(display,drawable,gc,grid_points,n,CoordModeOrigin);
  1391.   }
  1392.  
  1393.   if (x_draw_screen_flush)
  1394.     XFlush(display);
  1395.  }
  1396.  
  1397.  
  1398. /* TEXT  */
  1399.  
  1400. x_draw_message(line,s,col)
  1401. int line;
  1402. char * s;
  1403. int col;
  1404.   XGCValues gc_val;
  1405.  
  1406.   int x = 30;
  1407.   int y = 30*line+15;
  1408.  
  1409.   if (col != x_draw_color) x_draw_set_color(col);
  1410.  
  1411.   gc_val.font     = (Font)xv_get(message_font,XV_XID);
  1412.   gc_val.function = GXxor; 
  1413.   XChangeGC(display,gc,GCFont|GCFunction,&gc_val);
  1414.  
  1415.   XDrawString(display,drawable,gc,x,y,s,strlen(s));
  1416.  
  1417.   gc_val.font     = (Font)xv_get(text_font,XV_XID);
  1418.   gc_val.function = xpix_mode_op; 
  1419.   XChangeGC(display,gc,GCFont|GCFunction,&gc_val);
  1420.  
  1421.   if (x_draw_screen_flush)
  1422.     XFlush(display);
  1423. }
  1424.  
  1425.  
  1426. x_draw_text(x,y,s,col)
  1427. double x,y;
  1428. char * s;
  1429. int col;
  1430.  
  1431.   DPRINT(("x_draw_text im modus %d\n",xpix_mode_op));
  1432.  
  1433.   if (col != x_draw_color) x_draw_set_color(col);
  1434.  
  1435.   if(x_draw_text_mode == 1) /* opaque */
  1436.      XDrawImageString(display,drawable,gc,XPIX(x),YPIX(y),s,strlen(s));
  1437.   else  
  1438.      XDrawString(display,drawable,gc,XPIX(x),YPIX(y),s,strlen(s));
  1439.  
  1440.   if (x_draw_screen_flush)
  1441.     XFlush(display);
  1442. }
  1443.  
  1444. x_draw_ctext(x,y,s,col)
  1445. double x,y;
  1446. char * s;
  1447. int col;
  1448.   Font_string_dims dims;
  1449.  
  1450.   DPRINT(("x_draw_ctext im modus %d\n",xpix_mode_op));
  1451.  
  1452.   if (col != x_draw_color) x_draw_set_color(col);
  1453.  
  1454.   xv_get(text_font,FONT_STRING_DIMS,s,&dims);
  1455.   x -= ((double)dims.width)/(2*x_draw_scale);
  1456.   y -= ((double)dims.height)/(3*x_draw_scale);
  1457.  
  1458.   x_draw_text(x,y,s,col);
  1459.  
  1460. }
  1461.  
  1462. x_draw_int(x0,y0,i,col)
  1463. double x0,y0;
  1464. int i,col;
  1465.   char buf[16];
  1466.   sprintf(buf,"%d",i);
  1467.   x_draw_ctext(x0,y0,buf,col);
  1468.  }
  1469.  
  1470.  
  1471. x_draw_cursor()
  1472.   int X,Y;
  1473.  
  1474.   X = XPIX(mouse_xreal);
  1475.   Y = YPIX(mouse_yreal);
  1476.  
  1477.   xv_vector(pw,X,Y,X+10,Y,PIX_SRC^PIX_DST,1);
  1478.   xv_vector(pw,X,Y,X-10,Y,PIX_SRC^PIX_DST,1);
  1479.   xv_vector(pw,X,Y,X,Y+10,PIX_SRC^PIX_DST,1);
  1480.   xv_vector(pw,X,Y,X,Y-10,PIX_SRC^PIX_DST,1);
  1481.  
  1482. }
  1483.  
  1484.  
  1485.  
  1486. int x_draw_confirm(header)
  1487. char *header;
  1488. { /* ask for yes or no */
  1489.   char* s[2];
  1490.   s[0] = "NO";
  1491.   s[1] = "YES";
  1492.   return x_draw_read_panel(header,2,s,0);
  1493. }
  1494.  
  1495. int x_draw_acknowledge(header)
  1496. char *header;
  1497. { /* ask for ok */
  1498.   char* s[1];
  1499.   s[0] = "OK";
  1500.   return x_draw_read_panel(header,1,s,0);
  1501. }
  1502.  
  1503. /*
  1504. int x_draw_confirm(s)
  1505. char *s;
  1506.   return x_confirm(s,0);
  1507. }
  1508.  
  1509. int x_draw_acknowledge(s)
  1510. char *s;
  1511. {
  1512.   return x_confirm(s,1);
  1513. }
  1514.  
  1515. int
  1516. x_confirm(message, ok_only)
  1517. char    *message;
  1518. int    ok_only;
  1519. {
  1520.     int        answer;
  1521.   
  1522.     if (ok_only) 
  1523.       answer = notice_prompt(frame,NULL,
  1524.                 NOTICE_MESSAGE_STRINGS, message , NULL,
  1525.                 NOTICE_BUTTON_YES,      "OK",
  1526.                 NULL) ;
  1527.     else
  1528.       answer = notice_prompt(frame,NULL,
  1529.                 NOTICE_MESSAGE_STRINGS, message , NULL,
  1530.                 NOTICE_BUTTON_YES,      "YES",
  1531.                 NOTICE_BUTTON_NO,       "NO",
  1532.                 NULL) ;
  1533.  
  1534.     XFlush(display);
  1535.     return answer;
  1536. }
  1537. */
  1538.  
  1539.  
  1540.  
  1541. /* notify proc */
  1542. static void panel_input_notify(item, event)
  1543. Panel_item    item;
  1544. Event        *event;
  1545. {
  1546.     xv_set(panel,PANEL_CLIENT_DATA,(int)panel_get(item, PANEL_CLIENT_DATA),0);
  1547.  
  1548.     notify_stop();
  1549.  
  1550. }
  1551.  
  1552. int x_draw_screen_width()
  1553. { Rect *r;
  1554.   Frame frame = window_create(0, FRAME,NULL); 
  1555.   r = (Rect *) window_get(frame, WIN_SCREEN_RECT);
  1556.   window_destroy(frame);
  1557.   return(r->r_width);
  1558. }
  1559.  
  1560.  
  1561. int x_draw_screen_height()
  1562. { Rect *r;
  1563.   Frame frame = window_create(0, FRAME,NULL); 
  1564.   r = (Rect *) window_get(frame, WIN_SCREEN_RECT);
  1565.   window_destroy(frame);
  1566.   return(r->r_height);
  1567. }
  1568.  
  1569.  
  1570. static void
  1571. center_frame(frame)
  1572. Frame frame;
  1573. { Rect * r;
  1574.   int left,top,width,height;
  1575.  
  1576.     /* center frame on the screen */
  1577.  
  1578.     height = (int) window_get(frame, WIN_HEIGHT);
  1579.     width = (int) window_get(frame, WIN_WIDTH);
  1580.  
  1581.     left = (screen_width - width) / 2;
  1582.     top = (screen_height - height) / 2;
  1583.  
  1584.     if (left < 0) left = 0;
  1585.     if (top < 0) top = 0;
  1586.  
  1587.     window_set(frame, WIN_X, left, WIN_Y, top, 0);
  1588. }
  1589.  
  1590.  
  1591. static void 
  1592. init_panel_frame(message,num,label,vertical)
  1593. char    *message;
  1594. int     num;
  1595. char   **label;
  1596. int    vertical;
  1597. {
  1598.     Panel_item        message_item,button[64],but;
  1599.     int            i,w,left, top, panel_width[64], width, height;
  1600.     Rect        *r;
  1601.   
  1602.  
  1603.     panel_frame = window_create(0, FRAME,
  1604.                              FRAME_SHOW_LABEL, FALSE,
  1605.                              FRAME_NO_CONFIRM, TRUE, 
  1606.                              WIN_X, 100, WIN_Y, 100, 0);
  1607.  
  1608.  
  1609.    panel = window_create(panel_frame, PANEL, WIN_FONT, text_font, 0);
  1610.  
  1611.  
  1612.  
  1613.     message_item = panel_create_item(panel, PANEL_MESSAGE, 
  1614.                            PANEL_LABEL_STRING, message,
  1615.                            PANEL_LABEL_BOLD, TRUE,
  1616.                            PANEL_ITEM_X, 12,
  1617.                            PANEL_ITEM_Y, 10,
  1618.                        0);
  1619.  
  1620.     r = (Rect *) panel_get(message_item, PANEL_ITEM_RECT);
  1621.  
  1622.     left = 12;
  1623.  
  1624.     height = rect_bottom(r) + 15;
  1625.  
  1626.     button[0] = panel_create_item(panel, PANEL_BUTTON, 
  1627.                   PANEL_ITEM_X, left, PANEL_ITEM_Y, height, 
  1628.                   PANEL_LABEL_STRING, label[0],       
  1629.                   PANEL_CLIENT_DATA, 0,
  1630.                   PANEL_NOTIFY_PROC, panel_input_notify,
  1631.                   0);
  1632.  
  1633.       but = panel_create_item(panel, PANEL_BUTTON, 
  1634.                     PANEL_ITEM_Y, (i+1) * height,
  1635.                     PANEL_LABEL_STRING, "0",  
  1636.                     0);
  1637.  
  1638.       panel_width[0] =  panel_get(but,PANEL_ITEM_X) -left -10;
  1639.  
  1640.       w = panel_width[0];
  1641.  
  1642.        
  1643.       xv_destroy(but);
  1644.       
  1645.  
  1646.     if (vertical)
  1647.     for(i=1;i<num;i++)
  1648.     { button[i] = panel_create_item(panel, PANEL_BUTTON, 
  1649.                   PANEL_ITEM_X, left, PANEL_ITEM_Y, (i+1) * height,
  1650.                   PANEL_LABEL_STRING, label[i],     
  1651.                   PANEL_CLIENT_DATA, i,
  1652.                   PANEL_NOTIFY_PROC, panel_input_notify,
  1653.                   0);
  1654.  
  1655.       but = panel_create_item(panel, PANEL_BUTTON, 
  1656.                     PANEL_ITEM_Y, (i+1) * height,
  1657.                     PANEL_LABEL_STRING, "0",  
  1658.                     0);
  1659.  
  1660.       panel_width[i] =  panel_get(but,PANEL_ITEM_X) -left -10;
  1661.  
  1662.       if (w < panel_width[i]) w = panel_width[i];
  1663.  
  1664.        
  1665.       xv_destroy(but);
  1666.       
  1667.      }
  1668.     else
  1669.     { for(i=1;i<num;i++)
  1670.         button[i] = panel_create_item(panel, PANEL_BUTTON, 
  1671.                     PANEL_ITEM_Y, height,
  1672.                     PANEL_LABEL_STRING, label[i],  
  1673.                     PANEL_CLIENT_DATA, i,
  1674.                     PANEL_NOTIFY_PROC, panel_input_notify,
  1675.                     0);
  1676.  
  1677.       but = panel_create_item(panel, PANEL_BUTTON, 
  1678.                     PANEL_ITEM_Y, height,
  1679.                     PANEL_LABEL_STRING, "0",  
  1680.                     0);
  1681.  
  1682.       w = panel_get(but,PANEL_ITEM_X) -left -10;
  1683.  
  1684.       xv_destroy(but);
  1685.  
  1686.       for(i=0;i<num;i++) panel_width[i] = w;
  1687.  
  1688.      }
  1689.  
  1690.    /* center buttons under the message  or vice versa */
  1691.  
  1692.    for(i=0;i<num;i++)
  1693.    { left = (w - panel_width[i]) / 2;  
  1694.      panel_set(button[i],PANEL_ITEM_X,panel_get(button[i],PANEL_ITEM_X)+left,0);
  1695.     }
  1696.  
  1697.     left = (r->r_width - w) / 2;  
  1698.  
  1699.     if (left < 0) 
  1700.       panel_set(message_item,PANEL_ITEM_X,12-left,0);
  1701.     else
  1702.       for(i=0;i<num;i++)
  1703.         panel_set(button[i],PANEL_ITEM_X,panel_get(button[i],PANEL_ITEM_X)+left,0);
  1704.  
  1705.  
  1706.  
  1707.     window_fit(panel);
  1708.     window_fit(panel_frame);
  1709.  
  1710.     center_frame(panel_frame);
  1711. }
  1712.  
  1713.  
  1714. int x_draw_read_panel(message,n,labels,vertical)
  1715. char    *message;
  1716. int n;
  1717. char    **labels;
  1718. int    vertical;
  1719. {
  1720.     int answer;
  1721.  
  1722.     if (x_draw_grid_mode) x_draw_cursor();
  1723.  
  1724.     /* create the panel_frame */
  1725.     init_panel_frame(message,n,labels,vertical);
  1726.  
  1727.  
  1728.     xv_main_loop(panel_frame);
  1729.  
  1730.     answer = (int)xv_get(panel,PANEL_CLIENT_DATA);
  1731.  
  1732.  
  1733.     /* destroy the panel_frame */
  1734.     window_destroy(panel_frame);
  1735.  
  1736.     if (x_draw_grid_mode) x_draw_cursor();
  1737.  
  1738.     x_draw_reset_gc();
  1739.  
  1740.     XFlush(display);
  1741.  
  1742.     return answer;
  1743.  
  1744. }
  1745.  
  1746.  
  1747.  
  1748.  
  1749. char* x_draw_read_text_panel(message,menu_label,n,items)
  1750. char    *message;
  1751. char    *menu_label;
  1752. int      n;
  1753. char   **items;
  1754. {
  1755.     if (x_draw_grid_mode) x_draw_cursor();
  1756.  
  1757.     /* create the panel_frame */
  1758.     init_panel_text_frame(message,menu_label,n,items);
  1759.  
  1760.     xv_main_loop(panel_frame);
  1761.  
  1762.     /* destroy the panel_frame */
  1763.     window_destroy(panel_frame);
  1764.  
  1765.     if (x_draw_grid_mode) x_draw_cursor();
  1766.  
  1767.     x_draw_reset_gc();
  1768.  
  1769.     XFlush(display);
  1770.  
  1771.     return text_panel_answer;
  1772.  
  1773. }
  1774.  
  1775.  
  1776.  
  1777. static Panel_item panel_text_item;
  1778.  
  1779. static void 
  1780. init_panel_text_frame(message,menu_label,n,items)
  1781. char    *message;
  1782. char    *menu_label;
  1783. int      n;
  1784. char  **items;
  1785. {
  1786.     
  1787.     int       left, top, width, height;
  1788.     Rect  *r;
  1789.     int    i;
  1790.     Menu   menu;
  1791.     int    cols;
  1792.  
  1793.  
  1794.     cols =  1+ n/15;
  1795.   
  1796.  
  1797.     panel_frame = window_create(0, FRAME,
  1798.                              FRAME_SHOW_LABEL, FALSE,
  1799.                              FRAME_NO_CONFIRM, TRUE, 
  1800.                              WIN_X, mouse_xpix, WIN_Y, mouse_ypix, 0);
  1801.  
  1802.  
  1803.     panel = window_create(panel_frame, PANEL, WIN_FONT, text_font, 0);
  1804.  
  1805.  
  1806.  
  1807.  
  1808.     panel_text_item = panel_create_item(panel, PANEL_TEXT, 
  1809.                            PANEL_ITEM_Y, 18,
  1810.                            PANEL_NOTIFY_PROC,  panel_input_text_notify,
  1811.                            PANEL_LABEL_STRING, message,
  1812.                            PANEL_VALUE_DISPLAY_LENGTH, 20,
  1813.                            PANEL_VALUE_STORED_LENGTH, 256, 
  1814.                        0);
  1815.     
  1816. /*
  1817.     if (n>0)
  1818.     { menu = (Menu)xv_create(NULL, MENU,
  1819.                              MENU_NCOLS, cols,
  1820.                              MENU_NOTIFY_PROC, text_panel_menu_proc,
  1821.                              0);
  1822.  
  1823.       for(i=0;i<n;i++) menu_set(menu,MENU_STRING_ITEM,items[i],i,0);
  1824.  
  1825.       (void) xv_create(panel, PANEL_BUTTON,
  1826.                               PANEL_LABEL_STRING, menu_label,
  1827.                               PANEL_ITEM_MENU,    menu, 
  1828.                               0);
  1829.      }
  1830. */
  1831.  
  1832.  
  1833.     window_fit(panel);
  1834.     window_fit(panel_frame);
  1835.  
  1836.     center_frame(panel_frame);
  1837.  
  1838.     window_set(panel, PANEL_CARET_ITEM, panel_text_item, 0);
  1839.  
  1840. }
  1841.  
  1842.  
  1843. /* notify proc */
  1844.  
  1845. static void panel_input_text_notify(item, event)    /* pressing return */
  1846. Panel_item    item;
  1847. Event        *event;
  1848. {
  1849.     strcpy(text_panel_answer,(char*)panel_get_value(item));
  1850.     notify_stop();
  1851. }
  1852.  
  1853.  
  1854. static void text_panel_menu_proc(menu, menu_item)  /* selecting menu */
  1855. Menu menu;
  1856. Menu_item menu_item;
  1857. {
  1858.     xv_set(panel_text_item,PANEL_VALUE,xv_get(menu_item, MENU_STRING),0);
  1859.     strcpy(text_panel_answer,xv_get(menu_item, MENU_STRING));
  1860.     notify_stop();
  1861. }
  1862.  
  1863.  
  1864.  
  1865.  
  1866.  
  1867. void x_draw_notice(mesg)
  1868. char* mesg;
  1869. {
  1870.     notice_prompt(frame, NULL,
  1871.         NOTICE_FOCUS_XY,        500,200,
  1872.         NOTICE_MESSAGE_STRINGS, mesg, NULL,
  1873.         NOTICE_BUTTON_YES,      "OK",
  1874.         NULL);
  1875. }
  1876.  
  1877. static done_proc(subframe)
  1878. Frame subframe;
  1879. { xv_set(subframe,XV_SHOW,FALSE,0);
  1880.   notify_stop();
  1881.  }
  1882.  
  1883. x_draw_message_panel(argc, argv)
  1884. char *argv[];
  1885. {   int max_len,i,left, top, width, height;
  1886.     Rect        *r;
  1887.     Panel_item but;
  1888.  
  1889.     if (x_draw_grid_mode) x_draw_cursor();
  1890.  
  1891.     panel_frame = (Frame)xv_create(NULL, FRAME, 
  1892.                                    FRAME_LABEL, argv[0], 
  1893.                                    WIN_X, 10,
  1894.                                    WIN_Y, 10,
  1895.                                    NULL);
  1896.  
  1897.  
  1898. /*
  1899.  
  1900.     panel_frame = (Frame)xv_create(frame, FRAME_CMD,
  1901.                                          WIN_X, 10,
  1902.                                          WIN_Y, 10,
  1903.                                          WIN_WIDTH, 10,
  1904.                                          WIN_HEIGHT, 10,
  1905.                                          FRAME_CMD_PUSHPIN_IN, TRUE,
  1906.                                          FRAME_LABEL, argv[0],
  1907.                                          FRAME_DONE_PROC, done_proc,
  1908.                                          NULL);
  1909. */
  1910.  
  1911.     panel = window_create(panel_frame, PANEL, 
  1912.                                        PANEL_LAYOUT, PANEL_VERTICAL,
  1913.                                        WIN_FONT, text_font, 0);
  1914.  
  1915.     if (argc > 1)
  1916.     { xv_create(panel, PANEL_MESSAGE, 
  1917.                 PANEL_ITEM_Y, 10,
  1918.                 PANEL_ITEM_X, 25,
  1919.                 PANEL_LABEL_BOLD, TRUE, 
  1920.                 PANEL_LABEL_STRING, argv[1],
  1921.                 NULL);
  1922.       max_len = strlen(argv[1]);
  1923.      }
  1924.  
  1925.     for(i = 2; i< argc; i++)
  1926.     { if (max_len < strlen(argv[i])) 
  1927.           max_len = strlen(argv[i]);
  1928.       xv_create(panel, PANEL_MESSAGE, 
  1929.                 PANEL_ITEM_X, 25,
  1930.                 PANEL_LABEL_BOLD, TRUE, 
  1931.                 PANEL_LABEL_STRING, argv[i],
  1932.                 NULL);
  1933.      }
  1934.  
  1935.     but = xv_create(panel, PANEL_BUTTON,
  1936.                 PANEL_LABEL_STRING, "OK",
  1937.                 PANEL_CLIENT_DATA, 0,
  1938.                 PANEL_NOTIFY_PROC, panel_input_notify,
  1939.                 NULL);
  1940.  
  1941.  
  1942.     window_fit(panel);
  1943.     window_fit(panel_frame);
  1944.  
  1945.     width = xv_get(panel_frame,WIN_WIDTH);
  1946.     panel_set(but,PANEL_ITEM_X,width/2 - 15,0);
  1947.  
  1948.  
  1949.     center_frame(panel_frame);
  1950.  
  1951.     xv_main_loop(panel_frame);
  1952.  
  1953.     window_destroy(panel_frame);
  1954.  
  1955.     if (x_draw_grid_mode) x_draw_cursor();
  1956. }
  1957.