我正试图强制启动大写锁定。xset
不适用于我,因此我正在尝试使用setleds
。
在图形控制台中,此命令返回:
> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?
在虚拟终端中,它可以工作,但是效果是该虚拟终端本地的。据我了解,跑步
> setleds -L +caps < /dev/tty1
从虚拟终端(我的X服务器坐在tty1上)应该可以正常工作。但是,这需要root访问。
有没有一种方法可以将命令发送到X服务器下面的控制台,是从所说的xserver还是从另一个VT(没有root)发送的命令?
编辑:根据Mark Plotnik的建议,并根据此处找到的代码,我编写并编译了以下内容:
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#define SCROLLLOCK 1
#define CAPSLOCK 2
#define NUMLOCK 16
void setLeds(int leds) {
Display *dpy = XOpenDisplay(0);
XKeyboardControl values;
values.led_mode = leds & SCROLLLOCK ? LedModeOn : LedModeOff;
values.led = 3;
XChangeKeyboardControl(dpy, KBLedMode, &values);
XkbLockModifiers(dpy, XkbUseCoreKbd, CAPSLOCK | NUMLOCK,
leds & (CAPSLOCK | NUMLOCK) );
XFlush(dpy);
XCloseDisplay(dpy);
}
int main() {
setLeds(CAPSLOCK);
return 0;
}
从Gilles所写的内容来看xset
,我没想到它会起作用,但是从某种意义上说,它确实起作用了:它设置了led,但同时也设置了大写锁定状态。我不完全理解上面的所有代码,因此我可能犯了一个愚蠢的错误。显然,该行XChangeKeyboardControl...
不会更改程序的行为,XkbLockModifiers
而是设置led和capslock状态的原因。
xterm
源代码,它使用了对XChangeKeyboardControl()的调用来设置或取消设置LED,而不会影响大写锁定等的状态。因此,如果可以编译C代码,那是一种方法。
xterm
会影响led?听起来是个好主意,我将使用结果来编辑问题。
xterm
通过发送转义序列ESC [3 q来点亮ScrollLock LED ctlseqs.txt
,根据源附带的文件,但是无法使Num或CapsLock LED亮起并带有参数1和2。也许我需要做答案中提到的XKB配置。xterm
电话XChangeKeyboardControl
中xtermShowLED
和xtermClearLEDs
,但不调用XkbLockModifiers
所有的任何地方。
xdotool key Caps_Lock
从授权的X客户端执行类似操作,尽管这实际上会打开大写锁定。