Impedir o clique do mouse em quadros inativos a partir do ponto de reposicionamento

11

Quero impedir que o "primeiro" clique em um quadro em uma janela X inativa tenha qualquer efeito, exceto para tornar o quadro ativo. Especificamente, não quero que ele reposicione o ponto.

O problema é que não consigo detectar que o quadro estava inativo quando clico no mouse. Portanto, o código a seguir sempre mostra "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)

Como detecto que o quadro estava inativo anteriormente?

Ou alguém já conseguiu o que estou tentando fazer em outro lugar?

Nota: Estou pedindo algo diferente do que essa outra pergunta , que é sobre janelas inativas, e não quadros inativos.

edam
fonte
Você deseja modificar o atalho de teclado mouse-set-pointe criar sua própria função para fazer o que quiser. C-h kClique com o mouse e veja as duas (2) funções listadas lá.
lawlist
Seus quadros não possuem uma barra de título e uma borda? Por que você não clica nelas, em vez de clicar em um buffer?
Tirou
@lawlist: Eu não acho que isso ajude, porque o evento up chega ainda mais tarde. Eu não posso nem dizer que o quadro estava inativo durante o evento inativo!
edam
2
@ Drew: bem, eu poderia, mas é Fiddley. Eu preferiria apenas clicar na janela X, como posso quando o emacs é executado em um terminal.
edam
Este é realmente um comportamento muito irritante. Eu o evito por não usar o mouse, ou seja. usando Alt + Tab e co. para alternar entre quadros.
GergelyPolonkai

Respostas:

1

Eu não acho que isso seja possível no Emacs. O problema é que, assim que você clica no quadro, o gerenciador de janelas seleciona esse quadro. O Emacs vê-o imediatamente como o quadro selecionado.

Seu próprio código de teste mostra isso. Sem assessoria de qualquer mouse-drag-regionou mouse-set-point(ou qualquer outra função Emacs) fará qualquer diferença.

(Talvez haja algo que você possa fazer no nível X11 - não sei.)

Desenhou
fonte
Não foi possível rastrear o quadro selecionado por meio de post-command-hook, gravar todas as posições dos pontos e revertê-las quando o quadro selecionado mudar? Não seria eficiente, mas funcionaria.
PythonNut
@PythonNut: Ugh. Talvez. Tente. post-command-hooké o último recurso de um canalha. ;-) Todos nós o usamos para muitas coisas, mas é um martelo pesado.
Tirou
1

Não é exatamente o que você está pedindo, mas isso funciona bem para mim:

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

Isso não corresponde exatamente à sua solicitação, pois o quadro não é apenas ativado, mas a janela é clicada. Mas acho isso útil. O clique duplo move o ponto, o clique único não.

DaveL
fonte