잠금 화면에서 키보드 단축키가 작동하도록 설정

잠금 화면에서 키보드 단축키가 작동하도록 설정

나는 현재 사용하고 있습니다잠그다잠금 화면. 모든 키 입력을 가로채어 창 관리자에 도달하지 못하게 합니다(제 경우에는플럭스 박스). 이것은 좋은 일입니다.

하지만 화면이 잠겨 있을 때에도(화면 잠금을 해제하지 않고도) 특정 사용자 정의 키보드 단축키를 사용할 수 있었으면 좋겠습니다. 이 바로가기는 내가 작성한 스크립트를 실행합니다.

나는 바로가기를 하드코딩하기 위해 slock의 소스 코드를 수정하는 것을 고려했습니다. 그러나 slock이 setuid로 실행되기 때문에 이것은 완전히 사소한 것은 아닙니다. 준비된 해결책이 있었으면 좋겠습니다.

(해결책에는 화면 잠금을 전환하는 것이 포함될 수 있습니다. 저는 화면 잠금을 slock으로 설정하지 않았습니다.)

답변1

불행하게도 이와 같은 키보드 단축키를 하드코딩해야 합니다. 화면 잠금 장치는 항상 키보드를 제어합니다. 즉, 화면 잠금 장치는 키 입력을 받을 수 있는 실행 중인 유일한 X 클라이언트라는 의미입니다. 그렇지 않은 경우 다른 응용 프로그램이 키 누름을 수신하게 되며 이는 키 잠금으로 인해 발생하고 싶지 않은 일입니다. 잡기는 XGrabKeyboardXlib(slock에서 사용하는 라이브러리)에 구현된 함수에서 발생합니다. 일반적으로 Xlib는 잘 문서화되어 있으며 관심이 있다면 해당 맨페이지를 설치해 볼 수도 있습니다 man XGrabKeyboard. 다른 맨페이지에도 마찬가지로 다양한 다른 라이브러리 기능에 대해 "X" 접두사가 붙습니다.

setuid내가 이해한 바에 따르면, 이로 인해 스크립트가 엉망이 될까 봐 걱정하고 계시죠 ? 그렇다면 첫 번째 본능은 fork()시작 시 작업 속도를 늦추고 파이프를 사용하여 부모와 자식 간의 통신을 하는 것입니다. 보고 있다소스 코드, 340번 줄을 중심으로 분기하고 파이프를 설정할 수 setuid있습니다. 바로가기를 작성한 후에는 파이프를 사용하여 부모와 자식 사이에 통신할 수 있습니다. 기본적으로 해야 할 일은 메시지를 보내는 것뿐입니다. 어린이와 부모는 언제 자신의 스크립트를 실행해야 하는지 알고 있습니다. C로 파이프하는 것은 매우 쉽습니다. 따라서 구현을 너무 많이 조작하고 싶지 않다면 여기에 전체 파이프 예제가 있습니다.이 웹사이트:

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

관련 정보