Estou tentando desabilitar completamente o clique do meio para colar de um buffer, usando a solução da Radivarig .
Coloque isso em
~/.xbindkeysrc
"echo -n | xsel -n -i; pkill xbindkeys; xdotool click 2; xbindkeys" b:2 + Release
Essa solução, no entanto, depende xsel
(ou, de forma equivalente, de xclip
) concluir seu trabalho rapidamente.
Recentemente, notei um atraso de vários segundos para xsel
e xclip
ao tentar limpar o buffer primário.
Existe uma maneira menos "educada" do que qualquer outra coisa xsel
ou xclip
está fazendo para forçar o X a esvaziar um buffer específico?
A distribuição Linux em questão é Manjaro ... isso pode ser um bug específico do Manjaro ou do Arch, mas informações orientadas ao usuário final sobre como interagir com o servidor X11 sem xsel
ou xclip
ou outra ferramenta semelhante parecem estar um pouco ausentes.
~ > xclip -selection primary -verbose -in </dev/null
Connected to X server.
Using selection: XA_PRIMARY
Using UTF8_STRING.
Waiting for selection requests, Control-C to quit
Waiting for selection request number 1
Waiting for selection request number 2
Time: 13s
~ > xclip -selection primary -verbose -in </dev/null
...
Time: 11s
~ > xclip -selection primary -verbose -in </dev/null
...
Time: 23s
Eu anexei gdb
a um dos hangs xclip
e parece estar travado esperando por uma resposta do servidor X.
(gdb) where
#0 0x00007f905e1f1b78 in poll () from /usr/lib/libc.so.6
#1 0x00007f905dc68630 in ?? () from /usr/lib/libxcb.so.1
#2 0x00007f905dc6a2db in xcb_wait_for_event () from /usr/lib/libxcb.so.1
#3 0x00007f905e306009 in _XReadEvents () from /usr/lib/libX11.so.6
#4 0x00007f905e2f4ee1 in XNextEvent () from /usr/lib/libX11.so.6
#5 0x0000563eb8eaea70 in ?? ()
#6 0x00007f905e125223 in __libc_start_main () from /usr/lib/libc.so.6
#7 0x0000563eb8eaf53e in ?? ()
Tentei escrever um programa simplificado usando a API X diretamente, com base em parte do xsel
código-fonte, em particular: https://github.com/kfish/xsel/blob/master/xsel.c#L1003-L1018 .
Para limpar o buffer, xsel parece estar contando com esta propriedade de XSetSelectionOwner
:
Se o novo proprietário (seja um cliente ou None ) não for o mesmo que o proprietário atual da seleção e o proprietário atual não for None , o proprietário atual receberá um evento SelectionClear. Se o cliente proprietário de uma seleção for encerrado posteriormente (ou seja, sua conexão for fechada) ou se a janela proprietária especificada na solicitação for posteriormente destruída, o proprietário da seleção reverterá automaticamente para None , mas o último -o tempo de mudança não é afetado. O átomo de seleção não é interpretado pelo servidor X. XGetSelectionOwner() retorna a janela do proprietário, que é relatada nos eventos SelectionRequest e SelectionClear. As seleções são globais para o servidor X.
Aqui está minha tentativa de reduzir xsel
apenas a funcionalidade de que preciso.
Estou assumindo que o proprietário do XA_PRIMARY
buffer geralmente não é None
. Estou configurando-o para None
dentro do corpo do meu programa C e esperando que funcione.
// clear.c
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <assert.h>
// always debug
#undef NDEBUG
static Display * display = NULL;
static char * display_name = NULL;
static void clear_selection(void)
{
printf("%d\n", 300);
display = XOpenDisplay(display_name);
assert(display != NULL);
printf("%d\n", 200);
XSetSelectionOwner(display, XA_PRIMARY, None, CurrentTime);
printf("%d\n, 500);
XSync(display, False);
return;
}
int main(void)
{
printf("%d\n", 100);
clear_selection();
printf("%d\n", 200);
return 0;
}
Este programa executa e imprime
100
300
400
500
200
como esperado.
No entanto, ele falhou ao limpar o buffer primário.
xclip -selection -primary out
mostra a mesma coisa antes e depois.
Isso não funcionará. Como a primeira linha do
DESCRIPTION
deXSetSelectionOwner(3)
diz:Você terá que passar um timestamp real, que você pode obter de um
XEvent
recebido do servidor. Isto é o que eu fiz na minha própria implementação dexsel
:Eu defino uma propriedade em uma janela, espero pelo
PropertyNotify
evento e então pego o timestamp daXPropertyEvent
estrutura. A janela pode ser umaInputOnly
. Isso também é descrito no manual de programação xlib, ou em alguma página de manual do X11.Infelizmente, isso também significa que seu pequeno programa também não será rápido o suficiente, pois terá que esperar por esse evento ;-)
Não acho que as respostas para a pergunta vinculada sejam satisfatórias. É melhor você explorar usando algum
LD_PRELOAD
hack ou modificando os programas que estão causando problemas.