C GDK信号、按键和按键掩码

C GDK信号、按键和按键掩码,c,gtk,signals,keyboard-shortcuts,gdk,C,Gtk,Signals,Keyboard Shortcuts,Gdk,我正在试图捕捉用户键在GUI窗口上按Ctrl+d退出。我的代码如下所示: static gboolean callback(GtkWidget *widget, GdkEventKey *event, gpointer data) { if(event->state == GDK_CONTROL_MASK && event->keyval == 'd') gtk_main_quit();

我正在试图捕捉用户键在GUI窗口上按Ctrl+d退出。我的代码如下所示:

static gboolean
callback(GtkWidget   *widget,
         GdkEventKey *event,
         gpointer    data)
{
    if(event->state == GDK_CONTROL_MASK && event->keyval == 'd')
        gtk_main_quit();

    return FASLE;
}
这在我的笔记本电脑(Ubuntu11.04、gcc 4.5.2、libgtk 2.24.4)上运行。但是当我在更新的系统(Ubuntu 12.10、gcc 4.7.2、libgtk 2.24.13)上做同样的事情时,它就不起作用了


我添加了
g\u打印(“%u\n”,事件->状态)
if
语句之前,它显示当我按下
Ctrl
时,
事件->状态是20而不是4,或者1
事件->状态是a,这意味着值20并不意味着“20而不是4”,而是“同时4和16”。根据标题,值16(
1发生这种情况是因为
state
还包括诸如Caps Lock和Num Lock之类的修饰符

解决方案记录在:

使用
gtk\u accelerator\u get\u default\u mod\u mask()
获取修改器的位图,这些修改器也是快捷键(Control、Alt、Shift、Super、Hyper和Meta),然后按位和事件状态,例如:

GdkModifierType accel_mask = gtk_accelerator_get_default_mod_mask ();

if (event->state & accel_mask == GDK_CONTROL_MASK && event->keyval == 'd')
    ...

MOD2在许多系统上都是num lock。所以屏蔽它是有意义的。但只有检查控件是否设置了,这意味着它也会将Ctrl+Alt+D、Ctrl+Shift+D等视为Ctrl+D,这也不理想。
GdkModifierType accel_mask = gtk_accelerator_get_default_mod_mask ();

if (event->state & accel_mask == GDK_CONTROL_MASK && event->keyval == 'd')
    ...