summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2016-03-20 08:44:30 +0000
committerManolo Gouy <Manolo>2016-03-20 08:44:30 +0000
commit4baca53944c5193947203b5a96f95bfe8954a9cb (patch)
treed6c4b27aebd3c2a8bd6869a7a0ce7dde1fb6fccf /src/drivers
parent51030530f24c33c59db3084bc2b088d50b2c6627 (diff)
Continue implementation of class Fl_Window_Driver according to Albrecht's plan.
This removes a bunch of friend class Fl_XXX_Window_Driver; declarations from Fl_Window.H, and therefore allows to add a new window driver without modifying the platform-independent code. The Fl_PicoXXX_Window_Driver classes have been modified but not tested ==> test needed. File Fl_X11_Window_Driver.cxx contained this: // DO NOT call this if the window is not mapped! static int can_xdbe() { ... } The new code does call can_xdbe() before any window is mapped, and does work. Since can_xdbe() asks the X server whether it supports the Xdbe extension, I don't see why this should not work without a mapped window. This point should be clarified by the author of "DO NOT call this if the window is not mapped!". git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11388 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx4
-rw-r--r--src/drivers/Pico/Fl_Pico_Window_Driver.H7
-rw-r--r--src/drivers/Pico/Fl_Pico_Window_Driver.cxx39
-rw-r--r--src/drivers/PicoAndroid/Fl_PicoAndroid_Window_Driver.cxx13
-rw-r--r--src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.H2
-rw-r--r--src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.cxx15
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx4
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.H1
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.cxx140
9 files changed, 60 insertions, 165 deletions
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
index 3bc3f1dea..127a84d6d 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
@@ -56,7 +56,7 @@ void Fl_Cocoa_Window_Driver::take_focus()
void Fl_Cocoa_Window_Driver::flush_double() {
- pWindow->Fl_Window::flush();
+ flush_single();
}
@@ -115,7 +115,7 @@ void Fl_Cocoa_Window_Driver::draw_end()
// corner. This code draws a little ribbed triangle for dragging.
CGContextRef gc = (CGContextRef)Fl_Surface_Device::surface()->driver()->gc();
if (fl_mac_os_version < 100700 && gc && !pWindow->parent() && pWindow->resizable() &&
- (!pWindow->size_range_set || pWindow->minh!=pWindow->maxh || pWindow->minw!=pWindow->maxw)) {
+ (!size_range_set() || minh() != maxh() || minw() != maxw())) {
int dx = Fl::box_dw(pWindow->box())-Fl::box_dx(pWindow->box());
int dy = Fl::box_dh(pWindow->box())-Fl::box_dy(pWindow->box());
if (dx<=0) dx = 1;
diff --git a/src/drivers/Pico/Fl_Pico_Window_Driver.H b/src/drivers/Pico/Fl_Pico_Window_Driver.H
index 40d6457fa..51e9db920 100644
--- a/src/drivers/Pico/Fl_Pico_Window_Driver.H
+++ b/src/drivers/Pico/Fl_Pico_Window_Driver.H
@@ -37,13 +37,6 @@ public:
// --- window data
virtual int decorated_w();
virtual int decorated_h();
-
- // --- window management
- virtual void flush_single();
- virtual void flush_double();
- virtual void flush_overlay();
- virtual void draw_begin();
- virtual void draw_end();
};
diff --git a/src/drivers/Pico/Fl_Pico_Window_Driver.cxx b/src/drivers/Pico/Fl_Pico_Window_Driver.cxx
index f113a3ca8..d1fb664c8 100644
--- a/src/drivers/Pico/Fl_Pico_Window_Driver.cxx
+++ b/src/drivers/Pico/Fl_Pico_Window_Driver.cxx
@@ -25,7 +25,6 @@
#include <FL/fl_draw.h>
-
Fl_Pico_Window_Driver::Fl_Pico_Window_Driver(Fl_Window *win)
: Fl_Window_Driver(win)
{
@@ -50,44 +49,6 @@ int Fl_Pico_Window_Driver::decorated_h()
return pWindow->h();
}
-
-// --- window management
-void Fl_Pico_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_Pico_Window_Driver::flush_double()
-{
- flush_single();
-}
-
-
-void Fl_Pico_Window_Driver::flush_overlay()
-{
- flush_single();
-}
-
-
-
-
-void Fl_Pico_Window_Driver::draw_begin()
-{
- // nothing to do
-}
-
-
-void Fl_Pico_Window_Driver::draw_end()
-{
- // nothing to do
-}
-
-
//
// End of "$Id: Fl_Pico_Window_Driver.cxx 11253 2016-03-01 00:54:21Z matt $".
// \ No newline at end of file
diff --git a/src/drivers/PicoAndroid/Fl_PicoAndroid_Window_Driver.cxx b/src/drivers/PicoAndroid/Fl_PicoAndroid_Window_Driver.cxx
index 4921081e7..19312ee77 100644
--- a/src/drivers/PicoAndroid/Fl_PicoAndroid_Window_Driver.cxx
+++ b/src/drivers/PicoAndroid/Fl_PicoAndroid_Window_Driver.cxx
@@ -95,7 +95,6 @@ Fl_X *Fl_PicoAndroid_Window_Driver::makeWindow()
}
-
void Fl_PicoAndroid_Window_Driver::flush_single()
{
glClearColor(0, 0, 0, 1);
@@ -110,18 +109,6 @@ void Fl_PicoAndroid_Window_Driver::flush_single()
}
-void Fl_PicoAndroid_Window_Driver::flush_double()
-{
- flush_single();
-}
-
-
-void Fl_PicoAndroid_Window_Driver::flush_overlay()
-{
- flush_single();
-}
-
-
void Fl_X::flush()
{
w->flush();
diff --git a/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.H b/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.H
index 7cb2e7c43..980f80286 100644
--- a/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.H
+++ b/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.H
@@ -43,8 +43,6 @@ public:
// --- window management
virtual void flush_single();
- virtual void flush_double();
- virtual void flush_overlay();
};
diff --git a/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.cxx b/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.cxx
index 346eea241..354713f19 100644
--- a/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.cxx
+++ b/src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.cxx
@@ -94,21 +94,6 @@ void Fl_PicoSDL_Window_Driver::flush_single()
SDL_RenderPresent((SDL_Renderer*)i->xid);
}
-
-void Fl_PicoSDL_Window_Driver::flush_double()
-{
- flush_single();
-}
-
-
-void Fl_PicoSDL_Window_Driver::flush_overlay()
-{
- flush_single();
- // draw_overlay();
-}
-
-
-
//
// End of "$Id: Fl_PicoSDL_Window_Driver.cxx 11253 2016-03-01 00:54:21Z matt $".
// \ No newline at end of file
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
index c3622c2fc..1de3046f3 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
@@ -270,7 +270,7 @@ void Fl_WinAPI_Window_Driver::flush_double()
fl_clip_region(i->region); i->region = 0;
fl_begin_offscreen(i->other_xid);
fl_graphics_driver->clip_region( 0 );
- pWindow->draw();
+ draw();
fl_end_offscreen();
}
@@ -299,7 +299,7 @@ void Fl_WinAPI_Window_Driver::flush_overlay()
fl_clip_region(i->region); i->region = 0;
fl_begin_offscreen(i->other_xid);
fl_graphics_driver->clip_region(0);
- pWindow->draw();
+ draw();
fl_end_offscreen();
}
diff --git a/src/drivers/X11/Fl_X11_Window_Driver.H b/src/drivers/X11/Fl_X11_Window_Driver.H
index 206ffe91a..66cfbd64e 100644
--- a/src/drivers/X11/Fl_X11_Window_Driver.H
+++ b/src/drivers/X11/Fl_X11_Window_Driver.H
@@ -88,7 +88,6 @@ 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 15a7105e3..4d028b466 100644
--- a/src/drivers/X11/Fl_X11_Window_Driver.cxx
+++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx
@@ -35,7 +35,7 @@
#include <X11/extensions/Xdbe.h>
// whether the Xdbe extension is usable
-// DO NOT call this if the window is not mapped!
+// DO NOT call this if the window is not mapped! [why not? I see it OK on Debian and Darwin (MG)]
static int can_xdbe()
{
static int tried = 0;
@@ -59,12 +59,63 @@ static int can_xdbe()
return use_xdbe;
}
+class Fl_Xdbe_Window_Driver : public Fl_X11_Window_Driver {
+public:
+ Fl_Xdbe_Window_Driver(Fl_Window *win) : Fl_X11_Window_Driver(win) {}
+ virtual void destroy_double_buffer();
+ virtual void flush_double();
+ virtual ~Fl_Xdbe_Window_Driver() {}
+};
+
+void Fl_Xdbe_Window_Driver::destroy_double_buffer() {
+ Fl_X *i = Fl_X::i(pWindow);
+ XdbeDeallocateBackBufferName(fl_display, i->other_xid);
+ i->other_xid = 0;
+}
+
+void Fl_Xdbe_Window_Driver::flush_double()
+{
+ 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
+ if (!i->other_xid) {
+ i->other_xid = XdbeAllocateBackBufferName(fl_display, fl_xid(pWindow), XdbeCopied);
+ i->backbuffer_bad = 1;
+ pWindow->clear_damage(FL_DAMAGE_ALL);
+ }
+ if (i->backbuffer_bad) {
+ // Make sure we do a complete redraw...
+ if (i->region) {XDestroyRegion(i->region); i->region = 0;}
+ pWindow->clear_damage(FL_DAMAGE_ALL);
+ i->backbuffer_bad = 0;
+ }
+
+ // Redraw as needed...
+ if (pWindow->damage()) {
+ fl_clip_region(i->region); i->region = 0;
+ fl_window = i->other_xid;
+ draw();
+ fl_window = i->xid;
+ }
+
+ // Copy contents of back buffer to window...
+ XdbeSwapInfo s;
+ s.swap_window = fl_xid(pWindow);
+ s.swap_action = XdbeCopied;
+ XdbeSwapBuffers(fl_display, &s, 1);
+}
+
#endif // USE_XDBE
Fl_Window_Driver *Fl_Window_Driver::newWindowDriver(Fl_Window *w)
{
- return new Fl_X11_Window_Driver(w);
+ return
+#if USE_XDBE
+ can_xdbe() ? new Fl_Xdbe_Window_Driver(w) :
+#endif
+ new Fl_X11_Window_Driver(w);
}
@@ -126,7 +177,6 @@ int Fl_X11_Window_Driver::decorated_w()
}
-
void Fl_X11_Window_Driver::take_focus()
{
Fl_X *i = Fl_X::i(pWindow);
@@ -155,44 +205,13 @@ void Fl_X11_Window_Driver::flush_double()
Fl_X *i = Fl_X::i(pWindow);
if (!i) return; // window not yet created
if (!i->other_xid) {
-#if USE_XDBE
- if (can_xdbe()) {
- i->other_xid = XdbeAllocateBackBufferName(fl_display, fl_xid(pWindow), XdbeCopied);
- i->backbuffer_bad = 1;
- } else
-#endif
i->other_xid = fl_create_offscreen(pWindow->w(), pWindow->h());
pWindow->clear_damage(FL_DAMAGE_ALL);
}
-#if USE_XDBE
- if (can_xdbe()) {
- if (i->backbuffer_bad) {
- // Make sure we do a complete redraw...
- if (i->region) {XDestroyRegion(i->region); i->region = 0;}
- pWindow->clear_damage(FL_DAMAGE_ALL);
- i->backbuffer_bad = 0;
- }
-
- // Redraw as needed...
- if (pWindow->damage()) {
- fl_clip_region(i->region); i->region = 0;
- fl_window = i->other_xid;
- pWindow->draw();
- fl_window = i->xid;
- }
-
- // Copy contents of back buffer to window...
- XdbeSwapInfo s;
- s.swap_window = fl_xid(pWindow);
- s.swap_action = XdbeCopied;
- XdbeSwapBuffers(fl_display, &s, 1);
- return;
- } else
-#endif
if (pWindow->damage() & ~FL_DAMAGE_EXPOSE) {
fl_clip_region(i->region); i->region = 0;
fl_window = i->other_xid;
- pWindow->draw();
+ draw();
fl_window = i->xid;
}
int X,Y,W,H; fl_clip_box(0,0,pWindow->w(),pWindow->h(),X,Y,W,H);
@@ -200,6 +219,7 @@ void Fl_X11_Window_Driver::flush_double()
}
+//TODO call flush_double in there
void Fl_X11_Window_Driver::flush_overlay()
{
Fl_Overlay_Window *oWindow = pWindow->as_overlay_window();
@@ -223,49 +243,13 @@ void Fl_X11_Window_Driver::flush_overlay()
pWindow->clear_damage((uchar)(pWindow->damage()&~FL_DAMAGE_OVERLAY));
if (!i->other_xid) {
-#if USE_XDBE
- if (can_xdbe()) {
- i->other_xid = XdbeAllocateBackBufferName(fl_display, fl_xid(pWindow), XdbeCopied);
- i->backbuffer_bad = 1;
- } else
-#endif
i->other_xid = fl_create_offscreen(pWindow->w(), pWindow->h());
pWindow->clear_damage(FL_DAMAGE_ALL);
}
-#if USE_XDBE
- if (can_xdbe()) {
- if (i->backbuffer_bad || erase_overlay) {
- // Make sure we do a complete redraw...
- if (i->region) {XDestroyRegion(i->region); i->region = 0;}
- pWindow->clear_damage(FL_DAMAGE_ALL);
- i->backbuffer_bad = 0;
- }
-
- // Redraw as needed...
- if (pWindow->damage()) {
- fl_clip_region(i->region); i->region = 0;
- fl_window = i->other_xid;
- pWindow->draw();
- fl_window = i->xid;
- }
-
- // Copy contents of back buffer to window...
- XdbeSwapInfo s;
- s.swap_window = fl_xid(pWindow);
- s.swap_action = XdbeCopied;
- XdbeSwapBuffers(fl_display, &s, 1);
-
- pWindow->make_current();
- if (erase_overlay) fl_clip_region(0);
- if (oWindow->overlay_ == oWindow) oWindow->draw_overlay();
-
- return;
- } else
-#endif
if (pWindow->damage() & ~FL_DAMAGE_EXPOSE) {
fl_clip_region(i->region); i->region = 0;
fl_window = i->other_xid;
- pWindow->draw();
+ draw();
fl_window = i->xid;
}
if (erase_overlay) fl_clip_region(0);
@@ -276,18 +260,6 @@ void Fl_X11_Window_Driver::flush_overlay()
}
-void Fl_X11_Window_Driver::destroy_double_buffer() {
-#if USE_XDBE
- 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) {
shape_data_->shape_ = b;
}