Я хочу, чтобы «первый» щелчок по рамке в неактивном окне X не оказывал никакого влияния, кроме как активировать рамку. В частности, я не хочу, чтобы это изменило положение.
Проблема в том, что я не могу обнаружить, что он был неактивным, когда я щелкаю мышью. Таким образом, следующий код всегда показывает "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)
Как определить, что кадр был ранее неактивен?
Или кто-то уже достиг того, что я пытаюсь сделать в другом месте?
Примечание: я спрашиваю что-то другое, чем этот другой вопрос , который касается неактивных окон, а не неактивных фреймов.
mouse-set-point
и создать свою собственную функцию, чтобы делать все, что вы хотите. СделайтеC-h k
щелчок мышью и увидите две (2) функции , которые там перечислены.Ответы:
Я не думаю, что это возможно изнутри Emacs. Проблема в том, что как только вы щелкаете по фрейму, оконный менеджер выбирает этот фрейм. Таким образом, Emacs сразу видит его как выбранный кадр.
Ваш собственный тестовый код показывает это. Никаких советов ни о
mouse-drag-region
илиmouse-set-point
(или любой другой функции Emacs) не будет иметь никакого значения.(Возможно, есть кое-что, что вы можете сделать на уровне X11 - не знаю.)
источник
post-command-hook
, записать все положения точек и отменить их при изменении выбранного кадра? Это не будет эффективным, но это будет работать.post-command-hook
это последнее прибежище негодяя. ;-) Мы все используем его для многих вещей, но это тяжелый молот.Не совсем то, что вы просите, но это хорошо работает для меня:
Это не совсем соответствует вашему запросу, так как активируется не только рамка, но и окно. Но я считаю, что это полезно. Двойной щелчок перемещает точку, одиночный щелчок - нет.
источник