diff options
| author | Chong Yidong <cyd@stupidchicken.com> | 2010-11-13 16:01:10 -0500 |
|---|---|---|
| committer | Chong Yidong <cyd@stupidchicken.com> | 2010-11-13 16:01:10 -0500 |
| commit | de02effd8d2c2f8ada0eb8bda143b38e7506e2ae (patch) | |
| tree | de6b36dc0e7b69c819b9eef20b47bca16aca3a68 /lisp | |
| parent | 4d613e98a7ca89dbebbcc1a2865f8df04bf888f8 (diff) | |
| download | emacs-de02effd8d2c2f8ada0eb8bda143b38e7506e2ae.tar.gz | |
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).
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/ChangeLog | 6 | ||||
| -rw-r--r-- | lisp/textmodes/picture.el | 32 |
2 files changed, 29 insertions, 9 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index cb4dfb4651d..8be8e44d9a6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 diff --git a/lisp/textmodes/picture.el b/lisp/textmodes/picture.el index 2673ee15457..f1bb9957125 100644 --- a/lisp/textmodes/picture.el +++ b/lisp/textmodes/picture.el @@ -226,16 +226,30 @@ Do \\[command-apropos] picture-movement to see commands which control motion." (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. |
