密钥发布事件无法识别GTK

时间:2012-07-13 16:51:29

标签: c user-interface keyboard gtk gtk3

我正在编写一个C程序来控制一个ARDrone,并且只要按下一个键就想要无人机移动,当按键不再按下时我希望它停止移动。我将key_press_event和key_release_event附加到我创建的窗口,这里是回调函数:

gint key_press_cb(GtkWidget *widget, 
                GdkEventKey *kevent, 
                gpointer data)
{ 
unsigned int key;
int res;

/* While a key is pressed the drone moves,
 * when the key is released it is put back into hover mode */
if(kevent->type == GDK_KEY_RELEASE) {
    // Hover mode
    printf("--- Hover Mode ---\n");
    ardrone_at_set_progress_cmd(0, 0, 0, 0, 0);
    //res = keyboard_update(BACKSPACE);
} else if(kevent->type == GDK_KEY_PRESS) {

    key = kevent->keyval;
    g_message("Key pressed: %c [%d]", key, key);

    res = keyboard_update(key); 
}

return TRUE;
}

如果我在短时间内按下按键,我将收到按键释放事件,但是当按住它2秒钟后,我将看不到按键释放事件。我想这可能是因为我在按住键的同时不断收到key_press_events;有没有办法禁用那个重复?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下

void gtk_widget_add_events(GtkWidget* widget, gint event_mask);

其中event_mask应为GDK_KEY_RELEASE_MASK | GDK_KEY_PRESS_MASK 您还应该在key-release-event

上触发事件处理程序

要获得更详细的答案,需要更多代码和输出信息。

答案 1 :(得分:0)

如果有人在想,我发现了问题。在我的keyboard_update()函数中,当用户按下相应的键时,我正在调用g_signal_emit_by_name(G_OBJECT(/*button*/), "activate", NULL)按下按钮。删除此功能后,密钥发布事件再次被识别。不知道为什么会这样,但我现在可以没有这个功能。