changeset 111614:31f67bce5645

Fix picture-mouse-set-point calculation (Bug#7390). * lisp/textmodes/picture.el (picture-mouse-set-point): Don't use posn-col-row; explicitly compute the motion based on the posn at the window-start (Bug#7390).
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 13 Nov 2010 16:01:10 -0500
parents 8a76f3e33a5a
children ab9aebf1b099
files lisp/ChangeLog lisp/textmodes/picture.el
diffstat 2 files changed, 29 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Nov 13 12:22:52 2010 -0500
+++ b/lisp/ChangeLog	Sat Nov 13 16:01:10 2010 -0500
@@ -1,3 +1,9 @@
+2010-11-13  Chong Yidong  <cyd@stupidchicken.com>
+
+	* textmodes/picture.el (picture-mouse-set-point): Don't use
+	posn-col-row; explicitly compute the motion based on the posn at
+	the window-start (Bug#7390).
+
 2010-11-13  Michael Albinus  <michael.albinus@gmx.de>
 
 	* net/tramp.el (tramp-remote-coding-commands): Add an alternative
--- a/lisp/textmodes/picture.el	Sat Nov 13 12:22:52 2010 -0500
+++ b/lisp/textmodes/picture.el	Sat Nov 13 16:01:10 2010 -0500
@@ -226,16 +226,30 @@
   (picture-motion (- arg)))
 
 (defun picture-mouse-set-point (event)
-  "Move point to the position clicked on, making whitespace if necessary."
+  "Move point to the position of EVENT, making whitespace if necessary."
   (interactive "e")
-  (let* ((pos (posn-col-row (event-start event)))
-	 (x (car pos))
-	 (y (cdr pos))
-	 (current-row (count-lines (window-start) (line-beginning-position))))
-    (unless (equal x (current-column))
-      (picture-forward-column (- x (current-column))))
-    (unless (equal y current-row)
-      (picture-move-down (- y current-row)))))
+  (let ((position (event-start event)))
+    (unless (posn-area position) ; Ignore EVENT unless in text area
+      (let* ((window (posn-window position))
+	     (frame  (if (framep window) window (window-frame window)))
+	     (pair   (posn-x-y position))
+	     (start-pos (window-start window))
+	     (start-pair (posn-x-y (posn-at-point start-pos)))
+	     (dx (- (car pair) (car start-pair)))
+	     (dy (- (cdr pair) (cdr start-pair)))
+	     (char-ht (frame-char-height frame))
+	     (spacing (when (display-graphic-p frame)
+			(or (with-current-buffer (window-buffer window)
+			      line-spacing)
+			    (frame-parameter frame 'line-spacing))))
+	     rows cols)
+	(cond ((floatp spacing)
+	       (setq spacing (truncate (* spacing char-ht))))
+	      ((null spacing)
+	       (setq spacing 0)))
+	(goto-char start-pos)
+	(picture-move-down      (/ dy (+ char-ht spacing)))
+	(picture-forward-column (/ dx (frame-char-width frame)))))))
 
 
 ;; Picture insertion and deletion.