注意请参阅以下更新;奇怪的事情现在已经出现了。
我正在解释各种鼠标事件处理程序中的GdkEvent***.state
字段:
gdk_keymap_add_virtual_modifiers(
gdk_keymap_get_for_display(gdk_window_get_display(e.window)),
(GdkModifierType *) &e.state);
// (gdk_keymap_get_default() has the same effect)
但是,当我按下Alt键时,这似乎没有正确地映射到GDK_META_MASK
。
e.state
似乎是0x18(MOD1
| MOD2
)。我写了一个小的C程序(下面)来打印GDK认为物理密钥代码应该是什么,然后它返回(输出重新格式化以便清晰)
gdk_keymap_map_virtual_modifiers output gboolean return from that
meta 0x10000000 1
super 0x4000040 1
hyper 0x8000040 1
xmodmap说
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
发生了什么事?我正在运行GTK + / GDK 3.10.7,但我的程序至少以GTK + 3.4为目标。感谢。
// pietro gagliardi 19 march 2014
#include <stdio.h>
#include <gtk/gtk.h>
GdkKeymap *def;
void dovirt(char *name, GdkModifierType mod)
{
GdkModifierType from, to;
gboolean mapped;
from = mod;
gdk_keymap_add_virtual_modifiers(def, &from);
to = mod;
mapped = gdk_keymap_map_virtual_modifiers(def, &to);
printf("%s\t0x%X\t0x%X\t%d:0x%X\n",
name, mod, from, mapped, to);
}
int main(void)
{
gtk_init(NULL, NULL);
def = gdk_keymap_get_default();
printf("name\tmod\tadd\tmap\n");
dovirt("meta", GDK_META_MASK);
dovirt("super", GDK_SUPER_MASK);
dovirt("hyper", GDK_HYPER_MASK);
return 0;
}
在sudo中运行kate进行编辑后,我在命令行中看到了这一点:
kglobalaccel(19598) KKeyServer::initializeMods: Your keyboard setup doesn't provide a key to use for meta. See 'xmodmap -pm' or 'xkbcomp $DISPLAY'
kglobalaccel(19598) KKeyServer::initializeMods: Your keyboard setup doesn't provide a key to use for meta. See 'xmodmap -pm' or 'xkbcomp $DISPLAY'
kglobalaccel(19598) KKeyServer::initializeMods: Your keyboard setup doesn't provide a key to use for meta. See 'xmodmap -pm' or 'xkbcomp $DISPLAY'
xmodmap -pm
只是说我为xmodmap粘贴的内容; xkbcomp $DISPLAY
不产生输出和退出状态0.而Alt似乎在其他地方工作......包括凯特。现在我真的很困惑
现在解释key-press-event
/ key-release-event
; GdkKeyEvent.keyval
返回GDK_KEY_Alt_L
和GDK_KEY_Alt_R
...