Indeed - I went off on a bit of a tangent for a couple of weeks 8-) investigating events and run-loops and all that stuff. The only way I got it to work in the end was to get rid of all that stuff and implement a simple solution.
... forgot to say: i.e. I do it the same way you would if you were writing an ObjectiveC Cocoa app that needed to respond to events - and ditched any manual manipulation.
This wasn't clear from what I said - sorry for any people puzzling and then saying "but surely that's just the standard way to do it..." - yes, it would be. I guess 8-)
-Duncan