From xemacs-m  Mon May 19 02:45:48 1997
Received: from crystal.WonderWorks.COM (crystal.WonderWorks.com [192.203.206.1])
	by xemacs.org (8.8.5/8.8.5) with ESMTP id CAA17795
	for <xemacs-beta@xemacs.org>; Mon, 19 May 1997 02:45:46 -0500 (CDT)
Received: by crystal.WonderWorks.COM 
	id QQcqeh12313; Mon, 19 May 1997 03:45:47 -0400 (EDT)
Date: Mon, 19 May 1997 03:45:47 -0400 (EDT)
Message-Id: <QQcqeh12313.199705190745@crystal.WonderWorks.COM>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
From: Kyle Jones <kyle_jones@wonderworks.com>
To: xemacs-beta@xemacs.org
Subject: [PATCH] 20.3-b1: fix for multi-device lockstepped cursors
X-Mailer: VM 6.32 under 20.3 XEmacs Lucid (beta1)
X-Face: /cA45WHG7jWq>(O3&Z57Y<"WsX5ddc,4c#w0F*zrV#=M
        0@~@,s;b,aMtR5Sqs"+nU.z^CSFQ9t`z2>W,S,]:[+2^
        Nbf6v4g>!&,7R4Ot4Wg{&tm=WX7P["9%a)_da48-^tGy
        ,qz]Z,Zz\{E.,]'EO+F)@$KtF&V

Cursors on multiple devices move in lockstep if the same buffer
is displayed in the selected window of the selected frame of
each device.  This happens because the value of window point is
being ignored in the selected window of the selected frame of
all devices, instead of just being ignored in the selected
window of the selected frame of the selected device of the
selected console.

Here is a patch that fixes it.  This patch may have Unintended
Consequences.  Keep your eyes open for different display
behavior.

Mon May 19 03:40:46 1997  Kyle Jones  <kyle@crystal.WonderWorks.COM>

	* src/redisplay.c: (window_line_number)
	  don't prefer buffer point value over window point
	  value unless window, frame, device and console are
	  all selected.

	* src/redisplay.c: (redisplay_window)
	  don't prefer buffer point value over window point
	  value unless window, frame, device and console are
	  all selected.

	* src/redisplay.c: (create_text_block)
	  don't prefer buffer point value over window point
	  value unless window, frame, device and console are
	  all selected.


--- 1.1	1997/05/19 05:47:16
+++ src/redisplay.c	1997/05/19 07:20:08
@@ -1910,7 +1910,10 @@
     }
   else if (MINI_WINDOW_P (w) && !active_minibuffer)
     data.cursor_type = NO_CURSOR;
-  else if (w == XWINDOW (FRAME_SELECTED_WINDOW (device_selected_frame (d))))
+  else if (w == XWINDOW (FRAME_SELECTED_WINDOW (f)) &&
+	   EQ(DEVICE_CONSOLE(d), Vselected_console) &&
+	   d == XDEVICE(CONSOLE_SELECTED_DEVICE(XCONSOLE(DEVICE_CONSOLE(d))))&&
+	   f == XFRAME(DEVICE_SELECTED_FRAME(d)))
     {
       data.bi_cursor_bufpos = BI_BUF_PT (b);
       data.cursor_type = CURSOR_ON;
@@ -4931,7 +4934,8 @@
   int echo_active = 0;
   int startp = 1;
   int pointm;
-  int selected;
+  int selected_in_its_frame;
+  int selected_globally;
   int skip_output = 0;
   int truncation_changed;
   int inactive_minibuffer =
@@ -4958,9 +4962,13 @@
     }
 
   /* Is this window the selected window on its frame? */
-  selected =
-    (w == XWINDOW (FRAME_SELECTED_WINDOW (device_selected_frame (d))));
-  if (skip_selected && selected)
+  selected_in_its_frame = (w == XWINDOW (FRAME_SELECTED_WINDOW (f)));
+  selected_globally =
+      selected_in_its_frame &&
+      EQ(DEVICE_CONSOLE(d), Vselected_console) &&
+      XDEVICE(CONSOLE_SELECTED_DEVICE(XCONSOLE(DEVICE_CONSOLE(d)))) == d &&
+      XFRAME(DEVICE_SELECTED_FRAME(d)) == f;
+  if (skip_selected && selected_in_its_frame)
     return;
 
   /* It is possible that the window is not fully initialized yet. */
@@ -4979,7 +4987,7 @@
     pointm = 1;
   else
     {
-      if (selected)
+      if (selected_globally)
 	{
 	  pointm = BUF_PT (b);
 	}
@@ -5051,7 +5059,7 @@
 	{
 	  pointm = point_at_center (w, DESIRED_DISP, 0, 0);
 
-	  if (selected)
+	  if (selected_globally)
 	    BUF_SET_PT (b, pointm);
 
 	  Fset_marker (w->pointm[DESIRED_DISP], make_int (pointm),
@@ -5079,7 +5087,7 @@
       /* Check if the cursor has actually moved. */
       if (EQ (Fmarker_buffer (w->last_point[CURRENT_DISP]), w->buffer)
 	  && pointm == marker_position (w->last_point[CURRENT_DISP])
-	  && selected
+	  && selected_globally
 	  && !w->windows_changed
 	  && !f->clip_changed
 	  && !f->extents_changed
@@ -5119,7 +5127,7 @@
 		      goto regeneration_done;
 		    }
 		}
-	      else if (!selected && !f->point_changed)
+	      else if (!selected_in_its_frame && !f->point_changed)
 		{
 		  if (f->modeline_changed)
 		    regenerate_modeline (w);
@@ -5679,7 +5687,10 @@
   struct device *d = XDEVICE (XFRAME (w->frame)->device);
   struct buffer *b = XBUFFER (w->buffer);
   Bufpos end =
-    ((w == XWINDOW (FRAME_SELECTED_WINDOW (device_selected_frame (d))))
+    (((w == XWINDOW (FRAME_SELECTED_WINDOW (device_selected_frame (d)))) &&
+      EQ(DEVICE_CONSOLE(d), Vselected_console) &&
+      XDEVICE(CONSOLE_SELECTED_DEVICE(XCONSOLE(DEVICE_CONSOLE(d)))) == d &&
+      EQ(DEVICE_SELECTED_FRAME(d), w->frame))
      ? BUF_PT (b)
      : marker_position (w->pointm[type]));
   int lots = 999999999;

