| @@ -1040,7 +1040,7 @@ public: | |||||
| public: | public: | ||||
| // Cairo support API | // Cairo support API | ||||
| static cairo_t * cairo_make_current(Fl_Window* w); | |||||
| static cairo_t * cairo_make_current(Fl_Window* wi, Window w = 0); | |||||
| /** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true, | /** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true, | ||||
| any current window dc is linked to a current context. | any current window dc is linked to a current context. | ||||
| This is not the default, because it may not be necessary | This is not the default, because it may not be necessary | ||||
| @@ -45,15 +45,10 @@ | |||||
| overlay will blink if you change the image in the window. | overlay will blink if you change the image in the window. | ||||
| */ | */ | ||||
| class FL_EXPORT Fl_Overlay_Window : public Fl_Double_Window { | class FL_EXPORT Fl_Overlay_Window : public Fl_Double_Window { | ||||
| friend class _Fl_Overlay; | |||||
| virtual void draw_overlay() = 0; | virtual void draw_overlay() = 0; | ||||
| Fl_Window *overlay_; | |||||
| public: | public: | ||||
| void show(); | |||||
| void flush(); | void flush(); | ||||
| void hide(); | |||||
| void resize(int,int,int,int); | |||||
| ~Fl_Overlay_Window(); | |||||
| virtual ~Fl_Overlay_Window(); | |||||
| int can_do_overlay(); | int can_do_overlay(); | ||||
| void redraw_overlay(); | void redraw_overlay(); | ||||
| /** | /** | ||||
| @@ -63,13 +58,12 @@ public: | |||||
| will choose them. | will choose them. | ||||
| */ | */ | ||||
| Fl_Overlay_Window(int W, int H, const char *l=0) | Fl_Overlay_Window(int W, int H, const char *l=0) | ||||
| : Fl_Double_Window(W,H,l) {overlay_ = 0; force_doublebuffering_=1; image(0); } | |||||
| : Fl_Double_Window(W,H,l) { force_doublebuffering_=1; image(0); } | |||||
| /** | /** | ||||
| See Fl_Overlay_Window::Fl_Overlay_Window(int W, int H, const char *l=0) | See Fl_Overlay_Window::Fl_Overlay_Window(int W, int H, const char *l=0) | ||||
| */ | */ | ||||
| Fl_Overlay_Window(int X, int Y, int W, int H, const char *l=0) | Fl_Overlay_Window(int X, int Y, int W, int H, const char *l=0) | ||||
| : Fl_Double_Window(X,Y,W,H,l) {overlay_ = 0; force_doublebuffering_=1; image(0); } | |||||
| void show(int a, char **b) {Fl_Double_Window::show(a,b);} | |||||
| : Fl_Double_Window(X,Y,W,H,l) { force_doublebuffering_=1; image(0); } | |||||
| }; | }; | ||||
| #endif | #endif | ||||
| @@ -57,10 +57,11 @@ static Window real_xid; | |||||
| static int W, H; | static int W, H; | ||||
| cairo_t * | cairo_t * | ||||
| Fl::cairo_make_current(Fl_Window* wi) { | |||||
| Fl::cairo_make_current(Fl_Window* wi, Window w ) { | |||||
| if (!wi) return NULL; // Precondition | if (!wi) return NULL; // Precondition | ||||
| Window w = wi->i->other_xid ? wi->i->other_xid : wi->i->xid; | |||||
| if ( ! w ) | |||||
| w = wi->i->other_xid ? wi->i->other_xid : wi->i->xid; | |||||
| if ( ( fl_cairo_context && fl_cairo_context == wi->i->cc ) && | if ( ( fl_cairo_context && fl_cairo_context == wi->i->cc ) && | ||||
| w && w == real_xid && | w && w == real_xid && | ||||
| @@ -42,15 +42,6 @@ | |||||
| #include <FL/fl_draw.H> | #include <FL/fl_draw.H> | ||||
| #include <FL/x.H> | #include <FL/x.H> | ||||
| void Fl_Overlay_Window::show() { | |||||
| Fl_Double_Window::show(); | |||||
| if (overlay_ && overlay_ != this) overlay_->show(); | |||||
| } | |||||
| void Fl_Overlay_Window::hide() { | |||||
| Fl_Double_Window::hide(); | |||||
| } | |||||
| void Fl_Overlay_Window::flush() { | void Fl_Overlay_Window::flush() { | ||||
| #ifdef BOXX_BUGS | #ifdef BOXX_BUGS | ||||
| if (overlay_ && overlay_ != this && overlay_->shown()) { | if (overlay_ && overlay_ != this && overlay_->shown()) { | ||||
| @@ -61,15 +52,17 @@ void Fl_Overlay_Window::flush() { | |||||
| return; | return; | ||||
| } | } | ||||
| #endif | #endif | ||||
| int erase_overlay = (damage()&FL_DAMAGE_OVERLAY) | (overlay_ == this); | |||||
| int erase_overlay = (damage()&FL_DAMAGE_OVERLAY); | |||||
| clear_damage((uchar)(damage()&~FL_DAMAGE_OVERLAY)); | clear_damage((uchar)(damage()&~FL_DAMAGE_OVERLAY)); | ||||
| Fl_Double_Window::flush(erase_overlay); | Fl_Double_Window::flush(erase_overlay); | ||||
| if (overlay_ == this) draw_overlay(); | |||||
| } | |||||
| void Fl_Overlay_Window::resize(int X, int Y, int W, int H) { | |||||
| Fl_Double_Window::resize(X,Y,W,H); | |||||
| if (overlay_ && overlay_!=this) overlay_->resize(0,0,w(),h()); | |||||
| Fl_X* myi = Fl_X::i(this); | |||||
| #if FLTK_HAVE_CAIRO | |||||
| Fl::cairo_make_current( this, myi->xid ); | |||||
| #endif | |||||
| draw_overlay(); | |||||
| #if FLTK_HAVE_CAIRO | |||||
| Fl::cairo_make_current( this, myi->other_xid ); | |||||
| #endif | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -89,7 +82,6 @@ int Fl_Overlay_Window::can_do_overlay() {return 0;} | |||||
| calling show(). | calling show(). | ||||
| */ | */ | ||||
| void Fl_Overlay_Window::redraw_overlay() { | void Fl_Overlay_Window::redraw_overlay() { | ||||
| overlay_ = this; | |||||
| clear_damage((uchar)(damage()|FL_DAMAGE_OVERLAY)); | clear_damage((uchar)(damage()|FL_DAMAGE_OVERLAY)); | ||||
| Fl::damage(FL_DAMAGE_CHILD); | Fl::damage(FL_DAMAGE_CHILD); | ||||
| } | } | ||||