Pregunta:
No puedo creer que no haya forma en Emacs de ignorar el mouse de manera fácil y confiable, pero mi fu de google no parece lo suficientemente bueno como para encontrar cómo hacerlo.
Por fácil y confiable me refiero a deshabilitar el dispositivo, no desvincular los eventos del mouse (lo cual no es confiable ya que cualquier modo puede volver a vincularlos).
Respuesta:
Respuestas de dos y medio:
- El código init.el de Artur Malabarba . La publicación del blog tiene comentarios útiles.
- El código init.el de Victor Deryagin del que Malabarba derivó el suyo.
Mi tercera "respuesta" probablemente solo se aplica a los paneles táctiles, pero dado que la mayoría de las personas que tienen la necesidad de apagar "el mouse" en realidad usan computadoras portátiles y tocan accidentalmente su panel táctil, lo incluiré. (Junto con una invitación para cualquiera que pueda extender lo siguiente para manejar el mouse, en cuyo caso esta publicación en realidad proporcionará 3 respuestas 🙂 Aunque esta respuesta también se basa en el código init.el
, está más orientada al sistema operativo y orientada a X (y probablemente Linux- solo: OS + X != OSX
), otra razón por la que lo incluyo en último lugar.
Este enfoque llama a synclient
o xinput
dependiendo de cuál funcione para usted. Primero, algunos detalles:
synclient
es la forma más nueva / mejor de controlar los synclient
, por lo que probablemente debería preferirlo si lo tiene o puede instalarlo. synclient
define propiedades que puede establecer en tiempo de ejecución. La propiedad relevante aquí es TouchpadOff
que puede verificar (desde un shell) con
synclient -l | fgrep -e TouchpadOff
1
== desactivado (piense en TouchpadOff==true
), 0
== activado. Desafortunadamente, en mi computadora portátil de 10 años, obtengo
$ synclient -l | fgrep -e TouchpadOff
TouchpadOff = 2
que aparentemente significa "no funciona", porque empíricamente puedo hacer
synclient TouchpadOff=1
y no pasa nada, mi panel táctil sigue funcionando. Afortunadamente yo (y tal vez) puedo utilizar el {mayores, menos flexible y más propensos a romperse en el kernel / cambio de configuración} xinput
. Primero, verifique la ID de su panel táctil: en mi caso, es
$ xinput --list | fgrep -ie touchpad
⎜ ↳ SynPS/2 Synaptics TouchPad id=11 [slave pointer (2)]
(Tenga en cuenta que también puede hacer algo muy similar para su mouse, si tiene uno, y controlarlo a través de la extensión obvia del siguiente procedimiento. Sin embargo, no estoy discutiendo eso aquí porque synclient
no – IIUC – proporciona funcionalidad similar.)
Entonces puedo hacer
xinput --disable 11
que en realidad WFM, e igualmente
xinput --enable 11
Entonces, ¿cómo envolver todo esto para init.el
? Cito a cualquier experto en elisp que pueda mejorar lo siguiente (ciertamente me falta elisp-fu), pero aquí va:
(defconst XINPUT-TOUCHPAD-ID "11") ; if using xinput, SET TO VALUE APPROPRIATE FOR YOUR DEVICE!
(defconst XINPUT-DISABLE-TOUCHPAD (concat "xinput --disable " XINPUT-TOUCHPAD-ID))
(defconst XINPUT-ENABLE-TOUCHPAD (concat "xinput --enable " XINPUT-TOUCHPAD-ID))
(defconst SYNCLIENT-DISABLE-TOUCHPAD "synclient TouchpadOff=1")
(defconst SYNCLIENT-ENABLE-TOUCHPAD "synclient TouchpadOff=0")
;;; TEST YOUR DEVICE before you choose to use `synclient` (preferred) or `xinput`
(defconst DISABLE-TOUCHPAD XINPUT-DISABLE-TOUCHPAD)
(defconst ENABLE-TOUCHPAD XINPUT-ENABLE-TOUCHPAD)
(defun touchpad-off (&optional frame)
(interactive)
(shell-command DISABLE-TOUCHPAD))
(defun touchpad-on (&optional frame)
(interactive)
(shell-command ENABLE-TOUCHPAD))
(add-hook 'focus-in-hook #'touchpad-off)
(add-hook 'focus-out-hook #'touchpad-on)
(add-hook 'delete-frame-functions #'touchpad-on)
;;; and don't forget to enable the touchpad when you exit Emacs:
(add-hook 'kill-emacs-hook #'touchpad-on)
Una vez habilitado desde su init.el
, el código anterior debería apagar su panel táctil cuando cualquier marco de Emacs de GUI (errr … no sé si esto funciona para XEmacs) gana foco, y volver a encenderse cuando un marco de Emacs pierde el foco.