Cross-platform C++ input library supporting gamepads, keyboard, mouse, touch

Overview

This project is archived. It's neither maintained nor developed anymore.

Gainput Build Status MIT licensed

Gainput is the awesome C++ input library for your game:

  • handles your input needs from low-level device reading to high-level mapping of user-defined buttons
  • well-documented, clean, lightweight, and easy to use
  • a unified interface on all supported platforms: Android NDK, iOS/tvOS, Linux, macOS, Windows
  • supported devices: keyboard, mouse, gamepad, multi-touch, device built-in sensors
  • Open Source (MIT license)
  • complete list of features
  • API documentation

Usage

#include <gainput/gainput.h>

enum Button
{
	ButtonConfirm
};

gainput::InputManager manager;
manager.SetDisplaySize(displayWidth, displayHeight);
const gainput::DeviceId keyboardId = manager.CreateDevice<gainput::InputDeviceKeyboard>();
const gainput::DeviceId mouseId = manager.CreateDevice<gainput::InputDeviceMouse>();
const gainput::DeviceId padId = manager.CreateDevice<gainput::InputDevicePad>();
const gainput::DeviceId touchId = manager.CreateDevice<gainput::InputDeviceTouch>();

gainput::InputMap map(manager);
map.MapBool(ButtonConfirm, keyboardId, gainput::KeyReturn);
map.MapBool(ButtonConfirm, mouseId, gainput::MouseButtonLeft);
map.MapBool(ButtonConfirm, padId, gainput::PadButtonA);
map.MapBool(ButtonConfirm, touchId, gainput::Touch0Down);

while (running)
{
	manager.Update();

	// May need some platform-specific message handling here

	if (map.GetBoolWasDown(ButtonConfirm))
	{
		// Confirmed!
	}
}

Features

  • Offers a unified interface on all supported platforms. (Some minor changes are necessary to setup the library.)
  • Provides a low-level and high-level interface: Query the state of input devices buttons directly or map device buttons to a user button. That way it's easy to support alternative inputs or change the input mappings around later.
  • Supports recording and playback of input sequences.
  • Features a network server to obtain information on devices and mappings from.
  • Two Gainput instances can sync device states over the network. It's also possible to receive multi-touch inputs from a smartphone's regular browser.
  • Completely written in portable C++.
  • No STL is used. No exceptions are thrown. No RTTI is used. No C++11, and no boost.
  • No weird external dependencies are used. Relies on the existing platform SDKs.
  • Easily set up and built using your favorite IDE/build tool.
  • Listeners can be installed both for devices buttons as well as user buttons. That way you are notified when a button state changes.
  • Gestures allow for more complex input patterns to be detected, for example double-clicking, pinch/rotation gestures, or holding several buttons simultaneously.
  • An external allocator can be supplied to the library so that all memory management is done the way you want it.
  • Supports raw input on Linux and Windows.
  • Gamepad rumbling is supported where available.
  • It's easy to check for all pressed buttons so that offering a way to the players to remap their buttons is easy to implement. Similarly it's easy to save and load mappings.
  • Possibly unnecessary features, like gestures or the network server, are easily disabled.
  • Dead zones can be set up for any float-value button.
  • State changes, i.e. if a button is newly down or just released, can be checked for.

Building

By default, Gainput is built using CMake.

  1. Run mkdir build
  2. Run cmake ..
  3. Run make
  4. The library can be found in lib/, the executables in samples/.

Contributing

Everyone is welcome to contribute to the library. If you find any problems, you can submit them using GitHub's issue system. If you want to contribute code, you should fork the project and then send a pull request.

Dependencies

Gainput has a minimal number of external dependencies to make it as self-contained as possible. It uses the platforms' default ways of getting inputs and doesn't use the STL.

Testing

Generally, testing should be done by building and running Gainput on all supported platforms. The samples in the samples/ folder should be used in order to determine if the library is functional.

The unit tests in the test/ folder are built by the normal CMake build. The executable can be found in the test/ folder. All build configurations and unit tests are built and run by Travis CI whenever something is pushed into the repository.

Alternatives

Comments
  • Build Errors

    Build Errors

    When running 'waf build' I get:

        Build failed
         -> task in 'listenersample' failed (exit status 1):
                {task 49072224L: cxx SampleFramework.cpp -> SampleFramework.cpp.1.o}
        ['G:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\BIN\\amd64\\CL.exe',
        '-O2',
        '/IC:\\Users\\Travis\\Desktop\\Gainput\\build\\release\\lib\\include',
        '/IC:\\Users\\Travis\\Desktop\\Gainput\\lib\\include',
        '/IG:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\INCLUDE',
        '/IG:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\ATLMFC\\INCLUDE',
        '/IC:\\Program Files (x86)\\Windows Kits\\8.0\\include\\shared',
        '/IC:\\Program Files (x86)\\Windows Kits\\8.0\\include\\um',
        '/IC:\\Program Files (x86)\\Windows Kits\\8.0\\include\\winrt',
        '/DGAINPUT_LIB_BUILD=1',
        '/DNDEBUG=1',
        '',
        '..\\..\\samples\\samplefw\\SampleFramework.cpp',
        '/FC',
        '/c',
        '/Fo',
        'samples\\samplefw\\SampleFramework.cpp.1.o']
         -> task in 'recordingsample' failed (exit status 1):
                {task 49072672L: cxx SampleFramework.cpp -> SampleFramework.cpp.1.o}
        ['G:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\BIN\\amd64\\CL.exe',
        '-O2',
        '/IC:\\Users\\Travis\\Desktop\\Gainput\\build\\release\\lib\\include',
        '/IC:\\Users\\Travis\\Desktop\\Gainput\\lib\\include',
        '/IG:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\INCLUDE',
        '/IG:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\ATLMFC\\INCLUDE',
        '/IC:\\Program Files (x86)\\Windows Kits\\8.0\\include\\shared',
        '/IC:\\Program Files (x86)\\Windows Kits\\8.0\\include\\um',
        '/IC:\\Program Files (x86)\\Windows Kits\\8.0\\include\\winrt',
        '/DGAINPUT_LIB_BUILD=1',
        '/DNDEBUG=1',
        '',
        '..\\..\\samples\\samplefw\\SampleFramework.cpp',
        '/FC',
        '/c',
        '/Fo',
        'samples\\samplefw\\SampleFramework.cpp.1.o']
    

    If I re-run it without deleting any folders it passes but I am getting linker errors when I try to use it.

    opened by ZeroInputCtrl 16
  • Angled brackets vs

    Angled brackets vs "" in includes

    Hi,

    First of all, thanks for this great library! I'm trying to compile gainput on OSX and I'm hitting an error about headers not being correctly found:

    "'gainput/gainput.h' file not found with include; use "quotes" instead"

    It seems like you use angled brackets in gainput which Xcode treats as system headers. There's an option called Always Search User Paths (deprecated) that fixes the issue but ideally I wouldn't need to rely on this behavior as it's also marked as deprecated so will disappear in the future.

    Thanks!

    opened by redorav 11
  • Make Error on Ubuntu

    Make Error on Ubuntu

    Hey! I have an error when running the make command in the build folder. I get an error that I should use C++ 11, But i'm unsure how to do this, I read you do it in the Makefile, but how?

    from /home/thybe/Desktop/gainput/lib/source/gainput/GainputAllocator.cpp:2:
    /usr/include/c++/7/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
     #error This file requires compiler and library support \
    

    screenshot from 2018-03-14 19-30-29

    opened by ThybeVB 8
  • MouseButtonLeft triggers KeyLeft true and keeps KeyLeft true when application looses focus

    MouseButtonLeft triggers KeyLeft true and keeps KeyLeft true when application looses focus

    I have a bare bones cocos2d-x 3.9 project. I just noticed that once the running application loses focus, the GetBool() function starts to always return true. This doesn't stop when the application window comes back into focus.

    Edit: Okay so heres what I see now. Left mouse actually causes the key left for keyboard input to register. So when I press left mouse button down, I actually get true for GetBool(KeyLeft). And then once the window looses focus, the GetBool(KeyLeft) stays registered as true until the application is closed.

    Im using the latest version of gainput. Built on mac OS X 10.11.2.

    Heres some snippets of how I'm using gainput.

    enum Key
    {
        KeyLeft
    };
    
    enum Mouse
    {
        MouseLeft
    };
    
    gainput::InputManager manager;
    const gainput::DeviceId keyboardId = manager.CreateDevice<gainput::InputDeviceKeyboard>();
    const gainput::DeviceId mouseId = manager.CreateDevice<gainput::InputDeviceMouse>();
    
    manager.SetDisplaySize(visibleSize.width, visibleSize.height);
    map.MapBool(KeyLeft, keyboardId, gainput::KeyLeft);
    map.MapBool(MouseLeft, mouseId, gainput::MouseButtonLeft);
    
    void HelloWorld::update(float delta)
    {
        manager.Update();]
    
    // This returns true when the mouse left key is down. And then always returns true with the application looses focus
        if (map.GetBool(KeyLeft)) {
            log("LEFT");
        }
    
    }
    
    
    opened by ismyhc 6
  • Deterministic input recording/playback

    Deterministic input recording/playback

    Hey, really liking the library.

    I noticed you use a time stamp for recording and playing back input events. While this works for the most part, I don't believe it can achieve true deterministic reliability (for replaying a session). The framework using your library would have to update its state/input at a fixed frequency, which would replace time stamps with a simple integer counter.

    I plan on making this change for my engine, but I figured I give you a heads up in case you also wanted to support an integer counter for playback. Don't know when I'll get around to it, but I'll submit a pull if you're interested.

    opened by GameOverture 5
  • Is a Joystick supported?

    Is a Joystick supported?

    So, I've properly set up gainput into my Qt project, at least mouse and keyboard inputs are recognized by gainput. Now I am trying to bring my joystick to life but without success so far. Now I am wondering, is it even supported in your library? Is a joystick considered a gamepad? :D Your PadButtons enumerations start with 17, though I know my joystick buttons range from 0 - 11. Thanks in advance!

    opened by alexg-k 5
  • Program crashes when using InputManager

    Program crashes when using InputManager

    I have built and linked gainput. As soon as I add line: gainput::InputManager input;

    I get no warnings/errors, but program crashed right after start. Even a minimal example crashed.

    Any ideas would be appreciated!

    EDIT: I am using msvc 2013 64 bit

    opened by alexg-k 4
  • Windows build and multiple Joystick support?

    Windows build and multiple Joystick support?

    It would be nice to have a section in readme for how to do Windows build. Also, it would be great to include a sample that shows how to select and use joystick if you have multiple ones. The reason this is important is because Unreal engine has a very poor support for game input devices, especially joysticks on Windows, and this library can really help bridge the gap.

    opened by sytelus 2
  • Error in compilation for android

    Error in compilation for android

    Hi, When trying to compile the source for android using instructions in the Readme, I encountered the following error:

    "/lib/source/gainput/touch/GainputInputDeviceTouch.cpp:32:6: error: 'variant' was not declared in this scope"

    I got it compiled by changing the line:

    InputDeviceTouch::InputDeviceTouch(InputManager& manager, DeviceId device, unsigned index, DeviceVariant /variant/) :

    to:

    InputDeviceTouch::InputDeviceTouch(InputManager& manager, DeviceId device, unsigned index, DeviceVariant variant) :

    Am I right to uncomment variant?

    opened by vinod-mv 2
  • Undefined reference errors when using inside a DLL

    Undefined reference errors when using inside a DLL

    I am currently building a tiny game engine, and chose gainput for the input. The engine gets compiled to a dll, which is then linked against and used by a little test game. However, when i have the input system enabled (and link the dll against gainputstatic.a with -lgainputstatic). My library stops "working:" i get tons of undefined reference erros on the linking stage, which are not directly related to gainput, but are related to my engines internal classes and functions: C:\Windows\system32\cmd.exe /C C:/TDM-GCC-64/bin/mingw32-make.exe -j8 SHELL=cmd.exe -e -f Makefile "----------Building project:[ cysslib_test - Debug_win64 ]----------" mingw32-make.exe[1]: Entering directory 'C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test' C:/TDM-GCC-64/bin/g++.exe -c "C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/MyGame.cpp" -g -pg -Wall -m64 -std=c++11 -lOpenCL -o ./bin/Debug/win64//src_MyGame.cpp.o -I. -I../cysslib/include -I./include C:/TDM-GCC-64/bin/g++.exe -c "C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp" -g -pg -Wall -m64 -std=c++11 -lOpenCL -o ./bin/Debug/win64//src_main.cpp.o -I. -I../cysslib/include -I./include C:/TDM-GCC-64/bin/g++.exe -o ./bin/Debug/win64//cysslib_test @"cysslib_test.txt" -L. -L./bin/Debug/win64/ -L../cysslib/bin/Debug/win64/ -lcysslib -pg -O0 ./bin/Debug/win64//src_main.cpp.o: In functionmain': C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:9: undefined reference to cyss::GameWindow::GameWindow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int)' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:10: undefined reference tocyss::SimpleRenderer::SimpleRenderer(unsigned int, unsigned int)' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:11: undefined reference to cyss::Texture2D::Texture2D(unsigned int, unsigned int, bool)' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:12: undefined reference tocyss::Texture2D::loadFile(std::_cxx11::basic_string<char, std::char_traits, std::allocator >)' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:13: undefined reference to cyss::GameWindow::show()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:14: undefined reference tocyss::GameWindow::shouldClose()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:16: undefined reference to cyss::GameWindow::update()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:17: undefined reference tocyss::GameWindow::clear()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:18: undefined reference to cyss::SimpleRenderer::reset()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:20: undefined reference tocyss::SimpleRenderer::drawTexture(cyss::Texture2D, float, float, float, float)' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:22: undefined reference to cyss::GameWindow::swapBuffers()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:11: undefined reference tocyss::Texture2D::~Texture2D()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:10: undefined reference to cyss::SimpleRenderer::~SimpleRenderer()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:9: undefined reference tocyss::GameWindow::~GameWindow()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:11: undefined reference to cyss::Texture2D::~Texture2D()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:10: undefined reference tocyss::SimpleRenderer::~SimpleRenderer()' C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test/src/main.cpp:9: undefined reference to cyss::GameWindow::~GameWindow()' collect2.exe: error: ld returned 1 exit status mingw32-make.exe[1]: *_\* [bin/Debug/win64//cysslib_test] Error 1 cysslib_test.mk:78: recipe for target 'bin/Debug/win64//cysslib_test' failed mingw32-make.exe[1]: Leaving directory 'C:/Users/Daniel Wanner/Documents/Projekte/C++/cysslib/cysslib_test' mingw32-make.exe: **\* [All] Error 2 Makefile:4: recipe for target 'All' failed ====18 errors, 0 warnings====

    These undefined reference errors dont occur when not enabling the input system, and thus not linking against gainput.

    opened by delbato 2
  • Programmatically trigger input events?

    Programmatically trigger input events?

    Cool project! Is it possible to programmatically trigger input events, such as a mouse click or key press? My use case is to listen for user input events, and then be able to replay those same input events programmatically. Also, is it possible to trigger input events directly (from a mouse, keyboard or gamepad) without the first step of listening for them?

    Per the docs, I noticed one of the features is "Supports recording and playback of input sequences", and I wanted to make sure I was understanding that correctly. Thanks!

    opened by fohara 2
  • Library does not support Linux

    Library does not support Linux

    The lib/CMakeLists.txt does not contain X11 linkage for Linux

    if(WIN32)
    	target_link_libraries(gainput ${XINPUT} ws2_32)
    	target_link_libraries(gainputstatic ${XINPUT} ws2_32)
    	add_definitions(-DGAINPUT_LIB_DYNAMIC=1)
    elseif(ANDROID)
    	target_link_libraries(gainputstatic native_app_glue log android)
    	target_link_libraries(gainput native_app_glue log android)
    elseif(APPLE)
    	find_library(FOUNDATION Foundation)
    	find_library(IOKIT IOKit)
      find_library(GAME_CONTROLLER GameController)
    	target_link_libraries(gainput ${FOUNDATION} ${IOKIT} ${GAME_CONTROLLER})
      if(IOS)
          find_library(UIKIT UIKit)
          find_library(COREMOTION CoreMotion)
          find_library(QUARTZCORE QuartzCore)
          target_link_libraries(gainput ${UIKIT} ${COREMOTION})
      else()
          find_library(APPKIT AppKit)
          target_link_libraries(gainput ${APPKIT})
      endif()
    endif()
    
    opened by vladislav-tkach 0
  • Build gainput as a shared library by using BUILD_SHARED option in CMake.

    Build gainput as a shared library by using BUILD_SHARED option in CMake.

    As mentioned in issue #78, it is not possible to generate the project in CMake if either GAIN_BUILD_SHARED or GAIN_BUILD_STATIC is disabled while generating the project. This pull request fixes this issue by relying on the BUILD_SHARED_LIBS built-in option in CMake. The gainputstatic project should not be necessary if we rely on the fact that the user can switch between the shared and static variants by specifying the BUILD_SHARED_LIBS option accordingly.

    opened by jpvanoosten 1
  • Cannot specify link libraries for target

    Cannot specify link libraries for target "gainput" which is not built by this project.

    Surprising that I haven't seen this issue reported yet, but if I disable "GAIN_BUILD_SHARED" I get the following error when trying to configure the project with CMake:

    CMake Error at lib/CMakeLists.txt:40 (target_link_libraries):
      Cannot specify link libraries for target "gainput" which is not built by
      this project.
    

    Which makes sense since the "gainput" target shouldn't be created if "GAIN_BUILD_SHARED" is disabled.

    Similarly, if I disable "GAIN_BUILD_STATIC" I get the following error when trying to configure the project with CMake:

    CMake Error at lib/CMakeLists.txt:41 (target_link_libraries):
      Cannot specify link libraries for target "gainputstatic" which is not built
      by this project.
    

    Which also makes sense because the "gainputstatic" target shouldn't be created if "GAIN_BUILD_SHARED" is disabled!

    opened by jpvanoosten 1
  • How to get callbacks even when bool keys are repeating while holding down?

    How to get callbacks even when bool keys are repeating while holding down?

    Currently I find the MappedInputListener to only call the registered callback functions when the state of the button changes. Is there a way to force an input event from the MappedInputListener even when a key is repeating?

    opened by twaritwaikar 0
Releases(v1.0.0)
  • v1.0.0(Sep 6, 2017)

    This is it. This is version 1.0 of Gainput. This should hopefully be production-ready. It has definitely been used in shipped games.

    Contains a lot of changes:

    • Added support for tvOS.
    • Improved support for Android a lot and made it work if you don't use native-activity.
    • Added support for inputs coming from another thread (depends on a 3rd party thread-safe queue though).
    • Added support for user-provided delta times.
    • Fixed a lot of bugs and generally improved all platforms.
    Source code(tar.gz)
    Source code(zip)
  • v0.10.0-beta(Aug 30, 2015)

    • Added OS X support.
    • Added iOS support.
    • Changed build system to CMake.
    • Introduced 'built-in' device type.
    • Many minor fixes and cleaned up a lot.
    Source code(tar.gz)
    Source code(zip)
  • v0.9.0-beta(Sep 11, 2013)

    The second public release of Gainput with the following changes:

    • Implemented support for raw input on Windows and Linux for mice and keyboards.
    • Changed the naming of all buttons.
    • Added device variants so that different device implementations can be selected at runtime.
    • Added a small FAQ to the docs.
    • And more smaller fixes.
    Source code(tar.gz)
    Source code(zip)
  • v0.8.0-beta(Jul 24, 2013)

ESP32 software USB host through general IO pins. We can connect up to 4 USB-LS HID (keyboard mouse joystick) devices simultaneously.

esp32_usb_soft_host esp32 USB-LS pure software host thru general IO pins. Up to 4 HID devices simultaneously. board ~$3 :https://www.aliexpress.com/pr

Samsonov Dima 313 Jan 1, 2023
ESP8266 software USB host through general IO pins. We can connect up to 2 USB-LS HID (keyboard mouse joystick) devices simultaneously.

esp8266_usb_soft_host Test for esp8266 usb host . Works with ESP-IDF v3.4 80MHz and 160MHz. WorkInProgress Test run with mouse & combined mouse & keyb

Samsonov Dima 28 Sep 1, 2022
A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control.

N.A.G.E.K.I. A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control. 中文版

NanaNana 39 Dec 8, 2022
A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Using Pro-micro control.

N.A.G.E.K.I. PLEASE CHECK Main Project A cheap,simple,Ongeki controller Use Keyboard Simulation and Mouse Simulation to controller the ongeki game. Us

NanaNana 11 Dec 30, 2021
USB2Sun - USB keyboard/mouse to Sun Converter

USB2Sun While I've found many projects for connecting the Sun serial based keyboards to a modern machine via USB, I've never found anything to connect

Joakim L. Gilje 9 Nov 24, 2022
A lightweight & cross-platform IDE supporting the most recent C++ standards

This project has moved to https://gitlab.com/cppit/jucipp. juCi++ a lightweight, platform independent C++-IDE with support for C++11, C++14 and C++17

cppit (zippit) 886 Jan 3, 2023
A keyboard of chinese, with pinyin input method(IME)

适用于单片机的lvgl简单中文键盘拼音输入法,使用QT5.14创建,直接打开即可运行模拟器 如果QT编译提示有错误,尝试在构建设置中重设目录:QT的左边栏-"项目"->"Desktop QT5.14.2 MinGW 32-bit"->"构建设置"->"概要"->"构建目录",填入一个目录,比如“..

null 24 Dec 31, 2022
Arduino Capacitive Touch library

Arduino Capacitive Touch Library Basic Arduino Capacitive Touch library. This is useful if, for example, you want to use apples as input buttons. Or m

Tauno Erik 1 Nov 17, 2021
split89 keyboard - a 3d printed 89 key split TKL keyboard base powered by ATmega32U4 Pro Micro controllers with QMK Configurator support.

split89 keyboard - a 3d printed 89 key split TKL keyboard base powered by ATmega32U4 Pro Micro controllers with QMK Configurator support. This keyboar

null 54 Jan 7, 2023
Raw HID keyboard forwarder to turn the Pi 400 into a USB keyboard

Raspberry Pi 400 as a USB HID Keyboard Hook your Pi 400 up to your PC somehow, using a USB Type-C cable into the power port. Anker make good ones- I u

Philip Howard 182 Dec 12, 2022
Use Atari keyboard as USB keyboard with a Teensy 3.6

Atari Keyboard Convert an Atari 600/800/1200 XL into a USB keyboard. I bricked my Atari mainboard. My goal is to use the keyboard of the Atari on a Ra

Jos Koenis 2 Dec 3, 2021
Gesture-Detecting-Macro-Keyboard - Glorified Bluetooth macro keyboard with machine learning (TensorFlow Lite for Microcontrollers) running on an ESP32.

Gesture detection tldr; Glorified Bluetooth macro keyboard with machine learning (TensorFlow Lite for Microcontrollers) running on an ESP32. Main feat

Jakob Krantz 68 Dec 1, 2022
Simple ATTiny85 based PS/2 to Amiga keyboard protocol converter that fits inside the keyboard.

Simple ATTiny85 based PS/2 to Amiga keyboard protocol converter that fits inside the keyboard.

Jari Tulilahti 9 Dec 23, 2022
TinyTouchLight - Dimmable USB Night Light with Capacitive Touch Control

TinyTouchLight - Dimmable USB Night Light with Capacitive Touch Control

Stefan Wagner 11 Dec 30, 2022
Legacy stepper motor analyzer - A DYI minimalist hardware stepper motor analyzer with graphical touch screen.

Simple Stepper Motor Analyzer NOTE: This is the legacy STM32 based design which was replaced by the single board, Raspberry Pi Pico design at https://

Zapta 160 Dec 26, 2022
Yet another matrix client. Click packaging for locally running on Ubuntu Touch

Cinny Click Packaging Cinny is a Matrix client focusing primarily on simple, elegant and secure interface. License Cinny source package licensed under

Nitan Alexandru Marcel 6 Nov 15, 2022
C/C++ language server supporting multi-million line code base, powered by libclang. Emacs, Vim, VSCode, and others with language server protocol support. Cross references, completion, diagnostics, semantic highlighting and more

Archived cquery is no longer under development. clangd and ccls are both good replacements. cquery cquery is a highly-scalable, low-latency language s

Jacob Dufault 2.3k Jan 2, 2023
C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting

ccls ccls, which originates from cquery, is a C/C++/Objective-C language server. code completion (with both signature help and snippets) definition/re

Fangrui Song 3.3k Jan 6, 2023
The Leap Motion cross-format, cross-platform declarative serialization library

Introduction to LeapSerial LeapSerial is a cross-format, declarative, serialization and deserialization library written and maintained by Leap Motion.

Leap Motion (Ultraleap) 15 Jan 17, 2022