- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在为Linux(在Raspberry Pi硬件下)开发GUI,并且我对键盘有一个(很基本的)问题。
我可以通过使用input/eventX文件来处理keypressed,keyreleased ...,但是我得到的唯一是keyCode(显然)。
我想知道如何映射这些keyCode以从中获取字符?
最佳答案
此映射由控制台控制台的内核完成(请参阅dumpkeys或运行sudo dumpkeys -l
以查看当前控制台映射),并由X服务器针对X服务器应用程序(使用xmodmap -pm -pk
查看映射;第一列没有任何修饰符,第二列)单独使用第一个修饰符,第三列使用第二个修饰符,第四列使用两个第一个修饰符,第五列使用第三个修饰符,依此类推。通常,键盘映射文件在man 5 keymaps中描述。
您的问题是,如何自己进行映射。
首先,您需要了解映射的工作方式。在Linux输入子系统中,有9个修饰符,即逻辑状态,可以组合以产生29 = 512个不同的修饰符状态中的任何一个。它们具有完全任意的名称,与任何特定密钥本身无关,均为而不是。 (它们是Shift(20 = 1),AltGr(21 = 2),Control(22 = 4),Alt(23 = 8),ShiftL(24 = 16),ShiftR(25 = 32),CtrlL(26 = 64) ),CtrlR(27 = 128)和CapsShift(28 = 256)。将“ Activity ”项相加,以获得实际的修改器状态。)
假设您使用int
描述每个键盘结果;对于Unicode代码点(字符)为正,对于自定义操作键(如“向上光标”,“向下翻页”等)为负。然后,可以使用以下最小示例来描述每个键的映射:
struct mod_one {
__u16 down; /* State change when pressed */
__u16 up; /* State change when released */
};
struct key_one {
size_t count; /* Number of states for this keycode */
unsigned short *state; /* Array of states */
int *result; /* Array of keyboard_event() return values */
};
struct key_map {
/* Modifier keys */
size_t mod_count;
__u16 *mod_code;
struct mod_one *mod_xor;
/* Non-modifier keys */
size_t key_count;
__u16 *key_code;
struct key_one *key_map;
};
int keyboard_event(const struct input_event *const ev, unsigned short *const state, const struct key_map *const map)
{
/* Note: Uses linear search for simplicity.
* In practice, you want the arrays to be sorted,
* and use a binary search instead.
*/
/* Sanity check for NULL pointers. */
if (!ev || !state || !map)
return 0;
if (ev->type == EV_KEY) {
size_t i, k;
/* Is it a modifier key? */
for (i = 0; i < map->mod_count; i++)
if (ev->code == map->mod_code[i]) {
/* Yes. Apply the state change. */
if (ev->code == 0)
*state ^= map->mod_xor[i].down;
else
if (ev->code == 1)
*state ^= map->mod_xor[i].up;
break;
}
/* Does this event map to a keypress?
* We rely on kernel/device autorepeat. */
if (ev->code == 0 || ev->code == 2)
for (i = 0; i < map->key_count; i++)
if (ev->key == map->key_code[i]) {
for (k = 0; k < map->key_map[i].count; k++)
if (*state == map->key_map[i].state[k])
return map->key_map[i].result[k];
}
}
return 0;
}
struct key_map
有点繁琐。但是,希望您可以看到逻辑(也许可以通过简单的
struct key_map
尝试一下,并观察
*state
的更改和返回值)。在实际程序中,我想我将分别处理shift/capslock状态,并为每个修饰键使用单个掩码(按下时为或键状态,释放时为nand(而非键),带有shift和caps锁定状态互为异或,因此,如果修改器状态因某种原因感到困惑,那么多次敲击这些键将始终可以修复状态。
char
是很简单的。但是,如果在编辑过程中使用Unicode字符串,则编辑字符串(尤其是将光标移至字符串中以及删除单个字符)会更加容易。 (我更喜欢将UTF-8用于“不可变的”字符串,但是在编辑小部件时,为了简单起见,将它们转换为
wchar_t
或类似的代码。UTF-8⇔UCS4转换很简单。)
\xE2\x82\xAC
表示。如果您不能支持它,不要指望欧洲人使用您的UI。而且,不,ISO-8859-15也不会真正削减它,即使它确实有€。)
关于c - Linux C-keyMapping keyCodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582279/
我正在尝试向我的一个键映射绑定添加计数。然而,以下情况并未如预期那样工作:。如果我使用组合键50,则只会添加一行,并且编辑器处于插入模式。只有在我自己按了键之后,才会出现额外的4行,并且编辑器会切换到
在我的sublime-keymap文件中,我已经有了: { "keys": ["shift+space"], "command": "move", "args": {"by": "characters
我正在尝试将 key 绑定(bind)到某些组件。我的问题是,只有最后一个组件才会绑定(bind)一个 key 。例如: switch(element.id) { case "menu
我想为我的终端提供类似vim的导航,所以我补充道: set editing-mode vi set keymap vi 我的.inputrc文件基于this。editing-mode vi添加vi导航
使用 ExtJS 4.1.1,即使在 Ext.util.KeyMap 中我设置了 defaultEventAction: 'preventDefault' 并且在 fn : 函数中我也设置了 e.pr
我目前正在为Linux(在Raspberry Pi硬件下)开发GUI,并且我对键盘有一个(很基本的)问题。 我可以通过使用input/eventX文件来处理keypressed,keyreleased
在 Java 中,通过使用非默认系统外观,我们将拥有不同的键盘映射。 例如我正在使用 Mac OS X 并使用 Substance 外观(非默认系统外观)。结果是我丢失了用于全选文本组件的“元”键在
我开始自定义 Atom 编辑器,并且在尝试更改 Tree View:Toggle 的键映射时遇到了困难。 我把它放在我的用户 keycap.cson 文件中: '.editor': 'ctrl-t':
是否有可用于键映射的命令,用于在 Atom 编辑器中切换不可见项的显示。显示/隐藏不可见命令? 我会去哪里寻找这样的命令? 最佳答案 是 对于 Linux 和 Windows: 1) 按 Ctrl+S
我是一位 IntelliJ 老用户,现在正在开发一个需要 Eclipse 的项目。我不介意学习 Eclipse 默认键盘快捷键(如果有),但是很多操作都没有分配快捷键(grrrr!) 我想知道是否有任
创建/绑定(bind) KeyMaps 到视口(viewport)的最佳位置是什么? 给定一个像这样的非常简单的视口(viewport): Ext.define('EmptyTemplate.view
function Keymap(bindings) { this.map = {}; // Define the key identifier->handler map if (
我找不到关于所有这些之间关系的简明答案,所以我可以选择最佳实践并继续前进。 JTextComponent有: 旧的 addKeyListener(..)。我们编写一个 KeyListener,其中包含
我正在设置我自己的键映射,想知道是否有设置键的选项来切换正在处理的文件类型。因此,例如,如果我有一个普通的纯文本文件并希望它成为一个 css 文件,我将有一个将文档类型更改为 css 的键映射。可能的
由于我经常在适用于 Windows 的 Android Studio 和适用于 Mac 的 Android Studio 之间切换,我开始创建一个统一的快捷方式配置来让我的生活更轻松:-) 我需要在两
为了完善我正在开发的应用程序,我为常见任务添加了键盘快捷键。我可以起诉 Ext.KeyMap 这样做... var map = new Ext.KeyMap("my-element", { k
IntelliJ IDEA Keymap 中的“缩写”功能有什么用? Web help on Keymap对此保持沉默。 最佳答案 根据 JetBrains 支持部门的 Andrey Dernov 的
我想设置一个键映射来在 Netbeans 7.2 中生成 java 文档的结构。我想知道是否有人知道该怎么做? 最佳答案 已经设置了一个键映射来执行此操作,称为“生成 Javadoc”。如果您转到工具
描述: “用户可安装的键盘映射”是在 http://developer.android.com/about/versions/jelly-bean.html 上为 Android 4.1 列出的一项功
当我尝试修改 PHPStorm 的键盘映射以像 Sublime Text 一样工作时。我发现很多冲突 PHPStorm 有没有像 Sublime Text 这样的键盘映射配置? 谢谢 最佳答案 我们还
我是一名优秀的程序员,十分优秀!