mirror of
https://github.com/fltk/fltk.git
synced 2026-05-31 05:35:29 +08:00
MacOS: fix support of Cairo under macOS 10.14 Mojave.
The cairo_test program would redraw the window vertically flipped after the window was hidden or miniaturized when layer-backed windows were used. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@13111 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
@@ -166,6 +166,9 @@ public: // should be private!
|
|||||||
static int compose_state; // used for dead keys (WIN32) or marked text (MacOS)
|
static int compose_state; // used for dead keys (WIN32) or marked text (MacOS)
|
||||||
static void call_screen_init(); // recompute screen number and dimensions
|
static void call_screen_init(); // recompute screen number and dimensions
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
# ifdef FLTK_HAVE_CAIRO
|
||||||
|
static bool using_cairo_context;
|
||||||
|
# endif
|
||||||
static void reset_marked_text(); // resets marked text
|
static void reset_marked_text(); // resets marked text
|
||||||
static void insertion_point_location(int x, int y, int height); // sets window coordinates & height of insertion point
|
static void insertion_point_location(int x, int y, int height); // sets window coordinates & height of insertion point
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
# elif defined(WIN32)
|
# elif defined(WIN32)
|
||||||
# include <cairo-win32.h>
|
# include <cairo-win32.h>
|
||||||
# elif defined(__APPLE_QUARTZ__)
|
# elif defined(__APPLE_QUARTZ__)
|
||||||
|
bool Fl::using_cairo_context = false;
|
||||||
# include <cairo-quartz.h>
|
# include <cairo-quartz.h>
|
||||||
# else
|
# else
|
||||||
# error Cairo is not supported on this platform.
|
# error Cairo is not supported on this platform.
|
||||||
@@ -78,9 +79,15 @@ cairo_t * Fl::cairo_make_current(Fl_Window* wi) {
|
|||||||
if (fl_gc==0) { // means remove current cc
|
if (fl_gc==0) { // means remove current cc
|
||||||
Fl::cairo_cc(0); // destroy any previous cc
|
Fl::cairo_cc(0); // destroy any previous cc
|
||||||
cairo_state_.window(0);
|
cairo_state_.window(0);
|
||||||
|
#if defined(__APPLE_QUARTZ__)
|
||||||
|
Fl::using_cairo_context = false;
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__APPLE_QUARTZ__)
|
||||||
|
Fl::using_cairo_context = true;
|
||||||
|
#endif
|
||||||
// don't re-create a context if it's the same gc/window couple
|
// don't re-create a context if it's the same gc/window couple
|
||||||
if (fl_gc==Fl::cairo_state_.gc() && fl_xid(wi) == (Window) Fl::cairo_state_.window())
|
if (fl_gc==Fl::cairo_state_.gc() && fl_xid(wi) == (Window) Fl::cairo_state_.window())
|
||||||
return Fl::cairo_cc();
|
return Fl::cairo_cc();
|
||||||
|
|||||||
+13
-2
@@ -36,9 +36,8 @@ extern "C" {
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#include <FL/Fl.H>
|
|
||||||
#include <FL/x.H>
|
#include <FL/x.H>
|
||||||
|
#include <FL/Fl.H>
|
||||||
#include <FL/Fl_Window.H>
|
#include <FL/Fl_Window.H>
|
||||||
#include <FL/Fl_Tooltip.H>
|
#include <FL/Fl_Tooltip.H>
|
||||||
#include <FL/Fl_Printer.H>
|
#include <FL/Fl_Printer.H>
|
||||||
@@ -2421,8 +2420,20 @@ static CGContextRef prepare_bitmap_for_layer(int w, int h ) {
|
|||||||
}
|
}
|
||||||
if (window->damage()) {
|
if (window->damage()) {
|
||||||
through_drawRect = YES;
|
through_drawRect = YES;
|
||||||
|
#ifdef FLTK_HAVE_CAIRO
|
||||||
|
CGFloat before_flush = CGContextGetCTM(layer_gc).d;
|
||||||
|
Fl::using_cairo_context = false;
|
||||||
|
#endif
|
||||||
i->flush();
|
i->flush();
|
||||||
Fl_X::q_release_context();
|
Fl_X::q_release_context();
|
||||||
|
#ifdef FLTK_HAVE_CAIRO
|
||||||
|
if (Fl::using_cairo_context && CGContextGetCTM(layer_gc).d != before_flush ) {
|
||||||
|
// necessary for Cairo and layer-backed views
|
||||||
|
CGContextRestoreGState(layer_gc);
|
||||||
|
CGContextSaveGState(layer_gc);
|
||||||
|
}
|
||||||
|
Fl::using_cairo_context = false;
|
||||||
|
#endif
|
||||||
through_drawRect = NO;
|
through_drawRect = NO;
|
||||||
window->clear_damage();
|
window->clear_damage();
|
||||||
if (layer_gc) {
|
if (layer_gc) {
|
||||||
|
|||||||
Reference in New Issue
Block a user