summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rw-r--r--src/Fl_Double_Window.cxx25
-rw-r--r--src/Fl_mac.cxx11
-rw-r--r--src/cgdebug.h28
4 files changed, 49 insertions, 16 deletions
diff --git a/CHANGES b/CHANGES
index 59126770d..23f13135e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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)
{