diff options
| author | Manolo Gouy <Manolo> | 2016-03-20 08:44:30 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2016-03-20 08:44:30 +0000 |
| commit | 4baca53944c5193947203b5a96f95bfe8954a9cb (patch) | |
| tree | d6c4b27aebd3c2a8bd6869a7a0ce7dde1fb6fccf | |
| parent | 51030530f24c33c59db3084bc2b088d50b2c6627 (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
| -rw-r--r-- | FL/Fl_Window.H | 6 | ||||
| -rw-r--r-- | FL/Fl_Window_Driver.H | 9 | ||||
| -rw-r--r-- | src/Fl_Window_Driver.cxx | 11 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx | 4 | ||||
| -rw-r--r-- | src/drivers/Pico/Fl_Pico_Window_Driver.H | 7 | ||||
| -rw-r--r-- | src/drivers/Pico/Fl_Pico_Window_Driver.cxx | 39 | ||||
| -rw-r--r-- | src/drivers/PicoAndroid/Fl_PicoAndroid_Window_Driver.cxx | 13 | ||||
| -rw-r--r-- | src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/PicoSDL/Fl_PicoSDL_Window_Driver.cxx | 15 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 4 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.H | 1 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.cxx | 140 |
12 files changed, 80 insertions, 171 deletions
diff --git a/FL/Fl_Window.H b/FL/Fl_Window.H index 35536a15d..c71326550 100644 --- a/FL/Fl_Window.H +++ b/FL/Fl_Window.H @@ -72,12 +72,6 @@ class FL_EXPORT Fl_Window : public Fl_Group { friend class Fl_X; friend class Fl_Window_Driver; - friend class Fl_X11_Window_Driver; - friend class Fl_Pico_Window_Driver; - friend class Fl_Cocoa_Window_Driver; - friend class Fl_WinAPI_Window_Driver; - friend class Fl_PicoSDL_Window_Driver; - friend class Fl_PicoAndroid_Window_Driver; Fl_X *i; // points at the system-specific stuff, but exists only after the window is mapped Fl_Window_Driver *pWindowDriver; // points at the system-specific stuff at window creatino time diff --git a/FL/Fl_Window_Driver.H b/FL/Fl_Window_Driver.H index 9302b77b6..204aa1a07 100644 --- a/FL/Fl_Window_Driver.H +++ b/FL/Fl_Window_Driver.H @@ -54,6 +54,13 @@ public: virtual ~Fl_Window_Driver(); static Fl_Window_Driver *newWindowDriver(Fl_Window *); + // --- accessors to private window data + int minw(); + int minh(); + int maxw(); + int maxh(); + unsigned char size_range_set(); + // --- window data virtual int decorated_w() = 0; virtual int decorated_h() = 0; @@ -62,8 +69,10 @@ public: virtual void take_focus(); virtual void flush_double(); virtual void flush_overlay(); + virtual void flush_single(); virtual void draw_begin(); virtual void draw_end(); + void draw(); virtual Fl_X *makeWindow() { /* FIXME: move Fl_X::make(Fl_Window*) here for OSX, MSWin, and X11 */ return 0; } virtual void wait_for_expose() {} // TODO: check diff --git a/src/Fl_Window_Driver.cxx b/src/Fl_Window_Driver.cxx index 5c3861685..68b4b498e 100644 --- a/src/Fl_Window_Driver.cxx +++ b/src/Fl_Window_Driver.cxx @@ -34,6 +34,15 @@ Fl_Window_Driver::~Fl_Window_Driver() { } +int Fl_Window_Driver::minw() {return pWindow->minw;} +int Fl_Window_Driver::minh() {return pWindow->minh;} +int Fl_Window_Driver::maxw() {return pWindow->maxw;} +int Fl_Window_Driver::maxh() {return pWindow->maxh;} +unsigned char Fl_Window_Driver::size_range_set() {return pWindow->size_range_set;} + +void Fl_Window_Driver::flush_single() { pWindow->Fl_Window::flush(); } +void Fl_Window_Driver::draw() { pWindow->draw(); } + void Fl_Window_Driver::take_focus() { @@ -43,11 +52,13 @@ void Fl_Window_Driver::take_focus() void Fl_Window_Driver::flush_double() { + flush_single(); } void Fl_Window_Driver::flush_overlay() { + flush_single(); } 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; } |
