summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2015-08-07 12:55:56 +0000
committerManolo Gouy <Manolo>2015-08-07 12:55:56 +0000
commitcc36ab53b327b1a05edba006dcb581815fbdd08f (patch)
tree2393b9c37db87a36461470c264df104a5ec58f0d
parent9a38c24d638023059db9059c3805f0f62b455dbd (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.H1
-rw-r--r--src/Fl_Window.cxx4
-rw-r--r--src/Fl_cocoa.mm15
3 files changed, 15 insertions, 5 deletions
diff --git a/FL/mac.H b/FL/mac.H
index 259937915..2cc0d9687 100644
--- a/FL/mac.H
+++ b/FL/mac.H
@@ -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);