{"id":26321617,"url":"https://github.com/jonathanhelianthicusdoe/toonmux","last_synced_at":"2026-03-10T15:03:41.322Z","repository":{"id":98902839,"uuid":"229797136","full_name":"JonathanHelianthicusDoe/toonmux","owner":"JonathanHelianthicusDoe","description":"Linux multi-toon controller for Toontown-based MMORPGs","archived":false,"fork":false,"pushed_at":"2024-10-01T20:52:48.000Z","size":127,"stargazers_count":13,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-01T10:51:16.330Z","etag":null,"topics":["controller","gnu-linux","gplv3","gtk","gtk-rs","gtk3","libxdo","linux","mmorpg","multi-toon","multiplayer","rust","toon","toontown","toontown-online","toontown-rewritten","toontownonline","toontownrewritten","x11","xdo"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JonathanHelianthicusDoe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-12-23T17:37:04.000Z","updated_at":"2024-12-29T13:52:11.000Z","dependencies_parsed_at":"2023-12-26T11:28:34.347Z","dependency_job_id":"3ea79b68-1625-4069-b06d-a89d44423b35","html_url":"https://github.com/JonathanHelianthicusDoe/toonmux","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JonathanHelianthicusDoe/toonmux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanHelianthicusDoe%2Ftoonmux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanHelianthicusDoe%2Ftoonmux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanHelianthicusDoe%2Ftoonmux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanHelianthicusDoe%2Ftoonmux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JonathanHelianthicusDoe","download_url":"https://codeload.github.com/JonathanHelianthicusDoe/toonmux/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JonathanHelianthicusDoe%2Ftoonmux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30338599,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T15:02:55.010Z","status":"ssl_error","status_checked_at":"2026-03-10T15:02:36.911Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["controller","gnu-linux","gplv3","gtk","gtk-rs","gtk3","libxdo","linux","mmorpg","multi-toon","multiplayer","rust","toon","toontown","toontown-online","toontown-rewritten","toontownonline","toontownrewritten","x11","xdo"],"created_at":"2025-03-15T16:17:52.941Z","updated_at":"2026-03-10T15:03:40.762Z","avatar_url":"https://github.com/JonathanHelianthicusDoe.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# toonmux\n\n[![crates.io](https://img.shields.io/crates/v/toonmux)](https://crates.io/crates/toonmux)\n[![GPL v3+](https://img.shields.io/badge/license-GNU%20GPL%20v3%2B-bd0000)](./LICENSE)\n[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/JonathanHelianthicusDoe/toonmux)](https://github.com/JonathanHelianthicusDoe/toonmux)\n\nMulti-toon controller for\n[Toontown](https://en.wikipedia.org/wiki/Toontown_Online)-based MMORPGs. Uses\n[X11](https://en.wikipedia.org/wiki/X_Window_System) and\n[GTK](https://en.wikipedia.org/wiki/GTK), and is designed for use with\n[GNU/Linux](https://en.wikipedia.org/wiki/Linux) operating systems (but\n*possibly* works on anything that is using X11 as a windowing system).\n\n## Version\n\n**toonmux is in an *ALPHA* state, and should only be used at your own risk!**\nThis will continue to be the case until the version of toonmux is `\u003e=0.1.0`.\n\ntoonmux adheres to [version 2.0.0 of the Semantic Versioning\nspecification](https://semver.org/spec/v2.0.0.html).\n\n## Install\n\n### Requirements\n\n* [X11](https://en.wikipedia.org/wiki/X_Window_System)\n* [GTK](https://en.wikipedia.org/wiki/GTK) `\u003e=3.22 \u0026\u0026 \u003c4.0` (including\n  development files, `libgtk-3-dev` in Debian)\n* [libxdo](https://www.semicomplete.com/projects/xdotool/) `\u003e=3.0 \u0026\u0026 \u003c4.0`\n  (including development files, `libxdo-dev` in Debian)\n* [rustc \u0026amp; cargo](https://rustup.rs/)\n\n### How\n\n```bash\ngit clone https://github.com/JonathanHelianthicusDoe/toonmux.git\ncd toonmux\ncargo rustc --release -- -C target-cpu=native\nstrip ./target/release/toonmux\n./target/release/toonmux\n```\n\n## Features\n\n* [x] Multiple controllers (up to 64\\* simultaneously) with independent\n      bindings\n* [x] Rebindable main controls (the controls that all controllers\u0026rsquo;\n      bindings map to)\n* [x] Collapsable UI (minimal screen space while still being focusable with the\n      mouse)\n* [x] Ability to have a controller mirror another controller\n* [x] toonmux\u0026rsquo;s state is automatically persisted to disk as JSON\n* [x] Ability to re-bind controller from one window to another\n* [x] Special binding for a \u0026ldquo;low throw\u0026rdquo; of cream pies/evidence\n* [x] Ability to add controllers\n* [x] Ability to remove controllers\n* [x] Speedchat+ support\n* [x] Ability to toggle mirroring globally on and off using a key press\n* [ ] Bindable controls for viewing gags and tasks\n    * [ ] Automatic keep-alive\n\n\\*Actually 32 on 32-bit architectures.\n\n## FAQ\n\n### Why can\u0026rsquo;t I talk using a controller that is mirroring another?\n\nIf a controller `A` is mirroring a controller `B`, then `A`\u0026rsquo;s own\n\u0026ldquo;talk\u0026rdquo; hotkey gets suppressed; in this situation, the only way for\nyou to use Speedchat+ with controller `A` is by using `B`\u0026rsquo;s hotkey. If\nthis is not desired, you can just toggle off mirroring before chatting.\n\n### Why is everything spaghetti code?\n\n[The GUI ecosystem](https://areweguiyet.com/) for Rust is not very mature yet,\nand essentially all of the options for making a GUI in Rust are either too\nimmature for serious use (and may possibly vanish at any time), and/or perform\nunacceptably poorly for use in something that should just be a lightweight\ndesktop applet.\n\nAs a result, toonmux uses [gtk-rs](https://gtk-rs.org/), which are just Rust\nbindings to [GTK](https://en.wikipedia.org/wiki/GTK). Unfortunately, GTK is a\n[C](https://en.wikipedia.org/wiki/C_%28programming_language%29) API that is not\nonly geared towards more \u0026ldquo;object-oriented\u0026rdquo;/\u0026ldquo;classical\u0026rdquo;\n(read: [spaghetti](https://en.wikipedia.org/wiki/Spaghetti_code)) approaches to\nGUI, but also does not in any way respect the ownership model of Rust. This\nmeans using a lot of atomically reference-counted pointers\n([`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html)) that get passed\ninto closures, as well as internal mutability (mostly in the form of atomics\nfor toonmux, but also reader-writer locks \u0026amp; mutexes). This is essentially\nwriting out explicitly things that are required to be used anyways to use GTK\nsafely, but Rust doesn\u0026rsquo;t have the luxury of a large runtime to make\nthings easier (c.f. PyGTK).\n\nThat being said, toonmux is still written in Rust in order to stay as\nresponsive and lightweight as possible while still being safe (for some value\nof \u0026ldquo;safe\u0026rdquo;).\n\n### Why don\u0026rsquo;t you use any weak `Arc` references?\n\nThe only things wrapped in `Arc` are the global \u0026ldquo;state\u0026rdquo; and the\nglobal UI state. Holding weak references is obviously useless in this case\nbecause the global state never gets deallocated. Only holding references to the\n\u0026ldquo;root\u0026rdquo; of global state might seem like an unfortunate choice, but\nit works quite well since there is no actual graph structure, ownership-wise\n(except internally in GTK\u0026rsquo;s implementation of the UI).\n\n### Why are all of your atomic accesses sequentially consistent?\n\nBecause I\u0026rsquo;m a coward. Also because I expect the synchronization\nbottleneck to be at the level of the `RwLock`s anyways, not the atomics. If\nyou\u0026rsquo;re an atomics-semantical wizard, feel free to submit a PR to weaken\nthe ordering constraints\u0026hellip;\n\n## Legal\n\ntoonmux is licensed to anyone under the terms of the [GNU General Public\nLicense, version 3](https://www.gnu.org/licenses/gpl-3.0.html) (or any later\nversion of the same license, at the licensee\u0026rsquo;s option).\n\n[![GPL v3+](https://www.gnu.org/graphics/gplv3-or-later.png\n\"GPL v3+\")](https://www.gnu.org/licenses/gpl-3.0.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanhelianthicusdoe%2Ftoonmux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanhelianthicusdoe%2Ftoonmux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanhelianthicusdoe%2Ftoonmux/lists"}