AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 475906
Accepted
Greg Nisbet
Greg Nisbet
Asked: 2018-10-17 13:46:16 +0800 CST2018-10-17 13:46:16 +0800 CST 2018-10-17 13:46:16 +0800 CST

Limpe o buffer X específico diretamente, sem passar por xsel ou xclip

  • 772

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 xsele xclipao tentar limpar o buffer primário.

Existe uma maneira menos "educada" do que qualquer outra coisa xselou xclipestá 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 xselou xclipou 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 gdba um dos hangs xclipe 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 xselcó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 xselapenas a funcionalidade de que preciso.

Estou assumindo que o proprietário do XA_PRIMARYbuffer geralmente não é None. Estou configurando-o para Nonedentro 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 outmostra a mesma coisa antes e depois.

x11 x
  • 1 1 respostas
  • 405 Views

1 respostas

  • Voted
  1. Best Answer
    mosvy
    2018-10-17T14:32:54+08:002018-10-17T14:32:54+08:00
      XSetSelectionOwner(display, XA_PRIMARY, None, CurrentTime);
    

    Isso não funcionará. Como a primeira linha do DESCRIPTIONde XSetSelectionOwner(3)diz:

    A função XSetSelectionOwner altera o proprietário e a hora da última alteração para a seleção especificada e não tem efeito se a hora especificada for anterior à hora atual da última alteração da seleção especificada ou for posterior à hora atual do servidor X.

    Você terá que passar um timestamp real, que você pode obter de um XEventrecebido do servidor. Isto é o que eu fiz na minha própria implementação de xsel:

    Time getctime(void){
            XSelectInput(dpy, w, PropertyChangeMask);
            XStoreName(dpy, w, "xsel");
            for(;;){
                    XEvent e;
                    XNextEvent(dpy, &e);
                    if(e.type == PropertyNotify && e.xproperty.window == w)
                            return e.xproperty.time;
            }
    }
    

    Eu defino uma propriedade em uma janela, espero pelo PropertyNotifyevento e então pego o timestamp da XPropertyEventestrutura. A janela pode ser uma InputOnly. 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_PRELOADhack ou modificando os programas que estão causando problemas.

    • 2

relate perguntas

  • uso do chaveiro gnome sem uma sessão x

  • Arch Linux: executando o VirtualBox (VM) sem um gerenciador de janelas

  • erro de falta de dois pontos xrdb

  • Tornar as coisas maiores sem alterar a resolução? [AMIGO]

  • O encaminhamento SSH X11 funciona apenas ao usar

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve