# HG changeset patch # User Sam Steingold # Date 1209739059 0 # Node ID 8d02ae7cb729f48915ecfb095cb4c8f355d54dda # Parent e33c27238da25b9deee90d428ca36ab9f24ac14f * vc.el (vc-dir-mode-map): Enable mouse bindings. (vc-at-event): New macro: run the body at the even location. (vc-dir-menu, vc-dir-toggle-mark): Use it. (vc-dir-mark-file, vc-dir-unmark-file): Move only on non-mouse events. * subr.d (mouse-event-p): Check if the even is mouse-related. diff -r e33c27238da2 -r 8d02ae7cb729 lisp/ChangeLog --- a/lisp/ChangeLog Fri May 02 12:43:30 2008 +0000 +++ b/lisp/ChangeLog Fri May 02 14:37:39 2008 +0000 @@ -1,3 +1,11 @@ +2008-05-02 Sam Steingold + + * vc.el (vc-dir-mode-map): Enable mouse bindings. + (vc-at-event): New macro: run the body at the even location. + (vc-dir-menu, vc-dir-toggle-mark): Use it. + (vc-dir-mark-file, vc-dir-unmark-file): Move only on non-mouse events. + * subr.d (mouse-event-p): Check if the even is mouse-related. + 2008-05-02 Nick Roberts * progmodes/gdb-ui.el (gdb-info-breakpoints-custom): Don't diff -r e33c27238da2 -r 8d02ae7cb729 lisp/subr.el --- a/lisp/subr.el Fri May 02 12:43:30 2008 +0000 +++ b/lisp/subr.el Fri May 02 14:37:39 2008 +0000 @@ -828,6 +828,11 @@ "Return non-nil if OBJECT is a mouse movement event." (eq (car-safe object) 'mouse-movement)) +(defun mouse-event-p (object) + "Return non-nil if OBJECT is a mouse click event." + ;; is this really correct? maybe remove mouse-movement? + (memq (event-basic-type object) '(mouse-1 mouse-2 mouse-3 mouse-movement))) + (defsubst event-start (event) "Return the starting position of EVENT. If EVENT is a mouse or key press or a mouse click, this returns the location diff -r e33c27238da2 -r 8d02ae7cb729 lisp/vc.el --- a/lisp/vc.el Fri May 02 12:43:30 2008 +0000 +++ b/lisp/vc.el Fri May 02 14:37:39 2008 +0000 @@ -2991,10 +2991,8 @@ (define-key map "q" 'quit-window) (define-key map "g" 'vc-dir-refresh) (define-key map "\C-c\C-c" 'vc-dir-kill-dir-status-process) - ;; Does not work unless mouse sets point. Functions like vc-dir-find-file - ;; need to find the file from the mouse position, not `point'. - ;; (define-key map [(down-mouse-3)] 'vc-dir-menu) - ;; (define-key map [(mouse-2)] 'vc-dir-toggle-mark) + (define-key map [(down-mouse-3)] 'vc-dir-menu) + (define-key map [(mouse-2)] 'vc-dir-toggle-mark) ;; Hook up the menu. (define-key map [menu-bar vc-dir-mode] @@ -3022,10 +3020,21 @@ '("----") ext-binding)))) +(defmacro vc-at-event (event &rest body) + "Evaluate `body' wich point located at event-start of `event'. +If `body' uses `event', it should be a variable, + otherwise it will be evaluated twice." + (let ((posn (gensym "vc-at-event-posn"))) + `(let ((,posn (event-start ,event))) + (save-excursion + (set-buffer (window-buffer (posn-window ,posn))) + (goto-char (posn-point ,posn)) + ,@body)))) + (defun vc-dir-menu (e) "Popup the VC status menu." (interactive "e") - (popup-menu vc-dir-menu-map e)) + (vc-at-event e (popup-menu vc-dir-menu-map e))) (defvar vc-dir-tool-bar-map (let ((map (make-sparse-keymap))) @@ -3416,7 +3425,7 @@ (and (not isdir) (not (vc-dir-parent-marked-p crt)))) (setf (vc-dir-fileinfo->marked file) t) (ewoc-invalidate vc-ewoc crt) - (unless arg + (unless (or arg (mouse-event-p last-command-event)) (vc-dir-next-line 1))))) (defun vc-dir-mark () @@ -3481,7 +3490,8 @@ (file (ewoc-data crt))) (setf (vc-dir-fileinfo->marked file) nil) (ewoc-invalidate vc-ewoc crt) - (vc-dir-next-line 1))) + (unless (mouse-event-p last-command-event) + (vc-dir-next-line 1)))) (defun vc-dir-unmark () "Unmark the current file or all files in the region. @@ -3545,15 +3555,15 @@ (vc-dir-unmark-file) (vc-dir-mark-file)))) -(defun vc-dir-toggle-mark () - (interactive) - (vc-dir-mark-unmark 'vc-dir-toggle-mark-file)) +(defun vc-dir-toggle-mark (e) + (interactive "e") + (vc-at-event e (vc-dir-mark-unmark 'vc-dir-toggle-mark-file))) (defun vc-dir-register () "Register the marked files, or the current file if no marks." (interactive) ;; FIXME: Just pass the fileset to vc-register. - (mapc (lambda (arg) (vc-register nil arg)) + (mapc (lambda (arg) (vc-register nil arg)) (or (vc-dir-marked-files) (list (vc-dir-current-file))))) (defun vc-dir-delete-file ()