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.
mouse-set-point
y crear su propia función para hacer lo que quiera. HagaC-h k
clic con el mouse y vea las dos (2) funciones que se enumeran allí.Respuestas:
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-region
omouse-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é).
fuente
post-command-hook
, registrar todas las posiciones de los puntos y revertirlas cuando cambie el cuadro seleccionado? No sería eficiente, pero funcionaría.post-command-hook
Es el último recurso de un sinvergüenza. ;-) Todos lo usamos para muchas cosas, pero es un martillo pesado.No es exactamente lo que estás pidiendo, pero esto funciona bien para mí:
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.
fuente