diff options
| -rw-r--r-- | CHANGES | 1 | ||||
| -rw-r--r-- | src/Fl_Double_Window.cxx | 25 | ||||
| -rw-r--r-- | src/Fl_mac.cxx | 11 | ||||
| -rw-r--r-- | src/cgdebug.h | 28 |
4 files changed, 49 insertions, 16 deletions
@@ -1,5 +1,6 @@ CHANGES IN FLTK 1.1.8 + - Many OS X Quartz fixes (STR #1310, etc.) - Fixed shortcut and default focus for message dialogs (STR #1298) - Fixed focus issues (STR #1286, STR #1289, STR #1296) diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx index e1fa64e67..54fd2b935 100644 --- a/src/Fl_Double_Window.cxx +++ b/src/Fl_Double_Window.cxx @@ -219,12 +219,19 @@ void fl_delete_offscreen(Fl_Offscreen ctx) { free(data); } -static CGContextRef prev_gc = 0; -static Window prev_window = 0; +const int stack_max = 16; +static int stack_ix = 0; +static CGContextRef stack_gc[stack_max]; +static Window stack_window[stack_max]; void fl_begin_offscreen(Fl_Offscreen ctx) { - prev_gc = fl_gc; - prev_window = fl_window; + if (stack_ix<stack_max) { + stack_gc[stack_ix] = fl_gc; + stack_window[stack_ix] = fl_window; + } else + fprintf(stderr, "FLTK CGContext Stack overflow error\n"); + stack_ix++; + fl_gc = (CGContextRef)ctx; fl_window = 0; //fl_push_no_clip(); @@ -235,8 +242,14 @@ void fl_begin_offscreen(Fl_Offscreen ctx) { void fl_end_offscreen() { Fl_X::q_release_context(); //fl_pop_clip(); - fl_gc = prev_gc; - fl_window = prev_window; + if (stack_ix>0) + stack_ix--; + else + fprintf(stderr, "FLTK CGContext Stack underflow error\n"); + if (stack_ix<stack_max) { + fl_gc = stack_gc[stack_ix]; + fl_window = stack_window[stack_ix]; + } } extern void fl_restore_clip(); diff --git a/src/Fl_mac.cxx b/src/Fl_mac.cxx index c7a03531a..732f4f143 100644 --- a/src/Fl_mac.cxx +++ b/src/Fl_mac.cxx @@ -2032,6 +2032,7 @@ void Fl_Window::resize(int X,int Y,int W,int H) { void Fl_Window::make_current() { #ifdef __APPLE_QUARTZ__ + OSStatus err; Fl_X::q_release_context(); #endif if ( !fl_window_region ) @@ -2068,7 +2069,9 @@ void Fl_Window::make_current() } #ifdef __APPLE_QUARTZ__ - QDBeginCGContext(GetWindowPort(i->xid), &i->gc); + err = QDBeginCGContext(GetWindowPort(i->xid), &i->gc); + if (err!=noErr) + fprintf(stderr, "Error %d in QDBeginCGContext\n", (int)err); fl_gc = i->gc; CGContextSaveGState(fl_gc); Fl_X::q_fill_context(); @@ -2117,7 +2120,11 @@ void Fl_X::q_release_context(Fl_X *x) { if (x && x->gc!=fl_gc) return; if (!fl_gc) return; CGContextRestoreGState(fl_gc); - if (fl_window) QDEndCGContext(GetWindowPort(fl_window), &fl_gc); + if (fl_window) { + OSStatus err = QDEndCGContext(GetWindowPort(fl_window), &fl_gc); + if (err!=noErr) + fprintf(stderr, "Error %d in QDEndCGContext\n", (int)err); + } fl_gc = 0; } diff --git a/src/cgdebug.h b/src/cgdebug.h index 3d11158ff..a8a605322 100644 --- a/src/cgdebug.h +++ b/src/cgdebug.h @@ -83,6 +83,18 @@ //+StrokePath //+TranslateCTM +inline OSStatus dbgLocation(const char *file, int line) +{ + fprintf(stderr, "%s:%d ", file, line); + return 0; +} + +inline OSStatus dbgEndl() +{ + fprintf(stderr, "\n"); + return 0; +} + inline void dbgCGContextClipToRect(CGContextRef a, CGRect b) { @@ -109,20 +121,20 @@ inline OSStatus dbgQDEndCGContext(CGrafPtr a, CGContextRef *b) return QDEndCGContext(a, b); } -#define QDEndCGContext(a, b) { \ - fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ - dbgQDEndCGContext(a, b); \ - fprintf(stderr, "\n"); } +#define QDEndCGContext(a, b) ( \ + dbgLocation(__FILE__, __LINE__) + \ + dbgQDEndCGContext(a, b) + \ + dbgEndl() ) inline OSStatus dbgQDBeginCGContext(CGrafPtr a, CGContextRef *b) { return QDBeginCGContext(a, b); } -#define QDBeginCGContext(a, b) { \ - fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ - dbgQDBeginCGContext(a, b); \ - fprintf(stderr, "\n"); } +#define QDBeginCGContext(a, b) ( \ + dbgLocation(__FILE__, __LINE__) + \ + dbgQDBeginCGContext(a, b) + \ + dbgEndl() ) inline void dbgClipCGContextToRegion(CGContextRef a, const Rect *b, RgnHandle c) { |
