gue*_*tli 13 linux keyboard desktop
我想挂钩到linux桌面键事件处理.
按CapsLock应该输入某种命令行.
我想要实现的一些命令:
x.(灵感来自vi)这些命令应该适用于任何文本字段:浏览器,邮件客户端,gnome终端,...
AFAIK低级xmodmap在这里不会帮助我.
这样的事情可能吗?
我需要在哪里放钩?
目前的目标平台是Ubuntu> = 14.04
背景:我想把手指放在F和J上,然后在不看键盘的情况下使用电脑.几年以来一直适用于AZ,但是像Pos1/End这样的键不容易访问.
如果您不理解这个问题的一部分,请发表评论.谢谢.
更新
这个问题只是关于如何挂钩关键事件处理.其他东西(命令行)是一个不同的主题.你怎么能抓住这个例子CapsLock x?
Update2 我发现没有简单直接的解决方案.如果你没有答案,但你知道我可以在哪里找到更多的帮助(比如在邮件列表FOO上询问),请告诉我.
Update3 由于有些人不明白我想要什么,我试着解释一下:如果我使用emacs或者bash,我觉得如果计算机控制它:它就像飞行一样,只有很少的动作我可以告诉计算机去做我想要的是.在webbrowser textarea,LibreOffice或使用thunderbird编辑文本会让这种感觉消失.光标移动很麻烦,感觉不像是飞行.我想控制桌面,而不仅仅是一个应用程序,并指着F和J键.
Inn*_*der 10
UPDATE
您可以使用EVIOCGRABioctl,而不是告诉X服务器忽略该设备,我将其添加到下面的程序中.
你需要做以下事情:
1.确保编译并加载了CONFIG_UINPUT模块.我相信Ubuntu已经拥有它.如果您没有看到/dev/uinput设备,请尝试运行modprobe -v uinput以加载模块.
2.以root身份运行以下程序并为其指定键盘设备的路径,例如:
./process /dev/input/by-id/usb-Microsoft_Wired_Keyboard_600-event-kbd
以下程序创建一个名为的伪输入设备uinput-sample,并将来自给定输入设备的所有事件转发给它.我根据http://thiemonge.org/getting-started-with-uinput中给出的样本对其进行了调整
您可以修改它以执行您想要执行的操作.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/uinput.h>
#define die(str, args...) do { \
perror(str); \
exit(EXIT_FAILURE); \
} while(0)
int
main(int argc, char* argv[])
{
int fdo, fdi;
struct uinput_user_dev uidev;
struct input_event ev;
int i;
if(argc != 2) die("error: specify input device");
fdo = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if(fdo < 0) die("error: open");
fdi = open(argv[1], O_RDONLY);
if(fdi < 0) die("error: open");
if(ioctl(fdi, EVIOCGRAB, 1) < 0) die("error: ioctl");
if(ioctl(fdo, UI_SET_EVBIT, EV_SYN) < 0) die("error: ioctl");
if(ioctl(fdo, UI_SET_EVBIT, EV_KEY) < 0) die("error: ioctl");
if(ioctl(fdo, UI_SET_EVBIT, EV_MSC) < 0) die("error: ioctl");
for(i = 0; i < KEY_MAX; ++i)
if(ioctl(fdo, UI_SET_KEYBIT, i) < 0) die("error: ioctl");
memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
uidev.id.bustype = BUS_USB;
uidev.id.vendor = 0x1;
uidev.id.product = 0x1;
uidev.id.version = 1;
if(write(fdo, &uidev, sizeof(uidev)) < 0) die("error: write");
if(ioctl(fdo, UI_DEV_CREATE) < 0) die("error: ioctl");
while(1)
{
if(read(fdi, &ev, sizeof(struct input_event)) < 0)
die("error: read");
ev.time.tv_sec = 0;
ev.time.tv_usec = 0;
if(write(fdo, &ev, sizeof(struct input_event)) < 0)
die("error: write");
}
if(ioctl(fdo, UI_DEV_DESTROY) < 0) die("error: ioctl");
close(fdi);
close(fdo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
暴力破解方法是modyfy / rebuild xserver-xorg-input-evdev软件包并替换/usr/lib/xorg/modules/input/evdev_drv.so。我将从尝试修改中的EvdevQueueKbdEvent()功能开始xf86-input-evdev-2.9.0/src/evdev.c。看起来不是很优雅的解决方案,但是我认为您可以灵活地修改键盘事件队列。
使用XGRabKey()(此处有一些详细信息)和/或可能会减少干扰性的解决方案XGrabKeyboard()。
一些信息,在这里可能会有所帮助(关于XTest扩展)。