mirror of
https://github.com/fltk/fltk.git
synced 2026-05-30 13:05:35 +08:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -142,6 +142,10 @@ option(OPTION_FILESYSTEM_SUPPORT "allow file system support" ON)
|
|||||||
if(DOXYGEN_FOUND)
|
if(DOXYGEN_FOUND)
|
||||||
option(OPTION_BUILD_HTML_DOCUMENTATION "build html docs" OFF)
|
option(OPTION_BUILD_HTML_DOCUMENTATION "build html docs" OFF)
|
||||||
option(OPTION_INSTALL_HTML_DOCUMENTATION "install html docs" OFF)
|
option(OPTION_INSTALL_HTML_DOCUMENTATION "install html docs" OFF)
|
||||||
|
|
||||||
|
option(OPTION_INCLUDE_DRIVER_DOCUMENTATION "include driver (developer) docs" OFF)
|
||||||
|
mark_as_advanced(OPTION_INCLUDE_DRIVER_DOCUMENTATION)
|
||||||
|
|
||||||
if(LATEX_FOUND)
|
if(LATEX_FOUND)
|
||||||
option(OPTION_BUILD_PDF_DOCUMENTATION "build pdf docs" OFF)
|
option(OPTION_BUILD_PDF_DOCUMENTATION "build pdf docs" OFF)
|
||||||
option(OPTION_INSTALL_PDF_DOCUMENTATION "install pdf docs" OFF)
|
option(OPTION_INSTALL_PDF_DOCUMENTATION "install pdf docs" OFF)
|
||||||
|
|||||||
@@ -16,6 +16,11 @@
|
|||||||
// http://www.fltk.org/str.php
|
// http://www.fltk.org/str.php
|
||||||
//
|
//
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
Definition of class Fl_Sys_Menu_Bar.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef Fl_Sys_Menu_Bar_H
|
#ifndef Fl_Sys_Menu_Bar_H
|
||||||
#define Fl_Sys_Menu_Bar_H
|
#define Fl_Sys_Menu_Bar_H
|
||||||
|
|
||||||
@@ -44,7 +49,8 @@ class Fl_Sys_Menu_Bar_Driver;
|
|||||||
Changes to the menu state are immediately visible in the menubar when they are made
|
Changes to the menu state are immediately visible in the menubar when they are made
|
||||||
using member functions of the Fl_Sys_Menu_Bar class. Other changes (e.g., by a call to
|
using member functions of the Fl_Sys_Menu_Bar class. Other changes (e.g., by a call to
|
||||||
Fl_Menu_Item::set()) should be followed by a call to update() to be
|
Fl_Menu_Item::set()) should be followed by a call to update() to be
|
||||||
visible in the menubar across all platforms.
|
visible in the menubar across all platforms. Global variable \ref fl_sys_menu_bar points to
|
||||||
|
the unique, current system menu bar.
|
||||||
|
|
||||||
A few FLTK menu features are not supported by the Mac System menu:
|
A few FLTK menu features are not supported by the Mac System menu:
|
||||||
\li no symbolic labels
|
\li no symbolic labels
|
||||||
@@ -102,6 +108,8 @@ public:
|
|||||||
static void create_window_menu();
|
static void create_window_menu();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** The system menu bar.
|
||||||
|
*/
|
||||||
extern Fl_Sys_Menu_Bar *fl_sys_menu_bar;
|
extern Fl_Sys_Menu_Bar *fl_sys_menu_bar;
|
||||||
|
|
||||||
#endif // Fl_Sys_Menu_Bar_H
|
#endif // Fl_Sys_Menu_Bar_H
|
||||||
|
|||||||
@@ -135,10 +135,6 @@ void fl_mac_set_about(Fl_Callback *cb, void *user_data, int shortcut = 0);
|
|||||||
*/
|
*/
|
||||||
extern int fl_mac_os_version;
|
extern int fl_mac_os_version;
|
||||||
|
|
||||||
/** The system menu bar.
|
|
||||||
*/
|
|
||||||
//extern class Fl_Sys_Menu_Bar *fl_sys_menu_bar;
|
|
||||||
|
|
||||||
struct Fl_Menu_Item;
|
struct Fl_Menu_Item;
|
||||||
|
|
||||||
class Fl_Mac_App_Menu {
|
class Fl_Mac_App_Menu {
|
||||||
|
|||||||
+27
-4
@@ -103,11 +103,11 @@ OPTION_ARCHFLAGS - default EMPTY
|
|||||||
Extra architecture flags.
|
Extra architecture flags.
|
||||||
|
|
||||||
OPTION_APPLE_X11 - default OFF
|
OPTION_APPLE_X11 - default OFF
|
||||||
In case you want to use X11 on OSX.
|
In case you want to use X11 on macOS.
|
||||||
Use this only if you know what you do, and if you have installed X11.
|
Use this only if you know what you do, and if you have installed X11.
|
||||||
|
|
||||||
OPTION_USE_POLL - default OFF
|
OPTION_USE_POLL - default OFF
|
||||||
Don't use this one either.
|
Don't use this one either, it is deprecated.
|
||||||
|
|
||||||
OPTION_BUILD_SHARED_LIBS - default OFF
|
OPTION_BUILD_SHARED_LIBS - default OFF
|
||||||
Normally FLTK is built as static libraries which makes more portable
|
Normally FLTK is built as static libraries which makes more portable
|
||||||
@@ -117,10 +117,10 @@ OPTION_BUILD_EXAMPLES - default ON
|
|||||||
Builds the many fine example programs.
|
Builds the many fine example programs.
|
||||||
|
|
||||||
OPTION_CAIRO - default OFF
|
OPTION_CAIRO - default OFF
|
||||||
Enables libcairo support - see README.CMake.txt.
|
Enables libcairo support - see README.Cairo.txt.
|
||||||
|
|
||||||
OPTION_CAIROEXT - default OFF
|
OPTION_CAIROEXT - default OFF
|
||||||
Enables extended libcairo support - see README.CMake.txt.
|
Enables extended libcairo support - see README.Cairo.txt.
|
||||||
|
|
||||||
OPTION_USE_GL - default ON
|
OPTION_USE_GL - default ON
|
||||||
Enables OpenGL support.
|
Enables OpenGL support.
|
||||||
@@ -169,6 +169,28 @@ OPTION_PRINT_SUPPORT - default ON
|
|||||||
is somewhat smaller. This option makes sense only on the Unix/Linux
|
is somewhat smaller. This option makes sense only on the Unix/Linux
|
||||||
platform or when OPTION_APPLE_X11 is ON.
|
platform or when OPTION_APPLE_X11 is ON.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation options: these options are only available if `doxygen' is
|
||||||
|
installed and found by CMake. PDF related options require also `latex'.
|
||||||
|
|
||||||
|
OPTION_BUILD_HTML_DOCUMENTATION - default OFF
|
||||||
|
OPTION_BUILD_PDF_DOCUMENTATION - default OFF
|
||||||
|
These options can be used to switch HTML documentation generation with
|
||||||
|
doxygen on. The build targets ('html', 'pdf', or 'docs') need still to
|
||||||
|
be executed explicitly.
|
||||||
|
|
||||||
|
OPTION_INCLUDE_DRIVER_DOCUMENTATION - default OFF
|
||||||
|
This option adds driver documentation to HTML and PDF docs (if ON). This
|
||||||
|
option is marked as "advanced" since it is only useful for FLTK developers
|
||||||
|
or advanced users.
|
||||||
|
|
||||||
|
OPTION_INSTALL_HTML_DOCUMENTATION - default OFF
|
||||||
|
OPTION_INSTALL_PDF_DOCUMENTATION - default OFF
|
||||||
|
If these options are ON then the HTML and/or PDF docs get installed
|
||||||
|
when the 'install' target is executed, e.g. with `make install'. You
|
||||||
|
need to select above options OPTION_BUILD_*_DOCUMENTATION as well.
|
||||||
|
|
||||||
|
|
||||||
2.3 Building under Linux with Unix Makefiles
|
2.3 Building under Linux with Unix Makefiles
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
|
||||||
@@ -543,3 +565,4 @@ Apr 07 2015 - AlbrechtS: update use example and more docs
|
|||||||
Jan 31 2016 - msurette: custom command instead of fltk_wrap_ui
|
Jan 31 2016 - msurette: custom command instead of fltk_wrap_ui
|
||||||
Nov 01 2016 - AlbrechtS: remove deprecated FLTK_USE_FILE, add MinGW build
|
Nov 01 2016 - AlbrechtS: remove deprecated FLTK_USE_FILE, add MinGW build
|
||||||
Jul 05 2017 - matt: added instructions for MacOS and Xcode
|
Jul 05 2017 - matt: added instructions for MacOS and Xcode
|
||||||
|
Dec 29 2018 - AlbrechtS: add documentation option descriptions
|
||||||
|
|||||||
@@ -18,6 +18,14 @@
|
|||||||
|
|
||||||
set (DOCS)
|
set (DOCS)
|
||||||
|
|
||||||
|
set (FL_VERSION "${FLTK_VERSION_FULL}")
|
||||||
|
|
||||||
|
if (OPTION_INCLUDE_DRIVER_DOCUMENTATION)
|
||||||
|
set (DRIVER_DOCS "DriverDev")
|
||||||
|
else ()
|
||||||
|
set (DRIVER_DOCS "")
|
||||||
|
endif ()
|
||||||
|
|
||||||
#--------------------------
|
#--------------------------
|
||||||
# build html documentation
|
# build html documentation
|
||||||
#--------------------------
|
#--------------------------
|
||||||
@@ -31,7 +39,6 @@ if(OPTION_BUILD_HTML_DOCUMENTATION)
|
|||||||
set(GENERATE_HTML YES)
|
set(GENERATE_HTML YES)
|
||||||
set(GENERATE_LATEX NO)
|
set(GENERATE_LATEX NO)
|
||||||
set(LATEX_HEADER "")
|
set(LATEX_HEADER "")
|
||||||
set(FL_VERSION "${FLTK_VERSION_FULL}")
|
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
||||||
@@ -64,7 +71,6 @@ if (OPTION_BUILD_PDF_DOCUMENTATION)
|
|||||||
set(GENERATE_HTML NO)
|
set(GENERATE_HTML NO)
|
||||||
set(GENERATE_LATEX YES)
|
set(GENERATE_LATEX YES)
|
||||||
set(LATEX_HEADER "${CMAKE_CURRENT_BINARY_DIR}/fltk-book.tex")
|
set(LATEX_HEADER "${CMAKE_CURRENT_BINARY_DIR}/fltk-book.tex")
|
||||||
set(FL_VERSION "${FLTK_VERSION_FULL}")
|
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
||||||
|
|||||||
@@ -437,8 +437,7 @@ GENERATE_DEPRECATEDLIST= YES
|
|||||||
# The ENABLED_SECTIONS tag can be used to enable conditional
|
# The ENABLED_SECTIONS tag can be used to enable conditional
|
||||||
# documentation sections, marked by \if sectionname ... \endif.
|
# documentation sections, marked by \if sectionname ... \endif.
|
||||||
|
|
||||||
ENABLED_SECTIONS =
|
ENABLED_SECTIONS = @DRIVER_DOCS@
|
||||||
# ENABLED_SECTIONS += DriverDev
|
|
||||||
|
|
||||||
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
|
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
|
||||||
# the initial value of a variable or define consists of for it to appear in
|
# the initial value of a variable or define consists of for it to appear in
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
============================================================================
|
||||||
|
How to use `abi-compliance-checker' to test FLTK ABI compatibility (Linux)
|
||||||
|
============================================================================
|
||||||
|
|
||||||
|
This howto uses directories in /git/ as example directories. Please
|
||||||
|
adjust versions and directory names as appropriate on your system.
|
||||||
|
|
||||||
|
In this howto we compare FLTK 1.3.4-1 (last 1.3.x release as of Jan 02, 2019)
|
||||||
|
with the current version (1.3.5) before it will be released.
|
||||||
|
|
||||||
|
|
||||||
|
(1) Download 'abi-compliance-checker' from GitHub:
|
||||||
|
|
||||||
|
$ cd /git
|
||||||
|
$ git clone https://github.com/lvc/abi-compliance-checker.git
|
||||||
|
|
||||||
|
Download directory: /git/abi-compliance-checker/
|
||||||
|
|
||||||
|
|
||||||
|
(2) Use two different Git checkout (working) directories to build libs,
|
||||||
|
for instance (as used in this example):
|
||||||
|
|
||||||
|
(new) /git/fltk-1.3 current version = 1.3.5
|
||||||
|
(old) /git/fltk-1.3.4-1 previous version = 1.3.4-1 [1]
|
||||||
|
|
||||||
|
[1] The second working directory can be created from the first
|
||||||
|
git working tree ( /git/fltk-1.3 ) with these commands:
|
||||||
|
|
||||||
|
$ cd /git/fltk-1.3
|
||||||
|
$ git worktree add /git/fltk-1.3.4-1 release-1.3.4-1
|
||||||
|
|
||||||
|
This creates the worktree in /git/fltk-1.3.4-1 and checks the
|
||||||
|
tag 'release-1.3.4-1' out.
|
||||||
|
|
||||||
|
|
||||||
|
(3) Create two xml descriptions to test library compatibility in
|
||||||
|
an arbitrary working directory (here: /git/workdir):
|
||||||
|
|
||||||
|
--- fltk-1.3.4-1.xml ---
|
||||||
|
<version>
|
||||||
|
1.3.4-1
|
||||||
|
</version>
|
||||||
|
|
||||||
|
<headers>
|
||||||
|
/git/fltk-1.3.4-1/FL/
|
||||||
|
</headers>
|
||||||
|
|
||||||
|
<skip_headers>
|
||||||
|
win32.H
|
||||||
|
mac.H
|
||||||
|
</skip_headers>
|
||||||
|
|
||||||
|
<libs>
|
||||||
|
/git/fltk-1.3.4-1/src/
|
||||||
|
/git/fltk-1.3.4-1/cairo/
|
||||||
|
</libs>
|
||||||
|
--- end of file ---
|
||||||
|
|
||||||
|
--- fltk-1.3.5.xml ---
|
||||||
|
<version>
|
||||||
|
1.3.5
|
||||||
|
</version>
|
||||||
|
|
||||||
|
<headers>
|
||||||
|
/git/fltk-1.3/FL/
|
||||||
|
</headers>
|
||||||
|
|
||||||
|
<skip_headers>
|
||||||
|
win32.H
|
||||||
|
mac.H
|
||||||
|
</skip_headers>
|
||||||
|
|
||||||
|
<libs>
|
||||||
|
/git/fltk-1.3/src/
|
||||||
|
/git/fltk-1.3/cairo/
|
||||||
|
</libs>
|
||||||
|
--- end of file ---
|
||||||
|
|
||||||
|
|
||||||
|
(4) Configure and build both libraries with the same options.
|
||||||
|
You *must* include '--enable-cairo' to build and compare the
|
||||||
|
Cairo libs and '--enable-shared' to build the shared libs:
|
||||||
|
|
||||||
|
$ make clean
|
||||||
|
$ ./configure --enable-cairo --enable-shared --enable-debug
|
||||||
|
$ make
|
||||||
|
|
||||||
|
Note: you must *not* use '--with-abiversion' because we need to
|
||||||
|
build the default ABI version.
|
||||||
|
|
||||||
|
|
||||||
|
(5) Run `abi-compliance-checker.pl':
|
||||||
|
|
||||||
|
$ cd /git/workdir
|
||||||
|
$ /git/abi-compliance-checker/abi-compliance-checker.pl \
|
||||||
|
-lib fltk -old fltk-1.3.4-1.xml -new fltk-1.3.5.xml
|
||||||
|
Preparing, please wait ...
|
||||||
|
Using GCC 7 (x86_64-linux-gnu, target: x86_64)
|
||||||
|
WARNING: May not work properly with GCC 4.8.[0-2], 6.* and higher
|
||||||
|
due to bug #78040 in GCC. Please try other GCC versions with the
|
||||||
|
help of --gcc-path=PATH option or create ABI dumps by ABI Dumper
|
||||||
|
tool instead to avoid using GCC. Test selected GCC version first
|
||||||
|
by -test option.
|
||||||
|
------------------------------------------------------------------
|
||||||
|
--> ignore warning (but run `abi-compliance-checker.pl -test')
|
||||||
|
------------------------------------------------------------------
|
||||||
|
Checking header(s) 1.3.4-1 ...
|
||||||
|
WARNING: can't find 'ctags' program
|
||||||
|
Checking header(s) 1.3.5 ...
|
||||||
|
WARNING: can't find 'ctags' program
|
||||||
|
------------------------------------------------------------------
|
||||||
|
--> ignore warning (or install 'ctags' and repeat)
|
||||||
|
------------------------------------------------------------------
|
||||||
|
Comparing ABIs ...
|
||||||
|
Comparing APIs ...
|
||||||
|
Creating compatibility report ...
|
||||||
|
Binary compatibility: 100%
|
||||||
|
Source compatibility: 100%
|
||||||
|
Total binary compatibility problems: 0, warnings: 0
|
||||||
|
Total source compatibility problems: 0, warnings: 1
|
||||||
|
Report: compat_reports/fltk/1.3.4-1_to_1.3.5/compat_report.html
|
||||||
|
|
||||||
|
|
||||||
|
(6) Check the generated report (last line above) with a browser:
|
||||||
|
|
||||||
|
$ firefox compat_reports/fltk/1.3.4-1_to_1.3.5/compat_report.html
|
||||||
|
|
||||||
|
|
||||||
|
(7) You may want to remove the additional worktree created above with:
|
||||||
|
|
||||||
|
$ cd /git/fltk-1.3
|
||||||
|
$ git worktree remove --force /git/fltk-1.3.4-1
|
||||||
|
|
||||||
|
|
||||||
|
(8) Done.
|
||||||
|
|
||||||
|
|
||||||
|
Note 1: The report as given above issued 100% ABI compatibility. The only
|
||||||
|
warning was the different patch version number.
|
||||||
|
|
||||||
|
Note 2: There are other recommended methods to use abi-compliance-checker
|
||||||
|
together with abi-dumper, but this is not (yet) covered here (see
|
||||||
|
abi-compliance-checker documentation).
|
||||||
+52
-37
@@ -594,10 +594,12 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop()
|
|||||||
CGContextRef layer_data;
|
CGContextRef layer_data;
|
||||||
}
|
}
|
||||||
- (void)displayLayer:(CALayer *)layer;
|
- (void)displayLayer:(CALayer *)layer;
|
||||||
|
- (void)prepare_bitmap_for_layer;
|
||||||
- (void)viewFrameDidChange;
|
- (void)viewFrameDidChange;
|
||||||
- (BOOL)wantsLayer;
|
- (BOOL)wantsLayer;
|
||||||
- (void)dealloc;
|
- (void)dealloc;
|
||||||
- (BOOL)did_view_resolution_change;
|
- (BOOL)did_view_resolution_change;
|
||||||
|
- (void)drawRect:(NSRect)rect;
|
||||||
@end
|
@end
|
||||||
#endif //10_8
|
#endif //10_8
|
||||||
|
|
||||||
@@ -2176,12 +2178,6 @@ static FLTextInputContext* fltextinputcontext_instance = nil;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8
|
||||||
static CGContextRef prepare_bitmap_for_layer(int w, int h ) {
|
|
||||||
static CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
|
|
||||||
CGContextRef gc = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, cspace, kCGImageAlphaPremultipliedFirst);
|
|
||||||
CGContextClearRect(gc, CGRectMake(0,0,w,h));
|
|
||||||
return gc;
|
|
||||||
}
|
|
||||||
|
|
||||||
@interface FLGLViewLayer : FLView // for layer-backed GL windows
|
@interface FLGLViewLayer : FLView // for layer-backed GL windows
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12
|
||||||
@@ -2238,11 +2234,10 @@ static CGContextRef prepare_bitmap_for_layer(int w, int h ) {
|
|||||||
- (BOOL)wantsLayer {
|
- (BOOL)wantsLayer {
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)displayLayer:(CALayer *)layer {
|
- (void)displayLayer:(CALayer *)layer {
|
||||||
// called if views are layered (but not for GL) : all drawing to window goes through this
|
// used by non-GL layer-backed views
|
||||||
Fl_Window *window = [(FLWindow*)[self window] getFl_Window];
|
Fl_Window *window = [(FLWindow*)[self window] getFl_Window];
|
||||||
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(window);
|
if (!window) return; // needed e.g. when closing a tab in a window
|
||||||
float scale = Fl::screen_driver()->scale(0);
|
float scale = Fl::screen_driver()->scale(0);
|
||||||
NSRect rect = [self frame];
|
NSRect rect = [self frame];
|
||||||
if (!window->parent() && window->border() && fabs(rect.size.height - window->h() * scale) > 5. ) {
|
if (!window->parent() && window->border() && fabs(rect.size.height - window->h() * scale) > 5. ) {
|
||||||
@@ -2253,44 +2248,57 @@ static CGContextRef prepare_bitmap_for_layer(int w, int h ) {
|
|||||||
[self viewFrameDidChange];
|
[self viewFrameDidChange];
|
||||||
}
|
}
|
||||||
if (!layer_data) { // runs when window is created, resized, changed screen resolution
|
if (!layer_data) { // runs when window is created, resized, changed screen resolution
|
||||||
layer.bounds = NSRectToCGRect(rect);
|
[self prepare_bitmap_for_layer];
|
||||||
[self did_view_resolution_change];
|
|
||||||
d->wait_for_expose_value = 0;
|
|
||||||
if (d->mapped_to_retina()) {
|
|
||||||
rect.size.width *= 2; rect.size.height *= 2;
|
|
||||||
layer.contentsScale = 2.;
|
|
||||||
} else layer.contentsScale = 1.;
|
|
||||||
layer_data = prepare_bitmap_for_layer(rect.size.width, rect.size.height);
|
|
||||||
Fl_X *i = Fl_X::i(window);
|
Fl_X *i = Fl_X::i(window);
|
||||||
if ( i->region ) {
|
if ( i->region ) {
|
||||||
Fl_Graphics_Driver::default_driver().XDestroyRegion(i->region);
|
Fl_Graphics_Driver::default_driver().XDestroyRegion(i->region);
|
||||||
i->region = 0;
|
i->region = 0;
|
||||||
}
|
}
|
||||||
window->clear_damage(FL_DAMAGE_ALL);
|
window->clear_damage(FL_DAMAGE_ALL);
|
||||||
}
|
through_Fl_X_flush = YES;
|
||||||
if (window->damage()) {
|
Fl_Cocoa_Window_Driver::driver(window)->Fl_Window_Driver::flush();
|
||||||
through_drawRect = YES;
|
|
||||||
d->Fl_Window_Driver::flush();
|
|
||||||
Fl_Cocoa_Window_Driver::q_release_context();
|
Fl_Cocoa_Window_Driver::q_release_context();
|
||||||
through_drawRect = NO;
|
through_Fl_X_flush = NO;
|
||||||
window->clear_damage();
|
window->clear_damage();
|
||||||
if (layer_data) {
|
|
||||||
CGImageRef cgimg = CGBitmapContextCreateImage(layer_data); // requires 10.4
|
|
||||||
layer.contents = (id)cgimg;
|
|
||||||
CGImageRelease(cgimg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (layer_data) {
|
||||||
|
CGImageRef cgimg = CGBitmapContextCreateImage(layer_data); // requires 10.4
|
||||||
|
layer.contents = (id)cgimg;
|
||||||
|
CGImageRelease(cgimg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- (void)prepare_bitmap_for_layer {
|
||||||
|
Fl_Window *window = [(FLWindow*)[self window] getFl_Window];
|
||||||
|
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(window);
|
||||||
|
CALayer *layer = [self layer];
|
||||||
|
NSRect rect = [self frame];
|
||||||
|
layer.bounds = NSRectToCGRect(rect);
|
||||||
|
[self did_view_resolution_change];
|
||||||
|
d->wait_for_expose_value = 0;
|
||||||
|
if (d->mapped_to_retina()) {
|
||||||
|
rect.size.width *= 2; rect.size.height *= 2;
|
||||||
|
layer.contentsScale = 2.;
|
||||||
|
} else layer.contentsScale = 1.;
|
||||||
|
static CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
|
||||||
|
layer_data = CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, 8, 4 * rect.size.width, cspace, kCGImageAlphaPremultipliedFirst);
|
||||||
|
CGContextClearRect(layer_data, CGRectMake(0,0,rect.size.width,rect.size.height));
|
||||||
}
|
}
|
||||||
- (BOOL)did_view_resolution_change {
|
- (BOOL)did_view_resolution_change {
|
||||||
BOOL retval = [super did_view_resolution_change];
|
BOOL retval = [super did_view_resolution_change];
|
||||||
if (retval) {
|
if (retval) {
|
||||||
[self viewFrameDidChange];
|
[self viewFrameDidChange];
|
||||||
[self displayLayer:[self layer]]; // useful for Mandelbrot to recreate the layer's bitmap
|
[(FLWindow*)[self window] getFl_Window]->redraw();
|
||||||
|
[self setNeedsDisplay:YES];
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
-(void)viewFrameDidChange
|
-(void)viewFrameDidChange
|
||||||
{
|
{
|
||||||
|
Fl_Window *win = [(FLWindow*)[self window] getFl_Window];
|
||||||
|
if (win) { // can be null when window is set fullscreen
|
||||||
|
Fl_Cocoa_Window_Driver::q_release_context(Fl_Cocoa_Window_Driver::driver(win));
|
||||||
|
win->redraw();
|
||||||
|
}
|
||||||
CGContextRelease(layer_data);
|
CGContextRelease(layer_data);
|
||||||
layer_data = NULL;
|
layer_data = NULL;
|
||||||
}
|
}
|
||||||
@@ -2298,6 +2306,7 @@ static CGContextRef prepare_bitmap_for_layer(int w, int h ) {
|
|||||||
CGContextRelease(layer_data);
|
CGContextRelease(layer_data);
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
- (void)drawRect:(NSRect)rect {} // necessary under 10.14.2 to support gl_start()
|
||||||
@end
|
@end
|
||||||
#endif //>= MAC_OS_X_VERSION_10_8
|
#endif //>= MAC_OS_X_VERSION_10_8
|
||||||
|
|
||||||
@@ -2965,7 +2974,12 @@ void Fl_Cocoa_Window_Driver::flush()
|
|||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8
|
||||||
} else if (views_use_CA) {
|
} else if (views_use_CA) {
|
||||||
FLViewLayer *view = (FLViewLayer*)[fl_xid(pWindow) contentView];
|
FLViewLayer *view = (FLViewLayer*)[fl_xid(pWindow) contentView];
|
||||||
[view displayLayer:[view layer]];
|
if (!view->layer_data) [view prepare_bitmap_for_layer];
|
||||||
|
through_Fl_X_flush = YES;
|
||||||
|
Fl_Window_Driver::flush();
|
||||||
|
through_Fl_X_flush = NO;
|
||||||
|
q_release_context();
|
||||||
|
[view setNeedsDisplay:YES];
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
make_current_counts = 1;
|
make_current_counts = 1;
|
||||||
@@ -3414,8 +3428,10 @@ void Fl_Cocoa_Window_Driver::make_current()
|
|||||||
{
|
{
|
||||||
if (make_current_counts > 1 && !views_use_CA) return;
|
if (make_current_counts > 1 && !views_use_CA) return;
|
||||||
if (make_current_counts) make_current_counts++;
|
if (make_current_counts) make_current_counts++;
|
||||||
if (views_use_CA && !through_drawRect) { // detect direct calls from the app
|
if (views_use_CA && !through_Fl_X_flush) { // detect direct calls from the app
|
||||||
pWindow->damage(FL_DAMAGE_CHILD); // make next draws to this window displayed at next event loop
|
FLViewLayer *view = (FLViewLayer*)[fl_window contentView];
|
||||||
|
if (!view->layer_data) [view prepare_bitmap_for_layer]; // necessary for progressive drawing
|
||||||
|
[view setNeedsDisplay:YES];
|
||||||
}
|
}
|
||||||
q_release_context();
|
q_release_context();
|
||||||
Fl_X *i = Fl_X::i(pWindow);
|
Fl_X *i = Fl_X::i(pWindow);
|
||||||
@@ -3431,12 +3447,8 @@ void Fl_Cocoa_Window_Driver::make_current()
|
|||||||
if (views_use_CA) {
|
if (views_use_CA) {
|
||||||
gc = ((FLViewLayer*)[fl_window contentView])->layer_data;
|
gc = ((FLViewLayer*)[fl_window contentView])->layer_data;
|
||||||
# ifdef FLTK_HAVE_CAIRO
|
# ifdef FLTK_HAVE_CAIRO
|
||||||
// make sure the GC starts with an identity transformation matrix as do native Cocoa GC's
|
// necessary because cairo may have changed the Quartz context
|
||||||
// because cairo may have changed it
|
CGContextSaveGState(gc);
|
||||||
CGAffineTransform mat = CGContextGetCTM(gc);
|
|
||||||
if (!CGAffineTransformIsIdentity(mat)) { // 10.4
|
|
||||||
CGContextConcatCTM(gc, CGAffineTransformInvert(mat));
|
|
||||||
}
|
|
||||||
# endif
|
# endif
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@@ -3482,6 +3494,9 @@ void Fl_Cocoa_Window_Driver::q_release_context(Fl_Cocoa_Window_Driver *x) {
|
|||||||
if (!gc) return;
|
if (!gc) return;
|
||||||
CGContextRestoreGState(gc); // match the CGContextSaveGState's of make_current
|
CGContextRestoreGState(gc); // match the CGContextSaveGState's of make_current
|
||||||
CGContextRestoreGState(gc);
|
CGContextRestoreGState(gc);
|
||||||
|
#if defined(FLTK_HAVE_CAIRO)
|
||||||
|
if (views_use_CA) CGContextRestoreGState(gc);
|
||||||
|
#endif
|
||||||
CGContextFlush(gc);
|
CGContextFlush(gc);
|
||||||
Fl_Graphics_Driver::default_driver().gc(0);
|
Fl_Graphics_Driver::default_driver().gc(0);
|
||||||
#if defined(FLTK_USE_CAIRO)
|
#if defined(FLTK_USE_CAIRO)
|
||||||
|
|||||||
Reference in New Issue
Block a user