Repository navigation
Releases
0.11.0
anybox types text, presses key chords, takes a held key away from the PC and gives it back, and reaches what only a MAKCU, YSC or Ferrum can do
type_text,press_keys,release_keysandtap_keys. typing is native on a MAKCU and a YSC, chords on a MAKCU and a Ferrum, every other box gives youUnsupported. the README has a helper for when no box has something and a fallback for when only some doforce_release_keymakes the PC see a key up while the user still holds it, andrestore_keygives it back, down again if it's still held. native on a Medius (checked on 3.4.7) and a MAKCU (its key mask, i haven't checked that one on a box yet)device.makcu()has interpolation, autorelease and whether it's still moving,device.ysc()its interpolation and serial,device.ferrum()its catch_xy, next todevice.medius(). the MAKCU ones haven't run on a box yet, the YSC and Ferrum ones come from the vendors' own sources- docs/boxes.md says what a lock does to a held key, what each box does when you release a key the user holds, and which events carry the box's own time
nothing got removed, so updating from 0.10.0 is just the version number, but the C ABI is 3 now, so a C or C++ program needs the new header
0.10.0
YSC boxes report key events now, and anybox reads the YSC report shapes it used to drop
- YSC: key events, from the keyboard reports the box sends by itself every time something changes on the keyboard behind it. they only show the real keyboard, never the keys anybox presses, and the box names at most 6 keys next to the modifiers. they were read off a real V1's recording and the vendor's own source, though anybox reading them hasn't run on a box yet
- YSC: mouse reports named
mouse(newer firmware) or with no message or no wheel at all (older firmware) are read too. before, anybox dropped them, so a box with that firmware gave no button or motion events - YSC: a V2's version is read from
dataormessage, whatever the message says, like the vendor's driver does - what YSC key events show and what they don't is in docs/boxes.md
the API didn't change, so updating from 0.9.0 is just the version number, and the C ABI is still 2
0.9.0
anybox works from C# now, C++ has its own API, and every language has all of it, Medius included
- C#:
dotnet add package Anybox, .NET 10 on Windows and Linux. the library comes inside the package so you don't need Rust, anddevice.Medius()gives you everything only Medius does - C++: the capi tarball has
anybox.hppandanybox_medius.hppnow, the same API with RAII and exceptions, anddevice.medius()gives you a C++ Medius device instead of a handle formedius.h - every error carries its details in every language (the ports it tried, the boxes that couldn't do it, what it expected and what it found, etc), not just a status and a text
- event stamps also come in nanoseconds on the OS monotonic clock (
Stamp::arrived_ns,received_nsandanybox::monotonic_ns()), so they line up with other devices and other programs on the same machine. Python'stime.perf_counter_ns()and .NET'sStopwatchread that same clock Events::close()ends a receiver from any thread, arecvwaiting on it returns right away- Python: a receiver that ran out raises
RecvClosedErrornow instead of the closed device's error, aforover it still just ends - built on medius 3.4.6
- how to install and use each language is in docs/bindings.md
the Rust API only got additions, so updating from 0.8.0 is just the version number. the C ABI is 2 now, so a C or C++ program needs the new headers and library
0.8.0
anybox now works from C, C++ and Python, not only Rust
- C and C++: every release has an
anybox-capi-<target>.tar.gzfor Windows and Linux withanybox.h,medius.h, the library (shared and static) and the licenses of everything built into it - Python:
pip install anybox-rs, Python 3.11 or newer on Windows and Linux. the wheel has the library inside, so you don't need Rust.pip install anybox-rs[medius]also gets youdevice.medius() - the box-specific behavior notes moved from the README to docs/boxes.md
the Rust crate itself didn't change its API, so updating from 0.7.1 is just the version number
v0.7.1
- YSC: buttons, motion and the wheel come in, anybox reads the reports the way a real V1 sends them
- YSC: keys wait for the box's answer, so quick writes in a row don't break the link, and a key the box couldn't read gives
Rejectedinstead of a disconnect - YSC: connecting checks that the box takes text commands and tells you what to try when it doesn't
- Ferrum: a box that comes back through the app gets its locks back and lets go of what you held, with an
Event::SessionReset
v0.7.0
anybox::scan()andConnect::scan(): every port a search looks at, in port order, with its box or the error for that port alone (busy, not allowed, too old,NoBoxCan,NotFound), for a box pickerfind()removed,scan()gives everything it gave
v0.6.1
- a receiver made right after a refused one still gets its own
Rejected, so a stream that never came on can't look like an idle mouse Events::recv_timeoutwith a timeout too long for the clock waits likerecvinstead of panicking, and aStampbuilt with a hugesince_opensaturates- README: the YSC8K that's sold is the V1, and the MAKCU move rate as measured on one box
0.6.0
- a click or a key tap with a hold on Ferrum is now a press and a release timed from your PC, like Ferrum's docs say to do it,
native_onlystill refuses it - Ferrum: unplugging the box from the PC shows up as
Event::Changed(the app's port stays open), and the "no device set" reason says the box might not be plugged in - YSC 8K V1: opened with
.family(Family::Ysc), found at its rate the way the vendor's app does it (4M first, 9 rates), never changes the rate, the bootloader is refused.connect()with no family doesn't look for a V1 yet - a YSC search asks V2 ports before CH343 ones
0.5.0
anybox::candidates()andConnect::candidates()list the ports a search would look at, without opening any of them, so an app can notice a box getting plugged in and only runfind()thenEvent::Changedcomes when the snapshot changes without a reconnect (a mouse set in the Ferrum app, YSC keys turning off, a Medius clone's details), at most one waits unread per receiverInfo.peripheralhas the USB ids of the device plugged into the box, on a Medius and on a Ferrum's app port- README notes: the MAKCU's moment with no mouse right after a reconnect, the button Windows keeps down when the box restarts, and a YSC can't say yet whether a mouse is behind it
0.4.1
adds a trace feature. turn it on and set ANYBOX_TRACE to a file path, and every byte anybox sends to a box and gets back ends up in that file with a timestamp, failed opens included. it's for figuring out what a box actually says when something doesn't work, and it's off by default. on Linux and macOS the file is only readable by you, since keys typed on the keyboard behind the box end up in it