- (interactive "P")
- (let ((on-p (if arg
- (> (prefix-numeric-value arg) 0)
- (not mouse-sel-mode))))
- (if on-p
- (add-hook 'x-lost-selection-hooks 'mouse-sel-lost-selection-hook)
- (remove-hook 'x-lost-selection-hooks 'mouse-sel-lost-selection-hook))
- (mouse-sel-bindings on-p)
- (setq mouse-sel-mode on-p)))
-
-;;=== Key bindings ========================================================
-
-(defun mouse-sel-bindings (bind)
- (cond ((not bind)
- ;; These bindings are taken from mouse.el, i.e., they are the default
- ;; bindings. It would be better to restore the previous bindings.
- ;; Primary selection bindings.
- (global-set-key [mouse-1] 'mouse-set-point)
- (global-set-key [mouse-2] 'mouse-yank-at-click)
- (global-set-key [mouse-3] 'mouse-save-then-kill)
- (global-set-key [down-mouse-1] 'mouse-drag-region)
- (global-set-key [drag-mouse-1] 'mouse-set-region)
- (global-set-key [double-mouse-1] 'mouse-set-point)
- (global-set-key [triple-mouse-1] 'mouse-set-point)
- ;; Secondary selection bindings.
- (global-set-key [M-mouse-1] 'mouse-start-secondary)
- (global-set-key [M-mouse-2] 'mouse-yank-secondary)
- (global-set-key [M-mouse-3] 'mouse-secondary-save-then-kill)
- (global-set-key [M-drag-mouse-1] 'mouse-set-secondary)
- (global-set-key [M-down-mouse-1] 'mouse-drag-secondary))
- (mouse-sel-default-bindings
- ;;
- ;; Primary selection bindings.
- (global-unset-key [mouse-1])
- (global-unset-key [drag-mouse-1])
- (global-unset-key [mouse-3])
- (global-set-key [down-mouse-1] 'mouse-select)
- (unless (eq mouse-sel-default-bindings 'interprogram-cut-paste)
- (global-set-key [mouse-2] 'mouse-insert-selection)
- (setq interprogram-cut-function nil
- interprogram-paste-function nil))
- (global-set-key [down-mouse-3] 'mouse-extend)
- ;;
- ;; Secondary selection bindings.
- (global-unset-key [M-mouse-1])
- (global-unset-key [M-drag-mouse-1])
- (global-unset-key [M-mouse-3])
- (global-set-key [M-down-mouse-1] 'mouse-select-secondary)
- (global-set-key [M-mouse-2] 'mouse-insert-secondary)
- (global-set-key [M-down-mouse-3] 'mouse-extend-secondary))))
-
-;;=== Command Variable ====================================================
-
-;; This has to come after the function `mouse-sel-mode' and its callee.
-;; An alternative is to put the option `mouse-sel-mode' here and remove its
-;; `:initialize' keyword.
-(when mouse-sel-mode
- (mouse-sel-mode t))
+ :global t
+ :group 'mouse-sel
+ (if mouse-sel-mode
+ (progn
+ (add-hook 'x-lost-selection-functions 'mouse-sel-lost-selection-hook)
+ (when mouse-sel-default-bindings
+ ;; Save original bindings and replace them with new ones.
+ (setq mouse-sel-original-bindings
+ (mapcar (lambda (binding)
+ (let ((event (car binding)))
+ (prog1 (cons event (lookup-key global-map event))
+ (global-set-key event (cdr binding)))))
+ mouse-sel-bound-events))
+ ;; Update interprogram functions.
+ (setq mouse-sel-original-interprogram-cut-function
+ interprogram-cut-function
+ mouse-sel-original-interprogram-paste-function
+ interprogram-paste-function
+ mouse-sel-has-been-enabled t)
+ (unless (eq mouse-sel-default-bindings 'interprogram-cut-paste)
+ (setq interprogram-cut-function nil
+ interprogram-paste-function nil))))
+
+ ;; Restore original bindings
+ (remove-hook 'x-lost-selection-functions 'mouse-sel-lost-selection-hook)
+ (dolist (binding mouse-sel-original-bindings)
+ (global-set-key (car binding) (cdr binding)))
+ ;; Restore the old values of these variables,
+ ;; only if they were actually saved previously.
+ (if mouse-sel-has-been-enabled
+ (setq interprogram-cut-function
+ mouse-sel-original-interprogram-cut-function
+ interprogram-paste-function
+ mouse-sel-original-interprogram-paste-function))))