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