diff options
| author | Manolo Gouy <Manolo> | 2015-08-07 12:55:56 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2015-08-07 12:55:56 +0000 |
| commit | cc36ab53b327b1a05edba006dcb581815fbdd08f (patch) | |
| tree | 2393b9c37db87a36461470c264df104a5ec58f0d | |
| parent | 9a38c24d638023059db9059c3805f0f62b455dbd (diff) | |
- Implement Fl_Window::wait_for_expose() for Mac OS:
The -[NSWindow makeKeyAndOrderFront:] message used to make the window appear on the screen,
but, starting with 10.10 (approximately), this changed, and it became necessary to query for events
for a new window to appear on the screen. With 10.11 two event messages are needed.
The solution is therefore to implement Fl_Window::wait_for_expose().
- Calling NSDisableScreenUpdates()()/NSEnableScreenUpdates() before and after window updates
greatly accelerates multi-window update operations.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10826 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | FL/mac.H | 1 | ||||
| -rw-r--r-- | src/Fl_Window.cxx | 4 | ||||
| -rw-r--r-- | src/Fl_cocoa.mm | 15 |
3 files changed, 15 insertions, 5 deletions
@@ -208,6 +208,7 @@ public: static Fl_Fontdesc* calc_fl_fonts(void); // computes the fl_fonts global variable static int dnd(int use_selection); // call Fl_X::dnd(1) to support text dragging static int calc_mac_os_version(void); // computes the fl_mac_os_version global variable + static void do_wait_for_expose(); private: #if FLTK_ABI_VERSION >= 10304 CGRect* subRect_; // makes sure subwindow remains inside its parent window diff --git a/src/Fl_Window.cxx b/src/Fl_Window.cxx index b4d3c621f..50bc65e94 100644 --- a/src/Fl_Window.cxx +++ b/src/Fl_Window.cxx @@ -462,9 +462,13 @@ void Fl_Window::free_icons() { void Fl_Window::wait_for_expose() { if (!shown()) return; +#ifdef __APPLE__ + Fl_X::do_wait_for_expose(); +#else while (!i || i->wait_for_expose) { Fl::wait(); } +#endif } // diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index aee08a89a..9c91a79f8 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -779,7 +779,9 @@ double fl_mac_flush_and_wait(double time_to_wait) { // the idle function may turn off idle, we can then wait: if (Fl::idle) time_to_wait = 0.0; } + NSDisableScreenUpdates(); // 10.3 Makes updates to all windows appear as a single event Fl::flush(); + NSEnableScreenUpdates(); // 10.3 if (Fl::idle && !in_idle) // 'idle' may have been set within flush() time_to_wait = 0.0; double retval = fl_wait(time_to_wait); @@ -3047,10 +3049,6 @@ void Fl_X::make(Fl_Window* w) x->changed_resolution(false); #endif [cw makeKeyAndOrderFront:nil]; - if (fl_mac_os_version >= 101100) { // these two messages seem necessary to make the window appear on screen - [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:NO]; - [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:NO]; - } } if (!w->parent()) { @@ -3087,6 +3085,13 @@ void Fl_Window::size_range_() { } } +void Fl_X::do_wait_for_expose() +{ // this will make freshly created windows appear on the screen + [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:NO]; + if (fl_mac_os_version >= 101100) { // this extra message seems necessary with 10.11 + [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:NO]; + } +} /* * returns pointer to the filename, or null if name ends with ':' @@ -3340,7 +3345,7 @@ void Fl_X::q_clear_clipping() { void Fl_X::q_release_context(Fl_X *x) { if (x && x->gc!=fl_gc) return; if (!fl_gc) return; - CGContextRestoreGState(fl_gc); // KEEP IT: matches the CGContextSaveGState of make_current + CGContextRestoreGState(fl_gc); // match the CGContextSaveGState's of make_current CGContextRestoreGState(fl_gc); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 Fl_X::set_high_resolution(false); |
