OK, this should do it in terms of documentation and fixing C-x 5 o.
greg
>>>> "Hrvoje" == Hrvoje Niksic
<hniksic(a)srce.hr> writes: 
Hrvoje> 
Hrvoje> greg(a)alphatech.com (Greg Klanderman) writes:
> Are we agreed that with f-f-m true, C-x 5 o (other-frame) is the
> *only* command which should warp focus. 
Hrvoje> 
Hrvoje> Yes.  But this is still a major behavioral change which you should
Hrvoje> document.  For instance, it may be worth noting (in the manual) that
Hrvoje> if you want `select-frame' to actually select the WM frame, you must
Hrvoje> bind focus-follows-mouse to nil.
Hrvoje> 
Hrvoje> Other than the `C-x 5 o' problem, I must once again state that your
Hrvoje> patch does The Right Thing.  For instance,
Hrvoje> (progn (select-frame (other-frame)) (insert "foo")) inserts
"foo" in
Hrvoje> the other buffer's frame, which is correct, and then reselects this
Hrvoje> frame for focus.  Kudos to you.  :-)
1998-04-30  Greg Klanderman  <greg(a)alphatech.com>
	* frame.el (other-frame): Work even when focus-follows-mouse is true.
1998-04-30  Greg Klanderman  <greg(a)alphatech.com>
	* frame.c (Fselect_frame): update docstring to describe
	focus-follows-mouse behavior.
1998-04-30  Greg Klanderman  <greg(a)alphatech.com>
	* lispref/frames.texi (Input Focus): Document behavior of
	select-frame wrt focus-follows-mouse.
Index: etc/NEWS
===================================================================
RCS file: /usr/CVSroot/XEmacs/xemacs-20/etc/NEWS,v
retrieving revision 1.48
diff -u -r1.48 NEWS
--- NEWS	1998/04/24 21:33:58	1.48
+++ NEWS	1998/05/01 08:41:08
@@ -33,6 +33,17 @@
 * Changes in XEmacs 21.0
 ========================
 
+** When the variable focus-follows-mouse is non-nil, it is no longer
+possible for select-frame to permanently select a different frame.
+The frame selection is temporary and is reverted when the current
+command terminates, much like the buffer selected by `set-buffer'.
+In order to effect a permanent focus change in this case, bind
+focus-follows-mouse to nil, select the frame you want, and do a
+(sit-for 0) within the scope of the binding.  The function
+other-frame (normally bound to C-x 5 o) is the only command provided
+which does not respect the setting of focus-follows-mouse, and *will*
+allow one to select a different frame even when set non-nil.
+
 ** XEmacs has been unbundled into constituent installable packages.
 See the file `etc/PACKAGES' in the distribution for a full
 description.
Index: man/lispref/frames.texi
===================================================================
RCS file: /usr/CVSroot/XEmacs/xemacs-20/man/lispref/frames.texi,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 frames.texi
--- frames.texi	1996/12/18 22:43:49	1.1.1.1
+++ frames.texi	1998/05/01 08:41:09
@@ -677,6 +677,13 @@
 @code{deselect-frame-hook} to be run, until the next time that XEmacs is
 waiting for an event.
 
+Also note that when the variable @code{focus-follows-mouse} is non-nil,
+the frame selection is temporary and is reverted when the current
+command terminates, much like the buffer selected by @code{set-buffer}.
+In order to effect a permanent focus change in this case, bind
+@code{focus-follows-mouse} to nil, select the frame you want, and do a
+@code{(sit-for 0)} within the scope of the binding.
+
 @ignore (FSF Emacs)
 XEmacs cooperates with the X server and the window managers by arranging
 to select frames according to what the server and window manager ask
Index: lisp/frame.el
===================================================================
RCS file: /usr/CVSroot/XEmacs/xemacs-20/lisp/frame.el,v
retrieving revision 1.11
diff -u -r1.11 frame.el
--- frame.el	1998/04/23 02:07:52	1.11
+++ frame.el	1998/05/01 08:41:10
@@ -516,10 +516,15 @@
 (defun other-frame (arg)
   "Select the ARG'th different visible frame, and raise it.
 All frames are arranged in a cyclic order.
-This command selects the frame ARG steps away in that order.
+This command selects the frame ARG steps away in that order,
+regardless of the value of `focus-follows-mouse'.
 A negative ARG moves in the opposite order."
   (interactive "p")
-  (let ((frame (selected-frame)))
+  (let ((frame (selected-frame))
+        ;; Allow selecting another frame even when
+        ;; focus-follows-mouse is true.
+        (focus-policy focus-follows-mouse)
+        (focus-follows-mouse nil))
     (while (> arg 0)
       (setq frame (next-frame frame 'visible-nomini))
       (setq arg (1- arg)))
@@ -528,6 +533,8 @@
       (setq arg (1+ arg)))
     (raise-frame frame)
     (select-frame frame)
+    (if focus-policy  ;; this hack allows the focus change to be
+        (sit-for 0))  ;; processed while focus-follows-mouse is nil.
     ;this is a bad idea; you should in general never warp the
     ;pointer unless the user asks for this.  Furthermore,
     ;our version of `set-mouse-position' takes a window,
Index: src/frame.c
===================================================================
RCS file: /usr/CVSroot/XEmacs/xemacs-20/src/frame.c,v
retrieving revision 1.27
diff -u -r1.27 frame.c
--- frame.c	1998/04/29 23:03:51	1.27
+++ frame.c	1998/05/01 08:41:11
@@ -667,6 +667,13 @@
 Note that this does not actually cause the window-system focus to
 be set to this frame, or the select-frame-hook or deselect-frame-hook
 to be run, until the next time that XEmacs is waiting for an event.
+
+Also note that when focus-follows-mouse is non-nil, the frame
+selection is temporary and is reverted when the current command
+terminates, much like the buffer selected by `set-buffer'.  In order
+to effect a permanent focus change in this case, bind
+focus-follows-mouse to nil, select the frame you want, and do
+a (sit-for 0) within the scope of the binding.
 */
        (frame))
 {