使键盘快捷键与锁定屏幕一起使用

使键盘快捷键与锁定屏幕一起使用

我目前使用锁定屏幕。它拦截所有击键,防止它们到达窗口管理器(在我的例子中通量盒)。这是一件好事。

但是,我希望即使在屏幕锁定时也能够使用特定的自定义键盘快捷键(无需解锁屏幕)。该快捷方式运行我编写的脚本。

我考虑修改 slock 的源代码来硬编码快捷方式。然而,这并不完全是微不足道的,因为 slock 运行 setuid。我希望有一个现成的解决方案。

(解决方案可能涉及切换屏幕锁定器;我没有设置为 slock。)

答案1

不幸的是,您必须对这样的键盘快捷键进行硬编码。 Screenlocker 总是会控制键盘,这意味着它们是唯一能够获得按键的正在运行的 X 客户端。如果他们不这样做,则意味着其他应用程序将收到按键操作,这正是您不希望使用按键锁发生的情况。抓取发生XGrabKeyboard在 Xlib(这是 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);
}

相关内容