2012-07-13 1 views
0

J'écris un programme C pour contrôler un ARDrone, et je voudrais que le drone bouge tant qu'une touche est enfoncée, et quand la touche n'est plus appuyée, je veux qu'elle s'arrête en mouvement. J'attaché à la fois un key_press_event et key_release_event à la fenêtre, j'ai créé et est la fonction de rappel ici:Événement de validation de clé non reconnu GTK

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; 
} 

Je vais obtenir un événement de libération clé si je maintenez la touche pendant une courte période de temps, mais lors de la tenue Je ne verrai pas l'événement de libération de clé pendant 2+ secondes. Je pensais que cela pourrait être parce que je reçois constamment key_press_events tout en maintenant une touche; est-il possible de désactiver cette répétition?

+0

Le code que vous avez posté fonctionne très bien pour moi. Peut-être y a-t-il un autre widget dans la fenêtre qui a le focus et qui avale les événements de lancement de clé. –

+0

Je vais poster tout mon code, j'ai essayé de mettre le focus sur la fenêtre mais il semble que ce soit le bouton 'w' par défaut? – MikeG

Répondre

0

J'ai trouvé le problème si quelqu'un se demandait. Dans ma fonction keyboard_update(), j'appelais g_signal_emit_by_name(G_OBJECT(/*button*/), "activate", NULL) pour que le bouton soit enfoncé lorsque l'utilisateur appuyait sur la touche correspondante. Une fois que j'ai supprimé cette fonctionnalité, l'événement de libération de clé était à nouveau reconnu. Je ne sais pas pourquoi cela arrive, mais je peux vivre sans cette fonctionnalité pour l'instant.

0

Vous pouvez essayer les suivantes

void gtk_widget_add_events(GtkWidget* widget, gint event_mask); 

event_mask devrait être GDK_KEY_RELEASE_MASK | GDK_KEY_PRESS_MASK Et vous devez également déclencher le gestionnaire d'événements sur le key-release-event

Pour une réponse plus détaillée du code et des informations de sortie est nécessaire.

+0

Merci pour la réponse. J'ai essayé et j'ai toujours les mêmes problèmes. Je vais modifier le message principal pour inclure le code approprié pour créer la fenêtre et ajouter les signaux/événements. Je peux joindre tout mon code ici si vous le souhaitez mais c'est assez long. – MikeG