home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume11 / reve / patch3i / patches03f
Text File  |  1991-01-03  |  52KB  |  1,737 lines

  1.  
  2. ------- xview.c -------
  3. *** /tmp/da07695    Sun Dec  9 15:22:04 1990
  4. --- xview.c    Fri Dec  7 16:49:50 1990
  5. ***************
  6. *** 27,32 ****
  7. --- 27,37 ----
  8.   #include "color.h"
  9.   #include "extern.h"
  10.   #include "images.h"
  11. + #include <errno.h>
  12. + #include <sys/ioctl.h>
  13. + #include <sys/param.h>
  14. + #include <sys/wait.h>
  15.   #include <xview/xview.h>
  16.   #include <xview/canvas.h>
  17.   #include <xview/panel.h>
  18. ***************
  19. *** 35,47 ****
  20.   #include <xview/svrimage.h>
  21.   #include <xview/xv_xrect.h>
  22.   #include <X11/Xlib.h>
  23.   
  24. ! enum gr_type gtype = GXVIEW ;      /* Graphics type. */
  25.   
  26.   enum popup_pos {P_BELOW, P_RIGHT } ;   /* Positions relative to main frame. */
  27.   
  28.   #define  FRAME_BORDER_SIZE  7
  29.   #define  FRAME_LABEL_SIZE   30
  30.   
  31.   #define  XV_CREATE          (void) xv_create
  32.   #define  XV_SET             (void) xv_set
  33. --- 40,58 ----
  34.   #include <xview/svrimage.h>
  35.   #include <xview/xv_xrect.h>
  36.   #include <X11/Xlib.h>
  37. + #include <X11/Xresource.h>
  38.   
  39. ! extern int errno ;
  40.   
  41. + enum gr_type gtype = GXVIEW ;          /* Graphics type. */
  42.   enum popup_pos {P_BELOW, P_RIGHT } ;   /* Positions relative to main frame. */
  43.   
  44. + #define  CLIENT_NO          10
  45. + #define  DEPTH_MENU_ENTRY   9
  46.   #define  FRAME_BORDER_SIZE  7
  47.   #define  FRAME_LABEL_SIZE   30
  48. + #define  K_PROPS            3          /* Props key (L3). */
  49.   
  50.   #define  XV_CREATE          (void) xv_create
  51.   #define  XV_SET             (void) xv_set
  52. ***************
  53. *** 53,74 ****
  54.   Canvas canvas ;
  55.   Canvas_paint_window cpw ;
  56.   Event *cur_event ;
  57. - Frame cframe ;                  /* Frame for Reve game board. */
  58.   Frame frame ;                   /* Frame for control panel. */
  59. - Frame ls_frame ;                /* Frame for load/save pop-up window. */
  60.   Icon  creve_icon ;              /* Icon for game board. */
  61.   Icon  reve_icon ;               /* Icon for control panel. */
  62.   Panel panel ;                   /* Xview interface panel. */
  63.   
  64.   Frame ls_frame ;                /* Frame for load/save pop-up window. */
  65.   Panel ls_panel ;                /* Panel for load/save operations. */
  66.   Panel_item ls_button ;          /* Button to start load/save operation. */
  67.   Panel_item ls_text ;            /* Load/Save text filename item. */
  68. ! Panel_item mes_items[4] ;       /* Four generic message items. */
  69. ! Panel_setting start_load_save() ;
  70. ! Menu game_menu ;                /* Menu for 'New Game' button. */
  71. ! Menu menus[MAXMENUS] ;
  72. ! Notify_value quit_proc() ;
  73.   Panel_item black_item ;
  74.   Panel_item white_item ;
  75.   Server_image hglass_pr, nocur_pr ;
  76. --- 64,95 ----
  77.   Canvas canvas ;
  78.   Canvas_paint_window cpw ;
  79.   Event *cur_event ;
  80.   Frame frame ;                   /* Frame for control panel. */
  81.   Icon  creve_icon ;              /* Icon for game board. */
  82.   Icon  reve_icon ;               /* Icon for control panel. */
  83.   Panel panel ;                   /* Xview interface panel. */
  84.   
  85. + Notify_client client = (Notify_client) CLIENT_NO ;
  86.   Frame ls_frame ;                /* Frame for load/save pop-up window. */
  87.   Panel ls_panel ;                /* Panel for load/save operations. */
  88.   Panel_item ls_button ;          /* Button to start load/save operation. */
  89.   Panel_item ls_text ;            /* Load/Save text filename item. */
  90. ! Frame d_frame ;                 /* Frame for depth pop-up window. */
  91. ! Panel d_panel ;                 /* Panel for depth operations. */
  92. ! Panel_item d_button ;           /* Button to start depth operation. */
  93. ! Panel_item d_text ;             /* Depth numeric text item. */
  94. ! Frame props_frame ;               /* Frame for property window */
  95. ! Panel props_panel ;               /* Panel for property operations. */
  96. ! Panel_item props_computer ;       /* Computer plays: choice. */
  97. ! Panel_item props_button ;         /* Button to start property operation */
  98. ! Panel_item props_reset_button ;   /* Button to reset properties */
  99. ! Panel_item props_choices ;        /* non-exclusive choices for properties */
  100. ! Panel_item mes_items[4] ;         /* Four generic message items. */
  101. ! Panel_setting start_load_save(), set_profmax(), set_props(), reset_props() ;
  102.   Panel_item black_item ;
  103.   Panel_item white_item ;
  104.   Server_image hglass_pr, nocur_pr ;
  105. ***************
  106. *** 84,89 ****
  107. --- 105,111 ----
  108.   Window root ;
  109.   XFontStruct *font[MAXFONTS] ;   /* Xlib handles to the fonts. */
  110.   XGCValues gc_val ;              /* Used to setup graphics context values. */
  111. + XrmDatabase reve_DB[MAXDPY] ;   /* Combined resources database. */
  112.   int gc_flags ;                  /* Used to set up graphics context flags. */
  113.   int screen ;                    /* Default graphics display screen. */
  114.   unsigned long backgnd ;         /* Default background color. */
  115. ***************
  116. *** 92,106 ****
  117.   unsigned long palette[OTH_COLORSIZE] ;     /* Xlib color palette. */
  118.   
  119.   int opvals[3] ;         /* Pixrect rasterop values. */
  120.   int started ;           /* Set just before window is displayed. */
  121.   
  122.   void destroy_frame() ;
  123. ! static void menu_proc(),  new_game_proc(), pop_props(),    set_depth() ;
  124. ! static void set_player(), unimplemented(), xv_load_game(), xv_save_game() ;
  125.   
  126. - extern int mnb ;        /* Number of current move */
  127.   
  128.   void
  129.   batch(state)            /* Turn graphics batching on or off. */
  130.   enum bltype state ;
  131. --- 114,130 ----
  132.   unsigned long palette[OTH_COLORSIZE] ;     /* Xlib color palette. */
  133.   
  134.   int opvals[3] ;         /* Pixrect rasterop values. */
  135. + int pid ;               /* Process id of the reve_proc process. */
  136. + int pipe_io[2][2] ;
  137. + int reve_player ;       /* Player making the computer move (black/white). */
  138.   int started ;           /* Set just before window is displayed. */
  139.   
  140. + Notify_value read_from_reve(), sigchldcatcher() ;
  141.   void destroy_frame() ;
  142. ! static void menu_proc(),    set_depth(),   set_player() ;
  143. ! static void xv_load_game(), xv_new_game(), xv_save_game(), xv_set_props() ;
  144.   
  145.   
  146.   void
  147.   batch(state)            /* Turn graphics batching on or off. */
  148.   enum bltype state ;
  149. ***************
  150. *** 116,127 ****
  151.   Event *event ;
  152.   {
  153.     if (!started) return ;
  154. !   cur_event = event ;
  155. !   process_event() ;       /* Determine what kind of event it is. */
  156.     handle_event() ;        /* And do the appropriate action. */
  157.   
  158. !   if (nextc == LEFT_UP || nextc == MIDDLE_UP || nextc == RIGHT_UP)
  159. !     XV_SET(frame, FRAME_BUSY, FALSE, 0) ;
  160.   }
  161.   
  162.   
  163. --- 140,160 ----
  164.   Event *event ;
  165.   {
  166.     if (!started) return ;
  167. !   cur_event = event ;     /* Determine what kind of event it is. */
  168. !   XAllowEvents(dpy, AsyncBoth, CurrentTime) ;
  169.     handle_event() ;        /* And do the appropriate action. */
  170. + }
  171.   
  172. ! void
  173. ! change_depth(depth)
  174. ! int depth ;
  175. ! {
  176. !   struct reve_in in ;
  177. !   in.type = M_PROFMAX ;
  178. !   in.level = depth ;
  179. !   WRITE(pipe_io[0][1], (char *) &in, sizeof(struct reve_in)) ;
  180.   }
  181.   
  182.   
  183. ***************
  184. *** 132,139 ****
  185.   }
  186.   
  187.   
  188.   void
  189. ! color_area(x, y, width, height, color)
  190.   int x, y, width, height, color ;
  191.   {
  192.     int d ;
  193. --- 165,174 ----
  194.   }
  195.   
  196.   
  197. + /*ARGSUSED*/
  198.   void
  199. ! color_area(wtype, x, y, width, height, color)
  200. ! enum win_type wtype ;
  201.   int x, y, width, height, color ;
  202.   {
  203.     int d ;
  204. ***************
  205. *** 154,179 ****
  206.   
  207.   
  208.   void
  209. ! create_menu(mtype, values)    /* Create popup menus for cycle items. */
  210. ! enum panel_type mtype ;
  211. ! char *values[] ;
  212.   {
  213. !   int i = 0 ;
  214. !   int menuno ;     /* Current menu number. */
  215. !   int more = 1 ;   /* Cleared when current menu is complete.*/
  216. !   menuno = (int) mtype - (int) BLACK_PLAYS ;
  217. !   menus[menuno] = xv_create(XV_NULL,          MENU_COMMAND_MENU,
  218. !                             MENU_NOTIFY_PROC, menu_proc,
  219. !                             0) ;
  220. !   do
  221. !     {
  222. !       if (values[i] != NULL)
  223. !         XV_SET(menus[menuno], MENU_STRING_ITEM, values[i], i+1, 0) ;
  224. !       else more = 0 ;
  225. !       i++ ;
  226. !     }
  227. !   while (more) ;
  228.   }
  229.   
  230.   
  231. --- 189,199 ----
  232.   
  233.   
  234.   void
  235. ! connect_to_reve(pid)
  236. ! int pid ;
  237.   {
  238. !   notify_set_input_func(client, read_from_reve, pipe_io[1][0]) ;
  239. !   notify_set_wait3_func(client, sigchldcatcher, pid) ;
  240.   }
  241.   
  242.   
  243. ***************
  244. *** 181,208 ****
  245.   destroy_frame()        /* Destroy reve window. */
  246.   {
  247.     xv_destroy_safe(frame) ;
  248. !   xv_destroy_safe(cframe) ;
  249.     exit(0) ;
  250.   }
  251.   
  252.   
  253. ! do_menu(mtype)      /* Popup appropriate cycle menu and get value. */
  254. ! enum item_type mtype ;
  255.   {
  256. -   int menuno ;
  257. -   menuno = (int) mtype - (int) BLACK_PLAYS ;
  258. -   menu_show(menus[menuno], canvas, cur_event, 0) ;
  259. -   return(0) ;
  260.   }
  261.   
  262.   
  263.   /*ARGSUSED*/
  264.   void
  265. ! draw_button(item, color, image)      /* **DUMMY ROUTINE** */
  266.   enum panel_type item ;
  267.   int color ;
  268. - enum image_type image ;
  269.   {
  270.   }
  271.   
  272. --- 201,228 ----
  273.   destroy_frame()        /* Destroy reve window. */
  274.   {
  275.     xv_destroy_safe(frame) ;
  276. !   KILL(pid, SIGKILL) ;
  277.     exit(0) ;
  278.   }
  279.   
  280.   
  281. ! /*ARGSUSED*/
  282. ! void
  283. ! draw_button(wtype, item, color, image)      /* **DUMMY ROUTINE** */
  284. ! enum win_type wtype ;
  285. ! enum panel_type item ;
  286. ! int color ;
  287. ! enum image_type image ;
  288.   {
  289.   }
  290.   
  291.   
  292.   /*ARGSUSED*/
  293.   void
  294. ! draw_choice(wtype, item, color)             /* **DUMMY ROUTINE** */
  295. ! enum win_type wtype ;
  296.   enum panel_type item ;
  297.   int color ;
  298.   {
  299.   }
  300.   
  301. ***************
  302. *** 209,215 ****
  303.   
  304.   /*ARGSUSED*/
  305.   void
  306. ! draw_cycle(item, color, image)       /* **DUMMY ROUTINE** */
  307.   enum panel_type item ;
  308.   int color ;
  309.   enum image_type image ;
  310. --- 229,236 ----
  311.   
  312.   /*ARGSUSED*/
  313.   void
  314. ! draw_cycle(wtype, item, color, image)       /* **DUMMY ROUTINE** */
  315. ! enum win_type wtype ;
  316.   enum panel_type item ;
  317.   int color ;
  318.   enum image_type image ;
  319. ***************
  320. *** 217,224 ****
  321.   }
  322.   
  323.   
  324.   void
  325. ! draw_image(x, y, width, height, image)
  326.   int x, y, width, height ;
  327.   enum image_type image ;
  328.   {
  329. --- 238,247 ----
  330.   }
  331.   
  332.   
  333. + /*ARGSUSED*/
  334.   void
  335. ! draw_image(wtype, x, y, width, height, image)
  336. ! enum win_type wtype ;
  337.   int x, y, width, height ;
  338.   enum image_type image ;
  339.   {
  340. ***************
  341. *** 231,238 ****
  342.   }
  343.    
  344.    
  345.   void
  346. ! draw_line(x1, y1, x2, y2, op, color)
  347.   int x1, y1, x2, y2, color ;
  348.   enum optype op ;
  349.   {
  350. --- 254,263 ----
  351.   }
  352.    
  353.    
  354. + /*ARGSUSED*/
  355.   void
  356. ! draw_line(wtype, x1, y1, x2, y2, op, color)
  357. ! enum win_type wtype ;
  358.   int x1, y1, x2, y2, color ;
  359.   enum optype op ;
  360.   {
  361. ***************
  362. *** 251,258 ****
  363.   }
  364.   
  365.   
  366.   void
  367. ! draw_stencil(x, y, width, height, op, color, stencil, image)
  368.   int x, y, width, height, color ;
  369.   enum optype op ;
  370.   enum image_type stencil, image ;
  371. --- 276,285 ----
  372.   }
  373.   
  374.   
  375. + /*ARGSUSED*/
  376.   void
  377. ! draw_stencil(wtype, x, y, width, height, op, color, stencil, image)
  378. ! enum win_type wtype ;
  379.   int x, y, width, height, color ;
  380.   enum optype op ;
  381.   enum image_type stencil, image ;
  382. ***************
  383. *** 277,284 ****
  384.   }
  385.   
  386.   
  387.   void
  388. ! draw_text(x, y, ftype, color, str)
  389.   enum font_type ftype ;
  390.   int x, y, color ;
  391.   char *str ;
  392. --- 304,313 ----
  393.   }
  394.   
  395.   
  396. + /*ARGSUSED*/
  397.   void
  398. ! draw_text(wtype, x, y, ftype, color, str)
  399. ! enum win_type wtype ;
  400.   enum font_type ftype ;
  401.   int x, y, color ;
  402.   char *str ;
  403. ***************
  404. *** 305,327 ****
  405.   }
  406.   
  407.   
  408. ! static Notify_value
  409. ! frame_event(frame, event, arg, type)
  410. ! Frame frame ;
  411. ! Event *event ;
  412. ! Notify_arg arg ;
  413. ! Notify_event_type type ;
  414.   {
  415. !   int action ;
  416.   
  417. !   action = event_action(event) ;
  418. !   if (action == ACTION_CLOSE) XV_SET(cframe, XV_SHOW, FALSE, 0) ;
  419. !   if (action == WIN_RESIZE)
  420.       {
  421. !       position_popup(frame, cframe, P_BELOW) ;
  422. !       XV_SET(cframe, XV_SHOW, TRUE, 0) ;
  423.       }
  424. !   return(notify_next_event_func(frame, event, arg, type)) ;
  425.   }
  426.   
  427.   
  428. --- 334,375 ----
  429.   }
  430.   
  431.   
  432. ! /*ARGSUSED*/
  433. ! void
  434. ! draw_toggle(wtype, item, color)
  435. ! enum win_type wtype ;
  436. ! enum panel_type item ;
  437. ! int color ;
  438.   {
  439. ! }
  440.   
  441. ! fork_child()
  442. ! {
  443. !   int i ;
  444. !   PIPE(pipe_io[0]) ;      /* Setup input pipe. */
  445. !   PIPE(pipe_io[1]) ;      /* Setup output pipe. */
  446. !   switch (pid = fork())
  447.       {
  448. !       case -1 : CLOSE(pipe_io[0][0]) ;
  449. !                 CLOSE(pipe_io[0][1]) ;
  450. !                 CLOSE(pipe_io[1][0]) ;
  451. !                 CLOSE(pipe_io[1][1]) ;
  452. !                 perror("reve fork failed") ;
  453. !                 exit(1) ;
  454. !       case  0 : DUP2(pipe_io[0][0], 0) ;         /* Child. */
  455. !                 DUP2(pipe_io[1][1], 1) ;
  456. !                 DUP2(pipe_io[1][1], 2) ;
  457. !                 for (i = getdtablesize(); i > 2; i--) CLOSE(i) ;
  458. !                 for (i = 0; i < NSIG; i++) SIGNAL(i, SIG_DFL) ;
  459. !                 execlp("reve_proc", "reve_proc", edgefile, (char *) NULL) ;
  460. !                 perror("reve child exec") ;
  461. !                 _exit(-1) ;
  462. !       default : CLOSE(pipe_io[0][0]) ;           /* Parent. */
  463. !                 CLOSE(pipe_io[1][1]) ;
  464.       }
  465. !   return(pid) ;
  466.   }
  467.   
  468.   
  469. ***************
  470. *** 347,352 ****
  471. --- 395,420 ----
  472.   }
  473.   
  474.   
  475. + char *
  476. + get_resource(rtype)      /* Get Reve resource from merged databases. */
  477. + enum res_type rtype ;
  478. + {
  479. +   char cstr[MAXLINE], nstr[MAXLINE], str[MAXLINE] ;
  480. +   char *str_type[20] ;
  481. +   int d ;
  482. +   XrmValue value ;
  483. +  
  484. +   d = (int) cur_dpyno ;
  485. +   STRCPY(str, resources[(int) rtype]) ;
  486. +   SPRINTF(nstr,  "reve.%s", str) ;
  487. +   if (islower(str[0])) str[0] = toupper(str[0]) ;
  488. +   SPRINTF(cstr, "Reve.%s", str) ;
  489. +   if (XrmGetResource(reve_DB[d], nstr, cstr, str_type, &value) == NULL)
  490. +     return((char *) NULL) ;
  491. +   else return(value.addr) ;
  492. + }
  493.   get_strwidth(ftype, str)    /* Get width in pixels of string value. */
  494.   enum font_type ftype ;
  495.   char *str ;
  496. ***************
  497. *** 367,378 ****
  498.   }
  499.   
  500.   
  501.   init_ws_type()
  502.   {
  503. !   show_notes = TRUE ;   /* Override generic value for XView version. */
  504.     move_delta = 10 ;
  505.     cur_dpyno = DPY1 ;
  506. !   started = 0 ;       /* Kludge to correctly handle repaints. */
  507.     return 0 ;
  508.   }
  509.   
  510. --- 435,457 ----
  511.   }
  512.   
  513.   
  514. + init_graphics(argc, argv)
  515. + int *argc ;
  516. + char *argv[] ;
  517. + {
  518. +   xv_init(XV_INIT_ARGC_PTR_ARGV, argc, argv, 0) ;
  519. +   frame = (Frame) xv_create(XV_NULL, FRAME, 0) ;
  520. +   dpy = (Display *) xv_get(frame, XV_DISPLAY) ;
  521. +   reve_DB[(int) DPY1] = NULL ;
  522. + }
  523.   init_ws_type()
  524.   {
  525. !   SHOW_NOTES = TRUE ;   /* Override generic value for XView version. */
  526.     move_delta = 10 ;
  527.     cur_dpyno = DPY1 ;
  528. !   started = 0 ;         /* Kludge to correctly handle repaints. */
  529.     return 0 ;
  530.   }
  531.   
  532. ***************
  533. *** 406,412 ****
  534. --- 485,550 ----
  535.   }
  536.   
  537.   
  538. + /*  Get the resource databases. These are looked for in the following ways:
  539. +  *
  540. +  *  Classname file in the app-defaults directory. In this case, Classname
  541. +  *  is Reve.
  542. +  *
  543. +  *  Classname file in the directory specified by the XUSERFILESEARCHPATH
  544. +  *  or XAPPLRESDIR environment variable.
  545. +  *
  546. +  *  Property set using xrdb, accessible through the XResourceManagerString
  547. +  *  macro or, if that is empty, the ~/.Xdefaults file.
  548. +  *
  549. +  *  XENVIRONMENT environment variable or, if not set, .Xdefaults-hostname
  550. +  *  file.
  551. +  */
  552. +  
  553.   void
  554. + load_resources()
  555. + {
  556. +   XrmDatabase db ;
  557. +   char *home, name[MAXPATHLEN], *ptr ;
  558. +   int d, len ;
  559. +   d = (int) cur_dpyno ;
  560. +   home = getenv("HOME") ;
  561. +   XrmInitialize() ;
  562. +   STRCPY(name, "/usr/lib/X11/app-defaults/Reve") ;
  563. +  
  564. + /* Get applications defaults file, if any. */
  565. +  
  566. +   db = XrmGetFileDatabase(name) ;
  567. +   XrmMergeDatabases(db, &reve_DB[d]) ;
  568. +  
  569. + /* Merge server defaults, created by xrdb. If nor defined, use ~/.Xdefaults. */
  570. +   if (XResourceManagerString(dpy) != NULL)
  571. +     db = XrmGetStringDatabase(XResourceManagerString(dpy)) ;
  572. +   else
  573. +     { 
  574. +       SPRINTF(name, "%s/.Xdefaults", home) ;
  575. +       db = XrmGetFileDatabase(name) ;
  576. +     }
  577. +   XrmMergeDatabases(db, &reve_DB[d]) ;
  578. + /*  Open XENVIRONMENT file or, if not defined, the .Xdefaults, and merge
  579. +  *  into existing database.
  580. +  */
  581. +   if ((ptr = getenv("XENVIRONMENT")) == NULL)
  582. +     {
  583. +       SPRINTF(name, "%s/.Xdefaults-", home) ;
  584. +       len = strlen(name) ;
  585. +       GETHOSTNAME(name+len, 1024-len) ;
  586. +       db = XrmGetFileDatabase(name) ;
  587. +     }
  588. +   else db = XrmGetFileDatabase(ptr) ;
  589. +   XrmMergeDatabases(db, &reve_DB[d]) ;
  590. + }
  591. + void
  592.   lock_screen(state)     /* Turn graphics locking on or off - null routine. */
  593.   enum bltype state ;
  594.   {}
  595. ***************
  596. *** 415,429 ****
  597.   void
  598.   make_canvas()               /* Create canvas for game board. */
  599.   {
  600. !   cframe = xv_create(XV_NULL,                  FRAME,
  601. !                      XV_SHOW,                  FALSE,
  602. !                      FRAME_ICON,               creve_icon,
  603. !                      FRAME_NO_CONFIRM,         TRUE,
  604. !                      WIN_ERROR_MSG,            "Reve: Can't create window.",
  605. !                      FRAME_SHOW_RESIZE_CORNER, FALSE,
  606. !                      FRAME_SHOW_HEADER,        FALSE,
  607. !                      0) ;
  608. !   canvas = xv_create(cframe,              CANVAS,
  609.                        CANVAS_RETAINED,     FALSE,
  610.                        OPENWIN_AUTO_CLEAR,  FALSE, 
  611.                        XV_HEIGHT,           TOTAL_HEIGHT,
  612. --- 553,563 ----
  613.   void
  614.   make_canvas()               /* Create canvas for game board. */
  615.   {
  616. !   int pid ;
  617. !   canvas = xv_create(frame,               CANVAS,
  618. !                      WIN_BELOW,           panel,
  619. !                      XV_X,                0,
  620.                        CANVAS_RETAINED,     FALSE,
  621.                        OPENWIN_AUTO_CLEAR,  FALSE, 
  622.                        XV_HEIGHT,           TOTAL_HEIGHT,
  623. ***************
  624. *** 432,439 ****
  625.                          WIN_CONSUME_EVENTS,
  626.                            MS_LEFT, MS_MIDDLE, MS_RIGHT,
  627.                            WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
  628. !                          LOC_MOVE, LOC_DRAG,
  629. !                          LOC_WINENTER, LOC_WINEXIT,
  630.                            WIN_LEFT_KEYS, WIN_TOP_KEYS,
  631.                            WIN_RIGHT_KEYS, WIN_REPAINT,
  632.                            0,
  633. --- 566,572 ----
  634.                          WIN_CONSUME_EVENTS,
  635.                            MS_LEFT, MS_MIDDLE, MS_RIGHT,
  636.                            WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
  637. !                          LOC_DRAG, LOC_WINENTER, LOC_WINEXIT,
  638.                            WIN_LEFT_KEYS, WIN_TOP_KEYS,
  639.                            WIN_RIGHT_KEYS, WIN_REPAINT,
  640.                            0,
  641. ***************
  642. *** 440,447 ****
  643.                          WIN_EVENT_PROC,    canvas_proc,
  644.                          0,
  645.                        0) ;
  646. !   window_fit(cframe) ;
  647. !   notify_interpose_destroy_func(cframe, quit_proc) ;
  648.   
  649.     cpw = canvas_paint_window(canvas) ;
  650.     cursor[(int) CANVASCUR] = xv_get(cpw, WIN_CURSOR, NULL) ;
  651. --- 573,579 ----
  652.                          WIN_EVENT_PROC,    canvas_proc,
  653.                          0,
  654.                        0) ;
  655. !   window_fit(frame) ;
  656.   
  657.     cpw = canvas_paint_window(canvas) ;
  658.     cursor[(int) CANVASCUR] = xv_get(cpw, WIN_CURSOR, NULL) ;
  659. ***************
  660. *** 486,499 ****
  661. --- 618,635 ----
  662.   
  663.     images[(int) P_WHITE]     = make_server_image(white_image) ;
  664.     images[(int) P_BLACK]     = make_server_image(black_image) ;
  665. +   pid = fork_child() ;
  666. +   connect_to_reve(pid) ;
  667.   }
  668.   
  669.   
  670. + /*ARGSUSED*/
  671.   void 
  672.   make_frame(argc, argv)     /* Create frame and the panel, buttons, menus. */
  673.   int argc ;
  674.   char *argv[] ;
  675.   {
  676. +   int val ;
  677.     Menu_item item ;
  678.   
  679.     opvals[(int) RCLR] = GXclear ;
  680. ***************
  681. *** 502,570 ****
  682.   
  683.   /* Create the frame and the control panel */
  684.   
  685. !   xv_init(XV_INIT_ARGS, argc, argv, 0) ;
  686. !   frame = xv_create(XV_NULL,                  FRAME,
  687. !                     FRAME_ICON,               reve_icon,
  688. !                     FRAME_LABEL,              line,
  689. !                     FRAME_NO_CONFIRM,         TRUE,
  690. !                     FRAME_SHOW_RESIZE_CORNER, FALSE,
  691. !                     WIN_ERROR_MSG,            "Reve: Can't create window.",
  692. !                     NULL) ;
  693.   
  694.     panel = (Panel) xv_create(frame, PANEL, 0) ;
  695.   
  696. - /* Menu for the 'new game' button */
  697. -   game_menu = (Menu) xv_create(XV_NULL, MENU,
  698. -                                MENU_NOTIFY_PROC, new_game_proc,
  699. -                                MENU_STRINGS,
  700. -                                  "Human (black)    vs. Computer (white)",
  701. -                                  "Computer (black) vs. Human (white)",
  702. -                                  "Human (black)    vs. Human (white)",
  703. -                                  0,
  704. -                                0) ;
  705.   /* Create the buttons and other controls. */
  706.   
  707.     XV_CREATE(panel,              PANEL_BUTTON,
  708.               PANEL_ITEM_X,       xv_col(panel, 0),
  709.               PANEL_ITEM_Y,       xv_row(panel, 0),
  710. !             PANEL_LABEL_STRING, "New Game",
  711. !             PANEL_ITEM_MENU,    game_menu,
  712.               0) ;
  713.   
  714.     XV_CREATE(panel,              PANEL_BUTTON,
  715.               PANEL_ITEM_X,       xv_col(panel, 15),
  716.               PANEL_ITEM_Y,       xv_row(panel, 0),
  717. !             PANEL_LABEL_STRING, "Load Game...",
  718. !             PANEL_NOTIFY_PROC,  xv_load_game,
  719.               0) ;
  720.   
  721.     XV_CREATE(panel,              PANEL_BUTTON,
  722.               PANEL_ITEM_X,       xv_col(panel, 30),
  723.               PANEL_ITEM_Y,       xv_row(panel, 0),
  724. !             PANEL_LABEL_STRING, "Save Game...",
  725. !             PANEL_NOTIFY_PROC,  xv_save_game,
  726.               0) ;
  727.   
  728.     XV_CREATE(panel,              PANEL_BUTTON,
  729.               PANEL_ITEM_X,       xv_col(panel, 45),
  730.               PANEL_ITEM_Y,       xv_row(panel, 0),
  731. !             PANEL_LABEL_STRING, "     Help      ",
  732. !             PANEL_NOTIFY_PROC,  unimplemented,
  733.               0) ;
  734. !  
  735.     XV_CREATE(panel,              PANEL_BUTTON,
  736.               PANEL_ITEM_X,       xv_col(panel, 0),
  737.               PANEL_ITEM_Y,       xv_row(panel, 1),
  738. !             PANEL_LABEL_STRING, "   Moves?   ",
  739. !             PANEL_NOTIFY_PROC,  show_all_moves,
  740.               0) ;
  741.   
  742.     XV_CREATE(panel,              PANEL_BUTTON,
  743.               PANEL_ITEM_X,       xv_col(panel, 15),
  744.               PANEL_ITEM_Y,       xv_row(panel, 1),
  745. !             PANEL_LABEL_STRING, "   Suggest  ",
  746.               PANEL_NOTIFY_PROC,  suggest,
  747.               0) ;        
  748.   
  749. --- 638,693 ----
  750.   
  751.   /* Create the frame and the control panel */
  752.   
  753. !   XV_SET(frame,
  754. !          FRAME_ICON,               reve_icon,
  755. !          FRAME_LABEL,              line,
  756. !          FRAME_NO_CONFIRM,         TRUE,
  757. !          FRAME_SHOW_RESIZE_CORNER, FALSE,
  758. !          0) ;
  759.   
  760.     panel = (Panel) xv_create(frame, PANEL, 0) ;
  761.   
  762.   /* Create the buttons and other controls. */
  763.   
  764.     XV_CREATE(panel,              PANEL_BUTTON,
  765.               PANEL_ITEM_X,       xv_col(panel, 0),
  766.               PANEL_ITEM_Y,       xv_row(panel, 0),
  767. !             PANEL_LABEL_STRING, "Load Game...",
  768. !             PANEL_NOTIFY_PROC,  xv_load_game,
  769.               0) ;
  770.   
  771.     XV_CREATE(panel,              PANEL_BUTTON,
  772.               PANEL_ITEM_X,       xv_col(panel, 15),
  773.               PANEL_ITEM_Y,       xv_row(panel, 0),
  774. !             PANEL_LABEL_STRING, "   Moves?   ",
  775. !             PANEL_NOTIFY_PROC,  show_all_moves,
  776.               0) ;
  777.   
  778.     XV_CREATE(panel,              PANEL_BUTTON,
  779.               PANEL_ITEM_X,       xv_col(panel, 30),
  780.               PANEL_ITEM_Y,       xv_row(panel, 0),
  781. !             PANEL_NOTIFY_PROC,  xv_new_game,
  782. !             PANEL_LABEL_STRING, " New Game ",
  783.               0) ;
  784.   
  785.     XV_CREATE(panel,              PANEL_BUTTON,
  786.               PANEL_ITEM_X,       xv_col(panel, 45),
  787.               PANEL_ITEM_Y,       xv_row(panel, 0),
  788. !             PANEL_LABEL_STRING, "   Props...   ",
  789. !             PANEL_NOTIFY_PROC,  xv_set_props,
  790.               0) ;
  791.     XV_CREATE(panel,              PANEL_BUTTON,
  792.               PANEL_ITEM_X,       xv_col(panel, 0),
  793.               PANEL_ITEM_Y,       xv_row(panel, 1),
  794. !             PANEL_LABEL_STRING, "Save Game...",
  795. !             PANEL_NOTIFY_PROC,  xv_save_game,
  796.               0) ;
  797.   
  798.     XV_CREATE(panel,              PANEL_BUTTON,
  799.               PANEL_ITEM_X,       xv_col(panel, 15),
  800.               PANEL_ITEM_Y,       xv_row(panel, 1),
  801. !             PANEL_LABEL_STRING, "   Suggest   ",
  802.               PANEL_NOTIFY_PROC,  suggest,
  803.               0) ;        
  804.   
  805. ***************
  806. *** 582,670 ****
  807.               PANEL_NOTIFY_PROC,  destroy_frame,
  808.               0) ;
  809.   
  810. !   XV_CREATE(panel,              PANEL_CHECK_BOX,
  811.               PANEL_ITEM_X,       xv_col(panel, 0),
  812. !             PANEL_ITEM_Y,       xv_row(panel, 4),
  813. !             PANEL_LABEL_STRING, "Show Info  ",
  814. !             PANEL_NOTIFY_PROC,  pop_props,
  815. !             PANEL_VALUE,        1,
  816.               0) ;
  817. !   black_item = xv_create(panel,                PANEL_CHOICE_STACK,
  818. !                          PANEL_ITEM_X,         xv_col(panel, 0),
  819. !                          PANEL_ITEM_Y,         xv_row(panel, 2),
  820. !                          PANEL_LABEL_STRING,   "Black:",
  821. !                          PANEL_CHOICE_STRINGS,
  822. !                            "human",
  823. !                            "computer",
  824. !                            0,
  825. !                          PANEL_NOTIFY_PROC,    set_player,
  826. !                          PANEL_VALUE,          items[(int) BLACK_PLAYS].value,
  827.                            0) ;
  828.   
  829. !   white_item = xv_create(panel,                PANEL_CHOICE_STACK,
  830. !                          PANEL_ITEM_X,         xv_col(panel, 0),
  831. !                          PANEL_ITEM_Y,         xv_row(panel, 3),
  832. !                          PANEL_LABEL_STRING,   "White:",
  833. !                          PANEL_CHOICE_STRINGS,
  834. !                            "human",
  835. !                            "computer",
  836. !                            0,
  837. !                          PANEL_NOTIFY_PROC,    set_player,
  838. !                          PANEL_VALUE,          items[(int) WHITE_PLAYS].value,
  839.                            0) ;
  840.   
  841. !   mes_items[(int) (TURN_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  842. !                        PANEL_ITEM_X,       xv_col(panel, 30),
  843. !                        PANEL_ITEM_Y,       xv_row(panel, 2),
  844. !                        PANEL_LABEL_STRING, "Black to move",
  845. !                        0) ;
  846. !  
  847. !   mes_items[(int) (SCORE_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  848. !                        PANEL_ITEM_X,       xv_col(panel, 30),
  849.                          PANEL_ITEM_Y,       xv_row(panel, 3),
  850.                          PANEL_LABEL_STRING, "",
  851.                          0) ;
  852. !  
  853.     mes_items[(int) (EVAL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  854. !                        PANEL_ITEM_X,       xv_col(panel, 30),
  855.                          PANEL_ITEM_Y,       xv_row(panel, 4),
  856.                          PANEL_LABEL_STRING, "",
  857.                          0) ;
  858. !  
  859. !  
  860. !   mes_items[(int) (PANEL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  861. !                        PANEL_ITEM_X,       xv_col(panel, 30),
  862.                          PANEL_ITEM_Y,       xv_row(panel, 5),
  863.                          PANEL_LABEL_STRING, "",
  864.                          0) ;
  865. -  
  866. -   XV_CREATE(panel,                PANEL_CHOICE_STACK,
  867. -             PANEL_ITEM_X,         xv_col(panel, 0),
  868. -             PANEL_ITEM_Y,         xv_row(panel, 5),
  869. -             PANEL_LABEL_STRING,   "Difficulty: ",
  870. -             PANEL_CHOICE_STRINGS,
  871. -               " Instant",
  872. -               " 1 Minute",
  873. -               " 3 Minutes",
  874. -               " 5 Minutes",
  875. -               "10 Minutes",
  876. -               "15 Minutes",
  877. -               "20 Minutes",
  878. -               "Tournament (30)",
  879. -               "60 MInutes",
  880. -               0,
  881. -             PANEL_NOTIFY_PROC,     set_depth,
  882. -             PANEL_VALUE,           0,
  883. -             0) ;
  884.   
  885.     window_fit(panel) ;
  886. -   window_fit(frame) ;
  887. -   notify_interpose_event_func(frame, frame_event, NOTIFY_SAFE) ;
  888. -   notify_interpose_destroy_func(frame, quit_proc) ;
  889.   
  890.     ls_frame = xv_create(frame,                FRAME_CMD,
  891. -                        FRAME_LABEL,          "Name your Game ...",
  892.                          FRAME_CMD_PUSHPIN_IN, TRUE,
  893.                          0) ;
  894.      
  895. --- 705,764 ----
  896.               PANEL_NOTIFY_PROC,  destroy_frame,
  897.               0) ;
  898.   
  899. !   XV_CREATE(panel, PANEL_MESSAGE,
  900.               PANEL_ITEM_X,       xv_col(panel, 0),
  901. !             PANEL_ITEM_Y,       xv_row(panel, 2),
  902. !             PANEL_LABEL_BOLD,   TRUE,
  903. !             PANEL_LABEL_STRING, "Black:",
  904.               0) ;
  905. !   val = items[(int) BLACK_PLAYS].value ;
  906. !   black_item = xv_create(panel,                      PANEL_MESSAGE,
  907. !                          PANEL_ITEM_X,               xv_col(panel, 7),
  908. !                          PANEL_ITEM_Y,               xv_row(panel, 2),
  909. !                          PANEL_LABEL_BOLD,           FALSE,
  910. !                          PANEL_LABEL_STRING,         player_values[val],
  911.                            0) ;
  912.   
  913. !   XV_CREATE(panel, PANEL_MESSAGE,
  914. !             PANEL_ITEM_X,       xv_col(panel, 30),
  915. !             PANEL_ITEM_Y,       xv_row(panel, 2),
  916. !             PANEL_LABEL_BOLD,   TRUE,
  917. !             PANEL_LABEL_STRING, "White:",
  918. !             0) ;
  919. !   val = items[(int) WHITE_PLAYS].value ;
  920. !   white_item = xv_create(panel,                      PANEL_MESSAGE,
  921. !                          PANEL_ITEM_X,               xv_col(panel, 37),
  922. !                          PANEL_ITEM_Y,               xv_row(panel, 2),
  923. !                          PANEL_LABEL_BOLD,           FALSE,
  924. !                          PANEL_LABEL_STRING,         player_values[val],
  925.                            0) ;
  926.   
  927. !   mes_items[(int) (PANEL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  928. !                        PANEL_ITEM_X,       xv_col(panel, 0),
  929.                          PANEL_ITEM_Y,       xv_row(panel, 3),
  930.                          PANEL_LABEL_STRING, "",
  931.                          0) ;
  932.     mes_items[(int) (EVAL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  933. !                        PANEL_ITEM_X,       xv_col(panel, 0),
  934.                          PANEL_ITEM_Y,       xv_row(panel, 4),
  935.                          PANEL_LABEL_STRING, "",
  936.                          0) ;
  937. !   mes_items[(int) (SCORE_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  938. !                        PANEL_ITEM_X,       xv_col(panel, 0),
  939.                          PANEL_ITEM_Y,       xv_row(panel, 5),
  940.                          PANEL_LABEL_STRING, "",
  941.                          0) ;
  942.   
  943. +   mes_items[(int) (TURN_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
  944. +                        PANEL_ITEM_X,       xv_col(panel, 30),
  945. +                        PANEL_ITEM_Y,       xv_row(panel, 5),
  946. +                        PANEL_LABEL_STRING, "Black to move",
  947. +                        0) ;
  948.     window_fit(panel) ;
  949.   
  950.     ls_frame = xv_create(frame,                FRAME_CMD,
  951.                          FRAME_CMD_PUSHPIN_IN, TRUE,
  952.                          0) ;
  953.      
  954. ***************
  955. *** 673,679 ****
  956.     ls_text = XV_CREATE(ls_panel,                   PANEL_TEXT,
  957.                         PANEL_ITEM_X,               xv_col(ls_panel, 0),
  958.                         PANEL_ITEM_Y,               xv_row(ls_panel, 0),
  959. !                       PANEL_LABEL_STRING,         "Load File: ",
  960.                         PANEL_VALUE,                gamefile,
  961.                         PANEL_VALUE_DISPLAY_LENGTH, 30,
  962.                         PANEL_VALUE_STORED_LENGTH,  255,
  963. --- 767,773 ----
  964.     ls_text = XV_CREATE(ls_panel,                   PANEL_TEXT,
  965.                         PANEL_ITEM_X,               xv_col(ls_panel, 0),
  966.                         PANEL_ITEM_Y,               xv_row(ls_panel, 0),
  967. !                       PANEL_LABEL_STRING,         "Load File:",
  968.                         PANEL_VALUE,                gamefile,
  969.                         PANEL_VALUE_DISPLAY_LENGTH, 30,
  970.                         PANEL_VALUE_STORED_LENGTH,  255,
  971. ***************
  972. *** 680,686 ****
  973.                         0) ; 
  974.   
  975.     ls_button = xv_create(ls_panel,         PANEL_BUTTON,
  976. !                         PANEL_LABEL_STRING, "Load",
  977.                           PANEL_NOTIFY_PROC,  start_load_save,
  978.                           XV_X,               xv_col(ls_panel, 18),
  979.                           XV_Y,               xv_row(ls_panel, 1),
  980. --- 774,780 ----
  981.                         0) ; 
  982.   
  983.     ls_button = xv_create(ls_panel,         PANEL_BUTTON,
  984. !                         PANEL_LABEL_STRING, "Apply",
  985.                           PANEL_NOTIFY_PROC,  start_load_save,
  986.                           XV_X,               xv_col(ls_panel, 18),
  987.                           XV_Y,               xv_row(ls_panel, 1),
  988. ***************
  989. *** 688,693 ****
  990. --- 782,906 ----
  991.     window_fit(ls_panel) ;
  992.     window_fit(ls_frame) ;
  993.   
  994. +   d_frame = xv_create(frame,                FRAME_CMD,
  995. +                       FRAME_LABEL,          "Set Search Depth",
  996. +                       FRAME_CMD_PUSHPIN_IN, TRUE,
  997. +                       0) ;
  998. +   d_panel = (Panel) xv_get(d_frame, FRAME_CMD_PANEL) ;
  999. +   d_text = XV_CREATE(d_panel,                    PANEL_NUMERIC_TEXT,
  1000. +                      PANEL_VALUE_X,              xv_col(d_panel, 10),
  1001. +                      XV_Y,                       xv_row(d_panel, 0),
  1002. +                      PANEL_LABEL_STRING,         "Depth: ",
  1003. +                      PANEL_VALUE,                INIT_DEPTH,
  1004. +                      PANEL_VALUE_DISPLAY_LENGTH, 2,
  1005. +                      PANEL_VALUE_STORED_LENGTH,  2,
  1006. +                      PANEL_MIN_VALUE,            1,
  1007. +                      PANEL_MAX_VALUE,            MAX_PROFMAX,
  1008. +                      0) ;
  1009. +   d_button = xv_create(d_panel,            PANEL_BUTTON,
  1010. +                        PANEL_LABEL_STRING, "Apply",
  1011. +                        PANEL_NOTIFY_PROC,  set_profmax,
  1012. +                        XV_X,               xv_col(d_panel, 7),
  1013. +                        XV_Y,               xv_row(d_panel, 1),
  1014. +                        0) ;
  1015. +   window_fit(d_panel) ;
  1016. +   window_fit(d_frame) ;
  1017. +   props_frame = xv_create(frame,                FRAME_CMD,
  1018. +                           FRAME_LABEL,          "Reve Properties",
  1019. +                           FRAME_CMD_PUSHPIN_IN, TRUE,
  1020. +                           0) ;
  1021. +   props_panel = (Panel) xv_get(props_frame, FRAME_CMD_PANEL) ;
  1022. +        if (dtype == XBLACK)                 val = CP_WHITE ;
  1023. +   else if (dtype == XWHITE)                 val = CP_BLACK ;
  1024. +   else if (dtype == XBOTH || dtype == XTWO) val = CP_NEITHER ;
  1025. +   props_computer = xv_create(props_panel,          PANEL_CHOICE,
  1026. +                              PANEL_LABEL_STRING,   "Computer plays:",
  1027. +                              PANEL_LABEL_BOLD,     TRUE,
  1028. +                              PANEL_VALUE_X,        xv_col(props_panel, 15),
  1029. +                              XV_Y,                 xv_row(props_panel, 0),
  1030. +                              PANEL_CHOICE_STRINGS,
  1031. +                                "White",
  1032. +                                "Black",
  1033. +                                "Neither",
  1034. +                                "Both",
  1035. +                                0,
  1036. +                             PANEL_VALUE,           val,
  1037. +                             0) ;
  1038. +   XV_CREATE(props_panel,          PANEL_CHOICE_STACK,
  1039. +             PANEL_VALUE_X,        xv_col(props_panel, 15),
  1040. +             XV_Y,                 xv_row(props_panel, 1),
  1041. +             PANEL_LABEL_STRING,   "Difficulty: ",
  1042. +             PANEL_CHOICE_STRINGS,
  1043. +               " Instant",
  1044. +               " 1 Minute",
  1045. +               " 3 Minutes",
  1046. +               " 5 Minutes",
  1047. +               "10 Minutes",
  1048. +               "15 Minutes",
  1049. +               "20 Minutes",
  1050. +               "Tournament (30)",
  1051. +               "60 MInutes",
  1052. +               "Depth...",
  1053. +               0,
  1054. +             PANEL_NOTIFY_PROC,     set_depth,
  1055. +             PANEL_VALUE,           items[(int) DIFF_CHOICE].value,
  1056. +             0) ;
  1057. +   XV_CREATE(props_panel,        PANEL_MESSAGE,
  1058. +             XV_X,               xv_col(props_panel, 7),
  1059. +             XV_Y,               xv_row(props_panel, 2),
  1060. +             PANEL_LABEL_BOLD,   TRUE,
  1061. +             PANEL_LABEL_STRING, "Options:",
  1062. +             0) ;
  1063. +   val = ((ANIMATION   & 0x1) << 0) +
  1064. +         ((DO_BESTMOVE & 0x1) << 1) +
  1065. +         ((DO_LAST     & 0x1) << 2) +
  1066. +         ((SHOW_NOTES  & 0x1) << 3) +
  1067. +         ((DO_NUMBER   & 0x1) << 4) +
  1068. +         ((QUICKGAME   & 0x1) << 5) ;
  1069. +   props_choices = xv_create(props_panel,            PANEL_CHECK_BOX,
  1070. +                             PANEL_LAYOUT,           PANEL_VERTICAL,
  1071. +                             PANEL_CHOOSE_ONE,       FALSE,
  1072. +                             PANEL_CHOICE_STRINGS,
  1073. +                               "Animate Move",
  1074. +                               "Show Current Best Move",
  1075. +                               "Show Last Move",
  1076. +                               "Show Evaluation Info.",
  1077. +                               "Number Last Move",
  1078. +                               "Don't Show Flip",
  1079. +                               0,
  1080. +                             PANEL_VALUE_X,          xv_col(props_panel, 15),
  1081. +                             PANEL_VALUE_Y,          xv_row(props_panel, 2),
  1082. +                             PANEL_VALUE,            val,
  1083. +                             0) ;
  1084. +   props_button = xv_create(props_panel,        PANEL_BUTTON,
  1085. +                            PANEL_LABEL_STRING, "Apply",
  1086. +                            PANEL_NOTIFY_PROC,  set_props,
  1087. +                            XV_X,               xv_col(props_panel, 13),
  1088. +                            XV_Y,               xv_row(props_panel, 8),
  1089. +                            0) ;
  1090. +   props_reset_button = xv_create(props_panel,        PANEL_BUTTON,
  1091. +                                  PANEL_LABEL_STRING, "Reset",
  1092. +                                  PANEL_NOTIFY_PROC,  reset_props,
  1093. +                                  XV_X,               xv_col(props_panel, 23),
  1094. +                                  XV_Y,               xv_row(props_panel, 8),
  1095. +                                  0) ;
  1096. +   window_fit(props_panel) ;
  1097. +   window_fit(props_frame) ;
  1098.     iscolor[(int) cur_dpyno] = ((int) xv_get(frame, WIN_DEPTH) > 1) ? 1 : 0 ;
  1099.   }
  1100.   
  1101. ***************
  1102. *** 717,724 ****
  1103.   
  1104.   
  1105.   void
  1106. ! make_panel()                   /* **DUMMY ROUTINE** */
  1107.   {
  1108.   }
  1109.   
  1110.   
  1111. --- 930,938 ----
  1112.   
  1113.   
  1114.   void
  1115. ! make_panel()
  1116.   {
  1117. +   panel_paint(panel, PANEL_CLEAR) ;
  1118.   }
  1119.   
  1120.   
  1121. ***************
  1122. *** 758,808 ****
  1123.   }
  1124.   
  1125.   
  1126. ! static void
  1127. ! new_game_proc(menu, menu_item)
  1128. ! Menu menu ;
  1129. ! Menu_item menu_item ;
  1130.   {
  1131. -   switch((int) xv_get(menu_item, MENU_VALUE))
  1132. -     {
  1133. -       case 1 : items[(int) BLACK_PLAYS].value = HUMAN ;
  1134. -                items[(int) WHITE_PLAYS].value = COMPUTER ;
  1135. -                cmode = WHITE_START ;
  1136. -                dtype = XBLACK ;
  1137. -                break ;
  1138. -       case 2 : items[(int) BLACK_PLAYS].value = COMPUTER ;
  1139. -                items[(int) WHITE_PLAYS].value = HUMAN ;
  1140. -                cmode = BLACK_START ;
  1141. -                dtype = XWHITE ;
  1142. -                break ;
  1143. -       case 3 : items[(int) BLACK_PLAYS].value = HUMAN ;
  1144. -                items[(int) WHITE_PLAYS].value = HUMAN ;
  1145. -                cmode = BLACK_START ;
  1146. -                dtype = XBOTH ;
  1147. -     }
  1148. -   XV_SET(black_item, PANEL_VALUE, items[(int) BLACK_PLAYS].value) ;
  1149. -   XV_SET(white_item, PANEL_VALUE, items[(int) WHITE_PLAYS].value) ;
  1150. -   new_game() ;
  1151.   }
  1152.   
  1153.   
  1154. ! /* Callback for the check box to show/hide evaluation and score. */
  1155. ! static void
  1156. ! pop_props(item, value, event)
  1157.   {
  1158. -   show_notes = !show_notes ;
  1159. -   if (!show_notes)
  1160. -     {
  1161. -       XV_SET(mes_items[(int) (EVAL_MES - PANEL_MES)],
  1162. -              PANEL_LABEL_STRING, "",
  1163. -              0) ;
  1164. -       XV_SET(mes_items[(int) (SCORE_MES - PANEL_MES)],
  1165. -              PANEL_LABEL_STRING, "",
  1166. -              0) ;
  1167. -     }
  1168.   }
  1169.   
  1170.   
  1171. --- 972,987 ----
  1172.   }
  1173.   
  1174.   
  1175. ! void
  1176. ! open_frame(wtype)                    /* **DUMMY ROUTINE** */
  1177. ! enum win_type wtype ;
  1178.   {
  1179.   }
  1180.   
  1181.   
  1182. ! void
  1183. ! paint_prop_sheet()            /* **DUMMY ROUTINE** */
  1184.   {
  1185.   }
  1186.   
  1187.   
  1188. ***************
  1189. *** 839,844 ****
  1190. --- 1018,1024 ----
  1191.   {
  1192.     int id ;
  1193.   
  1194. +   nextc = IGNORE_EVENT ;
  1195.     id = (event_id(cur_event)) ;
  1196.     curx = event_x(cur_event) ;
  1197.     cury = event_y(cur_event) ;
  1198. ***************
  1199. *** 845,851 ****
  1200.    
  1201.          if (id == KBD_DONE    || id == LOC_WINEXIT) nextc = EXIT_WINDOW ;
  1202.     else if (id == LOC_WINENTER)                     nextc = ENTER_WINDOW ;
  1203. !   else if (id == LOC_MOVE    || id == LOC_DRAG)    nextc = MOUSE_MOVING ;
  1204.     else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
  1205.     else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
  1206.     else if (event_is_button(cur_event) && event_is_down(cur_event))
  1207. --- 1025,1031 ----
  1208.    
  1209.          if (id == KBD_DONE    || id == LOC_WINEXIT) nextc = EXIT_WINDOW ;
  1210.     else if (id == LOC_WINENTER)                     nextc = ENTER_WINDOW ;
  1211. !   else if (id == LOC_DRAG)                         nextc = MOUSE_MOVING ;
  1212.     else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
  1213.     else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
  1214.     else if (event_is_button(cur_event) && event_is_down(cur_event))
  1215. ***************
  1216. *** 859,865 ****
  1217.              if (id == MS_LEFT)   nextc = LEFT_UP ;
  1218.         else if (id == MS_MIDDLE) nextc = MIDDLE_UP ;
  1219.         else if (id == MS_RIGHT)  nextc = RIGHT_UP ;
  1220. -       XV_SET(frame, FRAME_BUSY, TRUE, 0) ;
  1221.       }
  1222.     else if (event_is_ascii(cur_event))
  1223.       {
  1224. --- 1039,1044 ----
  1225. ***************
  1226. *** 866,886 ****
  1227.         cur_ch = id ;
  1228.         nextc = KEYBOARD ;
  1229.       }
  1230.   }
  1231.   
  1232.   
  1233. ! static Notify_value
  1234. ! quit_proc(frame, status)
  1235. ! Frame frame ;
  1236.   Destroy_status status ;
  1237.   {
  1238. !   if (status == DESTROY_PROCESS_DEATH || status == DESTROY_CLEANUP)
  1239.       {
  1240. !       xv_destroy_safe(frame) ;
  1241. !       xv_destroy_safe(cframe) ;
  1242. !       exit(0) ;
  1243.       }
  1244. !   return(notify_next_destroy_func(frame, status)) ;
  1245.   }
  1246.   
  1247.   
  1248. --- 1045,1109 ----
  1249.         cur_ch = id ;
  1250.         nextc = KEYBOARD ;
  1251.       }
  1252. +   if (processing)
  1253. +     {
  1254. +       if (nextc == FRAME_REPAINT) return ;
  1255. +       else
  1256. +         {
  1257. +           if (event_action(cur_event) == ACTION_SELECT)
  1258. +             XUngrabPointer(dpy, 0) ;
  1259. +           nextc = IGNORE_EVENT ;
  1260. +           window_bell(frame) ;
  1261. +           message(PANEL_MES, "It's not your turn.") ;
  1262. +         }
  1263. +     }
  1264.   }
  1265.   
  1266.   
  1267. ! Notify_value
  1268. ! quit_proc(client, status)
  1269. ! Notify_client client ;
  1270.   Destroy_status status ;
  1271.   {
  1272. !   if (status == DESTROY_CHECKING) KILL(pid, SIGKILL) ;
  1273. !   return(notify_next_destroy_func(client, status)) ;
  1274. ! }
  1275. ! Notify_value
  1276. ! read_from_reve(client, fd)
  1277. ! Notify_client client ;
  1278. ! register int fd ;
  1279. ! {
  1280. !   struct reve_out out ;
  1281. !   int bytes, sout ;
  1282. !   if (!started) return(NOTIFY_DONE) ;
  1283. !   sout = sizeof(struct reve_out) ;
  1284. !   if (ioctl(fd, FIONREAD, &bytes) == 0)
  1285.       {
  1286. !       if (read(fd, (char *) &out, sout) > 0)
  1287. !         {
  1288. !           profmax = out.depth ;
  1289. !           if (out.type == M_BEST) show_best(out.move, out.note) ;
  1290. !           else if (out.type == M_MOVE)
  1291. !             {
  1292. !               set_cursor(CANVASCUR) ;
  1293. !               XV_SET(frame, FRAME_BUSY, TRUE, 0) ;
  1294. !               move = out.move ;
  1295. !               note = out.note ;
  1296. !               do_computer_move(reve_player) ;
  1297. !               XV_SET(frame, FRAME_BUSY, FALSE, 0) ;
  1298. !               processing = FALSE ;
  1299. !             }
  1300. !           else if (out.type == M_SUGGESTION)
  1301. !             {
  1302. !               do_suggest(reve_player, out.move, out.note, IS_ON) ;
  1303. !               processing = FALSE ;
  1304. !             }
  1305. !         }
  1306.       }
  1307. !   return(NOTIFY_DONE) ;
  1308.   }
  1309.   
  1310.   
  1311. ***************
  1312. *** 890,896 ****
  1313. --- 1113,1154 ----
  1314.   }
  1315.   
  1316.   
  1317. + Panel_setting
  1318. + reset_props(item, event)
  1319. + Panel_item item ;
  1320. + Event *event ;
  1321. + {
  1322. +   int val ;
  1323. +        if (dtype == XBLACK)                 val = CP_WHITE ;
  1324. +   else if (dtype == XWHITE)                 val = CP_BLACK ;
  1325. +   else if (dtype == XBOTH || dtype == XTWO) val = CP_NEITHER ;
  1326. +   XV_SET(props_computer, PANEL_VALUE, val, 0) ;
  1327. +   val = ((ANIMATION   & 0x1) << 0) +
  1328. +         ((DO_BESTMOVE & 0x1) << 1) +
  1329. +         ((DO_LAST     & 0x1) << 2) +
  1330. +         ((SHOW_NOTES  & 0x1) << 3) +
  1331. +         ((DO_NUMBER   & 0x1) << 4) +
  1332. +         ((QUICKGAME   & 0x1) << 5) ;
  1333. +   XV_SET(props_choices, PANEL_VALUE, val, 0) ;
  1334. +   return(PANEL_NONE) ;
  1335. + }
  1336.   void
  1337. + reset_time(timeleft)
  1338. + time_t timeleft ;
  1339. + {
  1340. +   struct reve_in in ;
  1341. +   in.type = M_TIME ;
  1342. +   in.timeleft = timeleft ;
  1343. +   WRITE(pipe_io[0][1], (char *) &in, sizeof(struct reve_in)) ;
  1344. + }
  1345. + void
  1346.   set_cursor(ctype)
  1347.   enum curtype ctype ;
  1348.   {
  1349. ***************
  1350. *** 902,908 ****
  1351.   
  1352.   /*ARGSUSED*/
  1353.   void
  1354. ! set_cycle(mtype, str)                    /* **DUMMY ROUTINE** */
  1355.   enum panel_type mtype ;
  1356.   char *str ;
  1357.   {
  1358. --- 1160,1167 ----
  1359.   
  1360.   /*ARGSUSED*/
  1361.   void
  1362. ! set_cycle(wtype, mtype, str)                    /* **DUMMY ROUTINE** */
  1363. ! enum win_type wtype ;
  1364.   enum panel_type mtype ;
  1365.   char *str ;
  1366.   {
  1367. ***************
  1368. *** 915,971 ****
  1369.   int value ;
  1370.   Event *event ;
  1371.   {
  1372. !   level = value + 1 ;
  1373. !   items[(int) DIFFICULTY].value = level - 1 ;
  1374.   }
  1375.   
  1376.   
  1377. ! static void
  1378. ! set_player(item, value, event)   /* Callback to set black/white player. */
  1379.   Panel_item item ;
  1380. - int value ;
  1381.   Event *event ;
  1382.   {
  1383. !   char *label ;
  1384. !   enum panel_type this, other ;
  1385. !   int curi, curo ;
  1386.   
  1387. !   label = (char *) xv_get(item, PANEL_LABEL_STRING) ;
  1388. !   if (EQUAL(label, "Black"))
  1389.       {
  1390. !       this = BLACK_PLAYS ;
  1391. !       other = WHITE_PLAYS ;
  1392.       }
  1393. !   else
  1394.       {
  1395. !       this = WHITE_PLAYS ;
  1396. !       other = BLACK_PLAYS ;
  1397. !     }
  1398.   
  1399. !   curi = items[(int) this].value = value ;
  1400. !   curo = items[(int) other].value ;
  1401. !   if (curi == COMPUTER && curo == COMPUTER)
  1402.       {
  1403. !       curi = HUMAN ;
  1404. !       XV_SET(item, PANEL_VALUE, curi, 0) ;
  1405. !       items[(int) this].value = curi ;
  1406. !       message(PANEL_MES, "Computer can't play both players.") ;
  1407.       }
  1408. !   if (curi == HUMAN    && curo == COMPUTER)
  1409. !     dtype = (this == BLACK_PLAYS) ? XBLACK : XWHITE ;
  1410. !   else if (curi == COMPUTER && curo == HUMAN)
  1411. !     dtype = (this == BLACK_PLAYS) ? XWHITE : XBLACK ;
  1412. !   else if (curi == HUMAN    && curo == HUMAN)
  1413. !     dtype = (dtype == XTWO) ? XTWO : XBOTH ;
  1414. !  
  1415.     if (curi == COMPUTER)
  1416. !     if ((this == BLACK_PLAYS && cmode == BLACK_START) ||
  1417. !         (this == WHITE_PLAYS && cmode == WHITE_START))
  1418.         computer_move(next_player) ;
  1419.   }
  1420.   
  1421.   
  1422.   Panel_setting
  1423.   start_load_save(item, event)
  1424.   Panel_item item ;
  1425. --- 1174,1287 ----
  1426.   int value ;
  1427.   Event *event ;
  1428.   {
  1429. !   if (value == DEPTH_MENU_ENTRY)
  1430. !     {
  1431. !       position_popup(frame, d_frame, P_RIGHT) ;
  1432. !       XV_SET(d_frame, XV_SHOW, TRUE, 0) ;
  1433. !     }
  1434. !   else
  1435. !     {
  1436. !       level = value + 1 ;
  1437. !       change_depth(1) ;
  1438. !       XV_SET(d_text, PANEL_VALUE, 1, 0) ;
  1439. !       items[(int) DIFF_CHOICE].value = level - 1 ;
  1440. !     }
  1441.   }
  1442.   
  1443.   
  1444. ! Panel_setting
  1445. ! set_profmax(item, event)
  1446.   Panel_item item ;
  1447.   Event *event ;
  1448.   {
  1449. !     XV_SET(d_frame, XV_SHOW, FALSE, 0) ;
  1450. !     change_depth((int) xv_get(d_text, PANEL_VALUE)) ;
  1451. !     level = 1 ;
  1452. !     return(PANEL_NONE) ;
  1453. ! }
  1454.   
  1455. ! Panel_setting
  1456. ! set_props(item, event)
  1457. ! Panel_item item ;
  1458. ! Event *event ;
  1459. ! {
  1460. !   int curi, oldval, val ;
  1461. !        if (dtype == XBLACK)                 oldval = CP_WHITE ;
  1462. !   else if (dtype == XWHITE)                 oldval = CP_BLACK ;
  1463. !   else if (dtype == XBOTH || dtype == XTWO) oldval = CP_NEITHER ;
  1464. !   val = (int) xv_get(props_computer, PANEL_VALUE, 0) ;
  1465. !   if (val == CP_WHITE)
  1466.       {
  1467. !       dtype = XBLACK ;
  1468. !       play_computer = TRUE ;
  1469. !       items[(int) BLACK_PLAYS].value = HUMAN ; 
  1470. !       items[(int) WHITE_PLAYS].value = COMPUTER ;
  1471.       }
  1472. !   else if (val == CP_BLACK)
  1473.       {
  1474. !       dtype = XWHITE ;
  1475. !       play_computer = TRUE ;
  1476. !       items[(int) BLACK_PLAYS].value = COMPUTER ;
  1477. !       items[(int) WHITE_PLAYS].value = HUMAN ;
  1478.   
  1479. !     }
  1480. !   else if (val == CP_NEITHER)
  1481.       {
  1482. !       dtype = XTWO ;
  1483. !       play_computer = FALSE ;
  1484. !       items[(int) BLACK_PLAYS].value = HUMAN ;
  1485. !       items[(int) WHITE_PLAYS].value = HUMAN ;
  1486.       }
  1487. !   else if (val == CP_BOTH)
  1488. !     {
  1489. !       XV_SET(props_computer, PANEL_VALUE, oldval, 0) ;
  1490. !       message(PANEL_MES, "Computer plays both is not implemented yet.") ;
  1491. !     }
  1492. !   val = items[(int) BLACK_PLAYS].value ;
  1493. !   XV_SET(black_item, PANEL_VALUE, player_values[val], 0) ;
  1494. !   val = items[(int) WHITE_PLAYS].value ;
  1495. !   XV_SET(white_item, PANEL_VALUE, player_values[val], 0) ;
  1496. !   if (next_player == BLACK) curi = items[(int) BLACK_PLAYS].value ;
  1497. !   else                      curi = items[(int) WHITE_PLAYS].value ;
  1498.     if (curi == COMPUTER)
  1499. !     if ((next_player == BLACK && cmode == BLACK_START) ||
  1500. !         (next_player == WHITE && cmode == WHITE_START))
  1501.         computer_move(next_player) ;
  1502. +   val = (int) xv_get(props_choices, PANEL_VALUE, 0) ;
  1503. +   ANIMATION   = (val >> 0) & 0x1 ;
  1504. +   DO_BESTMOVE = (val >> 1) & 0x1 ;
  1505. +   DO_LAST     = (val >> 2) & 0x1 ;
  1506. +   SHOW_NOTES  = (val >> 3) & 0x1 ;
  1507. +   DO_NUMBER   = (val >> 4) & 0x1 ;
  1508. +   QUICKGAME   = (val >> 5) & 0x1 ;
  1509. +   XV_SET(props_frame, XV_SHOW, FALSE, 0) ;
  1510. +   return(PANEL_NONE) ;
  1511.   }
  1512.   
  1513.   
  1514. + Notify_value
  1515. + sigchldcatcher(client, pid, status, rusage)
  1516. + Notify_client client ;
  1517. + int pid ;
  1518. + union wait *status ;
  1519. + struct rusage *rusage ;
  1520. + {
  1521. +   if (WIFEXITED(*status))
  1522. +     {
  1523. +       notify_set_input_func(client, NOTIFY_FUNC_NULL, pipe_io[1][0]) ;
  1524. +       return(NOTIFY_DONE) ;
  1525. +     }
  1526. +   return(NOTIFY_IGNORED) ;
  1527. + }
  1528.   Panel_setting
  1529.   start_load_save(item, event)
  1530.   Panel_item item ;
  1531. ***************
  1532. *** 973,979 ****
  1533.   {
  1534.     char *label ;
  1535.   
  1536. !   XV_SET(ls_frame, XV_SHOW, FALSE, NULL) ;
  1537.     STRCPY(gamefile, (char *) xv_get(ls_text, PANEL_VALUE)) ;
  1538.     label = (char *) xv_get(ls_button, PANEL_LABEL_STRING) ;
  1539.     if (EQUAL(label, "Load")) load_game() ;
  1540. --- 1289,1295 ----
  1541.   {
  1542.     char *label ;
  1543.   
  1544. !   XV_SET(ls_frame, XV_SHOW, FALSE, 0) ;
  1545.     STRCPY(gamefile, (char *) xv_get(ls_text, PANEL_VALUE)) ;
  1546.     label = (char *) xv_get(ls_button, PANEL_LABEL_STRING) ;
  1547.     if (EQUAL(label, "Load")) load_game() ;
  1548. ***************
  1549. *** 988,1004 ****
  1550.   enum disp_type dtype ;
  1551.   {
  1552.     started = 1 ;
  1553.     xv_main_loop(frame) ;
  1554.   }
  1555.   
  1556.   
  1557. ! static void         /* Dummy function for unimplemented callbacks */
  1558. ! unimplemented()
  1559.   {
  1560. !   message(PANEL_MES, "Not implemented yet.\n") ;
  1561.   }
  1562.   
  1563.   
  1564.   static void 
  1565.   xv_load_game(item, value, event)    /* Callback for loading a game button. */
  1566.   Panel_item item ;
  1567. --- 1304,1335 ----
  1568.   enum disp_type dtype ;
  1569.   {
  1570.     started = 1 ;
  1571. +   notify_interpose_destroy_func(frame, quit_proc) ;
  1572.     xv_main_loop(frame) ;
  1573.   }
  1574.   
  1575.   
  1576. ! /*ARGSUSED*/
  1577. ! void
  1578. ! write_to_reve(mtype, reve_board, player, level, reve_move, note)
  1579. ! enum move_type mtype ;
  1580. ! int *reve_board, player, level, *reve_move ;
  1581. ! long *note ;
  1582.   {
  1583. !   int i ;
  1584. !   struct reve_in in ;
  1585. !   for (i = 0; i < 64; i++) in.board[i] = reve_board[i] ;
  1586. !   in.player   = player ;
  1587. !   in.level    = level ;
  1588. !   in.type     = mtype ;
  1589. !   reve_player = player ;
  1590. !   processing  = TRUE ;
  1591. !   WRITE(pipe_io[0][1], (char *) &in, sizeof(struct reve_in)) ;
  1592.   }
  1593.   
  1594.   
  1595. + /*ARGSUSED*/
  1596.   static void 
  1597.   xv_load_game(item, value, event)    /* Callback for loading a game button. */
  1598.   Panel_item item ;
  1599. ***************
  1600. *** 1006,1017 ****
  1601.   Event *event ;
  1602.   {
  1603.     position_popup(frame, ls_frame, P_RIGHT) ;
  1604. !   XV_SET(ls_text, PANEL_LABEL_STRING, "Load File: ", 0) ;
  1605. !   XV_SET(ls_button, PANEL_LABEL_STRING, "Load", 0) ;
  1606. !   XV_SET(ls_frame, XV_SHOW, TRUE, NULL) ;
  1607.   }
  1608.   
  1609.   
  1610.   static void 
  1611.   xv_save_game(item, value, event)    /* Callback load saving a game button. */
  1612.   Panel_item item ;
  1613. --- 1337,1360 ----
  1614.   Event *event ;
  1615.   {
  1616.     position_popup(frame, ls_frame, P_RIGHT) ;
  1617. !   XV_SET(ls_frame,  FRAME_LABEL,        "Load Game",   0) ;
  1618. !   XV_SET(ls_text,   PANEL_LABEL_STRING, "Load File: ", 0) ;
  1619. !   XV_SET(ls_frame,  XV_SHOW,            TRUE,          0) ;
  1620.   }
  1621.   
  1622.   
  1623. + /*ARGSUSED*/
  1624. + static void
  1625. + xv_new_game(item, value, event)   /* Callback for starting a new game. */
  1626. + Panel_item item ;
  1627. + int value ;
  1628. + Event *event ;
  1629. + {
  1630. +   new_game() ;
  1631. + }
  1632. + /*ARGSUSED*/
  1633.   static void 
  1634.   xv_save_game(item, value, event)    /* Callback load saving a game button. */
  1635.   Panel_item item ;
  1636. ***************
  1637. *** 1019,1025 ****
  1638.   Event *event ;
  1639.   {
  1640.     position_popup(frame, ls_frame, P_RIGHT) ;
  1641. !   XV_SET(ls_text, PANEL_LABEL_STRING, "Save File: ", 0) ;
  1642. !   XV_SET(ls_button, PANEL_LABEL_STRING, "Save", 0) ; 
  1643. !   XV_SET(ls_frame, XV_SHOW, TRUE, NULL) ;
  1644.   }
  1645. --- 1362,1380 ----
  1646.   Event *event ;
  1647.   {
  1648.     position_popup(frame, ls_frame, P_RIGHT) ;
  1649. !   XV_SET(ls_frame,  FRAME_LABEL,        "Save Game",   0) ;
  1650. !   XV_SET(ls_text,   PANEL_LABEL_STRING, "Save File: ", 0) ;
  1651. !   XV_SET(ls_frame,  XV_SHOW,            TRUE,          0) ;
  1652. ! }
  1653. ! /*ARGSUSED*/
  1654. ! static void
  1655. ! xv_set_props(item, value, event)    /* Callback props button. */
  1656. ! Panel_item item ;
  1657. ! int value ;
  1658. ! Event *event ;
  1659. ! {
  1660. !   position_popup(frame, props_frame, P_RIGHT) ;
  1661. !   XV_SET(props_frame, XV_SHOW, TRUE, 0) ;
  1662.   }
  1663.  
  1664.