[comp.sources.games.bugs] Official patch #3 to reve v1.1 - part 9 of 9.

richb@sunaus.oz (Rich Burridge) (12/10/90)

------CUT HERE------ patch3 - part9 ------CUT HERE------

------- xview.c -------
*** /tmp/da07695	Sun Dec  9 15:22:04 1990
--- xview.c	Fri Dec  7 16:49:50 1990
***************
*** 27,32 ****
--- 27,37 ----
  #include "color.h"
  #include "extern.h"
  #include "images.h"
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <sys/param.h>
+ #include <sys/wait.h>
+ 
  #include <xview/xview.h>
  #include <xview/canvas.h>
  #include <xview/panel.h>
***************
*** 35,47 ****
  #include <xview/svrimage.h>
  #include <xview/xv_xrect.h>
  #include <X11/Xlib.h>
  
! enum gr_type gtype = GXVIEW ;      /* Graphics type. */
  
  enum popup_pos {P_BELOW, P_RIGHT } ;   /* Positions relative to main frame. */
  
  #define  FRAME_BORDER_SIZE  7
  #define  FRAME_LABEL_SIZE   30
  
  #define  XV_CREATE          (void) xv_create
  #define  XV_SET             (void) xv_set
--- 40,58 ----
  #include <xview/svrimage.h>
  #include <xview/xv_xrect.h>
  #include <X11/Xlib.h>
+ #include <X11/Xresource.h>
  
! extern int errno ;
  
+ enum gr_type gtype = GXVIEW ;          /* Graphics type. */
+ 
  enum popup_pos {P_BELOW, P_RIGHT } ;   /* Positions relative to main frame. */
  
+ #define  CLIENT_NO          10
+ #define  DEPTH_MENU_ENTRY   9
  #define  FRAME_BORDER_SIZE  7
  #define  FRAME_LABEL_SIZE   30
+ #define  K_PROPS            3          /* Props key (L3). */
  
  #define  XV_CREATE          (void) xv_create
  #define  XV_SET             (void) xv_set
***************
*** 53,74 ****
  Canvas canvas ;
  Canvas_paint_window cpw ;
  Event *cur_event ;
- Frame cframe ;                  /* Frame for Reve game board. */
  Frame frame ;                   /* Frame for control panel. */
- Frame ls_frame ;                /* Frame for load/save pop-up window. */
  Icon  creve_icon ;              /* Icon for game board. */
  Icon  reve_icon ;               /* Icon for control panel. */
  Panel panel ;                   /* Xview interface panel. */
  
  Frame ls_frame ;                /* Frame for load/save pop-up window. */
  Panel ls_panel ;                /* Panel for load/save operations. */
  Panel_item ls_button ;          /* Button to start load/save operation. */
  Panel_item ls_text ;            /* Load/Save text filename item. */
! Panel_item mes_items[4] ;       /* Four generic message items. */
! Panel_setting start_load_save() ;
! Menu game_menu ;                /* Menu for 'New Game' button. */
! Menu menus[MAXMENUS] ;
! Notify_value quit_proc() ;
  Panel_item black_item ;
  Panel_item white_item ;
  Server_image hglass_pr, nocur_pr ;
--- 64,95 ----
  Canvas canvas ;
  Canvas_paint_window cpw ;
  Event *cur_event ;
  Frame frame ;                   /* Frame for control panel. */
  Icon  creve_icon ;              /* Icon for game board. */
  Icon  reve_icon ;               /* Icon for control panel. */
  Panel panel ;                   /* Xview interface panel. */
  
+ Notify_client client = (Notify_client) CLIENT_NO ;
+ 
  Frame ls_frame ;                /* Frame for load/save pop-up window. */
  Panel ls_panel ;                /* Panel for load/save operations. */
  Panel_item ls_button ;          /* Button to start load/save operation. */
  Panel_item ls_text ;            /* Load/Save text filename item. */
! 
! Frame d_frame ;                 /* Frame for depth pop-up window. */
! Panel d_panel ;                 /* Panel for depth operations. */
! Panel_item d_button ;           /* Button to start depth operation. */
! Panel_item d_text ;             /* Depth numeric text item. */
! 
! Frame props_frame ;               /* Frame for property window */
! Panel props_panel ;               /* Panel for property operations. */
! Panel_item props_computer ;       /* Computer plays: choice. */
! Panel_item props_button ;         /* Button to start property operation */
! Panel_item props_reset_button ;   /* Button to reset properties */
! Panel_item props_choices ;        /* non-exclusive choices for properties */
! 
! Panel_item mes_items[4] ;         /* Four generic message items. */
! Panel_setting start_load_save(), set_profmax(), set_props(), reset_props() ;
  Panel_item black_item ;
  Panel_item white_item ;
  Server_image hglass_pr, nocur_pr ;
***************
*** 84,89 ****
--- 105,111 ----
  Window root ;
  XFontStruct *font[MAXFONTS] ;   /* Xlib handles to the fonts. */
  XGCValues gc_val ;              /* Used to setup graphics context values. */
+ XrmDatabase reve_DB[MAXDPY] ;   /* Combined resources database. */
  int gc_flags ;                  /* Used to set up graphics context flags. */
  int screen ;                    /* Default graphics display screen. */
  unsigned long backgnd ;         /* Default background color. */
***************
*** 92,106 ****
  unsigned long palette[OTH_COLORSIZE] ;     /* Xlib color palette. */
  
  int opvals[3] ;         /* Pixrect rasterop values. */
  int started ;           /* Set just before window is displayed. */
  
  void destroy_frame() ;
! static void menu_proc(),  new_game_proc(), pop_props(),    set_depth() ;
! static void set_player(), unimplemented(), xv_load_game(), xv_save_game() ;
  
- extern int mnb ;        /* Number of current move */
  
- 
  void
  batch(state)            /* Turn graphics batching on or off. */
  enum bltype state ;
--- 114,130 ----
  unsigned long palette[OTH_COLORSIZE] ;     /* Xlib color palette. */
  
  int opvals[3] ;         /* Pixrect rasterop values. */
+ int pid ;               /* Process id of the reve_proc process. */
+ int pipe_io[2][2] ;
+ int reve_player ;       /* Player making the computer move (black/white). */
  int started ;           /* Set just before window is displayed. */
  
+ Notify_value read_from_reve(), sigchldcatcher() ;
  void destroy_frame() ;
! static void menu_proc(),    set_depth(),   set_player() ;
! static void xv_load_game(), xv_new_game(), xv_save_game(), xv_set_props() ;
  
  
  void
  batch(state)            /* Turn graphics batching on or off. */
  enum bltype state ;
***************
*** 116,127 ****
  Event *event ;
  {
    if (!started) return ;
!   cur_event = event ;
!   process_event() ;       /* Determine what kind of event it is. */
    handle_event() ;        /* And do the appropriate action. */
  
!   if (nextc == LEFT_UP || nextc == MIDDLE_UP || nextc == RIGHT_UP)
!     XV_SET(frame, FRAME_BUSY, FALSE, 0) ;
  }
  
  
--- 140,160 ----
  Event *event ;
  {
    if (!started) return ;
!   cur_event = event ;     /* Determine what kind of event it is. */
!   XAllowEvents(dpy, AsyncBoth, CurrentTime) ;
    handle_event() ;        /* And do the appropriate action. */
+ }
  
! 
! void
! change_depth(depth)
! int depth ;
! {
!   struct reve_in in ;
! 
!   in.type = M_PROFMAX ;
!   in.level = depth ;
!   WRITE(pipe_io[0][1], (char *) &in, sizeof(struct reve_in)) ;
  }
  
  
***************
*** 132,139 ****
  }
  
  
  void
! color_area(x, y, width, height, color)
  int x, y, width, height, color ;
  {
    int d ;
--- 165,174 ----
  }
  
  
+ /*ARGSUSED*/
  void
! color_area(wtype, x, y, width, height, color)
! enum win_type wtype ;
  int x, y, width, height, color ;
  {
    int d ;
***************
*** 154,179 ****
  
  
  void
! create_menu(mtype, values)    /* Create popup menus for cycle items. */
! enum panel_type mtype ;
! char *values[] ;
  {
!   int i = 0 ;
!   int menuno ;     /* Current menu number. */
!   int more = 1 ;   /* Cleared when current menu is complete.*/
! 
!   menuno = (int) mtype - (int) BLACK_PLAYS ;
!   menus[menuno] = xv_create(XV_NULL,          MENU_COMMAND_MENU,
!                             MENU_NOTIFY_PROC, menu_proc,
!                             0) ;
!   do
!     {
!       if (values[i] != NULL)
!         XV_SET(menus[menuno], MENU_STRING_ITEM, values[i], i+1, 0) ;
!       else more = 0 ;
!       i++ ;
!     }
!   while (more) ;
  }
  
  
--- 189,199 ----
  
  
  void
! connect_to_reve(pid)
! int pid ;
  {
!   notify_set_input_func(client, read_from_reve, pipe_io[1][0]) ;
!   notify_set_wait3_func(client, sigchldcatcher, pid) ;
  }
  
  
***************
*** 181,208 ****
  destroy_frame()        /* Destroy reve window. */
  {
    xv_destroy_safe(frame) ;
!   xv_destroy_safe(cframe) ;
    exit(0) ;
  }
  
  
! do_menu(mtype)      /* Popup appropriate cycle menu and get value. */
! enum item_type mtype ;
  {
-   int menuno ;
- 
-   menuno = (int) mtype - (int) BLACK_PLAYS ;
-   menu_show(menus[menuno], canvas, cur_event, 0) ;
-   return(0) ;
  }
  
  
  /*ARGSUSED*/
  void
! draw_button(item, color, image)      /* **DUMMY ROUTINE** */
  enum panel_type item ;
  int color ;
- enum image_type image ;
  {
  }
  
--- 201,228 ----
  destroy_frame()        /* Destroy reve window. */
  {
    xv_destroy_safe(frame) ;
!   KILL(pid, SIGKILL) ;
    exit(0) ;
  }
  
  
! /*ARGSUSED*/
! void
! draw_button(wtype, item, color, image)      /* **DUMMY ROUTINE** */
! enum win_type wtype ;
! enum panel_type item ;
! int color ;
! enum image_type image ;
  {
  }
  
  
  /*ARGSUSED*/
  void
! draw_choice(wtype, item, color)             /* **DUMMY ROUTINE** */
! enum win_type wtype ;
  enum panel_type item ;
  int color ;
  {
  }
  
***************
*** 209,215 ****
  
  /*ARGSUSED*/
  void
! draw_cycle(item, color, image)       /* **DUMMY ROUTINE** */
  enum panel_type item ;
  int color ;
  enum image_type image ;
--- 229,236 ----
  
  /*ARGSUSED*/
  void
! draw_cycle(wtype, item, color, image)       /* **DUMMY ROUTINE** */
! enum win_type wtype ;
  enum panel_type item ;
  int color ;
  enum image_type image ;
***************
*** 217,224 ****
  }
  
  
  void
! draw_image(x, y, width, height, image)
  int x, y, width, height ;
  enum image_type image ;
  {
--- 238,247 ----
  }
  
  
+ /*ARGSUSED*/
  void
! draw_image(wtype, x, y, width, height, image)
! enum win_type wtype ;
  int x, y, width, height ;
  enum image_type image ;
  {
***************
*** 231,238 ****
  }
   
   
  void
! draw_line(x1, y1, x2, y2, op, color)
  int x1, y1, x2, y2, color ;
  enum optype op ;
  {
--- 254,263 ----
  }
   
   
+ /*ARGSUSED*/
  void
! draw_line(wtype, x1, y1, x2, y2, op, color)
! enum win_type wtype ;
  int x1, y1, x2, y2, color ;
  enum optype op ;
  {
***************
*** 251,258 ****
  }
  
  
  void
! draw_stencil(x, y, width, height, op, color, stencil, image)
  int x, y, width, height, color ;
  enum optype op ;
  enum image_type stencil, image ;
--- 276,285 ----
  }
  
  
+ /*ARGSUSED*/
  void
! draw_stencil(wtype, x, y, width, height, op, color, stencil, image)
! enum win_type wtype ;
  int x, y, width, height, color ;
  enum optype op ;
  enum image_type stencil, image ;
***************
*** 277,284 ****
  }
  
  
  void
! draw_text(x, y, ftype, color, str)
  enum font_type ftype ;
  int x, y, color ;
  char *str ;
--- 304,313 ----
  }
  
  
+ /*ARGSUSED*/
  void
! draw_text(wtype, x, y, ftype, color, str)
! enum win_type wtype ;
  enum font_type ftype ;
  int x, y, color ;
  char *str ;
***************
*** 305,327 ****
  }
  
  
! static Notify_value
! frame_event(frame, event, arg, type)
! Frame frame ;
! Event *event ;
! Notify_arg arg ;
! Notify_event_type type ;
  {
!   int action ;
  
!   action = event_action(event) ;
!   if (action == ACTION_CLOSE) XV_SET(cframe, XV_SHOW, FALSE, 0) ;
!   if (action == WIN_RESIZE)
      {
!       position_popup(frame, cframe, P_BELOW) ;
!       XV_SET(cframe, XV_SHOW, TRUE, 0) ;
      }
!   return(notify_next_event_func(frame, event, arg, type)) ;
  }
  
  
--- 334,375 ----
  }
  
  
! /*ARGSUSED*/
! void
! draw_toggle(wtype, item, color)
! enum win_type wtype ;
! enum panel_type item ;
! int color ;
  {
! }
  
! 
! fork_child()
! {
!   int i ;
! 
!   PIPE(pipe_io[0]) ;      /* Setup input pipe. */
!   PIPE(pipe_io[1]) ;      /* Setup output pipe. */
!   switch (pid = fork())
      {
!       case -1 : CLOSE(pipe_io[0][0]) ;
!                 CLOSE(pipe_io[0][1]) ;
!                 CLOSE(pipe_io[1][0]) ;
!                 CLOSE(pipe_io[1][1]) ;
!                 perror("reve fork failed") ;
!                 exit(1) ;
!       case  0 : DUP2(pipe_io[0][0], 0) ;         /* Child. */
!                 DUP2(pipe_io[1][1], 1) ;
!                 DUP2(pipe_io[1][1], 2) ;
!                 for (i = getdtablesize(); i > 2; i--) CLOSE(i) ;
!                 for (i = 0; i < NSIG; i++) SIGNAL(i, SIG_DFL) ;
!                 execlp("reve_proc", "reve_proc", edgefile, (char *) NULL) ;
!                 perror("reve child exec") ;
!                 _exit(-1) ;
!       default : CLOSE(pipe_io[0][0]) ;           /* Parent. */
!                 CLOSE(pipe_io[1][1]) ;
      }
!   return(pid) ;
  }
  
  
***************
*** 347,352 ****
--- 395,420 ----
  }
  
  
+ char *
+ get_resource(rtype)      /* Get Reve resource from merged databases. */
+ enum res_type rtype ;
+ {
+   char cstr[MAXLINE], nstr[MAXLINE], str[MAXLINE] ;
+   char *str_type[20] ;
+   int d ;
+   XrmValue value ;
+  
+   d = (int) cur_dpyno ;
+   STRCPY(str, resources[(int) rtype]) ;
+   SPRINTF(nstr,  "reve.%s", str) ;
+   if (islower(str[0])) str[0] = toupper(str[0]) ;
+   SPRINTF(cstr, "Reve.%s", str) ;
+   if (XrmGetResource(reve_DB[d], nstr, cstr, str_type, &value) == NULL)
+     return((char *) NULL) ;
+   else return(value.addr) ;
+ }
+ 
+ 
  get_strwidth(ftype, str)    /* Get width in pixels of string value. */
  enum font_type ftype ;
  char *str ;
***************
*** 367,378 ****
  }
  
  
  init_ws_type()
  {
!   show_notes = TRUE ;   /* Override generic value for XView version. */
    move_delta = 10 ;
    cur_dpyno = DPY1 ;
!   started = 0 ;       /* Kludge to correctly handle repaints. */
    return 0 ;
  }
  
--- 435,457 ----
  }
  
  
+ init_graphics(argc, argv)
+ int *argc ;
+ char *argv[] ;
+ {
+   xv_init(XV_INIT_ARGC_PTR_ARGV, argc, argv, 0) ;
+   frame = (Frame) xv_create(XV_NULL, FRAME, 0) ;
+   dpy = (Display *) xv_get(frame, XV_DISPLAY) ;
+   reve_DB[(int) DPY1] = NULL ;
+ }
+ 
+ 
  init_ws_type()
  {
!   SHOW_NOTES = TRUE ;   /* Override generic value for XView version. */
    move_delta = 10 ;
    cur_dpyno = DPY1 ;
!   started = 0 ;         /* Kludge to correctly handle repaints. */
    return 0 ;
  }
  
***************
*** 406,412 ****
--- 485,550 ----
  }
  
  
+ /*  Get the resource databases. These are looked for in the following ways:
+  *
+  *  Classname file in the app-defaults directory. In this case, Classname
+  *  is Reve.
+  *
+  *  Classname file in the directory specified by the XUSERFILESEARCHPATH
+  *  or XAPPLRESDIR environment variable.
+  *
+  *  Property set using xrdb, accessible through the XResourceManagerString
+  *  macro or, if that is empty, the ~/.Xdefaults file.
+  *
+  *  XENVIRONMENT environment variable or, if not set, .Xdefaults-hostname
+  *  file.
+  */
+  
  void
+ load_resources()
+ {
+   XrmDatabase db ;
+   char *home, name[MAXPATHLEN], *ptr ;
+   int d, len ;
+ 
+   d = (int) cur_dpyno ;
+   home = getenv("HOME") ;
+   XrmInitialize() ;
+   STRCPY(name, "/usr/lib/X11/app-defaults/Reve") ;
+  
+ /* Get applications defaults file, if any. */
+  
+   db = XrmGetFileDatabase(name) ;
+   XrmMergeDatabases(db, &reve_DB[d]) ;
+  
+ /* Merge server defaults, created by xrdb. If nor defined, use ~/.Xdefaults. */
+ 
+   if (XResourceManagerString(dpy) != NULL)
+     db = XrmGetStringDatabase(XResourceManagerString(dpy)) ;
+   else
+     { 
+       SPRINTF(name, "%s/.Xdefaults", home) ;
+       db = XrmGetFileDatabase(name) ;
+     }
+   XrmMergeDatabases(db, &reve_DB[d]) ;
+ 
+ /*  Open XENVIRONMENT file or, if not defined, the .Xdefaults, and merge
+  *  into existing database.
+  */
+ 
+   if ((ptr = getenv("XENVIRONMENT")) == NULL)
+     {
+       SPRINTF(name, "%s/.Xdefaults-", home) ;
+       len = strlen(name) ;
+       GETHOSTNAME(name+len, 1024-len) ;
+       db = XrmGetFileDatabase(name) ;
+     }
+   else db = XrmGetFileDatabase(ptr) ;
+   XrmMergeDatabases(db, &reve_DB[d]) ;
+ }
+ 
+ 
+ void
  lock_screen(state)     /* Turn graphics locking on or off - null routine. */
  enum bltype state ;
  {}
***************
*** 415,429 ****
  void
  make_canvas()               /* Create canvas for game board. */
  {
!   cframe = xv_create(XV_NULL,                  FRAME,
!                      XV_SHOW,                  FALSE,
!                      FRAME_ICON,               creve_icon,
!                      FRAME_NO_CONFIRM,         TRUE,
!                      WIN_ERROR_MSG,            "Reve: Can't create window.",
!                      FRAME_SHOW_RESIZE_CORNER, FALSE,
!                      FRAME_SHOW_HEADER,        FALSE,
!                      0) ;
!   canvas = xv_create(cframe,              CANVAS,
                       CANVAS_RETAINED,     FALSE,
                       OPENWIN_AUTO_CLEAR,  FALSE, 
                       XV_HEIGHT,           TOTAL_HEIGHT,
--- 553,563 ----
  void
  make_canvas()               /* Create canvas for game board. */
  {
!   int pid ;
! 
!   canvas = xv_create(frame,               CANVAS,
!                      WIN_BELOW,           panel,
!                      XV_X,                0,
                       CANVAS_RETAINED,     FALSE,
                       OPENWIN_AUTO_CLEAR,  FALSE, 
                       XV_HEIGHT,           TOTAL_HEIGHT,
***************
*** 432,439 ****
                         WIN_CONSUME_EVENTS,
                           MS_LEFT, MS_MIDDLE, MS_RIGHT,
                           WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
!                          LOC_MOVE, LOC_DRAG,
!                          LOC_WINENTER, LOC_WINEXIT,
                           WIN_LEFT_KEYS, WIN_TOP_KEYS,
                           WIN_RIGHT_KEYS, WIN_REPAINT,
                           0,
--- 566,572 ----
                         WIN_CONSUME_EVENTS,
                           MS_LEFT, MS_MIDDLE, MS_RIGHT,
                           WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
!                          LOC_DRAG, LOC_WINENTER, LOC_WINEXIT,
                           WIN_LEFT_KEYS, WIN_TOP_KEYS,
                           WIN_RIGHT_KEYS, WIN_REPAINT,
                           0,
***************
*** 440,447 ****
                         WIN_EVENT_PROC,    canvas_proc,
                         0,
                       0) ;
!   window_fit(cframe) ;
!   notify_interpose_destroy_func(cframe, quit_proc) ;
  
    cpw = canvas_paint_window(canvas) ;
    cursor[(int) CANVASCUR] = xv_get(cpw, WIN_CURSOR, NULL) ;
--- 573,579 ----
                         WIN_EVENT_PROC,    canvas_proc,
                         0,
                       0) ;
!   window_fit(frame) ;
  
    cpw = canvas_paint_window(canvas) ;
    cursor[(int) CANVASCUR] = xv_get(cpw, WIN_CURSOR, NULL) ;
***************
*** 486,499 ****
--- 618,635 ----
  
    images[(int) P_WHITE]     = make_server_image(white_image) ;
    images[(int) P_BLACK]     = make_server_image(black_image) ;
+   pid = fork_child() ;
+   connect_to_reve(pid) ;
  }
  
  
+ /*ARGSUSED*/
  void 
  make_frame(argc, argv)     /* Create frame and the panel, buttons, menus. */
  int argc ;
  char *argv[] ;
  {
+   int val ;
    Menu_item item ;
  
    opvals[(int) RCLR] = GXclear ;
***************
*** 502,570 ****
  
  /* Create the frame and the control panel */
  
!   xv_init(XV_INIT_ARGS, argc, argv, 0) ;
!   frame = xv_create(XV_NULL,                  FRAME,
!                     FRAME_ICON,               reve_icon,
!                     FRAME_LABEL,              line,
!                     FRAME_NO_CONFIRM,         TRUE,
!                     FRAME_SHOW_RESIZE_CORNER, FALSE,
!                     WIN_ERROR_MSG,            "Reve: Can't create window.",
!                     NULL) ;
  
    panel = (Panel) xv_create(frame, PANEL, 0) ;
  
- /* Menu for the 'new game' button */
- 
-   game_menu = (Menu) xv_create(XV_NULL, MENU,
-                                MENU_NOTIFY_PROC, new_game_proc,
-                                MENU_STRINGS,
-                                  "Human (black)    vs. Computer (white)",
-                                  "Computer (black) vs. Human (white)",
-                                  "Human (black)    vs. Human (white)",
-                                  0,
-                                0) ;
- 
  /* Create the buttons and other controls. */
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 0),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_LABEL_STRING, "New Game",
!             PANEL_ITEM_MENU,    game_menu,
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 15),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_LABEL_STRING, "Load Game...",
!             PANEL_NOTIFY_PROC,  xv_load_game,
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 30),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_LABEL_STRING, "Save Game...",
!             PANEL_NOTIFY_PROC,  xv_save_game,
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 45),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_LABEL_STRING, "     Help      ",
!             PANEL_NOTIFY_PROC,  unimplemented,
              0) ;
!  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 0),
              PANEL_ITEM_Y,       xv_row(panel, 1),
!             PANEL_LABEL_STRING, "   Moves?   ",
!             PANEL_NOTIFY_PROC,  show_all_moves,
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 15),
              PANEL_ITEM_Y,       xv_row(panel, 1),
!             PANEL_LABEL_STRING, "   Suggest  ",
              PANEL_NOTIFY_PROC,  suggest,
              0) ;        
  
--- 638,693 ----
  
  /* Create the frame and the control panel */
  
!   XV_SET(frame,
!          FRAME_ICON,               reve_icon,
!          FRAME_LABEL,              line,
!          FRAME_NO_CONFIRM,         TRUE,
!          FRAME_SHOW_RESIZE_CORNER, FALSE,
!          0) ;
  
    panel = (Panel) xv_create(frame, PANEL, 0) ;
  
  /* Create the buttons and other controls. */
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 0),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_LABEL_STRING, "Load Game...",
!             PANEL_NOTIFY_PROC,  xv_load_game,
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 15),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_LABEL_STRING, "   Moves?   ",
!             PANEL_NOTIFY_PROC,  show_all_moves,
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 30),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_NOTIFY_PROC,  xv_new_game,
!             PANEL_LABEL_STRING, " New Game ",
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 45),
              PANEL_ITEM_Y,       xv_row(panel, 0),
!             PANEL_LABEL_STRING, "   Props...   ",
!             PANEL_NOTIFY_PROC,  xv_set_props,
              0) ;
! 
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 0),
              PANEL_ITEM_Y,       xv_row(panel, 1),
!             PANEL_LABEL_STRING, "Save Game...",
!             PANEL_NOTIFY_PROC,  xv_save_game,
              0) ;
  
    XV_CREATE(panel,              PANEL_BUTTON,
              PANEL_ITEM_X,       xv_col(panel, 15),
              PANEL_ITEM_Y,       xv_row(panel, 1),
!             PANEL_LABEL_STRING, "   Suggest   ",
              PANEL_NOTIFY_PROC,  suggest,
              0) ;        
  
***************
*** 582,670 ****
              PANEL_NOTIFY_PROC,  destroy_frame,
              0) ;
  
!   XV_CREATE(panel,              PANEL_CHECK_BOX,
              PANEL_ITEM_X,       xv_col(panel, 0),
!             PANEL_ITEM_Y,       xv_row(panel, 4),
!             PANEL_LABEL_STRING, "Show Info  ",
!             PANEL_NOTIFY_PROC,  pop_props,
!             PANEL_VALUE,        1,
              0) ;
! 
!   black_item = xv_create(panel,                PANEL_CHOICE_STACK,
!                          PANEL_ITEM_X,         xv_col(panel, 0),
!                          PANEL_ITEM_Y,         xv_row(panel, 2),
!                          PANEL_LABEL_STRING,   "Black:",
!                          PANEL_CHOICE_STRINGS,
!                            "human",
!                            "computer",
!                            0,
!                          PANEL_NOTIFY_PROC,    set_player,
!                          PANEL_VALUE,          items[(int) BLACK_PLAYS].value,
                           0) ;
  
!   white_item = xv_create(panel,                PANEL_CHOICE_STACK,
!                          PANEL_ITEM_X,         xv_col(panel, 0),
!                          PANEL_ITEM_Y,         xv_row(panel, 3),
!                          PANEL_LABEL_STRING,   "White:",
!                          PANEL_CHOICE_STRINGS,
!                            "human",
!                            "computer",
!                            0,
!                          PANEL_NOTIFY_PROC,    set_player,
!                          PANEL_VALUE,          items[(int) WHITE_PLAYS].value,
                           0) ;
  
!   mes_items[(int) (TURN_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
!                        PANEL_ITEM_X,       xv_col(panel, 30),
!                        PANEL_ITEM_Y,       xv_row(panel, 2),
!                        PANEL_LABEL_STRING, "Black to move",
!                        0) ;
!  
!   mes_items[(int) (SCORE_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
!                        PANEL_ITEM_X,       xv_col(panel, 30),
                         PANEL_ITEM_Y,       xv_row(panel, 3),
                         PANEL_LABEL_STRING, "",
                         0) ;
!  
    mes_items[(int) (EVAL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
!                        PANEL_ITEM_X,       xv_col(panel, 30),
                         PANEL_ITEM_Y,       xv_row(panel, 4),
                         PANEL_LABEL_STRING, "",
                         0) ;
!  
!  
!   mes_items[(int) (PANEL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
!                        PANEL_ITEM_X,       xv_col(panel, 30),
                         PANEL_ITEM_Y,       xv_row(panel, 5),
                         PANEL_LABEL_STRING, "",
                         0) ;
-  
-   XV_CREATE(panel,                PANEL_CHOICE_STACK,
-             PANEL_ITEM_X,         xv_col(panel, 0),
-             PANEL_ITEM_Y,         xv_row(panel, 5),
-             PANEL_LABEL_STRING,   "Difficulty: ",
-             PANEL_CHOICE_STRINGS,
-               " Instant",
-               " 1 Minute",
-               " 3 Minutes",
-               " 5 Minutes",
-               "10 Minutes",
-               "15 Minutes",
-               "20 Minutes",
-               "Tournament (30)",
-               "60 MInutes",
-               0,
-             PANEL_NOTIFY_PROC,     set_depth,
-             PANEL_VALUE,           0,
-             0) ;
  
    window_fit(panel) ;
-   window_fit(frame) ;
-   notify_interpose_event_func(frame, frame_event, NOTIFY_SAFE) ;
-   notify_interpose_destroy_func(frame, quit_proc) ;
  
    ls_frame = xv_create(frame,                FRAME_CMD,
-                        FRAME_LABEL,          "Name your Game ...",
                         FRAME_CMD_PUSHPIN_IN, TRUE,
                         0) ;
     
--- 705,764 ----
              PANEL_NOTIFY_PROC,  destroy_frame,
              0) ;
  
!   XV_CREATE(panel, PANEL_MESSAGE,
              PANEL_ITEM_X,       xv_col(panel, 0),
!             PANEL_ITEM_Y,       xv_row(panel, 2),
!             PANEL_LABEL_BOLD,   TRUE,
!             PANEL_LABEL_STRING, "Black:",
              0) ;
!   val = items[(int) BLACK_PLAYS].value ;
!   black_item = xv_create(panel,                      PANEL_MESSAGE,
!                          PANEL_ITEM_X,               xv_col(panel, 7),
!                          PANEL_ITEM_Y,               xv_row(panel, 2),
!                          PANEL_LABEL_BOLD,           FALSE,
!                          PANEL_LABEL_STRING,         player_values[val],
                           0) ;
  
!   XV_CREATE(panel, PANEL_MESSAGE,
!             PANEL_ITEM_X,       xv_col(panel, 30),
!             PANEL_ITEM_Y,       xv_row(panel, 2),
!             PANEL_LABEL_BOLD,   TRUE,
!             PANEL_LABEL_STRING, "White:",
!             0) ;
!   val = items[(int) WHITE_PLAYS].value ;
!   white_item = xv_create(panel,                      PANEL_MESSAGE,
!                          PANEL_ITEM_X,               xv_col(panel, 37),
!                          PANEL_ITEM_Y,               xv_row(panel, 2),
!                          PANEL_LABEL_BOLD,           FALSE,
!                          PANEL_LABEL_STRING,         player_values[val],
                           0) ;
  
!   mes_items[(int) (PANEL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
!                        PANEL_ITEM_X,       xv_col(panel, 0),
                         PANEL_ITEM_Y,       xv_row(panel, 3),
                         PANEL_LABEL_STRING, "",
                         0) ;
! 
    mes_items[(int) (EVAL_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
!                        PANEL_ITEM_X,       xv_col(panel, 0),
                         PANEL_ITEM_Y,       xv_row(panel, 4),
                         PANEL_LABEL_STRING, "",
                         0) ;
! 
!   mes_items[(int) (SCORE_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
!                        PANEL_ITEM_X,       xv_col(panel, 0),
                         PANEL_ITEM_Y,       xv_row(panel, 5),
                         PANEL_LABEL_STRING, "",
                         0) ;
  
+   mes_items[(int) (TURN_MES - PANEL_MES)] = xv_create(panel, PANEL_MESSAGE,
+                        PANEL_ITEM_X,       xv_col(panel, 30),
+                        PANEL_ITEM_Y,       xv_row(panel, 5),
+                        PANEL_LABEL_STRING, "Black to move",
+                        0) ;
    window_fit(panel) ;
  
    ls_frame = xv_create(frame,                FRAME_CMD,
                         FRAME_CMD_PUSHPIN_IN, TRUE,
                         0) ;
     
***************
*** 673,679 ****
    ls_text = XV_CREATE(ls_panel,                   PANEL_TEXT,
                        PANEL_ITEM_X,               xv_col(ls_panel, 0),
                        PANEL_ITEM_Y,               xv_row(ls_panel, 0),
!                       PANEL_LABEL_STRING,         "Load File: ",
                        PANEL_VALUE,                gamefile,
                        PANEL_VALUE_DISPLAY_LENGTH, 30,
                        PANEL_VALUE_STORED_LENGTH,  255,
--- 767,773 ----
    ls_text = XV_CREATE(ls_panel,                   PANEL_TEXT,
                        PANEL_ITEM_X,               xv_col(ls_panel, 0),
                        PANEL_ITEM_Y,               xv_row(ls_panel, 0),
!                       PANEL_LABEL_STRING,         "Load File:",
                        PANEL_VALUE,                gamefile,
                        PANEL_VALUE_DISPLAY_LENGTH, 30,
                        PANEL_VALUE_STORED_LENGTH,  255,
***************
*** 680,686 ****
                        0) ; 
  
    ls_button = xv_create(ls_panel,         PANEL_BUTTON,
!                         PANEL_LABEL_STRING, "Load",
                          PANEL_NOTIFY_PROC,  start_load_save,
                          XV_X,               xv_col(ls_panel, 18),
                          XV_Y,               xv_row(ls_panel, 1),
--- 774,780 ----
                        0) ; 
  
    ls_button = xv_create(ls_panel,         PANEL_BUTTON,
!                         PANEL_LABEL_STRING, "Apply",
                          PANEL_NOTIFY_PROC,  start_load_save,
                          XV_X,               xv_col(ls_panel, 18),
                          XV_Y,               xv_row(ls_panel, 1),
***************
*** 688,693 ****
--- 782,906 ----
    window_fit(ls_panel) ;
    window_fit(ls_frame) ;
  
+   d_frame = xv_create(frame,                FRAME_CMD,
+                       FRAME_LABEL,          "Set Search Depth",
+                       FRAME_CMD_PUSHPIN_IN, TRUE,
+                       0) ;
+ 
+   d_panel = (Panel) xv_get(d_frame, FRAME_CMD_PANEL) ;
+ 
+   d_text = XV_CREATE(d_panel,                    PANEL_NUMERIC_TEXT,
+                      PANEL_VALUE_X,              xv_col(d_panel, 10),
+                      XV_Y,                       xv_row(d_panel, 0),
+                      PANEL_LABEL_STRING,         "Depth: ",
+                      PANEL_VALUE,                INIT_DEPTH,
+                      PANEL_VALUE_DISPLAY_LENGTH, 2,
+                      PANEL_VALUE_STORED_LENGTH,  2,
+                      PANEL_MIN_VALUE,            1,
+                      PANEL_MAX_VALUE,            MAX_PROFMAX,
+                      0) ;
+ 
+   d_button = xv_create(d_panel,            PANEL_BUTTON,
+                        PANEL_LABEL_STRING, "Apply",
+                        PANEL_NOTIFY_PROC,  set_profmax,
+                        XV_X,               xv_col(d_panel, 7),
+                        XV_Y,               xv_row(d_panel, 1),
+                        0) ;
+   window_fit(d_panel) ;
+   window_fit(d_frame) ;
+ 
+ 
+   props_frame = xv_create(frame,                FRAME_CMD,
+                           FRAME_LABEL,          "Reve Properties",
+                           FRAME_CMD_PUSHPIN_IN, TRUE,
+                           0) ;
+ 
+   props_panel = (Panel) xv_get(props_frame, FRAME_CMD_PANEL) ;
+ 
+        if (dtype == XBLACK)                 val = CP_WHITE ;
+   else if (dtype == XWHITE)                 val = CP_BLACK ;
+   else if (dtype == XBOTH || dtype == XTWO) val = CP_NEITHER ;
+ 
+   props_computer = xv_create(props_panel,          PANEL_CHOICE,
+                              PANEL_LABEL_STRING,   "Computer plays:",
+                              PANEL_LABEL_BOLD,     TRUE,
+                              PANEL_VALUE_X,        xv_col(props_panel, 15),
+                              XV_Y,                 xv_row(props_panel, 0),
+                              PANEL_CHOICE_STRINGS,
+                                "White",
+                                "Black",
+                                "Neither",
+                                "Both",
+                                0,
+                             PANEL_VALUE,           val,
+                             0) ;
+ 
+   XV_CREATE(props_panel,          PANEL_CHOICE_STACK,
+             PANEL_VALUE_X,        xv_col(props_panel, 15),
+             XV_Y,                 xv_row(props_panel, 1),
+             PANEL_LABEL_STRING,   "Difficulty: ",
+             PANEL_CHOICE_STRINGS,
+               " Instant",
+               " 1 Minute",
+               " 3 Minutes",
+               " 5 Minutes",
+               "10 Minutes",
+               "15 Minutes",
+               "20 Minutes",
+               "Tournament (30)",
+               "60 MInutes",
+               "Depth...",
+               0,
+             PANEL_NOTIFY_PROC,     set_depth,
+             PANEL_VALUE,           items[(int) DIFF_CHOICE].value,
+             0) ;
+ 
+   XV_CREATE(props_panel,        PANEL_MESSAGE,
+             XV_X,               xv_col(props_panel, 7),
+             XV_Y,               xv_row(props_panel, 2),
+             PANEL_LABEL_BOLD,   TRUE,
+             PANEL_LABEL_STRING, "Options:",
+             0) ;
+ 
+   val = ((ANIMATION   & 0x1) << 0) +
+         ((DO_BESTMOVE & 0x1) << 1) +
+         ((DO_LAST     & 0x1) << 2) +
+         ((SHOW_NOTES  & 0x1) << 3) +
+         ((DO_NUMBER   & 0x1) << 4) +
+         ((QUICKGAME   & 0x1) << 5) ;
+ 
+   props_choices = xv_create(props_panel,            PANEL_CHECK_BOX,
+                             PANEL_LAYOUT,           PANEL_VERTICAL,
+                             PANEL_CHOOSE_ONE,       FALSE,
+                             PANEL_CHOICE_STRINGS,
+                               "Animate Move",
+                               "Show Current Best Move",
+                               "Show Last Move",
+                               "Show Evaluation Info.",
+                               "Number Last Move",
+                               "Don't Show Flip",
+                               0,
+                             PANEL_VALUE_X,          xv_col(props_panel, 15),
+                             PANEL_VALUE_Y,          xv_row(props_panel, 2),
+                             PANEL_VALUE,            val,
+                             0) ;
+ 
+   props_button = xv_create(props_panel,        PANEL_BUTTON,
+                            PANEL_LABEL_STRING, "Apply",
+                            PANEL_NOTIFY_PROC,  set_props,
+                            XV_X,               xv_col(props_panel, 13),
+                            XV_Y,               xv_row(props_panel, 8),
+                            0) ;
+ 
+   props_reset_button = xv_create(props_panel,        PANEL_BUTTON,
+                                  PANEL_LABEL_STRING, "Reset",
+                                  PANEL_NOTIFY_PROC,  reset_props,
+                                  XV_X,               xv_col(props_panel, 23),
+                                  XV_Y,               xv_row(props_panel, 8),
+                                  0) ;
+   window_fit(props_panel) ;
+   window_fit(props_frame) ;
+ 
    iscolor[(int) cur_dpyno] = ((int) xv_get(frame, WIN_DEPTH) > 1) ? 1 : 0 ;
  }
  
***************
*** 717,724 ****
  
  
  void
! make_panel()                   /* **DUMMY ROUTINE** */
  {
  }
  
  
--- 930,938 ----
  
  
  void
! make_panel()
  {
+   panel_paint(panel, PANEL_CLEAR) ;
  }
  
  
***************
*** 758,808 ****
  }
  
  
! static void
! new_game_proc(menu, menu_item)
! Menu menu ;
! Menu_item menu_item ;
  {
-   switch((int) xv_get(menu_item, MENU_VALUE))
-     {
-       case 1 : items[(int) BLACK_PLAYS].value = HUMAN ;
-                items[(int) WHITE_PLAYS].value = COMPUTER ;
-                cmode = WHITE_START ;
-                dtype = XBLACK ;
-                break ;
- 
-       case 2 : items[(int) BLACK_PLAYS].value = COMPUTER ;
-                items[(int) WHITE_PLAYS].value = HUMAN ;
-                cmode = BLACK_START ;
-                dtype = XWHITE ;
-                break ;
- 
-       case 3 : items[(int) BLACK_PLAYS].value = HUMAN ;
-                items[(int) WHITE_PLAYS].value = HUMAN ;
-                cmode = BLACK_START ;
-                dtype = XBOTH ;
-     }
-   XV_SET(black_item, PANEL_VALUE, items[(int) BLACK_PLAYS].value) ;
-   XV_SET(white_item, PANEL_VALUE, items[(int) WHITE_PLAYS].value) ;
-   new_game() ;
  }
  
  
! /* Callback for the check box to show/hide evaluation and score. */
! 
! static void
! pop_props(item, value, event)
  {
-   show_notes = !show_notes ;
-   if (!show_notes)
-     {
-       XV_SET(mes_items[(int) (EVAL_MES - PANEL_MES)],
-              PANEL_LABEL_STRING, "",
-              0) ;
-       XV_SET(mes_items[(int) (SCORE_MES - PANEL_MES)],
-              PANEL_LABEL_STRING, "",
-              0) ;
-     }
  }
  
  
--- 972,987 ----
  }
  
  
! void
! open_frame(wtype)                    /* **DUMMY ROUTINE** */
! enum win_type wtype ;
  {
  }
  
  
! void
! paint_prop_sheet()            /* **DUMMY ROUTINE** */
  {
  }
  
  
***************
*** 839,844 ****
--- 1018,1024 ----
  {
    int id ;
  
+   nextc = IGNORE_EVENT ;
    id = (event_id(cur_event)) ;
    curx = event_x(cur_event) ;
    cury = event_y(cur_event) ;
***************
*** 845,851 ****
   
         if (id == KBD_DONE    || id == LOC_WINEXIT) nextc = EXIT_WINDOW ;
    else if (id == LOC_WINENTER)                     nextc = ENTER_WINDOW ;
!   else if (id == LOC_MOVE    || id == LOC_DRAG)    nextc = MOUSE_MOVING ;
    else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
    else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
    else if (event_is_button(cur_event) && event_is_down(cur_event))
--- 1025,1031 ----
   
         if (id == KBD_DONE    || id == LOC_WINEXIT) nextc = EXIT_WINDOW ;
    else if (id == LOC_WINENTER)                     nextc = ENTER_WINDOW ;
!   else if (id == LOC_DRAG)                         nextc = MOUSE_MOVING ;
    else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
    else if (id == WIN_REPAINT || id == WIN_RESIZE)  nextc = FRAME_REPAINT ;
    else if (event_is_button(cur_event) && event_is_down(cur_event))
***************
*** 859,865 ****
             if (id == MS_LEFT)   nextc = LEFT_UP ;
        else if (id == MS_MIDDLE) nextc = MIDDLE_UP ;
        else if (id == MS_RIGHT)  nextc = RIGHT_UP ;
-       XV_SET(frame, FRAME_BUSY, TRUE, 0) ;
      }
    else if (event_is_ascii(cur_event))
      {
--- 1039,1044 ----
***************
*** 866,886 ****
        cur_ch = id ;
        nextc = KEYBOARD ;
      }
  }
  
  
! static Notify_value
! quit_proc(frame, status)
! Frame frame ;
  Destroy_status status ;
  {
!   if (status == DESTROY_PROCESS_DEATH || status == DESTROY_CLEANUP)
      {
!       xv_destroy_safe(frame) ;
!       xv_destroy_safe(cframe) ;
!       exit(0) ;
      }
!   return(notify_next_destroy_func(frame, status)) ;
  }
  
  
--- 1045,1109 ----
        cur_ch = id ;
        nextc = KEYBOARD ;
      }
+   if (processing)
+     {
+       if (nextc == FRAME_REPAINT) return ;
+       else
+         {
+           if (event_action(cur_event) == ACTION_SELECT)
+             XUngrabPointer(dpy, 0) ;
+           nextc = IGNORE_EVENT ;
+           window_bell(frame) ;
+           message(PANEL_MES, "It's not your turn.") ;
+         }
+     }
  }
  
  
! Notify_value
! quit_proc(client, status)
! Notify_client client ;
  Destroy_status status ;
  {
!   if (status == DESTROY_CHECKING) KILL(pid, SIGKILL) ;
!   return(notify_next_destroy_func(client, status)) ;
! }
! 
! 
! Notify_value
! read_from_reve(client, fd)
! Notify_client client ;
! register int fd ;
! {
!   struct reve_out out ;
!   int bytes, sout ;
! 
!   if (!started) return(NOTIFY_DONE) ;
!   sout = sizeof(struct reve_out) ;
!   if (ioctl(fd, FIONREAD, &bytes) == 0)
      {
!       if (read(fd, (char *) &out, sout) > 0)
!         {
!           profmax = out.depth ;
!           if (out.type == M_BEST) show_best(out.move, out.note) ;
!           else if (out.type == M_MOVE)
!             {
!               set_cursor(CANVASCUR) ;
!               XV_SET(frame, FRAME_BUSY, TRUE, 0) ;
!               move = out.move ;
!               note = out.note ;
!               do_computer_move(reve_player) ;
!               XV_SET(frame, FRAME_BUSY, FALSE, 0) ;
!               processing = FALSE ;
!             }
!           else if (out.type == M_SUGGESTION)
!             {
!               do_suggest(reve_player, out.move, out.note, IS_ON) ;
!               processing = FALSE ;
!             }
!         }
      }
!   return(NOTIFY_DONE) ;
  }
  
  
***************
*** 890,896 ****
--- 1113,1154 ----
  }
  
  
+ Panel_setting
+ reset_props(item, event)
+ Panel_item item ;
+ Event *event ;
+ {
+   int val ;
+ 
+        if (dtype == XBLACK)                 val = CP_WHITE ;
+   else if (dtype == XWHITE)                 val = CP_BLACK ;
+   else if (dtype == XBOTH || dtype == XTWO) val = CP_NEITHER ;
+   XV_SET(props_computer, PANEL_VALUE, val, 0) ;
+ 
+   val = ((ANIMATION   & 0x1) << 0) +
+         ((DO_BESTMOVE & 0x1) << 1) +
+         ((DO_LAST     & 0x1) << 2) +
+         ((SHOW_NOTES  & 0x1) << 3) +
+         ((DO_NUMBER   & 0x1) << 4) +
+         ((QUICKGAME   & 0x1) << 5) ;
+   XV_SET(props_choices, PANEL_VALUE, val, 0) ;
+   return(PANEL_NONE) ;
+ }
+ 
+ 
  void
+ reset_time(timeleft)
+ time_t timeleft ;
+ {
+   struct reve_in in ;
+ 
+   in.type = M_TIME ;
+   in.timeleft = timeleft ;
+   WRITE(pipe_io[0][1], (char *) &in, sizeof(struct reve_in)) ;
+ }
+ 
+ 
+ void
  set_cursor(ctype)
  enum curtype ctype ;
  {
***************
*** 902,908 ****
  
  /*ARGSUSED*/
  void
! set_cycle(mtype, str)                    /* **DUMMY ROUTINE** */
  enum panel_type mtype ;
  char *str ;
  {
--- 1160,1167 ----
  
  /*ARGSUSED*/
  void
! set_cycle(wtype, mtype, str)                    /* **DUMMY ROUTINE** */
! enum win_type wtype ;
  enum panel_type mtype ;
  char *str ;
  {
***************
*** 915,971 ****
  int value ;
  Event *event ;
  {
!   level = value + 1 ;
!   items[(int) DIFFICULTY].value = level - 1 ;
  }
  
  
! static void
! set_player(item, value, event)   /* Callback to set black/white player. */
  Panel_item item ;
- int value ;
  Event *event ;
  {
!   char *label ;
!   enum panel_type this, other ;
!   int curi, curo ;
  
!   label = (char *) xv_get(item, PANEL_LABEL_STRING) ;
!   if (EQUAL(label, "Black"))
      {
!       this = BLACK_PLAYS ;
!       other = WHITE_PLAYS ;
      }
!   else
      {
!       this = WHITE_PLAYS ;
!       other = BLACK_PLAYS ;
!     }
  
!   curi = items[(int) this].value = value ;
!   curo = items[(int) other].value ;
! 
!   if (curi == COMPUTER && curo == COMPUTER)
      {
!       curi = HUMAN ;
!       XV_SET(item, PANEL_VALUE, curi, 0) ;
!       items[(int) this].value = curi ;
!       message(PANEL_MES, "Computer can't play both players.") ;
      }
!   if (curi == HUMAN    && curo == COMPUTER)
!     dtype = (this == BLACK_PLAYS) ? XBLACK : XWHITE ;
!   else if (curi == COMPUTER && curo == HUMAN)
!     dtype = (this == BLACK_PLAYS) ? XWHITE : XBLACK ;
!   else if (curi == HUMAN    && curo == HUMAN)
!     dtype = (dtype == XTWO) ? XTWO : XBOTH ;
!  
    if (curi == COMPUTER)
!     if ((this == BLACK_PLAYS && cmode == BLACK_START) ||
!         (this == WHITE_PLAYS && cmode == WHITE_START))
        computer_move(next_player) ;
  }
  
  
  Panel_setting
  start_load_save(item, event)
  Panel_item item ;
--- 1174,1287 ----
  int value ;
  Event *event ;
  {
!   if (value == DEPTH_MENU_ENTRY)
!     {
!       position_popup(frame, d_frame, P_RIGHT) ;
!       XV_SET(d_frame, XV_SHOW, TRUE, 0) ;
!     }
!   else
!     {
!       level = value + 1 ;
!       change_depth(1) ;
!       XV_SET(d_text, PANEL_VALUE, 1, 0) ;
!       items[(int) DIFF_CHOICE].value = level - 1 ;
!     }
  }
  
  
! Panel_setting
! set_profmax(item, event)
  Panel_item item ;
  Event *event ;
  {
!     XV_SET(d_frame, XV_SHOW, FALSE, 0) ;
!     change_depth((int) xv_get(d_text, PANEL_VALUE)) ;
!     level = 1 ;
!     return(PANEL_NONE) ;
! }
  
! 
! Panel_setting
! set_props(item, event)
! Panel_item item ;
! Event *event ;
! {
!   int curi, oldval, val ;
! 
!        if (dtype == XBLACK)                 oldval = CP_WHITE ;
!   else if (dtype == XWHITE)                 oldval = CP_BLACK ;
!   else if (dtype == XBOTH || dtype == XTWO) oldval = CP_NEITHER ;
! 
!   val = (int) xv_get(props_computer, PANEL_VALUE, 0) ;
!   if (val == CP_WHITE)
      {
!       dtype = XBLACK ;
!       play_computer = TRUE ;
!       items[(int) BLACK_PLAYS].value = HUMAN ; 
!       items[(int) WHITE_PLAYS].value = COMPUTER ;
      }
!   else if (val == CP_BLACK)
      {
!       dtype = XWHITE ;
!       play_computer = TRUE ;
!       items[(int) BLACK_PLAYS].value = COMPUTER ;
!       items[(int) WHITE_PLAYS].value = HUMAN ;
  
!     }
!   else if (val == CP_NEITHER)
      {
!       dtype = XTWO ;
!       play_computer = FALSE ;
!       items[(int) BLACK_PLAYS].value = HUMAN ;
!       items[(int) WHITE_PLAYS].value = HUMAN ;
      }
!   else if (val == CP_BOTH)
!     {
!       XV_SET(props_computer, PANEL_VALUE, oldval, 0) ;
!       message(PANEL_MES, "Computer plays both is not implemented yet.") ;
!     }
! 
!   val = items[(int) BLACK_PLAYS].value ;
!   XV_SET(black_item, PANEL_VALUE, player_values[val], 0) ;
!   val = items[(int) WHITE_PLAYS].value ;
!   XV_SET(white_item, PANEL_VALUE, player_values[val], 0) ;
! 
!   if (next_player == BLACK) curi = items[(int) BLACK_PLAYS].value ;
!   else                      curi = items[(int) WHITE_PLAYS].value ;
    if (curi == COMPUTER)
!     if ((next_player == BLACK && cmode == BLACK_START) ||
!         (next_player == WHITE && cmode == WHITE_START))
        computer_move(next_player) ;
+ 
+   val = (int) xv_get(props_choices, PANEL_VALUE, 0) ;
+   ANIMATION   = (val >> 0) & 0x1 ;
+   DO_BESTMOVE = (val >> 1) & 0x1 ;
+   DO_LAST     = (val >> 2) & 0x1 ;
+   SHOW_NOTES  = (val >> 3) & 0x1 ;
+   DO_NUMBER   = (val >> 4) & 0x1 ;
+   QUICKGAME   = (val >> 5) & 0x1 ;
+ 
+   XV_SET(props_frame, XV_SHOW, FALSE, 0) ;
+   return(PANEL_NONE) ;
  }
  
  
+ Notify_value
+ sigchldcatcher(client, pid, status, rusage)
+ Notify_client client ;
+ int pid ;
+ union wait *status ;
+ struct rusage *rusage ;
+ {
+   if (WIFEXITED(*status))
+     {
+       notify_set_input_func(client, NOTIFY_FUNC_NULL, pipe_io[1][0]) ;
+       return(NOTIFY_DONE) ;
+     }
+   return(NOTIFY_IGNORED) ;
+ }
+ 
+ 
  Panel_setting
  start_load_save(item, event)
  Panel_item item ;
***************
*** 973,979 ****
  {
    char *label ;
  
!   XV_SET(ls_frame, XV_SHOW, FALSE, NULL) ;
    STRCPY(gamefile, (char *) xv_get(ls_text, PANEL_VALUE)) ;
    label = (char *) xv_get(ls_button, PANEL_LABEL_STRING) ;
    if (EQUAL(label, "Load")) load_game() ;
--- 1289,1295 ----
  {
    char *label ;
  
!   XV_SET(ls_frame, XV_SHOW, FALSE, 0) ;
    STRCPY(gamefile, (char *) xv_get(ls_text, PANEL_VALUE)) ;
    label = (char *) xv_get(ls_button, PANEL_LABEL_STRING) ;
    if (EQUAL(label, "Load")) load_game() ;
***************
*** 988,1004 ****
  enum disp_type dtype ;
  {
    started = 1 ;
    xv_main_loop(frame) ;
  }
  
  
! static void         /* Dummy function for unimplemented callbacks */
! unimplemented()
  {
!   message(PANEL_MES, "Not implemented yet.\n") ;
  }
  
  
  static void 
  xv_load_game(item, value, event)    /* Callback for loading a game button. */
  Panel_item item ;
--- 1304,1335 ----
  enum disp_type dtype ;
  {
    started = 1 ;
+   notify_interpose_destroy_func(frame, quit_proc) ;
    xv_main_loop(frame) ;
  }
  
  
! /*ARGSUSED*/
! void
! write_to_reve(mtype, reve_board, player, level, reve_move, note)
! enum move_type mtype ;
! int *reve_board, player, level, *reve_move ;
! long *note ;
  {
!   int i ;
!   struct reve_in in ;
! 
!   for (i = 0; i < 64; i++) in.board[i] = reve_board[i] ;
!   in.player   = player ;
!   in.level    = level ;
!   in.type     = mtype ;
!   reve_player = player ;
!   processing  = TRUE ;
!   WRITE(pipe_io[0][1], (char *) &in, sizeof(struct reve_in)) ;
  }
  
  
+ /*ARGSUSED*/
  static void 
  xv_load_game(item, value, event)    /* Callback for loading a game button. */
  Panel_item item ;
***************
*** 1006,1017 ****
  Event *event ;
  {
    position_popup(frame, ls_frame, P_RIGHT) ;
!   XV_SET(ls_text, PANEL_LABEL_STRING, "Load File: ", 0) ;
!   XV_SET(ls_button, PANEL_LABEL_STRING, "Load", 0) ;
!   XV_SET(ls_frame, XV_SHOW, TRUE, NULL) ;
  }
  
  
  static void 
  xv_save_game(item, value, event)    /* Callback load saving a game button. */
  Panel_item item ;
--- 1337,1360 ----
  Event *event ;
  {
    position_popup(frame, ls_frame, P_RIGHT) ;
!   XV_SET(ls_frame,  FRAME_LABEL,        "Load Game",   0) ;
!   XV_SET(ls_text,   PANEL_LABEL_STRING, "Load File: ", 0) ;
!   XV_SET(ls_frame,  XV_SHOW,            TRUE,          0) ;
  }
  
  
+ /*ARGSUSED*/
+ static void
+ xv_new_game(item, value, event)   /* Callback for starting a new game. */
+ Panel_item item ;
+ int value ;
+ Event *event ;
+ {
+   new_game() ;
+ }
+ 
+ 
+ /*ARGSUSED*/
  static void 
  xv_save_game(item, value, event)    /* Callback load saving a game button. */
  Panel_item item ;
***************
*** 1019,1025 ****
  Event *event ;
  {
    position_popup(frame, ls_frame, P_RIGHT) ;
!   XV_SET(ls_text, PANEL_LABEL_STRING, "Save File: ", 0) ;
!   XV_SET(ls_button, PANEL_LABEL_STRING, "Save", 0) ; 
!   XV_SET(ls_frame, XV_SHOW, TRUE, NULL) ;
  }
--- 1362,1380 ----
  Event *event ;
  {
    position_popup(frame, ls_frame, P_RIGHT) ;
!   XV_SET(ls_frame,  FRAME_LABEL,        "Save Game",   0) ;
!   XV_SET(ls_text,   PANEL_LABEL_STRING, "Save File: ", 0) ;
!   XV_SET(ls_frame,  XV_SHOW,            TRUE,          0) ;
! }
! 
! 
! /*ARGSUSED*/
! static void
! xv_set_props(item, value, event)    /* Callback props button. */
! Panel_item item ;
! int value ;
! Event *event ;
! {
!   position_popup(frame, props_frame, P_RIGHT) ;
!   XV_SET(props_frame, XV_SHOW, TRUE, 0) ;
  }