C GDK信号、按键和按键掩码
我正在试图捕捉用户键在GUI窗口上按Ctrl+d退出。我的代码如下所示: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();
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')
...