Boost.org program_options module

Overview

Program Options, part of the collection of Boost C++ Libraries, allows for definition and acquisition of (name, value) pairs from the user via conventional methods such as command line and config file. It is roughly analogous to getopt_long, but for use with C++.

License

Distributed under the Boost Software License, Version 1.0.

Properties

  • C++03
  • Requires Linking

Build Status

(in progress...)

Branch Travis Appveyor codecov.io Deps Docs Tests
master Build Status Build status codecov Deps Documentation Enter the Matrix
develop Build Status Build status codecov Deps Documentation Enter the Matrix

Directories

Name Purpose
build build script for link library
ci continuous integration scripts
doc documentation
example use case examples
include headers
src source code for link library
test unit tests

More information

  • Ask questions: Be sure to read the documentation first to see if it answers your question.
  • Report bugs: Be sure to mention Boost version, platform and compiler you're using. A small compilable code sample to reproduce the problem is always good as well.
  • Submit Pull Requests against the develop branch. Note that by submitting patches you agree to license your modifications under the Boost Software License, Version 1.0. Be sure to include tests proving your changes work properly.
  • Discussions about the library are held on the Boost developers mailing list. Be sure to read the discussion policy before posting and add the [program_options] tag at the beginning of the subject line.
Comments
  • Support for  multiple long names - PR for initial review only

    Support for multiple long names - PR for initial review only

    Hello @vprus , @pdimov ,

    A year and a half ago I wrote you, @vprus , about my interest in implementing some additional features for program_options. You referred me to the boost mailing list, where I had an exchange with Klemens Morgenstern.

    ... a long while later, I've gotten around to starting to work on that. Now, the list of all of the features I'm interested in is here, but this PR is about a single feature:

    Support multiple alternative long names for some option.

    It has another commit, though, unrelated to the feature which is just about avoiding a warning.

    I'm asking for a code review of what I've written, to see if it's generally ok with you guys and for some feedback. If you give me the go-ahead I'll add some test cases and make a second PR for you to consider for actual merging.

    opened by eyalroz 17
  • Reset all shared_ptr values in options_description destructors

    Reset all shared_ptr values in options_description destructors

    Reset all the shared_ptr that were constructed within the library from within so that a mismatch with the header implementation of shared_ptr does not result in code for the wrong implementation being executed in the shared_ptr destructor.

    Fixes #70.

    opened by nomis 10
  • Cannot use shared library in C++98

    Cannot use shared library in C++98

    After https://github.com/boostorg/function/pull/25 building a C++ < 11 consumer fails. Affects at least gearmand, pdfedit, uhd. CC @Kojoley

    $ cat >a.cc
    #include <boost/program_options.hpp>
    
    int main(int argc, char **argv) {
      boost::program_options::options_description desc("foo");
      boost::program_options::parse_command_line(argc, argv, desc);
      return 0;
    }
    
    $ c++ -std=gnu++98 a.cc -lboost_program_options
    >>> referenced by a.cc
    >>>               /tmp/a-fa8c69.o:(boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>))
    c++: error: linker command failed with exit code 1 (use -v to see invocation)
    
    opened by jbeich 10
  • Reverting change for implicit_option that happened in boost 1.59

    Reverting change for implicit_option that happened in boost 1.59

    Dear Vladimir Prus. This is a follow up to your comment in (http://stackoverflow.com/questions/31921200/how-to-have-an-optional-option-value-in-boost-program-options)

    implicit_option changed its behaviour in boost 1.59 so that --option_name option_value no longer works and needs to be written as --option_name=option_value. I would find it useful if the original behavior was restored and both formats worked (and the documentation changed to reflect this). Thank you.

    opened by jmoraleda 9
  • exception thrown: bad_lexical_cast

    exception thrown: bad_lexical_cast

    Hi,

    we discovered, that boost crashes with "bad_lexical_cast" if we provide an empty "string" as parameter. Tested with boost 1.58.0 and 1.63.0

    Cli input to reproduce: sleep ""

    gdb Backtrace (catch throw) with boost_ver: 1.58.0

    #0  0x00007ffff2cbbd90 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #1  0x000000000049a12e in boost::throw_exception<boost::bad_lexical_cast> (e=...) at path/gcc48/include/boost-1_58_1/boost/throw_exception.hpp:69
    #2  0x00007ffff739ea91 in boost::conversion::detail::throw_bad_cast<std::string, unsigned int> () at path/gcc48/include/boost-1_58_1/boost/lexical_cast/bad_lexical_cast.hpp:92
    #3  0x00007ffff739e123 in boost::lexical_cast<unsigned int, std::string> (arg="") at path/gcc48/include/boost-1_58_1/boost/lexical_cast.hpp:42
    #4  0x00007ffff739d901 in boost::program_options::validate<unsigned int, char> (v=..., xs=std::vector of length 1, capacity 1 = {...})
        at path/gcc48/include/boost-1_58_1/boost/program_options/detail/value_semantic.hpp:89
    #5  0x00007ffff739d44c in boost::program_options::typed_value<unsigned int, char>::xparse (this=0x70fff0, value_store=..., new_tokens=std::vector of length 1, capacity 1 = {...})
        at path/gcc48/include/boost-1_58_1/boost/program_options/detail/value_semantic.hpp:167
    #6  0x00007ffff4c6f0b5 in boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool) const ()
       from path/gcc48/lib/x86_64-linux-gnu/libboost_program_options-gcc48-mt-1_58_1.so.1.58.1
    #7  0x00007ffff4c6b1da in boost::program_options::store(boost::program_options::basic_parsed_options<char> const&, boost::program_options::variables_map&, bool) ()
       from path/gcc48/lib/x86_64-linux-gnu/libboost_program_options-gcc48-mt-1_58_1.so.1.58.1
    #8  0x00007ffff74a08f8 in program_name::cli::namespace_version::bindCommandline (tokens=..., startIdx=0, opts=..., popts=..., vmap=...)
    

    content of 'boost::program_options::basic_parsed_options const&' :

    {options = std::vector of length 1, capacity 1 = {{string_key = "time", position_key = 0, value = std::vector of length 1, capacity 1 = {""}, original_tokens = std::vector of length 1, capacity 1 = {""}, 
          unregistered = false, case_insensitive = false}}, description = 0x7ffff788b620 <program_name::cli::namespace_version::POConsoleInput::s_sleepOptions>, m_options_prefix = 1}
    

    Thank you in advance

    opened by thomas955 7
  • Fails to build the .lib on msvc toolchain

    Fails to build the .lib on msvc toolchain

    master branch of the superproject (https://github.com/boostorg/boost/commit/43468c7a8492ab00c6f0bfb993acfe9e1dd5e844) fails to produce the .lib files for program options, causing the build of my own library tests to fail:

    https://ci.appveyor.com/project/vinniefalco/beast/build/master%20(%231328)

    msvc.link libs\beast\bin\example\echo-op\msvc-14.0\debug\threading-multi\echo-op.exe LINK : fatal error LNK1181: cannot open input file 'bin.v2\libs\program_options\build\msvc-14.0\debug\threading-multi\boost_program_options-vc140-mt-gd-1_65.lib

    Performing git checkout boost-1.64.0 resolves the issue. The problem has been bisected with certainty, indicating these defective commits:

    Superproject: https://github.com/boostorg/boost/commit/025ccc062abf21cf44d500def72fba5ff6f08966

    program_options: https://github.com/boostorg/program_options/commit/1f9413f532e58b82d12e9185c2eb8bc45612914c

    Furthermore we have identified another critical issue, @vprus has not yet joined the #boost channel on cpp-lang Slack: http://cpplang.diegostamigni.com/ Please resolve this!

    opened by vinniefalco 5
  • Avoid deprecated bind placeholders in global namespace

    Avoid deprecated bind placeholders in global namespace

    This fixes numerous yet annoying compilation warnings:

      note: #pragma message:
        The practice of declaring the Bind placeholders (_1, _2, ...)
        in the global namespace is deprecated.
        Please use <boost/bind/bind.hpp> + using namespace boost::placeholders,
        or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior.
    

    This is somewhat related to PR #91


    Apart from obscuring the output of compilation of libraries using Boost.Test, it may be troublesome on CI builds. On many CI services every line of log counts and if log dumps become too long, builds are terminated.

    opened by mloskot 4
  • add ci bits and readme

    add ci bits and readme

    Summary

    This pull request adds support for:

    • Travis CI
      • Various gcc and clang builds
      • cppcheck
      • ubsan
      • covecov.io build
    • Appveyor
      • Visual Studio 2017 and 2013 builds
      • mingw 32-bit and 64-bit builds
      • cygwin 32-bit and 64-bit builds
    • codecov.io integration, which will post code coverage deltas into each pull request that runs successfully (really cool!)
    • Coverity Scan support (when enabled), also see #46 which came out of this work.

    Example Build Jobs

    Appveyor: https://ci.appveyor.com/project/jeking3/program-options/build/1.0.16-develop (note the red builds are already tracked in #45 so I made these build failures non-fatal)

    Travis: https://travis-ci.org/jeking3/program_options/builds/350461368 (note the fialed UBSAN issue is tracked in #44 but this is serious so I left it as fatal!)

    Work Required by the Repository Owner

    After merging this pull request the repository owner must perform a number of tasks:

    • Add the boostorg/program_options project to your Travis CI account. Make sure it is the boostorg one. Sometimes you have to click on "sync with github" to get it to show up. If it does not show up you will need to request Admin level access through the Boost Admin list.
    • Add the boostorg/program_options project to your Appveyor account.
    • Update the README.md at the top, uncommenting the status section and fixing all the links to use your project.
    • I will create a Coverity Scan project after this pull request is merged and add the repository owner as an owner/admin; the repository owner will then need to modify the boostorg/program_options travis project with two environment variables that enable coverity scan builds to work.

    This fixes #43

    opened by jeking3 4
  • Strange behavior with empty

    Strange behavior with empty "--"

    In this example

    example -- --option
    

    arguments are going to be parsed as positional arguments: "--" and "--option". I don't understand why.

    opened by chfast 4
  • Boost release tag frozen since 3 years ?

    Boost release tag frozen since 3 years ?

    Hello, I am puzzled by https://github.com/boostorg/program_options/releases

    I fell on this while trying to understand why I got warnings about boost/bind placeholders in global namespace even though this is fixed since long in this repository : https://github.com/boostorg/program_options/commit/a2379420f67071e997d0d2aecd1d782c04db9ce7

    Any reason why new Boost releases don't get new program_options code ?

    opened by ilelann 3
  • Branch coverage is around 50% (which typically means error path testing should be improved)

    Branch coverage is around 50% (which typically means error path testing should be improved)

    +lcov --gcov-tool=gcov-7 --rc lcov_branch_coverage=1 --list coverage.info
    Reading tracefile coverage.info
                                                   |Lines      |Functions|Branches  
    Filename                                       |Rate    Num|Rate  Num|Rate   Num
    ================================================================================
    [/home/travis/build/jeking3/boost-root/]
    boost/program_options/detail/cmdline.hpp       | 100%     1| 100%   1|50.0%    6
    boost/program_options/detail/config_file.hpp   |95.2%    21|77.8%  18|50.0%   86
    boost/program_options/detail/convert.hpp       | 100%     5| 100%   2|62.5%   16
    boost/program_options/detail/parsers.hpp       | 100%    37| 100%  13|56.1%   82
    boost/program_options/detail/value_semantic.hpp|91.3%    69|79.2%  53|29.5%  484
    boost/program_options/environment_iterator.hpp | 100%    19| 100%   4|53.8%   26
    boost/program_options/eof_iterator.hpp         | 100%    18| 100%  15|64.3%   14
    boost/program_options/errors.hpp               |94.9%    99|73.1%  78|42.2%  166
    boost/program_options/option.hpp               | 100%     7| 100%   8|39.7%   68
    boost/program_options/options_description.hpp  | 100%     1|50.0%   2|28.6%   14
    boost/program_options/parsers.hpp              | 100%     5| 100%   6|50.0%   12
    boost/program_options/positional_options.hpp   | 100%     1| 100%   1|50.0%    4
    boost/program_options/value_semantic.hpp       | 100%    67|84.7% 118|56.2%  208
    boost/program_options/variables_map.hpp        | 100%    17|89.5%  19|40.0%   25
    libs/program_options/src/cmdline.cpp           |92.8%   334|95.8%  24|62.3%  778
    libs/program_options/src/config_file.cpp       |97.2%    72| 100%   8|57.3%  206
    libs/program_options/src/convert.cpp           |93.9%    33| 100%  13|40.6%   64
    libs/program_options/s...ptions_description.cpp|93.4%   257|93.9%  33|56.2%  582
    libs/program_options/src/parsers.cpp           | 100%    58|93.8%  16|51.0%  210
    libs/program_options/src/positional_options.cpp| 100%    16| 100%   4|70.0%   20
    libs/program_options/src/split.cpp             |81.8%    11|50.0%   4|27.0%  100
    libs/program_options/src/value_semantic.cpp    |81.8%   192|85.7%  28|45.4%  608
    libs/program_options/src/variables_map.cpp     |78.0%   100|66.7%  12|56.4%  259
    ================================================================================
                                             Total:|91.9%  1440|85.2% 480|50.3% 4038
    

    Build job: https://travis-ci.org/jeking3/program_options/jobs/350413747

    opened by jeking3 2
  • Potential Cmake issue. Not able to get secondary dependency when including in own helloworld-app

    Potential Cmake issue. Not able to get secondary dependency when including in own helloworld-app

    I trying to include program_options in a simple testapp, by using CMake.

    include(FetchContent)
    FetchContent_Declare (
        boost_program_options
        GIT_REPOSITORY https://github.com/boostorg/program_options.git   
        GIT_TAG boost-1.80.0
    )
    FetchContent_MakeAvailable(boost_program_options)
    add_executable(helloworld main.cpp)
    target_link_libraries(helloworld PRIVATE boost_program_options) 
    

    Trying to build this yields

    [cmake] CMake Error at CMakeLists.txt:15 (add_executable):
    [cmake]   Target "helloworld" links to target "Boost::any" but the target was not
    [cmake]   found.  Perhaps a find_package() call is missing for an IMPORTED target, or
    [cmake]   an ALIAS target is missing?
    
    opened by bratne 0
  • Link Error when use variables_map::contains method

    Link Error when use variables_map::contains method

    Env: Windows 10 19044.1826 Library Config: vcpkg, all ports are updated to date. IDE: Visual Studio 2022 17.2.6 Boost Version: 1.79.0 C++ Version: C++20

    When i use program_options library in my program, i got a link error as follows.

    main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __cdecl std::_Tree<class std::_Tmap_traits<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class boost::program_options::variable_value,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class boost::program_options::variable_value > >,0> >::contains(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " ([email protected][email protected] [email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected]@@[email protected][email protected] [email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected][email protected][email protected][email protected][email protected]@ [email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected]@@@std @@@[email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z), function "__cdecl This is referenced in exec(class boost::program_options::options_description const &,class boost::program_options::variables_map const &)" ([email protected]@[email protected][email protected][email protected]@@[email protected]@@Z) symbol
    

    Other boost libraries are work well with my vcpkg and VS env.

    The reproduce code:

    #include <cstdlib>
    #include <iostream>
    #include <boost/program_options.hpp>
    
    namespace po = boost::program_options;
    
    auto initDesc(po::options_description& desc) {
    
        desc.add_options()
            ("--help", "Produce help message")
            ;
    
    }
    
    auto exec(const po::options_description& desc, const po::variables_map& vm) {
        // contains method will cause a link error
        // but count method will perform normal
       // Code is compiled with an 'std=c++20' option
        if (vm.contains("--help")) {
            std::cout << desc << std::endl;
            return EXIT_FAILURE;
        }
    
        return EXIT_SUCCESS;
    
    }
    
    int main(int argc, char* argv[]) {
    
        try {
    
            po::options_description opts{ "All Supported Options" };
            po::variables_map vm;
    
            initDesc(opts);
    
            po::store(po::parse_command_line(argc, argv, opts), vm);
            po::notify(vm);
    
            return exec(opts, vm);
    
        }
        catch (const std::exception& e) {
            std::cerr << e.what() << std::endl;
        }
    
        return EXIT_SUCCESS;
    
    }
    
    

    I noticed that variables_map are inherited from std::map, is something wrong with here?

    opened by YunchengLiu 0
  • Supplying a list of possible values instead of a default value to an option?

    Supplying a list of possible values instead of a default value to an option?

    Is there a way to specify a restricted list of values a command line option can take? I was thinking of something like this:

    #include <boost/program_options.hpp>
    namespace po = boost::program_options;
    
    po::options_description description("General options");
    description.add_options()
           ("key", po::value<string>()->possible_values("a", "b", "c"), "description of key");
    

    Running executable --key d in the command line would throw an error but executable --key a would not. I know there is the option of manually processing the argument supplied to the key later on, but I was wondering if the functionality of identifying unambiguous abbreviations could be utilised.

    opened by IsabelMarleen 0
  • program_options.hpp fails when imported as a header unit (MSVC 2022).

    program_options.hpp fails when imported as a header unit (MSVC 2022).

    The program fails to compile when trying to import program_options.hpp as a header unit in Visual Studio 2022 (C++20).

    main.cpp

    import <boost/program_options.hpp>;
    
    int main(int argc, char** argv)
    {
    	namespace po = boost::program_options;
    	po::options_description desc;
    	desc.add_options()
    		("stringtest", po::value<std::string>()->implicit_value("test"), "string test")
    		;
    
    	return 0;
    }
    

    You'll get the following error: Error - C3084 - 'boost::exception::~exception': a destructor cannot be 'abstract' - solution - E:\Projects\CPP\boost\boost\exception\exception.hpp - 297

    I haven't had any troubles with any other boost headers. This is the only one I've run into with this issue. This was tested with the latest master branch.

    opened by LoneBoco 3
  • Why doesn't `allow_unregistered` work for me?

    Why doesn't `allow_unregistered` work for me?

    I still get too many positional options have been specified on the command line on run()

    The excerpt

    boost::program_options::variables_map vm;
    try{
    	auto parsed = boost::program_options::command_line_parser(rawArgs.argc, rawArgs.argv).options(oDesc).positional(pd).allow_unregistered().run();  //too many positional options have been specified on the command line
    	boost::program_options::store(parsed, vm);
    	boost::program_options::notify(vm);
    	auto rest = boost::program_options::collect_unrecognized(parsed.options, boost::program_options::collect_unrecognized_mode::include_positional);
    } catch(std::exception &ex) {
    	PROCESS_CASE_OF_SYNTAX_ERROR_WHATABLE_EXCEPTION(ex);
    }
    

    The full source is here: https://github.com/HydrArgs/HydrArgs/blob/master/backends/BoostArgs.cpp

    opened by KOLANICH 0
Owner
Boost.org
Boost provides free peer-reviewed portable C++ source libraries.
Boost.org
glsl code blocks for org-mode

GLSL code blocks for Emacs Org-mode This org-mode extension adds the capability to run GLSL code blocks directly from inside Emacs and immediately dis

null 31 Dec 1, 2022
Bubbles: simple and expandable c++ project template with googletest and boost included

Bubbles: A simple and expandable C++ project template with Googletest and Boost included. Building && Testing cmake -S . -B build cmake --build build

Will 8 Dec 20, 2021
Boost.Multiprecision

Boost Multiprecision Library ANNOUNCEMENT: Support for C++03 is now removed from this library. Any attempt to build with a non C++11 conforming compil

Boost.org 135 Dec 3, 2022
A fast base64 module for React Native

react-native-quick-base64 A native implementation of Base64 in C++ for React Native. 4x faster than base64-js on an iPhone 11 Pro.

Takuya Matsuyama 228 Dec 18, 2022
This is a tool for software engineers to view,record and analyse data(sensor data and module data) In the process of software development.

![Contributors][Huang Jianyu] Statement 由于工具源码在网上公开,除使用部分开源项目代码外,其余代码均来自我个人,工具本身不包含公司的知识产权,所有与公司有关的内容均从软件包中移除,软件发布遵循Apache协议,任何人均可下载进行修改使用,如使用过程中出现任何问

HuangJianyu 36 Dec 25, 2022
USB to interfaces implementing MicroPython "machine" module functionalities on a computer.

u2if project u2if(USB to interfaces) is an attempt to implement some of the MicroPython "machine" module functionalities on a computer. The goal is to

null 101 Dec 26, 2022
Linux kernel module to fight against police terror

protecc is a Linux kernel module that will shut down your computer when a predefined USB device is removed from the system.

null 25 Nov 20, 2022
An Xposed module to detect or reject applist requests

Hide My Applist About this module Although "It is incorrect to detect specific app's installation", yet not every app using root provides random packa

null 1.3k Jan 9, 2023
This project shows how to interface Nokia 5110 LCD with Esp32 module to show current prices of any cryptocurrency like Bitcoin, Dogecoin, etc

ESP32 Cryptocurreny Ticker Introduction This project shows how to interface Nokia 5110 LCD with Esp32 module to show current prices of any cryptocurre

Aniket Katkar 20 Jun 16, 2022
A test using a TTGO module (ESP32 + screen) which renders a 3d scene using pingo library

A simple 3D renderer tested and developed for the TTGO T-Display ESP32 board. The 3d renderer is: https://github.com/fededevi/pingo The 3D renderer is

fedevi 10 Nov 2, 2022
Linux kernel module for Onion Omega2 to control WS2811/WS2812 LEDs

omega2-ws2811-lkm Linux kernel module for Onion Omega2 to control WS2811/WS2812 LEDs. It's using a bit-banging, so you can use any GPIO pin. Also, it

Alexey 'Cluster' Avdyukhin 17 Nov 3, 2022
anthemtotheego 402 Dec 26, 2022
multispectral monitoring of a sourdough starter; esp32 eink module, scd30 co2 sensor, vl6180 distance sensor

EINK STARTER MONITOR See full blogpost here Tracks height of starter with a VL6180 i2c distance sensor, and CO2/temperature/humidity with an SCD30. A

AKA 15 Feb 16, 2022
Linux kernel module for RedPill

?? RedPill LKM THIS IS WORK IN PROGRESS There's nothing to run/see here (yet ;)). What is this? This is a major part of a tool which will be able to r

null 296 Dec 30, 2022
Fully resizing juce peak meter module with optional fader overlay.

Sound Meter Juce peak meter module with optional fader overlay. by Marcel Huibers | Sound Development 2021 | Published under the MIT License Features:

Sound Development 17 Nov 22, 2022
Godot module to use ROS2 within Godot

godot_ros This repo is a Godot Module meant to connect Robotic Operating System 2 (ROS2) and the Godot Game Engine. Quick Start Make sure to have both

Evan Flynn 32 Dec 27, 2022
DIY Zigbee CC2530 Motion sensor (AM312/ AM412/ BS312/ BS412), Temperature /Humidity /Pressure sensor (BME280), Ambient Light sensor (BH1750), 2.9inch e-Paper Module

How to join: If device in FN(factory new) state: Press and hold button (1) for 2-3 seconds, until device start flashing led Wait, in case of successfu

Sergey Koptyakov 5 Feb 13, 2022
A simple Linux kernel module that kills ptrace tracer and its tracees

dont_trace dont_trace is a simple Linux kernel module that kills ptrace tracer and its tracees. This kernel module relies upon the Linux kernel task_s

null 5 Mar 31, 2022
Custom linux kernel module that re-enables fn-keys on the Gigabyte Aero 15 SB

aerofnkeys Custom HID Quirks Driver that fixes function keys not working in the Gigabyte Aero 15 SB on Linux. Works by intercepting non-HID compliant

null 7 Aug 30, 2022