Evite el clic del mouse en cuadros inactivos desde el punto de reposicionamiento

11

Quiero evitar que el "primer" clic en un marco en una ventana X inactiva tenga algún efecto, aparte de activar el marco. Específicamente, no quiero que vuelva a colocar el punto.

El problema es que parece que no puedo detectar que el marco estaba inactivo cuando hago clic con el mouse. Entonces el siguiente código siempre muestra "y":

;; detect if frame is active when clicking
(defun my/mouse-drag-region (event)
  (interactive "e")
  (mouse-minibuffer-check event)
  (let* ((window (caadr event))
         (frame (window-frame window)))
    (if (eql frame (selected-frame))
        (print "y")
      (print "n"))))
(global-set-key [down-mouse-1] 'my/mouse-drag-region)

¿Cómo detecto que el marco estaba previamente inactivo?

O, ¿alguien ya ha logrado lo que estoy tratando de hacer en otro lugar?

Nota: estoy pidiendo algo diferente a esta otra pregunta , que se trata de ventanas inactivas, no de marcos inactivos.

queso Edam
fuente
Desea modificar el método abreviado de teclado mouse-set-pointy crear su propia función para hacer lo que quiera. Haga C-h kclic con el mouse y vea las dos (2) funciones que se enumeran allí.
leyes 01 de
¿Sus marcos no tienen una barra de título y un borde? ¿Por qué no haces clic en ellos, en lugar de hacer clic en un búfer?
Dibujó
@lawlist: no creo que esto ayude porque el evento hasta llega incluso más tarde. ¡Ni siquiera puedo decir que el marco estuvo inactivo durante el evento inactivo!
Edam
2
@Drew: bueno, podría, pero es fiddley. Prefiero poder hacer clic en la ventana X, como puedo cuando emacs se ejecuta en una terminal.
Edam
Este es un comportamiento muy molesto de hecho. Lo evito al no usar el mouse, es decir. usando Alt + Tab y co. para cambiar entre cuadros.
GergelyPolonkai

Respuestas:

1

No creo que esto sea posible desde Emacs. El problema es que tan pronto como hace clic en el marco, el administrador de ventanas selecciona ese marco. Emacs lo ve así inmediatamente como el marco seleccionado.

Su propio código de prueba muestra esto. Ningún aviso de cualquiera mouse-drag-regiono mouse-set-point(o cualquier otra función de Emacs) hará ninguna diferencia.

(Quizás hay algo que puedes hacer en el nivel X11: no sé).

Dibujó
fuente
¿No podría rastrear el cuadro seleccionado a través de post-command-hook, registrar todas las posiciones de los puntos y revertirlas cuando cambie el cuadro seleccionado? No sería eficiente, pero funcionaría.
PythonNut
@PythonNut: Ugh. Tal vez. Intentalo. post-command-hookEs el último recurso de un sinvergüenza. ;-) Todos lo usamos para muchas cosas, pero es un martillo pesado.
Dibujó el
1

No es exactamente lo que estás pidiendo, pero esto funciona bien para mí:

(global-unset-key [down-mouse-1])   ; no dragging nonsense
(global-set-key [mouse-1] 'mouse-select-window)  ; no setting point

Esto no coincide exactamente con su solicitud, ya que no solo se activa el marco, sino que también se hace clic en la ventana. Pero, creo que eso es útil. El doble clic mueve el punto, el simple clic no.

DaveL
fuente