Como faço para enviar uma ação de clique do mouse/manter o botão do mouse pressionado para uma janela em segundo plano, sem trazer a janela para a frente?
Quero poder interagir com outras janelas enquanto mantenho pressionado um botão do mouse em um aplicativo específico.
34 anos atrás, uma ferramenta X11 muito útil foi lançada que pode ajudar você a suprimir eventos dados indo para um aplicativo. Embora
xmon
infelizmente não seja mais incluída por muitas distribuições, você pode baixar as fontes de 2017 e recompilá-las. Acabei de fazer isso, usandoxmkmf
o pacote fromimake
para converterImakefile
em um Makefile e, em seguida, executarmake
. Tive que adicionar a opção gcc-fcommon
noCDEBUGFLAGS
Imakefile primeiro, devido a mudanças no gcc. Você também precisará de vários pacotes de desenvolvimento para ter os arquivos de inclusão .h do X11.Os testes mostraram que a ferramenta espera ser capaz de se conectar ao servidor X11 por tcp, em vez de soquetes de domínio Unix, como geralmente é o caso hoje em dia, por segurança. Você pode reiniciar seu servidor X11 com a opção
-listen tcp
de permitir conexões (mas você também precisa fazer mais para desabilitar o acesso remoto, então faça isso apenas em uma rede fechada).Em vez disso, para testar, apenas executei um servidor dentro de um servidor:
Agora você executa o xmon e pede para ele se conectar a este novo servidor:
Você verá uma janela de opções de
xmonui
, masxmond
não tentará conectar até que você inicie um cliente. Por exemplo, de outro terminal:Se falhar, talvez seja necessário alterar
localhost:1
para usar seu nome de host real. Adicione-verbose 1 -debug 255
se precisar depurar.xmond
morrerá se não puder se conectar ao servidor, masxmonui
não notará, então você precisará matá-lo.Se você clicar com o botão do mouse na
xev
janela, deverá ver os eventos usuaisButtonPress
eButtonRelease
daxev
saída, exmond
deverá ver linhas comoClique na interface gráfica para selecionar "nomes", para que o evento completo não seja impresso.
Agora, no painel inferior direito, clique em
5 ButtonRelease
para selecioná-lo; você deverá ver um asterisco:5 * ButtonRelease
. Certifique-se de que oblocking
item acima da lista esteja definido comoon
.Ao clicar na
xev
janela, você não verá maisButtonRelease
eventos dexev
.Não consegui resolver isso diretamente. A resposta de @meuh pode funcionar, mas provavelmente não é sensato usá-la em um sistema produtivo, tanto por questões de segurança quanto de usabilidade.
No entanto, consegui encontrar várias soluções alternativas que podem ser úteis para outras pessoas com um problema semelhante:
xdotool
(minha solução atual) - O Wayland (ao contrário do X11) não envia uma liberação de botão se alguém usaxdotool
para enviarmousedown
e interagir com uma janela diferente depois disso.