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);
}