[Cairo] Remove part of the dependency of FL/Fl.H on config.h.

To use Fl_Cairo_Window one did not only need to configure with --enable-cairo,
but also needed to #include <config.h> before #include <FL/Fl.H>.

This commit removes the smaller part of the dependency of the public header
file FL/Fl.H on config.h. This needs a better solution in FLTK 1.4.0.

The user still needs to define FLTK_HAVE_CAIRO _before_ #include <FL/Fl.H>.

Note: This is not compatible with fluid, since fluid _always_ includes
FL/Fl.H as the first statement in generated header files.

See also the discussion in fltk.general:

https://groups.google.com/d/msg/fltkgeneral/_C1OJhMLQl0/pHUFtz9SCwAJ

Note: also fixed a typo in src/drivers/X11/Fl_X11_Screen_Driver.cxx


git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11168 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Albrecht Schlosser 2016-02-13 18:02:17 +00:00
parent d8f96b579d
commit 8630bdbed2
4 changed files with 47 additions and 32 deletions

View File

@ -1295,19 +1295,19 @@ int main() {
static int use_high_res_GL() { return use_high_res_GL_; }
#ifdef FLTK_HAVE_CAIRO
/** \defgroup group_cairo Cairo support functions and classes
/** \defgroup group_cairo Cairo Support Functions and Classes
@{
*/
public:
// Cairo support API
static cairo_t * cairo_make_current(Fl_Window* w);
/** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true,
any current window dc is linked to a current context.
/** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true,
any current window dc is linked to a current cairo context.
This is not the default, because it may not be necessary
to add cairo support to all fltk supported windows.
When you wish to associate a cairo context in this mode,
you need to call explicitly in your draw() overridden method,
FL::cairo_make_current(Fl_Window*). This will create a cairo context
Fl::cairo_make_current(Fl_Window*). This will create a cairo context
but only for this Window.
Still in custom cairo application it is possible to handle
completely this process automatically by setting \p alink to true.

View File

@ -3,7 +3,7 @@
//
// Main header file for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2010 by Bill Spitzak and others.
// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@ -29,17 +29,7 @@
# include <FL/Fl_Export.H>
#if defined(USE_X11) // X11
# include <cairo-xlib.h>
#elif defined(WIN32)
# include <cairo-win32.h>
#elif defined(__APPLE_QUARTZ__) // PORTME: Cairo Support
# include <cairo-quartz.h>
#elif defined(FL_PORTING)
# pragma message "FL_PORTING: is the Cairo library available on this platform?"
#else
# error Cairo is not supported on that platform.
#endif
# include <cairo.h>
/**
\addtogroup group_cairo
@ -60,9 +50,16 @@ public:
// access attributes
cairo_t* cc() const {return cc_;} ///< Gets the current cairo context
bool autolink() const {return autolink_;} ///< Gets the autolink option. See Fl::cairo_autolink_context(bool)
/** Sets the current cairo context, \p own indicates cc deletion is handle externally by user */
void cc(cairo_t* c, bool own=true) {
if (cc_ && own_cc_) cairo_destroy(cc_);
/** Sets the current cairo context.
\p own == \e true (the default) indicates that the cairo context \p c
will be deleted by FLTK internally when another cc is set later.
\p own == \e false indicates cc deletion is handled externally
by the user program.
*/
void cc(cairo_t* c, bool own=true) {
if (cc_ && own_cc_) cairo_destroy(cc_);
cc_=c;
if (!cc_) window_=0;
own_cc_=own;
@ -76,7 +73,8 @@ public:
private:
cairo_t * cc_; // contains the unique autoupdated cairo context
bool own_cc_; // indicates whether we must delete the cc, useful for internal cleanup
bool autolink_; // true by default, permits to prevent the automatic cairo mapping on fltk windows for custom cairo implementations
bool autolink_; // false by default, prevents the automatic cairo mapping on fltk windows
// for custom cairo implementations.
void* window_, *gc_; // for keeping track internally of last win+gc treated
};

View File

@ -3,7 +3,7 @@
//
// Main header file for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2010 by Bill Spitzak and others.
// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@ -26,8 +26,23 @@
#include <Carbon/Carbon.h>
#endif
// Cairo is currently supported for the following platforms:
// Win32, Apple Quartz, X11
#if defined(USE_X11) // X11
# include <cairo-xlib.h>
#elif defined(WIN32)
# include <cairo-win32.h>
#elif defined(__APPLE_QUARTZ__) // PORTME: Cairo Support
# include <cairo-quartz.h>
#elif defined(FL_PORTING)
# pragma message "FL_PORTING: is the Cairo library available on this platform?"
#else
# error Cairo is not supported on this platform.
#endif
// static Fl module initialization :
Fl_Cairo_State Fl::cairo_state_; ///< contains all necesary info for current cairo context mapping
Fl_Cairo_State Fl::cairo_state_; ///< contains all necessary info for current cairo context mapping
// Fl cairo features implementation
@ -39,22 +54,22 @@ void Fl_Cairo_State::autolink(bool b) {
autolink_ = b;
#else
Fl::fatal("In Fl::autolink(bool) : Cairo autolink() feature is only "
"available with the enable-cairoext configure option, now quitting.");
"available with the enable-cairoext configure option, now quitting.");
#endif
}
/**
Provides a corresponding cairo context for window \a wi.
This is needed in a draw() override if Fl::cairo_autolink_context()
This is needed in a draw() override if Fl::cairo_autolink_context()
returns false, which is the default.
The cairo_context() does not need to be freed as it is freed every time
The cairo_context() does not need to be freed as it is freed every time
a new cairo context is created. When the program terminates,
a call to Fl::cairo_make_current(0) will destroy any residual context.
\note A new cairo context is not always re-created when this method
is used. In particular, if the current graphical context and the current
is used. In particular, if the current graphical context and the current
window didn't change between two calls, the previous gc is internally kept,
thus optimizing the drawing performances.
Also, after this call, Fl::cairo_gc() is adequately updated with this
Also, after this call, Fl::cairo_cc() is adequately updated with this
cairo context.
\note Only available when configure has the --enable-cairo option
\return the valid cairo_t* cairo context associated to this window.
@ -83,7 +98,8 @@ cairo_t * Fl::cairo_make_current(Fl_Window* wi) {
/*
Creates transparently a cairo_surface_t object.
gc is an HDC context in WIN32, a CGContext* in Quartz, a display on X11
gc is an HDC context in WIN32, a CGContext* in Quartz, and
a display on X11 (not used on this platform)
*/
static cairo_surface_t * cairo_create_surface(void * gc, int W, int H) {
@ -99,8 +115,9 @@ static cairo_surface_t * cairo_create_surface(void * gc, int W, int H) {
}
/**
Creates a cairo context from a \a gc only, get its window size or offscreen size if fl_window is null.
\note Only available when configure has the --enable-cairo option
Creates a cairo context from a \a gc only, gets its window size or
offscreen size if fl_window is null.
\note Only available when configure has the --enable-cairo option
*/
cairo_t * Fl::cairo_make_current(void *gc) {
int W=0,H=0;
@ -127,7 +144,7 @@ cairo_t * Fl::cairo_make_current(void *gc) {
#elif defined(WIN32)
// we don't need any W,H for WIN32
#else
# error Cairo is not supported under this platform.
# error Cairo is not supported on this platform.
#endif
if (!gc) {
Fl::cairo_cc(0);

View File

@ -21,7 +21,7 @@
#include "Fl_X11_Screen_Driver.h"
#include <FL/Fl.H>
#include <FL/x.H>
#include <FL/fl_ask.h>
#include <FL/fl_ask.H>
#if HAVE_XINERAMA
# include <X11/extensions/Xinerama.h>