Zapobiegaj kliknięciu myszą nieaktywnych ramek z punktu repozytorium

11

Chcę zapobiec temu, by „pierwsze” kliknięcie ramki w nieaktywnym oknie X miało jakikolwiek wpływ poza aktywowaniem ramki. W szczególności nie chcę, aby zmieniał punkt.

Problem polega na tym, że nie mogę wykryć, że ramka była nieaktywna, gdy kliknąłem myszą. Tak więc następujący kod zawsze pokazuje "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)

Jak wykryć, że ramka była wcześniej nieaktywna?

A może ktoś już osiągnął to, co próbuję zrobić gdzie indziej?

Uwaga: Proszę o coś innego niż to inne pytanie , które dotyczy nieaktywnych okien, a nie nieaktywnych ramek.

ser edamski
źródło
Chcesz zmodyfikować skrót klawiaturowy mouse-set-pointi utworzyć własną funkcję, aby robić, co chcesz. Wykonaj C-h kkliknięciem myszki rzeczy i zobaczyć dwa (2) funkcje , które są wymienione tam.
prawnik
Czy twoje ramki nie mają paska tytułu i ramki? Dlaczego po prostu ich nie klikniesz, zamiast klikać w buforze?
Drew
@lawlist: Nie sądzę, aby to pomogło, ponieważ wydarzenie up przychodzi jeszcze później. Nie mogę nawet powiedzieć, że ramka była nieaktywna podczas zdarzenia w dół!
edam
2
@Drew: cóż, mógłbym, ale to skrzypce. Wolę po prostu móc kliknąć w oknie X, tak jak mogę, gdy emacs działa w terminalu.
edam
To naprawdę bardzo denerwujące zachowanie. Zapobiegam temu, w ogóle nie używając myszy, tj. używając Alt + Tab i co. przełączać między ramkami.
GergelyPolonkai

Odpowiedzi:

1

Nie sądzę, że jest to możliwe z poziomu Emacsa. Problem polega na tym, że jak tylko klikniesz ramkę, menedżer okien wybiera tę ramkę. Emacs postrzega go zatem natychmiast jako wybraną ramkę.

Twój kod testowy to pokazuje. Żadne doradztwo dotyczące żadnej mouse-drag-regionlub mouse-set-point(lub jakiejkolwiek innej funkcji Emacsa) nie będzie miało znaczenia.

(Być może jest coś, co możesz zrobić na poziomie X11 - nie wiem.)

Rysował
źródło
Czy nie możesz śledzić wybranej klatki za pomocą post-command-hook, nagrywać wszystkie pozycje punktów i cofać je, gdy zmienia się wybrana klatka? Nie byłoby wydajne, ale działałoby.
PythonNut
@PythonNut: Ugh. Może. Spróbuj. post-command-hookto ostatnia deska ratunku. ;-) Wszyscy używamy tego do wielu rzeczy, ale jest to ciężki młotek.
Drew
1

Nie do końca to, o co prosisz, ale to działa dobrze dla mnie:

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

Nie odpowiada to dokładnie twojemu żądaniu, ponieważ nie tylko uaktywnia się ramka, ale również klikane jest okno. Ale uważam, że jest to przydatne. Podwójne kliknięcie przesuwa punkt, pojedyncze kliknięcie nie.

DaveL
źródło