Program The Steam Controller Without Using The Steam SDK


Over the holidays I picked up a Steam Controller and if I am honest I’ve been somewhat underwhelmed.  I never once found a game that performed better than using an XBox One or Keyboard/Mouse, rendering it kind of useless to me.  I thought no major loss, I’ll go ahead and write some code and share it here, making a small amount of lemonade from lemons life gave.  It was after all and interesting device with a world of potential.  Then I discovered the only way to take advantage of the Steam Controller was through the the Steam SDK.  Eww.


So, for the most part, this device has just past time in the bad purchases junk drawer.  A recent development has occurred that may cause me to dust off the controller after all.  A library has been released on Steam enabling you to utilize the controller without the Steam SDK.  Fro the github repository:

This is a little C library for Linux based operating systems that allows accessing the Steam Wireless Controller as a gamepad. It exposes all button and axis data as well as acceleration, angular velocity and spatial orientation.

It is also possible to configure certain controller features and use its haptic feedback capabilities.


Get started

Get the source and build it. The project can be built with CMake, but I guess you could just compile the .c file into a library.

First you need to enumerate all available devices and iterate over them. Use SteamController_Open to get a device handle:

SteamControllerDeviceEnum *pEnum = SteamController_EnumControllerDevices();  while (pEnum) {      SteamControllerDevice *pDevice = SteamController_Open(pEnum);        // ... store pDevice for later use ...        pEnum = SteamController_NextControllerDevice(pEnum);  }  

After that you can use SteamController_Configure with the desired flags to set up the controller. Then you useSteamController_ReadEvent to receive updates about connection status, button, axis and vector values and battery voltage.

Use SteamController_UpdateState to accumulate events into a controller state.

See example.c for a very crude, very rudimentary example.

You may be thinking at this point that the library is Linux only by that description.  Fortunately, there was this recent commit:

The API was changed to use opaque data types to aid porting to different platforms. Support  for Windows platforms was added and common functionality was separated into groups  with similar concerns.  

Very cool work. Anybody else out there pick up a Steam controller and love the thing? If so, in what scenarios are you using it?

Scroll to Top