I'm not sure if the Keyboard class is threadsafe, if that's what you mean. Might be, but I just don't know.
Hmm, would that matter if all I'm calling are isKeyDown() queries? Nothing should be changing in the static Keyboard instance, correct?
To be honest, I'm not that familiar with multi-threading (I've only worked with it a few times, and most of the libraries I've used were thread safe). This update is partially an excuse to learn.

Also: how would you execute something on the main thread while paused? The spawn point/combat plugin wouldn't get called until the unpause. Just trying to understand 
The keyboard handler was previously in the spawn point, and the keyboard checks were done once per advance(). It's not implemented that way anymore.
Now, the keyboard handler is its own thread with a custom framerate (and thus no longer reliant on Starfarer calling advance()). This is the change that allows it to be used while paused or in a menu. All the spawn point advance()/combat plugin init() methods do is tell the console if the player is on the campaign map or in a battle so it can select which commands are available.
It's kind of a messy workaround, but I believe it will work (I'm still in the prototype phase right now). That said, I would love to see something like a Global.getCampaignState(CampaignState state) API method that tells us where the current focus is.
