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.
mouse-set-point
i utworzyć własną funkcję, aby robić, co chcesz. WykonajC-h k
kliknięciem myszki rzeczy i zobaczyć dwa (2) funkcje , które są wymienione tam.Odpowiedzi:
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-region
lubmouse-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.)
źródło
post-command-hook
, nagrywać wszystkie pozycje punktów i cofać je, gdy zmienia się wybrana klatka? Nie byłoby wydajne, ale działałoby.post-command-hook
to ostatnia deska ratunku. ;-) Wszyscy używamy tego do wielu rzeczy, ale jest to ciężki młotek.Nie do końca to, o co prosisz, ale to działa dobrze dla mnie:
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.
źródło