bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#16647: Imprecisions with window-resizing cursors


From: martin rudalics
Subject: bug#16647: Imprecisions with window-resizing cursors
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))
     {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]