Verhindern Sie, dass Mausklicks in inaktiven Frames vom Punkt der Neupositionierung entfernt werden

11

Ich möchte verhindern, dass der "erste" Klick auf einen Frame in einem inaktiven X-Fenster andere Auswirkungen hat, als den Frame zu aktivieren. Insbesondere möchte ich nicht, dass der Punkt neu positioniert wird.

Das Problem ist , dass ich nicht zu erkennen scheinen , dass er Rahmen war inaktiv , wenn ich die Maus - Klick erhalten. Der folgende Code zeigt also immer"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)

Wie erkenne ich, dass der Frame zuvor inaktiv war?

Oder hat jemand bereits erreicht, was ich anderswo zu tun versuche?

Hinweis: Ich frage nach etwas anderem als dieser anderen Frage , bei der es um inaktive Fenster geht, nicht um inaktive Frames.

Edamer
quelle
Sie möchten die Tastenkombination für ändern mouse-set-pointund eine eigene Funktion erstellen, um zu tun, was Sie wollen. Machen Sie den C-h kMausklick und sehen Sie sich die beiden (2) Funktionen an , die dort aufgelistet sind.
Lawlist
Haben Ihre Rahmen keine Titelleiste und keinen Rand? Warum klicken Sie nicht einfach auf diese, anstatt in einen Puffer zu klicken?
Drew
@lawlist: Ich denke nicht, dass dies hilft, da das Up-Event noch später kommt. Ich kann nicht einmal sagen, dass der Frame während des Down-Events inaktiv war!
Edam
2
@Drew: Nun, ich könnte, aber es ist fiddley. Ich würde es vorziehen, einfach in das X-Fenster klicken zu können, wie ich es kann, wenn Emacs in einem Terminal ausgeführt wird.
Edam
Dies ist in der Tat ein sehr ärgerliches Verhalten. Ich verhindere es, indem ich die Maus überhaupt nicht benutze, dh. mit Alt + Tab und Co. zwischen Frames wechseln.
GergelyPolonkai

Antworten:

1

Ich denke nicht, dass dies innerhalb von Emacs möglich ist. Das Problem ist, dass der Fenstermanager diesen Rahmen auswählt, sobald Sie in den Rahmen klicken. Emacs sieht es somit sofort als den ausgewählten Frame.

Ihr eigener Testcode zeigt dies. Keine Empfehlung von mouse-drag-regionoder mouse-set-point(oder einer anderen Emacs-Funktion) wird einen Unterschied machen.

(Vielleicht gibt es etwas, das Sie auf X11-Ebene tun können - keine Ahnung.)

Drew
quelle
Könnten Sie das ausgewählte Bild nicht über das verfolgen post-command-hook, alle Punktpositionen aufzeichnen und zurücksetzen, wenn sich das ausgewählte Bild ändert? Es wäre nicht effizient, aber es würde funktionieren.
PythonNut
@ PythonNut: Ugh. Könnte sein. Versuch es. post-command-hookist der letzte Ausweg eines Schurken. ;-) Wir alle benutzen es für viele Sachen, aber es ist ein schwerer Hammer.
Drew
1

Nicht genau das, wonach Sie fragen, aber das funktioniert gut für mich:

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

Dies entspricht nicht genau Ihrer Anfrage, da nicht nur der Frame aktiviert wird, sondern auch das angeklickte Fenster. Aber ich finde das nützlich. Ein Doppelklick verschiebt den Punkt, ein Einzelklick nicht.

DaveL
quelle