From xemacs-m  Wed Sep 17 22:47:31 1997
Received: from relay5.UU.NET (relay5.UU.NET [192.48.96.15])
	by xemacs.org (8.8.5/8.8.5) with ESMTP id WAA18065
	for <xemacs-beta@xemacs.org>; Wed, 17 Sep 1997 22:47:30 -0500 (CDT)
Received: from crystal.WonderWorks.COM by relay5.UU.NET with ESMTP 
	(peer crosschecked as: crystal.WonderWorks.com [192.203.206.1])
	id QQdhmd28524; Wed, 17 Sep 1997 23:47:54 -0400 (EDT)
Received: by crystal.WonderWorks.COM 
	id QQdhmd29266; Wed, 17 Sep 1997 23:47:29 -0400 (EDT)
Date: Wed, 17 Sep 1997 23:47:29 -0400 (EDT)
Message-Id: <QQdhmd29266.199709180347@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] 19.16: fix for lockstepped cursor on multiple devices
X-Mailer: VM 6.34 under 19.16 "" XEmacs Lucid (beta91)
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

This is the same patch I made to 20.2 long ago for this problem.
I patched, tested and diff'd again to get a patch applicable to
19.16.  This patch is against 19.16-b91 which is the most recent
beta I have.

Wed Sep 17 23:46:38 1997  Kyle Jones  <kyle_jones@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/09/18 03:22:48
+++ src/redisplay.c	1997/09/18 03:27:26
@@ -1904,7 +1904,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;
@@ -4923,7 +4926,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 =
@@ -4950,9 +4954,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. */
@@ -4971,7 +4979,7 @@
     pointm = 1;
   else
     {
-      if (selected)
+      if (selected_globally)
 	{
 	  pointm = BUF_PT (b);
 	}
@@ -5043,7 +5051,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),
@@ -5071,7 +5079,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
@@ -5111,7 +5119,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);
@@ -5665,7 +5673,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;

