View on GitHub

bindcontrol

Keybind, macro, and popmenu manager for City of Heroes

BindControl

Find the latest release of BindControl on its releases page.

BindControl is a helper app for creating and maintaining keybinds, macros, and popmenus for City of Heroes.

BindControl

Features

TODO

Using Binary Releases

Binary releases of Python applications are finicky and fragile, but are provided on the releases page. Feel free to try them, but if you have any trouble, skip down to Running From Source below for an alternative, very deterministic, way of running BindControl. Any feedback on your experience with the binary releases is welcome and encouraged.

Windows users: Try the ZIP file. If that works for you, it’s the quickest path to victory. If you receive malware warnings when downloading, please read my comments on that issue.

MacOS users: Experimental binary releases for Intel and Arm64 have been made available. They are not signed and/or notarized, and might or might not work at all. Any feedback from MacOS users is welcome and appreciated.

Linux users: Two experimental binary releases are now available:

Running From Source

Step 1 - Dependencies

  1. Python version 3.13 or later
  2. wxPython version 4.2.2 or later
  3. Pillow
  4. pypubsub

Windows users:

MacOS users:

Linux users: install your distribution’s packages for Python 3, wxPython, python-pillow, and python-pypubsub.2

Step 2 - Getting and running the code

Developing BindControl

BindControl is being developed on Manjaro Linux. It gets feature-tested on Windows 10 and 11 VMs, and occasionally on a MacOS Catalina VM.

While developing, I make sure the code passes both pyright and ruff with a large subset of the possible ruff rules included.

There is a small but growing pytest test suite. It only runs on Linux (and possibly MacOS) because it uses pytest-forked which is not supported on Windows. To run the test suite, you’ll need to install the following plugins and their dependencies:

I make liberal use of typing in parameters, attributes, and return values, and continue to add this into new and existing code as I go. This has proven to be a bit of a hassle since BindControl was originally a direct port of CityBinder, and inherited many of its original questionable design decisions, as well as having introduced any number of its own over the years. Enforcing more strict typing is an ongoing process, but has resulted in cleaner and better code, as well as having surfaced any number of potential and actual bugs.

Any submitted patches or pull requests should pass the test suite and pyright at the very least. Adding new tests is encouraged.

History

BindControl began as a direct port of Konoko and Monorail’s CityBinder 0.76, using Python and the WxWidgets UI toolkit. It has since come into its own, adding many original features, UI improvements, and quality-of-life upgrades.

During City of Heroes’ original run, CityBinder was the go-to app for keybinds. CityBinder is written in lua, using the IUP toolkit, and the required versions of those can be difficult to set up for development on modern OSes. I wanted to add features and clean up the UI, so in a stunningly unwise act of hubris, I instead started work on BindControl.

I worked on it on-and-off for the remainder of the original run of City of Heroes, then shelved it, ostensibly forever, when NCSoft shut down the game. Then, of course, everything changed, the game lives again, and BindControl has a reason to exist.

BindControl is and has been developed on Homecoming, and best supports that. Recently, beta support for Rebirth has been added, supporting the Guardian archetype, new powersets, the Genesis Incarnate slot, and more. This support is solid but is a work in progress – Rebirth players, check it out and file issues as you find bugs!

Credits

BindControl was originally a direct port of CityBinder code, and in many places is still extremely influenced by it. Keybinding code drew from similar code in PADRE.

Various newer functionality was added to CityBinder for Homecoming by Tailcoat, who kindly provided his source code and permission to adapt for use with BindControl, as well as offered suggestions and advice for improvements. The Inspiration Popper in particular was incorporated wholesale from a design of Tailcoat’s in an unreleased version of CityBinder for Homecoming.

The CoH/CoV Technical Reference Guide from Shenanigunner4 has been, and continues to be, a crucial resource and is highly recommended for those wishing to dig deeper into keybinds, popmenus, and macros.

The Sandolphan Mastermind bind schemes were originally developed by Sandolphan during the City of Villains beta in 2006 and posted to the official forums at that time. The version in BindControl is an adaptation and expansion of the original binds.

The qwy Mastermind bind schemes are adapted from qwy’s posts on the Homecoming forums5 6, and are used with their gracious permission.

The Github Actions for automated building of binary releases were provided by JamzTheMan.

BindControl contains a local modified copy of the wx.lib.agw.flatmenu package from wxPython. The file COHMenu.py is separately licensed under the wxWindows Library License, which is reproduced inside that file, and references the LGPL version 2.0, which is included as a separate file. Flatmenu was originally written by Andrea Gavana.

Most of the UI Icons / graphics are from Microsoft’s Fluent icons collection, by way of Colton Griffith’s Fluent Icons viewer.

Additional feedback and suggestions have been provided in the Homecoming Forums thread and in Github issues by:
DevoDog68, BlackSpectre, Premmy, kenlon, Lumenia, xizar, autobotpinto, jtoya85

CityBinder’s original acknowledgements are reproduced below:

    Obviously, without Cryptic and NCSoft to have created/funded/published
    City of Heroes and City of Villains, there would be no point to this
    program.  Thanks to Gnarly and the numerous people who contributed to the
    creation of the Speed on Demand System.  Thanks to Sandolphan/Khaiba and
    the many people who posted Mastermind binds in the CoV Beta forums.
    Again thanks to Sandolphan for the Bodyguard mode binds.  Also thanks
    to the following people, who directly contributed to CityBinder, either
    with bug reports, feature suggestions, or contirbuted binds.
    PerezPersuader, Blue_Daze, Back_Blast, IronVulture, Darkelven,
    Shadowhand, Knight_Marshal, Nilt_, Psygon, DuskA, CyberKnight7, ErieFF,
    Darc_Reign, Beerninja, BarfBag, Oronis, TrystarMojo, Pyrobard,
    Ang_Rui_Shen, Konoko, Draznar, Local_Man, tyrose, Caustic, 80sboi,
    DarknessEternal, reiella, Robotech_Master, Ground_Zeroo, Stylina, and
    ShieldBearer.

License

BindControl is licensed under the GPL version 3 or later, except for the file COHMenu.py, which is licensed as indicated inside that file.

emerson@hayseed.net

  1. For instance, I run Manjaro, and have to install “libtiff5” from AUR to make the binary release work. 

  2. Various distributions have different names for their package manager versions of python packages. You might need to do a little searching with apt or yum or what-have-you to find these. You can also use pip to install them but that path is sometimes very fiddly. 

  3. If you are familiar at all with git or github, cloning the repo is the recommended action here – this makes it easier and quicker to get new changes when they arrive, as well as allows access to incremental between-release changes and experimental branches. 

  4. Shenanigunner passed away in April 2025 and his site has gone dark since then. The links in the Credits section point to the latest available captures of his site at the Internet Archive. Shenanigunner was an iconic and tireless member of the City of Heroes community, and his presence is deeply missed. 

  5. i26 Expanded Mastermind NumPad Controls+ 

  6. i26 The Mastermind’s PetMouse