Após a atualização, o botão X na barra de título não fecha mais o xterm

3

Em teoria, pressionar o botão fechar deve fechar um xterm. Ele fez antes de eu fazer um aptitude upgrade . (Estou executando o teste Debian). Mas agora isso não acontece - clicar no X não faz nada - mas apenas para alguns xterms.

Em particular, se eu iniciar um xterm a partir do Kla quicklaunch thing, ou o menu K, esses xterms são closeable. Se, no entanto, eu iniciá-lo a partir de um atalho de teclado (khotkeys), então o xterm não pode ser fechado.

Além disso, isso é recursivo: se eu iniciar um xterm a partir de um xterm, ele poderá ser fechado se seu pai for.

Isso não acontece em geral. É apenas para o xterm. Eu testei iniciando esses aplicativos a partir de um xterm que não pode ser fechado, e eles são todos closeable:

  • gvim
  • xclock
  • xditview
  • golfinho
  • konsole

Intercalar outro programa lá quebra a cadeia (por exemplo, iniciando um xterm a partir do konsole):

  • xterm (uncloseable) → xterm (unclosable) → xterm (uncloseable) →…
  • xterm (uncloseable) → konsole (que pode ser fechado) → xterm (que pode ser fechado) →…

Eu verifiquei minhas regras do Windows kwin, eu não tenho nenhuma para o xterm.

    
por derobert 31.12.2013 / 20:25

1 resposta

8

Atualização: é a nVidia

Stephen Dowdy respondeu ao relatório de erros do Debian e sugeriu que pode ser um bug da nVidia. onde está corrompendo máscaras de sinal. Algumas pesquisas encontraram o Debian Bug # 728743 , e de fato mudaram para o Nouveau / MESA -source driver) corrigiu o problema.

Observe que o downgrade para um driver nVidia mais antigo não o fez, o que provavelmente significa que são os drivers da nVidia + algumas versões mais recentes de outras coisas, que eu não me incomodei em rastrear como um comentarista no bug. 331,38. (Estou correndo 331,49 agora, e é realmente fixo).

Resultados da strace

Eu corri strace em ambas as versões. Após alguma filtragem (para fazer o diff funcionar melhor), vejo várias linhas como:

WORKING  rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
*vs*
BROKEN   rt_sigprocmask(SIG_BLOCK, NULL, [HUP], 8) = 0

Parece que a versão quebrada tem o SIGHUP bloqueado. Clicar no X parece enviar um SIGHUP, que é ignorado, então o shell não sai. Você pode fazer um trabalho quebrado, capturando SIGHUP no shell, e não saindo (mas não o contrário, pois parece que o shell nunca recebe o HUP).

Arquivei o erro da Debian # 733816 sobre isso.

Como solução alternativa, você pode agrupar comandos de tecla de atalho usando este programa C trivial:

#include <signal.h>
#include <stddef.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    sigset_t set;

    if (argc < 2) {
        fprintf(stderr, "ERROR: Expected at least a command to run\n"
                "\n"
                "USAGE: %s command [arguments]\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

    sigemptyset(&set);
    sigaddset(&set, SIGHUP);
    sigprocmask(SIG_UNBLOCK, &set, NULL);

    execvp(argv[1], argv+1);
}

Use-o compilando (digamos, para ~/bin/unblock-hup ), em seguida, chame ~/bin/unblock-hup xterm em vez de xterm . Observe que, no módulo de controle Atalhos personalizados, você precisa colocar o caminho completo em seu diretório pessoal; ~ não funciona.

    
por 31.12.2013 / 21:38