diff -c ../xfig.3.2.2/d_arc.c ./d_arc.c
*** ../xfig.3.2.2/d_arc.c	Sat Jun 13 01:19:07 1998
--- ./d_arc.c	Tue Oct 20 21:54:51 1998
***************
*** 32,37 ****
--- 32,38 ----
  #include "w_cursor.h"
  #include "w_msgpanel.h"
  #include "w_mousefun.h"
+ #include "u_geom.h"
  
  /* EXPORT */
  
***************
*** 43,57 ****
  static void	get_arcpoint();
  static void	init_arc_drawing();
  static void	cancel_arc();
  
  void
  arc_drawing_selected()
  {
!     set_mousefun("first point", "", "", "", "", "");
      canvas_kbd_proc = null_proc;
      canvas_locmove_proc = null_proc;
      canvas_leftbut_proc = init_arc_drawing;
!     canvas_middlebut_proc = null_proc;
      canvas_rightbut_proc = null_proc;
      set_cursor(arrow_cursor);
      reset_action_on();
--- 44,63 ----
  static void	get_arcpoint();
  static void	init_arc_drawing();
  static void	cancel_arc();
+ static void	init_arc_c_drawing();
+ 
+ static Boolean	center_marked;
+ F_pos	center_point;
  
  void
  arc_drawing_selected()
  {
!     center_marked = FALSE;
!     set_mousefun("first point", "center point", "", "", "", "");
      canvas_kbd_proc = null_proc;
      canvas_locmove_proc = null_proc;
      canvas_leftbut_proc = init_arc_drawing;
!     canvas_middlebut_proc = init_arc_c_drawing;
      canvas_rightbut_proc = null_proc;
      set_cursor(arrow_cursor);
      reset_action_on();
***************
*** 61,73 ****
  init_arc_drawing(x, y)
      int		    x, y;
  {
!     set_mousefun("mid point", "", "cancel", "", "", "");
      draw_mousefun_canvas();
      canvas_rightbut_proc = cancel_arc;
      num_point = 0;
      point[num_point].x = fix_x = cur_x = x;
      point[num_point++].y = fix_y = cur_y = y;
!     canvas_locmove_proc = unconstrained_line;
      canvas_leftbut_proc = get_arcpoint;
      canvas_middlebut_proc = null_proc;
      elastic_line();
--- 67,85 ----
  init_arc_drawing(x, y)
      int		    x, y;
  {
!     if (center_marked) {
!       elastic_line();
!       set_mousefun("mid angle", "", "cancel", "", "", "");
!     } else {
!       set_mousefun("mid point", "", "cancel", "", "", "");
!     }
      draw_mousefun_canvas();
      canvas_rightbut_proc = cancel_arc;
      num_point = 0;
      point[num_point].x = fix_x = cur_x = x;
      point[num_point++].y = fix_y = cur_y = y;
!     if (!center_marked)
!       canvas_locmove_proc = unconstrained_line;
      canvas_leftbut_proc = get_arcpoint;
      canvas_middlebut_proc = null_proc;
      elastic_line();
***************
*** 78,83 ****
--- 90,99 ----
  static void
  cancel_arc()
  {
+     if (center_marked) {
+       center_marked = FALSE;
+       center_marker(center_point.x, center_point.y);  /* clear center marker */
+     }
      elastic_line();
      /* erase any length info if appres.showlengths is true */
      erase_lengths();
***************
*** 99,105 ****
  	return;
  
      if (num_point == 1) {
! 	set_mousefun("final point", "", "cancel", "", "", "");
  	draw_mousefun_canvas();
      }
      if (num_point == 2) {
--- 115,124 ----
  	return;
  
      if (num_point == 1) {
! 	if (center_marked)
!   	  set_mousefun("final angle", "", "cancel", "", "", "");
! 	else
! 	  set_mousefun("final point", "", "cancel", "", "", "");
  	draw_mousefun_canvas();
      }
      if (num_point == 2) {
***************
*** 140,145 ****
--- 159,184 ----
  	x = point[i].x;
  	y = point[i].y;
      }
+ 
+     if (center_marked) {
+       double theta, r;
+ 
+       center_marker(center_point.x, center_point.y);  /* clear center marker */
+ 
+       r = sqrt((point[0].x - center_point.x) * (point[0].x - center_point.x)
+ 	       + (point[0].y - center_point.y) * (point[0].y - center_point.y));
+ 
+       theta = compute_angle((double)(point[1].x - center_point.x),
+ 			    (double)(point[1].y - center_point.y));
+       point[1].x = center_point.x + r * cos(theta);
+       point[1].y = center_point.y + r * sin(theta);
+       
+       theta = compute_angle((double)(point[2].x - center_point.x),
+ 			    (double)(point[2].y - center_point.y));
+       point[2].x = center_point.x + r * cos(theta);
+       point[2].y = center_point.y + r * sin(theta);
+     }
+ 
      if (!compute_arccenter(point[0], point[1], point[2], &xx, &yy)) {
  	put_msg("Invalid ARC geometry");
  	arc_drawing_selected();
***************
*** 187,189 ****
--- 226,246 ----
      arc_drawing_selected();
      draw_mousefun_canvas();
  }
+ 
+ 
+ static void
+ init_arc_c_drawing(x, y)
+     int		    x, y;
+ {
+     set_mousefun("first point", "", "cancel", "", "", "");
+     draw_mousefun_canvas();
+     canvas_locmove_proc = arc_point;
+     canvas_middlebut_proc = null_proc;
+     canvas_rightbut_proc = cancel_arc;
+     center_point.x = fix_x = cur_x = x;
+     center_point.y = fix_y = cur_y = y;
+     center_marked = TRUE;
+     center_marker(center_point.x, center_point.y);
+     num_point = 0;
+ }
+ 
Only in .: d_arc.c.old
diff -c ../xfig.3.2.2/d_arc.h ./d_arc.h
*** ../xfig.3.2.2/d_arc.h	Fri Jun 12 09:01:20 1998
--- ./d_arc.h	Wed Oct 14 21:24:13 1998
***************
*** 16,18 ****
--- 16,19 ----
   */
  
  extern F_pos		point[3];
+ extern F_pos		center_point;
diff -c ../xfig.3.2.2/u_elastic.c ./u_elastic.c
*** ../xfig.3.2.2/u_elastic.c	Fri Jun 12 09:09:23 1998
--- ./u_elastic.c	Wed Oct 14 21:36:15 1998
***************
*** 25,30 ****
--- 25,31 ----
  #include "w_canvas.h"
  #include "w_setup.h"
  #include "w_zoom.h"
+ #include "d_arc.h"
  
  /********************** EXPORTS **************/
  
***************
*** 708,713 ****
--- 709,725 ----
  }
  
  /*************************** ARCS *************************/
+ 
+ void
+ arc_point(x, y, numpoint)
+     int		    x, y, numpoint;
+ {
+     elastic_line();
+     cur_x = x;
+     cur_y = y;
+     altlength_msg(MSG_DIAM_ANGLE, center_point.x, center_point.y);
+     elastic_line();
+ }
  
  void
  reshaping_arc(x, y)
diff -c ../xfig.3.2.2/u_elastic.h ./u_elastic.h
*** ../xfig.3.2.2/u_elastic.h	Fri Jun 12 09:09:10 1998
--- ./u_elastic.h	Wed Oct 14 21:36:38 1998
***************
*** 30,35 ****
--- 30,36 ----
  #define		MSG_LENGTH	3
  #define		MSG_DIST	4
  #define		MSG_PNTS_LENGTH	5
+ #define		MSG_DIAM_ANGLE	6
  
  extern int	constrained;
  extern float	cur_angle;
***************
*** 73,78 ****
--- 74,80 ----
  extern void	elastic_scalepts();
  extern void	scaling_line();
  
+ extern void	arc_point();
  extern void	moving_arc();
  extern void	elastic_movearc();
  extern void	reshaping_arc();
diff -c ../xfig.3.2.2/w_msgpanel.c ./w_msgpanel.c
*** ../xfig.3.2.2/w_msgpanel.c	Fri Jun 12 06:07:10 1998
--- ./w_msgpanel.c	Wed Oct 14 21:36:24 1998
***************
*** 600,605 ****
--- 600,615 ----
  		(float)dy*appres.user_scale, cur_fig_units,
  		ang );
  	break;
+     case MSG_DIAM_ANGLE:
+ 	if (num_point == 0)
+ 	  put_msg("Diameter = %.3f %s, Angle = %.1f deg",
+ 		  len*appres.user_scale, cur_fig_units,
+ 		  ang );
+ 	else
+ 	  put_msg("%d point%s, Angle = %.1f deg",
+ 		  num_point, ((num_point != 1)? "s": ""),
+ 		  ang );
+ 	break;
      default:
  	put_msg("%s = %.3f %s, dx = %.3lf %s, dy = %.3lf %s (%.1f) deg",
  		(type==MSG_LENGTH? "Length": "Distance"),
