按CapsLock应该输入某种命令行.
我要实现的一些命令:
> d / x:从当前光标位置删除直到字符x为止. (灵感来自vi)
a:转到行首,像pos1. (灵感来自于emacs).
> k:删除直到行尾. (灵感来自于emacs).
> …
命令应该在任何文本字段中工作:浏览器,邮件客户端,gnome终端,…
AFAIK低级xmodmap将不会帮助我.
有可能吗?
我需要在哪里放钩子?
目前的平台是Ubuntu> = 14.04
背景:我想把手指放在F和J上,使用电脑而不看键盘.几年来为A-Z工作,但像Pos1 / End这样的键不容易访问.
如果您不了解这个问题的一部分,请发表评论.谢谢.
更新
这个问题只是关于如何挂钩关键的事件处理.其他的东西(命令行)是一个不同的主题.你如何抓住例如CapsLock x?
UPDATE2
我看到没有简单直接的解决方案.如果你没有答案,但你知道我可以在哪里找到更多的帮助(比如在邮件列表FOO上询问),请告诉我.
UPDATE3
由于有些人不明白我想要什么,我试图解释一下:如果我使用emacs或bash,我觉得像电脑一样控制:就像飞行一样,只有很少的动作,我可以告诉电脑做什么我想要.在webbrowser textarea,LibreOffice或使用thunderbird中编辑文本会使这种感觉消失.光标移动很麻烦,不觉得飞行.我想控制桌面,而不只是一个应用程序,并保持我的手指指向F和J键.
解决方法
而不是告诉X服务器忽略该设备,您可以使用EVIOCGRAB ioctl,我添加到下面的程序中.
你需要做以下事情:
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,EV_KEY) < 0) die("error: ioctl"); if(ioctl(fdo,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,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,sizeof(struct input_event)) < 0) die("error: write"); } if(ioctl(fdo,UI_DEV_DESTROY) < 0) die("error: ioctl"); close(fdi); close(fdo); return 0; }