Search code examples
gokeyboard

How to stop waiting for a keypress after a time


I use this code in my project, but keyboard.GetSingleKey() waiting keystroke. How to make the function not wait for a keypress and return nil (for example, after 1 second)?

package main

import (
    "fmt"
    "github.com/eiannone/keyboard"
)
func main() {
    char, _, err := keyboard.GetSingleKey()
    if (err != nil) {
         panic(err)
    }
    fmt.Printf("You pressed: %q\r\n", char)
}

If key was not pressed output "Key was not pressed",but in another case output "You pressed: " and key name


Solution

  • func getKeyTimeout(tm time.Duration) (ch rune, err error) {
    if err = keyboard.Open(); err != nil {
        return
    }
    defer keyboard.Close()
    
    var (
        chChan  = make(chan rune, 1)
        errChan = make(chan error, 1)
    )
    
    go func(chChan chan<- rune, errChan chan<- error) {
        ch, _, err := keyboard.GetSingleKey()
        if err != nil {
            errChan <- err
            return
        }
        chChan <- ch
    }(chChan, errChan)
    
    select {
    case <-time.After(tm):
        return 0, err
    case ch = <-chChan:
    case err = <-errChan:
    }
    
    return
    }
    
    ch, err := tools.GetKey(time.Millisecond * n)
    if err != nil {
        panic(err)
    }
    if ch != rune(0) {
        fmt.Printf("You pressed: %q\r\n", ch)
    } else {
          fmt.Printf("Key was not pressed")
    }