Subject: Re: bug#16647: Imprecisions with window-resizing cursors

From: martin rudalics <[email-masked]>
Date: Fri, 21 Feb 2014 19:53:40 +0100

> Regardless of where the vertical line is, it is now almost impossible to
 > get the <=> handle to appear at all when approaching the vertical line
 > from the left -- I get it once in about fifty attempts. When approaching
 > the vertical line from the right, the <=> handle appears normally (and
 > it now appears normally when the vertical line is all the way to the
 > left as well).

If you can apply the patch I posted earlier (and I attach here again)
you could try the following snippet with emacs -Q:

(let ((i 200)
       (window-on-left (selected-window))
       (window-on-right (split-window-right))
       (lhits 0)
       (rhits 0))
   (tooltip-mode -1)
   (scroll-bar-mode -1)
   (set-mouse-pixel-position (selected-frame) i 200)
   (while (car (setq position (cdr (mouse-pixel-position))))
     (let ((coordinates (coordinates-in-window-p position window-on-left t)))
       (when (eq coordinates 'vertical-line)
	(setq lhits (1+ lhits))))
     (let ((coordinates (coordinates-in-window-p position window-on-right t)))
       (when (eq coordinates 'vertical-line)
	(setq rhits (1+ rhits))))
     (sit-for 0.001)
     (set-mouse-pixel-position
      (selected-frame) (setq i (1+ i)) 200))
   (cons lhits rhits))

Evaluating this returns (8 . 0) here, the cdr of which amounts to the
width of one character on my frame.  So here I have an 8 pixel-wide
corridor entirely in the left window where I am "on the vertical line"
(which occupies virtually the 7 right pixels of the right fringe of the
window on the left).  Evaluating

(let ((i 600)
       (window-on-left (selected-window))
       (window-on-right (split-window-right))
       (lhits 0)
       (rhits 0))
   (tooltip-mode -1)
   (scroll-bar-mode -1)
   (set-mouse-pixel-position (selected-frame) i 200)
   (while (car (setq position (cdr (mouse-pixel-position))))
     (let ((coordinates (coordinates-in-window-p position window-on-left t)))
       (when (eq coordinates 'vertical-line)
	(setq lhits (1+ lhits))))
     (let ((coordinates (coordinates-in-window-p position window-on-right t)))
       (when (eq coordinates 'vertical-line)
	(setq rhits (1+ rhits))))
     (sit-for 0.001)
     (set-mouse-pixel-position
      (selected-frame) (setq i (1- i)) 200))
   (cons lhits rhits))

gets me the same results.  What do you get?  You might have to change
the initial values of `i' to "be in the frame" accordingly.

martin
=== modified file 'src/window.c'
--- src/window.c	2014-02-21 08:02:05 +0000
+++ src/window.c	2014-02-21 18:16:00 +0000
@@ -1410,13 +1410,15 @@

 DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
-       Scoordinates_in_window_p, 2, 2, 0,
+       Scoordinates_in_window_p, 2, 3, 0,
        doc: /* Return non-nil if COORDINATES are in WINDOW.
 WINDOW must be a live window and defaults to the selected one.
 COORDINATES is a cons of the form (X . Y), X and Y being distances
 measured in characters from the upper-left corner of the frame.
 \(0 . 0) denotes the character in the upper left corner of the
-frame.
+frame.  Third argument PIXELWISE non-nil means interpret coordinates
+pixelwise.
+
 If COORDINATES are in the text portion of WINDOW,
    the coordinates relative to the window are returned.
 If they are in the mode line of WINDOW, `mode-line' is returned.
@@ -1427,7 +1429,7 @@
   `vertical-line' is returned.
 If they are in the windows's left or right marginal areas, `left-margin'\n\
   or `right-margin' is returned.  */)
-  (register Lisp_Object coordinates, Lisp_Object window)
+  (register Lisp_Object coordinates, Lisp_Object window, Lisp_Object pixelwise)
 {
   struct window *w;
   struct frame *f;
@@ -1439,10 +1441,16 @@
   CHECK_CONS (coordinates);
   lx = Fcar (coordinates);
   ly = Fcdr (coordinates);
-  CHECK_NUMBER_OR_FLOAT (lx);
-  CHECK_NUMBER_OR_FLOAT (ly);
-  x = FRAME_PIXEL_X_FROM_CANON_X (f, lx) + FRAME_INTERNAL_BORDER_WIDTH (f);
-  y = FRAME_PIXEL_Y_FROM_CANON_Y (f, ly) + FRAME_INTERNAL_BORDER_WIDTH (f);
+  CHECK_NUMBER (lx);
+  CHECK_NUMBER (ly);
+  x = ((!NILP (pixelwise)
+    ? XINT (lx)
+    : FRAME_PIXEL_X_FROM_CANON_X (f, lx))
+       + FRAME_INTERNAL_BORDER_WIDTH (f));
+  y = ((!NILP (pixelwise)
+    ? XINT (ly)
+    : FRAME_PIXEL_Y_FROM_CANON_Y (f, ly))
+       + FRAME_INTERNAL_BORDER_WIDTH (f));

   switch (coordinates_in_window (w, x, y))
     {