Eu uso libgpm para ler eventos de mouse em meu aplicativo de console. Funciona bem se iniciado diretamente do shell. Ele não recebe nenhum evento de mouse se for iniciado a partir de mc (comandante da meia-noite).
O problema está relacionado ao pseudo terminal que o mc cria para o meu processo. Posso resolver parcialmente esse problema forçando o gpm a usar a tela do console especificada passada como segundo argumento para Gpm_Open (em vez de 0 - automático?).
int Gpm_Open(Gpm_Connect*,int);
Existe alguma maneira de saber qual tela do console virtual devo usar ao executar no pseudo tty (criado por mc)? Eu considerei usar o console ativo, mas pode não ser aquele em que meu aplicativo está sendo executado. Provavelmente, percorrer a árvore de processos e verificar se seu TTY é um console real funcionaria, mas não sei como obter tty (nome) para determinado pid e receio que precisaria de privilégios elevados para isso.
Ou espero que haja alguma solução alternativa mais simples?
Edit: Acabei de perceber que iniciar meu processo do mc, mas via sudo (usando a linha de comando) sem forçar o gpm a usar a tela paticular vc - simplesmente funciona!
Consegui criar um script de inicialização simples que é executado
ps f
para obter a árvore de processos. Isso me dá uma boa saída me dizendo tudo que eu preciso:A análise da última linha me leva a processar com um TTY=tty1 real (é claro que é culpado
mc
). Então, finalmente, posso executar meu programa com o número tty de mc analisado como argumento.Outra opção seria recuperar o número tty dentro do meu programa, analisando arquivos '/proc/PID/stat' como
ps
o programa faz, que contém tty dev id e id do processo pai. Mas usar script me faz sentir que é menos dependente do sistema operacional. Exemplo '/proc/PID/stat' abaixo:Então, no final, criei este código: