2017-02-09 2 views
2

J'utilise haskell et gtk2hs.Comment obtenir les événements keydown et keyup dans haskell?

Existe-t-il un moyen d'obtenir des événements keydown/keyup (keystate est tout aussi bon, l'événement keypress n'est pas) avec ceux-ci?

+1

http://hackage.haskell.org/package/gtk-0.14.6/docs/Graphics-UI-Gtk-Abstract-Widget.html#v:onKeyRelease? – leftaroundabout

+0

Cela fonctionne. Je ne l'avais pas trouvé. –

+3

Bien. Envisagez d'afficher votre solution en tant que réponse vous-même; Cela pourrait être très utile à d'autres personnes. – leftaroundabout

Répondre

3

ces importations seront nécessaires

import Graphics.UI.Gtk.Abstract.Widget 
import Graphics.UI.Gtk.Gdk.Events 

alors c'est de savoir comment répondre aux KeyRelease événements (certains exemples simples):

let handler event = do 
    case event of 
     (Key _ _ _ _ _ _ _ _ _ (Just char)) -> case char of 
      'a' -> doSomething 
      _ -> return() --or whatever type the other cases have 
     _ -> return() 
    return True 

onKeyRelease widget handler 

les nombreux ignorent les modèles contiendraient des informations qui ne sont pas essentiels pour gestionnaires d'événements simples.

Voilà comment l'état d'une clé peut être suivi:

isPressedA <- newIORef False 
let handler event = do 
    case event of 
     (Key released _ _ _ _ _ _ _ _ (Just char)) -> case char of 
      'a' -> writeIORef isPressedA (not released) 
      _ -> return() 
     _ -> return() 
    return True 

onKeyPress window handler 
onKeyRelease window handler 

Le sort contient si la clé a été libéré ou pressée, de sorte que le même gestionnaire peut travailler pour les deux événements.

J'ai fait ce code réagisse à des événements clés de la fenêtre, plutôt que certains widgets', pour éviter les keyPress et l'enregistrement KeyRelease sur différents widgets (il est toujours possible que lors du passage des fenêtres entre les événements)

obtenir un keyDown L'événement peut être fait en suivant s'il y a eu un keyRelease depuis le dernier keyPress.

+0

Salut, j'essaie d'utiliser votre solution pour obtenir un événement clé, mais je ne sais pas comment installer Graphics.UI.Gtk.Abstract.Widget et les événements en utilisant Cabal. N'a pas trouvé le nom du paquet là, pourriez-vous m'aider avec cela? En outre, cette partie du code continue sur Main, non? Merci – alitalvez