Linux 在驅動程式中如何判定 Capslock...等之按鍵狀態?
时间:2010-06-23
来源:互联网
请问在 Linux Device Driver 中如何得知 Capslock, Numlock, ScrollLock 这几个按键的状态?
例如该如何得知现在系统在大写或小写中, 或是 Numlock 已开启?
我 trace 过 keyboard driver, 只知道该如何送 input_event 但不知道该如何得知目前键盘状态,
Document 里的 input 也未提及, 看了几本跟 kernel 与 LDD3 都未提到.
我想要设计 function key 功能, 所以需要知道那几个键该如何使用. (或是有人知道 KEY_FN 这几个 event 该如何使用吗?)
例如该如何得知现在系统在大写或小写中, 或是 Numlock 已开启?
我 trace 过 keyboard driver, 只知道该如何送 input_event 但不知道该如何得知目前键盘状态,
Document 里的 input 也未提及, 看了几本跟 kernel 与 LDD3 都未提到.
我想要设计 function key 功能, 所以需要知道那几个键该如何使用. (或是有人知道 KEY_FN 这几个 event 该如何使用吗?)
作者: n00b 发布时间: 2010-06-23
因为我也是 Driver 上的新手~所以请对我讲的保持怀疑求证的态度~
我认为应该由 struct input_dev *dev->led 这理著手
我看的是 usbkbd.c 这个原始码
首先 Capslock 等按钮直觉会想到 input device,按下按钮事件就是 *event( ) 了
指向的是 usb_kbd_event( ) 这个函数。
里面发现:
----------------------------------------------------------------------------------------------------------------------------------------
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
(!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) |
(!!test_bit(LED_NUML, dev->led));
----------------------------------------------------------------------------------------------------------------------------------------
这是 dev->led 存在所有 led 的状态,而 LED_CAPSL 等定义,表示第几个 bit 代表该 LED
如 LED_CAPSL 就是 0x01,第二个 bit
这一行将键盘相关的LED取出,组成方便辨识的一串bit。
我想,是不是可以直接以 LED 的状态来识别目前的设定?(如大小写)
至於 function key,感觉是视 AP 而有不同的运作方式,Driver 只是帮你改记忆体罢了。
我认为应该由 struct input_dev *dev->led 这理著手
我看的是 usbkbd.c 这个原始码
首先 Capslock 等按钮直觉会想到 input device,按下按钮事件就是 *event( ) 了
指向的是 usb_kbd_event( ) 这个函数。
里面发现:
----------------------------------------------------------------------------------------------------------------------------------------
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
(!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) |
(!!test_bit(LED_NUML, dev->led));
----------------------------------------------------------------------------------------------------------------------------------------
这是 dev->led 存在所有 led 的状态,而 LED_CAPSL 等定义,表示第几个 bit 代表该 LED
如 LED_CAPSL 就是 0x01,第二个 bit
这一行将键盘相关的LED取出,组成方便辨识的一串bit。
我想,是不是可以直接以 LED 的状态来识别目前的设定?(如大小写)
至於 function key,感觉是视 AP 而有不同的运作方式,Driver 只是帮你改记忆体罢了。
作者: id4fox 发布时间: 2010-08-20
参考:
* Console IOCTLs Under Linux
* Linux Programming Hints | Linux Journal
* man 4 console_ioctl (KDGETLED/KDSETLED)
Kernel 里的 code 是在 drivers/char/vt_ioctl.c
指令是 setleds
我自己试的结果,在 gnome terminal 里去下 setleds 或在程式里用 ioctl ,会出现 EINVAL 的错误,无法读取 keyboard 灯号的状态
如果是在纯 console 下就可以。
作者: elleryq 发布时间: 2010-08-23
X 里的话,根据这篇 hardy.dropblog › Trying to detect the state of the caps-lock key in X 的回覆里,可以用 XkbGetIndicatorState
或是用 xset q | grep LED 来取得。
作者: elleryq 发布时间: 2010-08-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28