Rivalcfg v4.16.0 released with new supported devices and a lot of improvements!

Rivalcfg v4.16.0 was released on 2026-02-13. It adds support for 3 new devices and improves the CPI (sensitivity) setting for many mice. On the technical side, this version adds official support for Python 3.14 and drops support for Python 3.9. The packaging has also been modernized (the old setup.py / setuptools combo was replaced by pyproject.toml and Flit).

Three new devices supported

As mentioned in the introduction, this version brings support for 3 new SteelSeries mice.

Aerox 3 Wireless CS2 Dragon Lore Edition

The first one is the "SteelSeries Wireless Gaming Mouse CS2 Dragon Lore Edition". It is just a skin of the Aerox 3 Wireless, so it was easy to support. You will find more information about this mouse in the documentation:

SteelSeries Wireless Gaming Mouse CS2 Dragon Lore Edition (Aerox 3 Wireless)

SteelSeries Wireless Gaming Mouse CS2 Dragon Lore Edition (Aerox 3 Wireless)

Rival 3 Gen 2

The second one is the Rival 3 Gen 2, a new iteration of the Rival 3. The main change is the ability to set different sensitivity values for X and Y axes. This required implementing a new handler to fully support the device. More info in the doc:

Also, I would like to thank Orson Teodoro who helped support this mouse! 😁️

Rival 3 Gen 2, black and white versions

Rival 3 Gen 2, black and white versions

Rival 3 Wireless Gen 2

And the last one is the Rival 3 Wireless Gen 2. Like the wired version, it is just a new iteration of the previous Rival 3 Wireless, with the ability to set different CPI values on X and Y axes.

Please note that, as for the first version, the support of the Gen 2 is partial. The following features are currently not supported:

  • Color / illumination,
  • Wheel scroll mapping,
  • Power settings (high efficiency, smart illumination, sleep timer).

I will work on this later for both Gen 1 and Gen 2 devices. More information in the doc:

Rival 3 Wireless Gen 2, black and white versions

Rival 3 Wireless Gen 2, black, white, lavender and aqua versions

Improvement of the CPI setting

To set the mouse sensitivity, Rivalcfg must convert the CPI requested by the user, (for example, 1800 dpi) to a value understood by the sensor, such as 0x14.

Some sensors are linear and are easy to map. For those, we may have [100 dpi = 0x01], [200 dpi = 0x02], [300 dpi = 0x03] and so on. However, some other sensors are not linear and use a fixed conversion table that contains unexpected "jumps". For example, the TrueMove Air sensor is mapped with [100 dpi = 0x00], [200 dpi = 0x02], [300 dpi = 0x03], etc.

TrueMove Air sensor is non-linear, so we can see "jumps"

TrueMove Air sensor is non-linear, so we can see "jumps"

For non-linear sensors, Rivalcfg used to approximate values using a linear function. This works for most values, but for some of them it does not match the ones of the fixed table. In such cases, the behavior is undefined. It may set a slightly different sensitivity than the requested one, or it may not work at all.

Anyway, this is now fixed. Rivalcfg v4.16.0 includes value tables for the TrueMove Air, TrueMove Core and PMW3326 sensors, so it now perfectly matches the SteelSeries GG Engine behavior.

Mouse families that now have accurate CPI values are:

  • Aerox 3
  • Aerox 3 Wireless
  • Aerox 5
  • Aerox 5 Wireless
  • Aerox 9 Wireless
  • Prime Wireless
  • Rival 106 device
  • Rival 110 device
  • Rival 3
  • Rival 3 Wireless
  • Rival 300S device

Complete Changelog

Here is the complete changelog for Rivalcfg 4.16.0:

  • feat(devices): Added support for the Aerox 3 Wireless CS2 Dragon Lore Edition (1038:187a, 1038:1878) (@flozz)
  • feat(devices): Added support for the Rival 3 Gen 2 (1038:1870) (#249, #257, @flozz, @orsonteodoro)
  • feat(devices): Added support for the Rival 3 Wireless Gen 2 (1038:1872) (#258, @flozz)
  • feat(handler): Added range_choice handler (@flozz)
  • feat(handler): Added multidpi_range_choice handler (@flozz)
  • feat(handler): Added multidpi_range_choice_xy handler (@flozz)
  • fix(devices): Fixed DPI values for devices using the TrueMove Air sensor (@flozz):
    • Aerox 3 Wireless (1038:183A, 1038:187A, 1038:1838, 1038:1878)
    • Aerox 5 (1038:1850)
    • Aerox 5 Wireless (1038:1854, 1038:185E, 1038:1862, 1038:1852, 1038:185C, 1038:1860)
    • Aerox 9 Wireless (1038:185A, 1038:1876, 1038:1858, 1038:1874)
    • Prime Wireless (1038:1842, 1038:184A, 1038:1840, 1038:1848)
    • Rival 3 Wireless (1038:1830)
  • fix(devices): Fixed DPI values for devices using the TrueMove Core sensor (@flozz):
    • Aerox 3 (1038:1836)
    • Rival 3 (1038:1824, 1038:184C)
  • fix(devices): Fixed DPI values for devices using the PixArt PMW3326 sensor (@flozz):
    • Rival 106 device (1038:1816)
    • Rival 110 device (1038:1729)
    • Rival 300S device (1038:1810)
  • misc(tests): Added tests for the Aerox 5 device (1038:1850) (@flozz)
  • misc: Modernized packaging setup.py/setuptools -> pyproject.toml/flit (@flozz)
  • misc: Added Python 3.14 support (@flozz)
  • misc!: Removed Python 3.9 support (@flozz)