电脑按键精灵:GDK信号、按键和按键掩码(what does gdk mean)

我试图抓住用户键按 Ctrl + D 在 GUI 窗口退出。

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

这适用于我的笔记本电脑(Ubuntu 11.04,gcc 4.5.2,libgtk 2.24.4)。但是当我在较新的系统(Ubuntu 12.10,gcc 4.7.2,libgtk 2.24.13)上做同样的事情时,它不起作用。

我在if语句之前添加了g_print("%u\n", event->state);,它显示当我按Ctrl时,event->state是 20,而不是文档中的 4 或 1 & lt;& lt;2。如果我将GDK_CONTROL_MASK更改为 20,它适用于较新的系统,但不适用于旧系统。有人请告诉我

4

event->statebitmap,这意味着值 20 并不意味着“20 而不是 4”,而是“4 和 16 同时”。根据标题,值 16(1 << 4)对应于MOD2修饰符,可能对应于笔记本电脑上的fn键。

一个简单的修复方法是使用&运算符检查控件,同时忽略其他修饰符:

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

这将在两个系统上工作。

0

这是因为state还包括 Caps Lock 和 Num Lock 等修饰符。

解决方案记录在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')
    ...

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(914)
Re dies:在他们的父母去世后 僵尸进程去哪里
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(24条)