summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Window.cxx5
-rw-r--r--src/Fl_Window_Driver.cxx19
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H1
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx67
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H1
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx13
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.H2
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.cxx28
8 files changed, 37 insertions, 99 deletions
diff --git a/src/Fl_Window.cxx b/src/Fl_Window.cxx
index 483eea714..85075b4b3 100644
--- a/src/Fl_Window.cxx
+++ b/src/Fl_Window.cxx
@@ -437,7 +437,10 @@ int Fl_Window::decorated_h()
void Fl_Window::flush()
{
- driver()->flush_single();
+ if (!shown()) return;
+ make_current();
+ fl_clip_region(i->region); i->region = 0;
+ draw();
}
diff --git a/src/Fl_Window_Driver.cxx b/src/Fl_Window_Driver.cxx
index 12d26e664..5c3861685 100644
--- a/src/Fl_Window_Driver.cxx
+++ b/src/Fl_Window_Driver.cxx
@@ -18,11 +18,8 @@
//
-#include <config.h>
#include "config_lib.h"
#include <FL/Fl_Window_Driver.H>
-#include <FL/Fl.H>
-#include <FL/Fl_Overlay_Window.H>
#include <FL/fl_draw.H>
@@ -44,25 +41,13 @@ void Fl_Window_Driver::take_focus()
}
-void Fl_Window_Driver::flush_single()
-{
- Fl_X *i = Fl_X::i(pWindow);
- if (!i) return;
- fl_clip_region(i->region);
- i->region = 0;
- pWindow->draw();
-}
-
-
void Fl_Window_Driver::flush_double()
{
- flush_single();
}
void Fl_Window_Driver::flush_overlay()
{
- flush_single();
}
@@ -81,10 +66,6 @@ void Fl_Window_Driver::draw_end()
void Fl_Window_Driver::destroy_double_buffer() {
Fl_X *i = Fl_X::i(pWindow);
- /* This is a working, platform-independent implementation.
- Some platforms may re-implement it for their own logic:
- - on Xlib, it is reimplemented if the Xdbe extension is available.
- */
fl_delete_offscreen(i->other_xid);
i->other_xid = 0;
}
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
index cad0f8c71..025d1701a 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
@@ -69,7 +69,6 @@ public:
// --- window management
virtual void take_focus();
- virtual void flush_single();
virtual void flush_double();
virtual void flush_overlay();
virtual void draw_begin();
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
index e6c066680..3bc3f1dea 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
@@ -55,61 +55,42 @@ void Fl_Cocoa_Window_Driver::take_focus()
}
-void Fl_Cocoa_Window_Driver::flush_single()
-{
- if (!pWindow->shown()) return;
- pWindow->make_current();
- Fl_X *i = Fl_X::i(pWindow);
- if (!i) return; // window not yet created
- fl_clip_region(i->region); i->region = 0;
- pWindow->draw();
-}
-
-
-void Fl_Cocoa_Window_Driver::flush_double()
-{
- if (!pWindow->shown()) return;
- pWindow->make_current();
- Fl_X *i = Fl_X::i(pWindow);
- if (!i) return; // window not yet created
- fl_clip_region(i->region); i->region = 0;
- pWindow->draw();
+void Fl_Cocoa_Window_Driver::flush_double() {
+ pWindow->Fl_Window::flush();
}
void Fl_Cocoa_Window_Driver::flush_overlay()
{
Fl_Overlay_Window *oWindow = pWindow->as_overlay_window();
- if (!oWindow) return flush_single();
-
- if (!pWindow->shown()) return;
- pWindow->make_current(); // make sure fl_gc is non-zero
- Fl_X *i = Fl_X::i(pWindow);
- if (!i) return; // window not yet created
-
- int erase_overlay = (pWindow->damage()&FL_DAMAGE_OVERLAY);
+ int erase_overlay = (pWindow->damage()&FL_DAMAGE_OVERLAY) | (oWindow->overlay_ == oWindow);
pWindow->clear_damage((uchar)(pWindow->damage()&~FL_DAMAGE_OVERLAY));
- if (!i->other_xid) {
- i->other_xid = fl_create_offscreen(pWindow->w(), pWindow->h());
- pWindow->clear_damage(FL_DAMAGE_ALL);
+ if (!oWindow->shown()) return;
+ pWindow->make_current(); // make sure fl_gc is non-zero
+ Fl_X *myi = Fl_X::i(pWindow);
+ if (!myi) return; // window not yet created
+ if (!myi->other_xid) {
+ myi->other_xid = fl_create_offscreen(oWindow->w(), oWindow->h());
+ oWindow->clear_damage(FL_DAMAGE_ALL);
}
- if (pWindow->damage() & ~FL_DAMAGE_EXPOSE) {
- fl_clip_region(i->region); i->region = 0;
- if ( i->other_xid ) {
- fl_begin_offscreen( i->other_xid );
- fl_clip_region( 0 );
- pWindow->draw();
- fl_end_offscreen();
- } else {
- pWindow->draw();
+ if (oWindow->damage() & ~FL_DAMAGE_EXPOSE) {
+ fl_clip_region(myi->region); myi->region = 0;
+ if ( myi->other_xid ) {
+ fl_begin_offscreen( myi->other_xid );
+ fl_clip_region( 0 );
+ oWindow->draw();
+ fl_end_offscreen();
+ } else {
+ oWindow->draw();
+ }
}
- }
if (erase_overlay) fl_clip_region(0);
+ // on Irix (at least) it is faster to reduce the area copied to
+ // the current clip region:
+ int X,Y,W,H; fl_clip_box(0,0,oWindow->w(),oWindow->h(),X,Y,W,H);
+ if (myi->other_xid) fl_copy_offscreen(X, Y, W, H, myi->other_xid, X, Y);
- int X,Y,W,H; fl_clip_box(0,0,pWindow->w(),pWindow->h(),X,Y,W,H);
- if (i->other_xid) fl_copy_offscreen(X, Y, W, H, i->other_xid, X, Y);
-
if (oWindow->overlay_ == oWindow) oWindow->draw_overlay();
}
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H
index 120bca748..31f3b1db2 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H
+++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H
@@ -73,7 +73,6 @@ public:
virtual int decorated_h();
// --- window management
- virtual void flush_single();
virtual void flush_double();
virtual void flush_overlay();
virtual void draw_begin();
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
index 78110c7fb..c3622c2fc 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
@@ -255,18 +255,6 @@ void Fl_WinAPI_Window_Driver::draw_begin()
}
-void Fl_WinAPI_Window_Driver::flush_single()
-{
- if (!pWindow->shown()) return;
- pWindow->make_current(); // make sure fl_gc is non-zero
- Fl_X *i = Fl_X::i(pWindow);
- if (!i) return;
- fl_clip_region(i->region);
- i->region = 0;
- pWindow->draw();
-}
-
-
void Fl_WinAPI_Window_Driver::flush_double()
{
if (!pWindow->shown()) return;
@@ -294,7 +282,6 @@ void Fl_WinAPI_Window_Driver::flush_double()
void Fl_WinAPI_Window_Driver::flush_overlay()
{
Fl_Overlay_Window *oWindow = pWindow->as_overlay_window();
- if (!oWindow) return flush_single();
if (!pWindow->shown()) return;
pWindow->make_current(); // make sure fl_gc is non-zero
diff --git a/src/drivers/X11/Fl_X11_Window_Driver.H b/src/drivers/X11/Fl_X11_Window_Driver.H
index 9b7e1954b..206ffe91a 100644
--- a/src/drivers/X11/Fl_X11_Window_Driver.H
+++ b/src/drivers/X11/Fl_X11_Window_Driver.H
@@ -77,7 +77,6 @@ public:
// --- window management
virtual void take_focus();
- virtual void flush_single();
virtual void flush_double();
virtual void flush_overlay();
virtual void draw_begin();
@@ -89,6 +88,7 @@ public:
virtual void free_icons();
virtual void capture_titlebar_and_borders(Fl_Shared_Image*& top, Fl_Shared_Image*& left, Fl_Shared_Image*& bottom, Fl_Shared_Image*& right);
virtual void wait_for_expose();
+ virtual void destroy_double_buffer();
};
diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx
index d0443ae1b..15a7105e3 100644
--- a/src/drivers/X11/Fl_X11_Window_Driver.cxx
+++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx
@@ -148,18 +148,6 @@ void Fl_X11_Window_Driver::draw_begin()
}
-void Fl_X11_Window_Driver::flush_single()
-{
- if (!pWindow->shown()) return;
- pWindow->make_current(); // make sure fl_gc is non-zero
- Fl_X *i = Fl_X::i(pWindow);
- if (!i) return;
- fl_clip_region(i->region);
- i->region = 0;
- pWindow->draw();
-}
-
-
void Fl_X11_Window_Driver::flush_double()
{
if (!pWindow->shown()) return;
@@ -215,7 +203,6 @@ void Fl_X11_Window_Driver::flush_double()
void Fl_X11_Window_Driver::flush_overlay()
{
Fl_Overlay_Window *oWindow = pWindow->as_overlay_window();
- if (!oWindow) return flush_single();
if (!pWindow->shown()) return;
pWindow->make_current(); // make sure fl_gc is non-zero
@@ -289,15 +276,16 @@ void Fl_X11_Window_Driver::flush_overlay()
}
-
+void Fl_X11_Window_Driver::destroy_double_buffer() {
#if USE_XDBE
-
-//void Fl_X11_Dbe_Window_Driver::destroy_double_buffer() {
-// Fl_X *i = Fl_X::i(pWindow);
-// XdbeDeallocateBackBufferName(fl_display, i->other_xid);
-// i->other_xid = 0;
-//}
+ if (can_xdbe()) {
+ Fl_X *i = Fl_X::i(pWindow);
+ XdbeDeallocateBackBufferName(fl_display, i->other_xid);
+ i->other_xid = 0;
+ } else
#endif // USE_XDBE
+ Fl_Window_Driver::destroy_double_buffer();
+}
void Fl_X11_Window_Driver::shape_bitmap_(Fl_Image* b) {