Faça o atalho de teclado funcionar com a tela bloqueada

1

Atualmente, uso o slock para bloquear a tela. Ele intercepta todas as teclas digitadas, impedindo que elas alcancem o gerenciador de janelas (no meu caso Fluxbox ). Isso é bom.

No entanto, quero poder usar um atalho de teclado específico definido, mesmo quando a tela está bloqueada (sem desbloquear a tela). O atalho executa um script que eu escrevi.

Eu considerei modificar o código-fonte do slock para codificar o atalho. No entanto, isso não é totalmente trivial porque o slock roda setuid. Espero que haja uma solução pronta.

(A solução pode envolver a troca de um bloqueador de tela; não estou definido em slock.)

    
por Boris Bukh 16.10.2017 / 22:39

1 resposta

2

Infelizmente, você precisará codificar esse atalho de teclado. Os bloqueadores de tela sempre controlam o teclado, o que significa que eles são o único cliente X em execução que obtém os pressionamentos de tecla. Se eles não fizerem isso, isso significaria que outros aplicativos receberiam pressionamentos de tecla, que é a coisa exata que você não desejaria que acontecesse com um keylocker. A captura acontece com a função XGrabKeyboard que é implementada no Xlib (que é a biblioteca que o slock usa). Em geral, o Xlib é bastante bem documentado e você provavelmente tem até manpages instalados para ele se estiver interessado - por exemplo, man XGrabKeyboard . As outras páginas de manual são similarmente prefixadas com "X" para várias outras funções da biblioteca.

Tanto quanto eu entendo, você está preocupado que setuid atrapalha seu roteiro, certo? Em caso afirmativo, meu primeiro instinto seria fork() slock na inicialização e provavelmente usaria pipes para se comunicar entre pai e filho. Olhando para o código-fonte , você provavelmente poderia bifurcar na linha 340 ou mais (antes do setuid e Depois de ter programado o seu atalho, você pode usar o pipe para se comunicar entre pai e filho Essencialmente, tudo o que você precisa fazer é enviar uma mensagem que permita que o pai ou a criança saiba quando executar seu próprio script Pipes são bastante fáceis em C, então eles são adequados se você não quer mexer com a implementação muito.Este é um exemplo de tubo cheio retirado de este site :

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
        int     fd[2], nbytes;
        pid_t   childpid;
        char    string[] = "Hello, world!\n";
        char    readbuffer[80];

        pipe(fd);

        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)
        {
                /* Child process closes up input side of pipe */
                close(fd[0]);

                /* Send "string" through the output side of pipe */
                write(fd[1], string, (strlen(string)+1));
                exit(0);
        }
        else
        {
                /* Parent process closes up output side of pipe */
                close(fd[1]);

                /* Read in a string from the pipe */
                nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
                printf("Received string: %s", readbuffer);
        }

        return(0);
}
    
por 17.10.2017 / 05:29