1;;; t-mouse.el --- mouse support within the text terminal
2
3;; Author: Nick Roberts <nickrob@gnu.org>
4;; Maintainer: emacs-devel@gnu.org
5;; Keywords: mouse gpm linux
6
7;; Copyright (C) 1994-1995, 1998, 2006-2021 Free Software Foundation,
8;; Inc.
9
10;; This file is part of GNU Emacs.
11
12;; GNU Emacs is free software: you can redistribute it and/or modify
13;; it under the terms of the GNU General Public License as published by
14;; the Free Software Foundation, either version 3 of the License, or
15;; (at your option) any later version.
16
17;; GNU Emacs is distributed in the hope that it will be useful,
18;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20;; GNU General Public License for more details.
21
22;; You should have received a copy of the GNU General Public License
23;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
24
25;;; Commentary:
26
27;; This package provides access to mouse event as reported by the gpm-Linux
28;; package. It tries to reproduce the functionality offered by Emacs under X.
29;; The "gpm" server runs under Linux, so this package is rather
30;; Linux-dependent.
31
32;; The file, t-mouse.el was originally written by Alessandro Rubini and Ian T
33;; Zimmerman, and Emacs communicated with gpm through a client program called
34;; mev.  Now the interface with gpm is directly through a Unix socket, so this
35;; file is reduced to a single minor mode macro call.
36
37;;
38
39;;; Code:
40
41;; Prevent warning when compiling in an Emacs without gpm support.
42(declare-function gpm-mouse-start "term.c" ())
43
44(defun gpm-mouse-enable ()
45  "Try to enable gpm mouse support on the current terminal."
46  (let ((activated nil))
47    (unwind-protect
48        (progn
49          (unless (fboundp 'gpm-mouse-start)
50            (error "Emacs must be built with Gpm to use this mode"))
51          (when gpm-mouse-mode
52            (gpm-mouse-start)
53            (set-terminal-parameter nil 'gpm-mouse-active t)
54            (setq activated t)))
55      ;; If something failed to turn it on, try to turn it off as well,
56      ;; just in case.
57      (unless activated (gpm-mouse-disable)))))
58
59(defun gpm-mouse-disable ()
60  "Try to disable gpm mouse support on the current terminal."
61  (when (fboundp 'gpm-mouse-stop)
62    (gpm-mouse-stop))
63  (set-terminal-parameter nil 'gpm-mouse-active nil))
64
65;;;###autoload
66(define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
67;;;###autoload
68(define-minor-mode gpm-mouse-mode
69  "Toggle mouse support in GNU/Linux consoles (GPM Mouse mode).
70
71This allows the use of the mouse when operating on a GNU/Linux console,
72in the same way as you can use the mouse under X11.
73It relies on the `gpm' daemon being activated.
74
75Note that when `gpm-mouse-mode' is enabled, you cannot use the
76mouse to transfer text between Emacs and other programs which use
77GPM.  This is due to limitations in GPM and the Linux kernel."
78  :global t :group 'mouse :init-value t
79  (dolist (terminal (terminal-list))
80    (when (and (eq t (terminal-live-p terminal))
81               (not (eq gpm-mouse-mode
82                        (terminal-parameter terminal 'gpm-mouse-active))))
83      ;; Simulate selecting a terminal by selecting one of its frames ;-(
84      (with-selected-frame (car (frames-on-display-list terminal))
85        (if gpm-mouse-mode (gpm-mouse-enable) (gpm-mouse-disable))))))
86
87(provide 't-mouse)
88
89;;; t-mouse.el ends here
90