Application.Idle is invoked on the same thread used to add the event our hacky double buffering only works on the client area, not the nc area. need to move to a more XplatUI solution involving server-side drawing surfaces (pixmaps in the X case). right now the expose/configure event aggregating is done in the XEventThread (in the hwnd code, but in the thread running the x event loop). There is probably a way to get it to run in the thread doing GetMessage, probably by making GetMessage know about both the xevent and paint queue's, and having it consume the x queue until there's nothing left, doing the AddExpose stuff there. then, once the xqueue is empty, consume the paint queue. This has the added benefit of making the paint queue a ThreadQueue local thing - no locking will be needed on it, since the only thing touching it will be the thread running the message pump. why do we /nowarn:108? we lose tons of possibly important warnings due to that... more event work: CheckedListBox: nothing done. DataGridView*: nothing done. GridColumnStylesCollection: nothing done, no Component inheritance GridTableStylesCollection: nothing done, no Component inheritance MenuItem: what do we do about CloneMenu? we can't have assignment of events like that (look for the #if notyet) MonthCalendar: nothing done. Panel: nothing done. see whether the events should be "new" or now..