我正在尝试捕捉用户在图形用户界面窗口上按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,libgtk2.24.4)。但当我在较新的系统(Ubuntu12.10,gcc 4.7.2,libgtk2.24.13)上做同样的事情时,它不能工作。
我在if语句之前添加了g_print("%u\n", event->state);,它显示当我按Ctrl时,event->state是20,而不是文档中的4或1 << 2。如果我将GDK_CONTROL_MASK更改为20,它将在较新的系统上工作,但在旧系统上不起作用。请告诉我为什么会发生这种情况,以及如何修复它。
发布于 2017-10-04 01:52:42
这是因为state还包括像大写锁定和数字锁定这样的修改器。
该解决方案在https://developer.gnome.org/gtk3/stable/checklist-modifiers.html上提供了文档
使用gtk_accelerator_get_default_mod_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')
...https://stackoverflow.com/questions/16226043
复制相似问题