// don't do this! auto window = new SimpleWindow(); window.eventLoop(0); auto window2 = new SimpleWindow(); window2.eventLoop(0); // problematic! might crash
simpledisplay's current implementation assumes that final cleanup is done when the event loop refcount reaches zero. So after the first eventLoop returns, when there isn't already another one active, it assumes the program will exit soon and cleans up.
This is arguably a bug that it doesn't reinitialize, and I'll probably change it eventually, but in the mean time, there's an easy solution:
// do this EventLoop mainEventLoop = EventLoop.get; // just add this line auto window = new SimpleWindow(); window.eventLoop(0); auto window2 = new SimpleWindow(); window2.eventLoop(0); // perfectly fine since mainEventLoop still alive
By adding a top-level reference to the event loop, it ensures the final cleanup is not performed until it goes out of scope too, letting the individual window loops work without trouble despite the bug.
The overload without pulseTimeout was added on December 8, 2021.
On December 9, 2021, the default blocking mode (which is now configurable because eventLoopWithBlockingMode was added) switched from BlockingMode.untilApplicationQuits over to BlockingMode.automatic. This should almost never be noticeable to you since the typical simpledisplay paradigm has been (and I still recommend) to have one eventLoop call.
The event loop automatically returns when the window is closed pulseTimeout is given in milliseconds. If pulseTimeout == 0, no pulse timer is created. The event loop will block until an event arrives or the pulse timer goes off.
The given eventHandlers are passed to setEventHandlers, which in turn assigns them to handleKeyEvent, handleCharEvent, handlePulse, and handleMouseEvent, based on the signature of delegates you provide.
Give one with no parameters to set a timer pulse handler. Give one that takes KeyEvent for a key handler, MouseEvent, for a mouse handler, and one that takes dchar for a char event handler. You can use as many or as few handlers as you need for your application.