gamepad

Cross-platform gamepad driver

Pure Nim score 15/100 · tests present · no docs generated

Summary

Latest Version 0.0.16
License MIT
CI Status Failing
Downloads 0
Last Indexed 2026-07-21 05:25

Authors

  • David Konsumer

Installation

nimble install gamepad
choosenim install gamepad
git clone https://github.com/konsumer/nim-gamepad

OS Compatibility

Platform Linux macOS Windows FreeBSD OpenBSD NetBSD Android iOS WASM Embedded
gamepad - - - - - - -

Dependencies

Package Version Optional
nim >= 1.6.10 No

Source

Repository https://github.com/konsumer/nim-gamepad
Homepage https://github.com/konsumer/nim-gamepad
Registry Source nimble_official

README

This is a simple gamepad library for nim. It's a thin, statically-compiled wrapper for libstem_gamepad.

It should work on Windows, Linux, and Mac.

installation

Add this to your .nimble file:

requires "gamepad >= 0.0.16"

usage

import gamepad
import os

proc onGamepadAttached(device: ptr GamepadDevice, context: pointer) {.cdecl.} =
  var js = device[]
  echo "attached: " & $js.deviceID

proc onGamepadRemoved(device: ptr GamepadDevice, context: pointer) {.cdecl.} =
  var js = device[]
  echo "removed: " & $js.deviceID

proc onButtonDown (device: ptr GamepadDevice, buttonID: cuint, timestamp: cdouble, context: pointer) {.cdecl.} =
  var js = device[]
  echo "buttonDown: (" & $buttonID & ")" & $js.deviceID

proc onButtonUp (device: ptr GamepadDevice, buttonID: cuint, timestamp: cdouble, context: pointer) {.cdecl.} =
  var js = device[]
  echo "buttonUp: (" & $buttonID & ")" & $js.deviceID

proc onAxisMoved (device: ptr GamepadDevice, axisID: cuint, value: cfloat, lastValue: cfloat, timestamp: cdouble, context: pointer) {.cdecl.} =
  var js = device[]
  echo "axis: (" & $axisID & ")" & $js.deviceID & " - " & $value


const GAMEPAD_POLL_ITERATION_INTERVAL=30

gamepad.deviceAttachFunc(onGamepadAttached)
gamepad.deviceRemoveFunc(onGamepadRemoved)
gamepad.buttonDownFunc(onButtonDown)
gamepad.buttonUpFunc(onButtonUp)
gamepad.axisMoveFunc(onAxisMoved)
gamepad.init()

var iterationsToNextPoll = 1
var close = false

# do your loop however you like
# this is a simple example that will cleanup on Ctrl-C

proc handler() {.noconv.} =
  close = true
  gamepad.shutdown()
setControlCHook(handler)

echo "Press Ctrl-C to exit"
while not close:
  sleep(100)
  gamepad.processEvents()
  dec iterationsToNextPoll
  if iterationsToNextPoll == 0:
    gamepad.detectDevices()
    iterationsToNextPoll = GAMEPAD_POLL_ITERATION_INTERVAL