diff options
29 files changed, 78 insertions, 74 deletions
diff --git a/FL/Fl_Window.H b/FL/Fl_Window.H index f05281671..4153199bf 100644 --- a/FL/Fl_Window.H +++ b/FL/Fl_Window.H @@ -527,8 +527,6 @@ public: */ int decorated_h() const; - Fl_Window_Driver *driver() const { return pWindowDriver; } - // Note: Doxygen docs in Fl_Widget.H to avoid redundancy. virtual Fl_Window* as_window() { return this; } @@ -545,7 +543,7 @@ public: void shape(const Fl_Image* img); void shape(const Fl_Image& b) ; int is_shaped(); - + inline int screen_num(); }; #endif diff --git a/FL/Fl_Window_Driver.H b/FL/Fl_Window_Driver.H index 45546158d..41c2e75a9 100644 --- a/FL/Fl_Window_Driver.H +++ b/FL/Fl_Window_Driver.H @@ -181,6 +181,7 @@ public: #endif virtual int scroll(int src_x, int src_y, int src_w, int src_h, int dest_x, int dest_y, void (*draw_area)(void*, int,int,int,int), void* data) { return 0; } + static Fl_Window_Driver* driver(const Fl_Window *win) {return win->pWindowDriver;} }; #endif // FL_WINDOW_DRIVER_H diff --git a/documentation/src/drawing.dox b/documentation/src/drawing.dox index f8b2fd903..666fe541d 100644 --- a/documentation/src/drawing.dox +++ b/documentation/src/drawing.dox @@ -61,7 +61,7 @@ expressed in FLTK units by the current value of the scale factor for the screen in use and obtains quantities in <b>drawing units</b>. The current scale factor value, for an Fl_Window named \e window, is given by \code -int nscreen = window->driver()->screen_num(); // the screen where window is mapped +int nscreen = window->screen_num(); // the screen where window is mapped float s = Fl::screen_driver()->scale(nscreen); // this screen's scale factor \endcode One drawing unit generally corresponds to one screen pixel... diff --git a/src/Fl.cxx b/src/Fl.cxx index 8695add93..6e60e524c 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -695,10 +695,10 @@ void Fl::flush() { damage_ = 0; for (Fl_X* i = Fl_X::first; i; i = i->next) { Fl_Window* wi = i->w; - if (wi->driver()->wait_for_expose_value) {damage_ = 1; continue;} + if (Fl_Window_Driver::driver(wi)->wait_for_expose_value) {damage_ = 1; continue;} if (!wi->visible_r()) continue; if (wi->damage()) { - wi->driver()->flush(); + Fl_Window_Driver::driver(wi)->flush(); wi->clear_damage(); } // destroy damage regions for windows that don't use them: @@ -912,7 +912,7 @@ void Fl::focus(Fl_Widget *o) while (w1) { win=w1; w1=win->window(); } if (win) { if (fl_xfocus != win) { - win->driver()->take_focus(); + Fl_Window_Driver::driver(win)->take_focus(); fl_xfocus = win; } } diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx index b6456dab2..54421c191 100644 --- a/src/Fl_Double_Window.cxx +++ b/src/Fl_Double_Window.cxx @@ -54,15 +54,15 @@ void Fl_Double_Window::resize(int X,int Y,int W,int H) { int oh = h(); Fl_Window::resize(X,Y,W,H); Fl_X *myi = Fl_X::i(this); - if (myi && driver()->other_xid && (ow < w() || oh < h() || Fl_Window_Driver::is_a_rescale())) - driver()->destroy_double_buffer(); + if (myi && Fl_Window_Driver::driver(this)->other_xid && (ow < w() || oh < h() || Fl_Window_Driver::is_a_rescale())) + Fl_Window_Driver::driver(this)->destroy_double_buffer(); } void Fl_Double_Window::hide() { Fl_X *myi = Fl_X::i(this); - if (myi && driver()->other_xid) { - driver()->destroy_double_buffer(); + if (myi && Fl_Window_Driver::driver(this)->other_xid) { + Fl_Window_Driver::driver(this)->destroy_double_buffer(); } Fl_Window::hide(); } @@ -70,7 +70,7 @@ void Fl_Double_Window::hide() { void Fl_Double_Window::flush() { - driver()->flush_double(); + Fl_Window_Driver::driver(this)->flush_double(); } diff --git a/src/Fl_Gl_Window.cxx b/src/Fl_Gl_Window.cxx index 9687fd1ec..b01313165 100644 --- a/src/Fl_Gl_Window.cxx +++ b/src/Fl_Gl_Window.cxx @@ -617,7 +617,7 @@ Fl_Gl_Window_Driver *Fl_Gl_Window_Driver::newGlWindowDriver(Fl_Gl_Window *w) float Fl_WinAPI_Gl_Window_Driver::pixels_per_unit() { - int ns = pWindow->driver()->screen_num(); + int ns = Fl_Window_Driver::driver(pWindow)->screen_num(); return Fl::screen_driver()->scale(ns); } @@ -715,7 +715,7 @@ void Fl_X11_Gl_Window_Driver::before_show(int& need_redraw) { float Fl_X11_Gl_Window_Driver::pixels_per_unit() { - int ns = pWindow->driver()->screen_num(); + int ns = Fl_Window_Driver::driver(pWindow)->screen_num(); return Fl::screen_driver()->scale(ns); } diff --git a/src/Fl_Menu_Window.cxx b/src/Fl_Menu_Window.cxx index fd0ec6ed0..2010295fd 100644 --- a/src/Fl_Menu_Window.cxx +++ b/src/Fl_Menu_Window.cxx @@ -27,17 +27,17 @@ #include <FL/Fl_Window_Driver.H> void Fl_Menu_Window::show() { - driver()->show_menu(); + Fl_Window_Driver::driver(this)->show_menu(); } void Fl_Menu_Window::flush() { if (!shown()) return; - driver()->flush_menu(); + Fl_Window_Driver::driver(this)->flush_menu(); } /** Erases the window, does nothing if HAVE_OVERLAY is not defined in config.h */ void Fl_Menu_Window::erase() { - driver()->erase_menu(); + Fl_Window_Driver::driver(this)->erase_menu(); } // Fix the colormap flashing on Maximum Impact Graphics by erasing the diff --git a/src/Fl_Overlay_Window.cxx b/src/Fl_Overlay_Window.cxx index 5e127ec53..b5e755bdf 100644 --- a/src/Fl_Overlay_Window.cxx +++ b/src/Fl_Overlay_Window.cxx @@ -51,7 +51,7 @@ void Fl_Overlay_Window::hide() { void Fl_Overlay_Window::flush() { - driver()->flush_overlay(); + Fl_Window_Driver::driver(this)->flush_overlay(); } void Fl_Overlay_Window::resize(int X, int Y, int W, int H) { @@ -68,7 +68,7 @@ Fl_Overlay_Window::~Fl_Overlay_Window() { } int Fl_Overlay_Window::can_do_overlay() { - return driver()->can_do_overlay(); + return Fl_Window_Driver::driver(this)->can_do_overlay(); } /** @@ -78,7 +78,7 @@ int Fl_Overlay_Window::can_do_overlay() { calling show(). */ void Fl_Overlay_Window::redraw_overlay() { - driver()->redraw_overlay(); + Fl_Window_Driver::driver(this)->redraw_overlay(); } // diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx index d926c02ff..6006dcaf8 100644 --- a/src/Fl_Screen_Driver.cxx +++ b/src/Fl_Screen_Driver.cxx @@ -302,7 +302,7 @@ void Fl_Screen_Driver::rescale_all_windows_from_screen(int screen, float f) int i = 0, count = 0; // count top-level windows, except transient scale-displaying window Fl_Window *win = Fl::first_window(); while (win) { - if (!win->parent() && (win->driver()->screen_num() == screen || rescalable() == SYSTEMWIDE_APP_SCALING) && + if (!win->parent() && (Fl_Window_Driver::driver(win)->screen_num() == screen || rescalable() == SYSTEMWIDE_APP_SCALING) && win->user_data() != &Fl_Screen_Driver::transient_scale_display) count++; win = Fl::next_window(win); } @@ -310,14 +310,14 @@ void Fl_Screen_Driver::rescale_all_windows_from_screen(int screen, float f) win = Fl::first_window(); // memorize all top-level windows while (win) { if (!win->parent() && win->user_data() != &Fl_Screen_Driver::transient_scale_display && - (win->driver()->screen_num() == screen || rescalable() == SYSTEMWIDE_APP_SCALING) ) { + (Fl_Window_Driver::driver(win)->screen_num() == screen || rescalable() == SYSTEMWIDE_APP_SCALING) ) { win_array[i++] = win; } win = Fl::next_window(win); } for (i = count - 1; i >= 0; i--) { // rescale all top-level windows, finishing with front one win = win_array[i]; - win->driver()->resize_after_scale_change(screen, old_f, f); + Fl_Window_Driver::driver(win)->resize_after_scale_change(screen, old_f, f); win->wait_for_expose(); } delete[] win_array; @@ -366,8 +366,8 @@ void Fl_Screen_Driver::transient_scale_display(float f, int nscreen) win->user_data((void*)&transient_scale_display); // prevent this window from being rescaled later win->set_output(); win->set_non_modal(); - win->driver()->screen_num(nscreen); - win->driver()->force_position(1); + Fl_Window_Driver::driver(win)->screen_num(nscreen); + Fl_Window_Driver::driver(win)->force_position(1); win->show(); Fl::add_timeout(1, del_transient_window, win); // delete after 1 sec } @@ -382,7 +382,7 @@ int Fl_Screen_Driver::scale_handler(int event) if (Fl::grab()) return 0; // don't rescale when menu windows are on Fl_Widget *wid = Fl::focus(); if (!wid) return 0; - int screen = wid->top_window()->driver()->screen_num(); + int screen = Fl_Window_Driver::driver(wid->top_window())->screen_num(); Fl_Screen_Driver *screen_dr = Fl::screen_driver(); static float initial_scale = screen_dr->scale(screen); #if defined(TEST_SCALING) diff --git a/src/Fl_Widget_Surface.cxx b/src/Fl_Widget_Surface.cxx index 68e785478..5812911ff 100644 --- a/src/Fl_Widget_Surface.cxx +++ b/src/Fl_Widget_Surface.cxx @@ -155,7 +155,7 @@ void Fl_Widget_Surface::print_window_part(Fl_Window *win, int x, int y, int w, i Fl_Window *save_front = Fl::first_window(); win->show(); Fl::check(); - win->driver()->flush(); // makes the window current + Fl_Window_Driver::driver(win)->flush(); // makes the window current Fl_RGB_Image *img = Fl_Screen_Driver::traverse_to_gl_subwindows(win, x, y, w, h, NULL); if (img) img->scale(w, h, 1, 1); if (save_front != win) save_front->show(); @@ -186,7 +186,7 @@ void Fl_Widget_Surface::draw_decorated_window(Fl_Window *win, int x_offset, int { Fl_RGB_Image *top=0, *left=0, *bottom=0, *right=0; if (win->border() && !win->parent()) { - win->driver()->capture_titlebar_and_borders(top, left, bottom, right); + Fl_Window_Driver::driver(win)->capture_titlebar_and_borders(top, left, bottom, right); } int wsides = left ? left->w() : 0; int toph = top ? top->h() : 0; diff --git a/src/Fl_Window.cxx b/src/Fl_Window.cxx index dedbf525d..c34988cf3 100644 --- a/src/Fl_Window.cxx +++ b/src/Fl_Window.cxx @@ -631,6 +631,11 @@ void Fl_Window::size_range(int minw, int minh, int maxw, int maxh, int dw, int d pWindowDriver->size_range(); } +/** The number of the screen containing the mapped window */ +inline int Fl_Window::screen_num() { + return pWindowDriver->screen_num(); +} + // // End of "$Id$". // diff --git a/src/Fl_Window_Driver.cxx b/src/Fl_Window_Driver.cxx index f59235971..45e9c4b03 100644 --- a/src/Fl_Window_Driver.cxx +++ b/src/Fl_Window_Driver.cxx @@ -250,7 +250,7 @@ void Fl_Window_Driver::wait_for_expose() { } int Fl_Window_Driver::screen_num() { - if (pWindow->parent()) return pWindow->top_window()->driver()->screen_num(); + if (pWindow->parent()) return Fl_Window_Driver::driver(pWindow->top_window())->screen_num(); return Fl::screen_num(x(), y(), w(), h()); } diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 6309d1d27..cc5d8f016 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -1353,7 +1353,7 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; r = [[nsw contentView] frame]; pt2 = [nsw convertBaseToScreen:NSMakePoint(0, r.size.height)]; pt2.y = main_screen_height - pt2.y; - float s = Fl::screen_driver()->scale(window->driver()->screen_num()); + float s = Fl::screen_driver()->scale(Fl_Window_Driver::driver(window)->screen_num()); pt2.x = int(pt2.x/s + 0.5); pt2.y = int(pt2.y/s + 0.5); Fl_Window *parent = window->window(); while (parent) { @@ -1976,7 +1976,7 @@ static int fake_X_wm(Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by) { int W, H, xoff, yoff, dx, dy; int ret = bx = by = bt = 0; if (w->border() && !w->parent()) { - if (w->driver()->maxw() != w->driver()->minw() || w->driver()->maxh() != w->driver()->minh()) { + if (Fl_Window_Driver::driver(w)->maxw() != Fl_Window_Driver::driver(w)->minw() || Fl_Window_Driver::driver(w)->maxh() != Fl_Window_Driver::driver(w)->minh()) { ret = 2; } else { ret = 1; @@ -3088,7 +3088,7 @@ Fl_X* Fl_Cocoa_Window_Driver::makeWindow() x->xid = cw; x->w = w; i(x); - w->driver()->wait_for_expose_value = 1; + Fl_Window_Driver::driver(w)->wait_for_expose_value = 1; if (!w->parent()) { x->next = Fl_X::first; Fl_X::first = x; diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx index 8f5259fef..74028e61f 100644 --- a/src/Fl_win32.cxx +++ b/src/Fl_win32.cxx @@ -848,7 +848,7 @@ void Fl_WinAPI_System_Driver::paste(Fl_Widget &receiver, int clipboard, const ch int hdots = GetDeviceCaps(hdc, HORZRES); ReleaseDC(NULL, hdc); float factor = (100.f * hmm) / hdots; - float scaling = Fl::screen_driver()->scale(receiver.top_window()->driver()->screen_num()); + float scaling = Fl::screen_driver()->scale(Fl_Window_Driver::driver(receiver.top_window())->screen_num()); if (!Fl_Window::current()) { Fl_GDI_Graphics_Driver *d = (Fl_GDI_Graphics_Driver*)&Fl_Graphics_Driver::default_driver(); d->scale(scaling);// may run early at app startup before Fl_Window::make_current() scales d @@ -1168,7 +1168,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar // fl_msg.lPrivate = ??? Fl_Window *window = fl_find(hWnd); - float scale = (window ? Fl::screen_driver()->scale(window->driver()->screen_num()) : 1); + float scale = (window ? Fl::screen_driver()->scale(Fl_Window_Driver::driver(window)->screen_num()) : 1); if (window) { switch (uMsg) { @@ -1179,9 +1179,9 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar float f = HIWORD(wParam) / 96.; GetClientRect(hWnd, &r); float old_f = float(r.right) / window->w(); - int ns = window->driver()->screen_num(); + int ns = Fl_Window_Driver::driver(window)->screen_num(); Fl::screen_driver()->scale(ns, f); - window->driver()->resize_after_scale_change(ns, old_f, f); + Fl_Window_Driver::driver(window)->resize_after_scale_change(ns, old_f, f); } return 0; } @@ -1204,7 +1204,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar case WM_PAINT: { Fl_Region R, R2; Fl_X *i = Fl_X::i(window); - window->driver()->wait_for_expose_value = 0; + Fl_Window_Driver::driver(window)->wait_for_expose_value = 0; char redraw_whole_window = false; if (!i->region && window->damage()) { // Redraw the whole window... @@ -1246,7 +1246,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar // Very annoying! fl_GetDC(hWnd); // Make sure we have a DC for this window... fl_save_pen(); - window->driver()->flush(); + Fl_Window_Driver::driver(window)->flush(); fl_restore_pen(); window->clear_damage(); return 0; @@ -1652,10 +1652,10 @@ static int fake_X_wm_style(const Fl_Window *w, int &X, int &Y, int &bt, int &bx, int ret = bx = by = bt = 0; int fallback = 1; - float s = Fl::screen_driver()->scale(w->driver()->screen_num()); + float s = Fl::screen_driver()->scale(Fl_Window_Driver::driver(w)->screen_num()); if (!w->parent()) { if (fl_xid(w)) { - Fl_WinAPI_Window_Driver *dr = (Fl_WinAPI_Window_Driver *)w->driver(); + Fl_WinAPI_Window_Driver *dr = Fl_WinAPI_Window_Driver::driver(w); dr->border_width_title_bar_height(bx, by, bt); xoff = bx; yoff = by + bt; @@ -1952,19 +1952,19 @@ Fl_X *Fl_WinAPI_Window_Driver::makeWindow() { // compute adequate screen where to put the window int nscreen = 0; if (w->parent()) { - nscreen = w->top_window()->driver()->screen_num(); - } else if (w->driver()->force_position() && Fl_WinAPI_Window_Driver::driver(w)->screen_num_ >= 0) { - nscreen = w->driver()->screen_num(); + nscreen = Fl_Window_Driver::driver(w->top_window())->screen_num(); + } else if (Fl_Window_Driver::driver(w)->force_position() && Fl_WinAPI_Window_Driver::driver(w)->screen_num_ >= 0) { + nscreen = Fl_Window_Driver::driver(w)->screen_num(); } else { Fl_Window *hint = Fl::first_window(); if (hint) { - nscreen = hint->top_window()->driver()->screen_num(); + nscreen = Fl_Window_Driver::driver(hint->top_window())->screen_num(); } else { int mx, my; nscreen = Fl::screen_driver()->get_mouse(mx, my); } } - w->driver()->screen_num(nscreen); + Fl_Window_Driver::driver(w)->screen_num(nscreen); float s = Fl::screen_driver()->scale(nscreen); int xp = w->x() * s; // these are in graphical units int yp = w->y() * s; diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 6b9c2fad8..752924593 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -1098,7 +1098,7 @@ static void set_event_xy(Fl_Window *win) { # endif float s = 1; #if USE_XFT - s = Fl::screen_driver()->scale(win->driver()->screen_num()); + s = Fl::screen_driver()->scale(Fl_Window_Driver::driver(win)->screen_num()); #endif Fl::e_x_root = fl_xevent->xbutton.x_root/s; Fl::e_x = fl_xevent->xbutton.x/s; @@ -1654,7 +1654,7 @@ int fl_handle(const XEvent& thisevent) break; case Expose: - window->driver()->wait_for_expose_value = 0; + Fl_Window_Driver::driver(window)->wait_for_expose_value = 0; # if 0 // try to keep windows on top even if WM_TRANSIENT_FOR does not work: // opaque move/resize window managers do not like this, so I disabled it. @@ -1665,7 +1665,7 @@ int fl_handle(const XEvent& thisevent) case GraphicsExpose: { #if USE_XFT - int ns = window->driver()->screen_num(); + int ns = Fl_Window_Driver::driver(window)->screen_num(); float s = Fl::screen_driver()->scale(ns); window->damage(FL_DAMAGE_EXPOSE, xevent.xexpose.x/s, xevent.xexpose.y/s, xevent.xexpose.width/s + 2, xevent.xexpose.height/s + 2); @@ -2072,7 +2072,7 @@ int fl_handle(const XEvent& thisevent) if ( !wasXExceptionRaised() ) { resize_bug_fix = window; #if USE_XFT - int ns = window->driver()->screen_num(); + int ns = Fl_Window_Driver::driver(window)->screen_num(); float s = Fl::screen_driver()->scale(ns); #else float s = 1; @@ -2282,11 +2282,11 @@ void fl_fix_focus(); // in Fl.cxx Fl_X* Fl_X::set_xid(Fl_Window* win, Window winxid) { Fl_X *xp = new Fl_X; xp->xid = winxid; - win->driver()->other_xid = 0; + Fl_Window_Driver::driver(win)->other_xid = 0; xp->w = win; win->i = xp; xp->next = Fl_X::first; xp->region = 0; - win->driver()->wait_for_expose_value = 1; + Fl_Window_Driver::driver(win)->wait_for_expose_value = 1; #ifdef USE_XDBE Fl_X11_Window_Driver::driver(win)->backbuffer_bad = 1; #endif @@ -2427,13 +2427,13 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap) //compute adequate screen where to put the window int nscreen = 0; if (win->parent()) { - nscreen = win->top_window()->driver()->screen_num(); + nscreen = Fl_Window_Driver::driver(win->top_window())->screen_num(); } else if (win->force_position() && Fl_X11_Window_Driver::driver(win)->screen_num_ >= 0) { - nscreen = win->driver()->screen_num(); + nscreen = Fl_Window_Driver::driver(win)->screen_num(); } else { Fl_Window *hint = Fl::first_window(); if (hint) { - nscreen = hint->top_window()->driver()->screen_num(); + nscreen = Fl_Window_Driver::driver(hint->top_window())->screen_num(); } } Fl_X11_Window_Driver::driver(win)->screen_num(nscreen); diff --git a/src/drivers/Android/Fl_Android_Window_Driver.H b/src/drivers/Android/Fl_Android_Window_Driver.H index 1df475a3d..6ade10cf4 100644 --- a/src/drivers/Android/Fl_Android_Window_Driver.H +++ b/src/drivers/Android/Fl_Android_Window_Driver.H @@ -71,8 +71,8 @@ private: #endif public: - static inline Fl_Android_Window_Driver* driver(Fl_Window *w) { - return (Fl_Android_Window_Driver*)w->driver(); + static inline Fl_Android_Window_Driver* driver(const Fl_Window *w) { + return (Fl_Android_Window_Driver*)Fl_Window_Driver::driver(w); } Fl_Android_Window_Driver(Fl_Window *w) : Fl_Window_Driver(w) {} diff --git a/src/drivers/Android/Fl_Android_Window_Driver.cxx b/src/drivers/Android/Fl_Android_Window_Driver.cxx index 4e10d6d7d..05fd80020 100644 --- a/src/drivers/Android/Fl_Android_Window_Driver.cxx +++ b/src/drivers/Android/Fl_Android_Window_Driver.cxx @@ -99,7 +99,7 @@ void Fl_Android_Window_Driver::expose_all() { for (Fl_X *x = Fl_X::first; x; x = x->next) { Fl_Window *win = x->w; - win->driver()->wait_for_expose_value = 0; + Fl_Android_Window_Driver::driver(win)->wait_for_expose_value = 0; win->damage(FL_DAMAGE_EXPOSE); win->redraw(); } diff --git a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm index d9a43b1f2..fabfcaa8f 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm +++ b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm @@ -383,7 +383,7 @@ void Fl_Cocoa_Printer_Driver::draw_decorated_window(Fl_Window *win, int x_offset CGContextRef gc = (CGContextRef)driver()->gc(); CGContextSaveGState(gc); CGContextTranslateCTM(gc, x_offset - 0.5, y_offset + bt - 0.5); - float s = Fl::screen_driver()->scale(win->driver()->screen_num()); + float s = Fl::screen_driver()->scale(Fl_Window_Driver::driver(win)->screen_num()); CGContextScaleCTM(gc, 1/s, -1/s); Fl_Cocoa_Window_Driver::draw_layer_to_context(layer, gc, win->w() * s, bt); CGContextRestoreGState(gc); @@ -428,7 +428,7 @@ void Fl_Cocoa_Printer_Driver::draw_decorated_window(Fl_Window *win, int x_offset Fl::check(); // capture the window title bar with no title Fl_RGB_Image *top, *left, *bottom, *right; - win->driver()->capture_titlebar_and_borders(top, left, bottom, right); + Fl_Window_Driver::driver(win)->capture_titlebar_and_borders(top, left, bottom, right); [(NSWindow*)fl_xid(win) setTitle:title]; // put back the window title this->set_current(); // back to the Fl_Paged_Device top->draw(x_offset, y_offset); // print the title bar diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H index 43538c175..d7162eff9 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H @@ -73,7 +73,7 @@ private: public: Fl_Cocoa_Window_Driver(Fl_Window*); ~Fl_Cocoa_Window_Driver(); - static inline Fl_Cocoa_Window_Driver* driver(Fl_Window *w) {return (Fl_Cocoa_Window_Driver*)w->driver();} + static inline Fl_Cocoa_Window_Driver* driver(const Fl_Window *w) {return (Fl_Cocoa_Window_Driver*)Fl_Window_Driver::driver(w);} CGContextRef gc; // graphics context NSCursor *cursor; static void q_release_context(Fl_Cocoa_Window_Driver *x = 0); // free all resources associated with gc diff --git a/src/drivers/OpenGL/Fl_OpenGL_Display_Device.cxx b/src/drivers/OpenGL/Fl_OpenGL_Display_Device.cxx index 5b1f8b1f8..09d02cbc3 100644 --- a/src/drivers/OpenGL/Fl_OpenGL_Display_Device.cxx +++ b/src/drivers/OpenGL/Fl_OpenGL_Display_Device.cxx @@ -109,7 +109,7 @@ Fl_RGB_Image* Fl_OpenGL_Display_Device::capture_gl_rectangle(Fl_Gl_Window *glw, glPixelStorei(GL_PACK_SKIP_ROWS, 0); glPixelStorei(GL_PACK_SKIP_PIXELS, 0); // - int ns = glw->driver()->screen_num(); + int ns = Fl_Window_Driver::driver(glw)->screen_num(); float s = Fl::screen_driver()->scale(ns); if (s != 1) { x *= s; y *= s; w *= s; h *= s; diff --git a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx index 2c61e6089..2a3448409 100644 --- a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx +++ b/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx @@ -52,7 +52,7 @@ Fl_Quartz_Image_Surface_Driver::Fl_Quartz_Image_Surface_Driver(int w, int h, int if (high_res) { s = Fl_Graphics_Driver::default_driver().scale(); Fl_Window *cw = Fl_Window::current(); - if (cw && ((Fl_Cocoa_Window_Driver*)cw->driver())->mapped_to_retina()) s *= 2; + if (cw && Fl_Cocoa_Window_Driver::driver(cw)->mapped_to_retina()) s *= 2; W *= s; H *= s; } CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H index 72996db60..44cc06ccc 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H @@ -68,7 +68,7 @@ private: public: Fl_WinAPI_Window_Driver(Fl_Window*); ~Fl_WinAPI_Window_Driver(); - static inline Fl_WinAPI_Window_Driver* driver(Fl_Window *w) {return (Fl_WinAPI_Window_Driver*)w->driver();} + static inline Fl_WinAPI_Window_Driver* driver(const Fl_Window *w) {return (Fl_WinAPI_Window_Driver*)Fl_Window_Driver::driver(w);} HDC private_dc; // used for OpenGL RECT border_width_title_bar_height(int &bx, int &by, int &bt); virtual void screen_num(int n); diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx index dd45ad2ad..3b6974330 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx @@ -64,7 +64,7 @@ Fl_WinAPI_Window_Driver::~Fl_WinAPI_Window_Driver() int Fl_WinAPI_Window_Driver::screen_num() { if (pWindow->parent()) { - screen_num_ = pWindow->top_window()->driver()->screen_num(); + screen_num_ = Fl_Window_Driver::driver(pWindow->top_window())->screen_num(); } return screen_num_ >= 0 ? screen_num_ : 0; } @@ -694,7 +694,7 @@ void Fl_WinAPI_Window_Driver::resize_after_screen_change(void *data) { GetClientRect(fl_xid(win), &r); float old_f = float(r.right)/win->w(); int ns = data_for_resize_window_between_screens_.screen; - win->driver()->resize_after_scale_change(ns, old_f, Fl::screen_driver()->scale(ns)); + Fl_Window_Driver::driver(win)->resize_after_scale_change(ns, old_f, Fl::screen_driver()->scale(ns)); data_for_resize_window_between_screens_.busy = false; } diff --git a/src/drivers/X11/Fl_X11_Screen_Driver.cxx b/src/drivers/X11/Fl_X11_Screen_Driver.cxx index d79d31307..cb6da5d1e 100644 --- a/src/drivers/X11/Fl_X11_Screen_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Screen_Driver.cxx @@ -801,7 +801,7 @@ Fl_RGB_Image *Fl_X11_Screen_Driver::read_win_rectangle(int X, int Y, int w, int RootWindow(fl_display, fl_screen), X*s, Y*s, &dxs, &dys, &child_win); dx = dxs/s; dy = dys/s; // screen dimensions - Fl::screen_xywh(sx, sy, sw, sh, win->driver()->screen_num()); + Fl::screen_xywh(sx, sy, sw, sh, Fl_Window_Driver::driver(win)->screen_num()); } if (win && !allow_outside && int(s) != s) { ws = (w+1)*s-1; diff --git a/src/drivers/X11/Fl_X11_Window_Driver.H b/src/drivers/X11/Fl_X11_Window_Driver.H index a3eb304ea..e1ff50105 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.H +++ b/src/drivers/X11/Fl_X11_Window_Driver.H @@ -92,7 +92,7 @@ private: public: Fl_X11_Window_Driver(Fl_Window*); virtual ~Fl_X11_Window_Driver(); - static inline Fl_X11_Window_Driver* driver(Fl_Window *w) {return (Fl_X11_Window_Driver*)w->driver();} + static inline Fl_X11_Window_Driver* driver(const Fl_Window *w) {return (Fl_X11_Window_Driver*)Fl_Window_Driver::driver(w);} #if USE_XFT virtual int screen_num(); static void resize_after_screen_change(void *data); diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx index 46aa52878..fc64ee645 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx @@ -691,14 +691,14 @@ Fl_X11_Window_Driver::type_for_resize_window_between_screens Fl_X11_Window_Drive void Fl_X11_Window_Driver::resize_after_screen_change(void *data) { Fl_Window *win = (Fl_Window*)data; float f = Fl::screen_driver()->scale(data_for_resize_window_between_screens_.screen); - win->driver()->resize_after_scale_change(data_for_resize_window_between_screens_.screen, f, f); + Fl_Window_Driver::driver(win)->resize_after_scale_change(data_for_resize_window_between_screens_.screen, f, f); data_for_resize_window_between_screens_.busy = false; } int Fl_X11_Window_Driver::screen_num() { if (pWindow->parent()) { - screen_num_ = pWindow->top_window()->driver()->screen_num(); + screen_num_ = Fl_Window_Driver::driver(pWindow->top_window())->screen_num(); } return screen_num_ >= 0 ? screen_num_ : 0; } diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx index dad106a02..65284514a 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx @@ -736,7 +736,7 @@ void Fl_Xlib_Graphics_Driver::draw_fixed(Fl_RGB_Image *img, int X, int Y, int W, int ox = offset_x_, oy = offset_y_; offset_x_ = offset_y_ = 0; Fl_X11_Screen_Driver *d = (Fl_X11_Screen_Driver*)Fl::screen_driver(); - int nscreen = Fl_Window::current()->driver()->screen_num(); + int nscreen = Fl_Window_Driver::driver(Fl_Window::current())->screen_num(); float keep = d->scale(nscreen); d->scale(nscreen, 1); push_no_clip(); diff --git a/src/fl_dnd_win32.cxx b/src/fl_dnd_win32.cxx index cdc6529bc..78452b7b1 100644 --- a/src/fl_dnd_win32.cxx +++ b/src/fl_dnd_win32.cxx @@ -90,7 +90,7 @@ public: HWND hWnd = WindowFromPoint( ppt ); Fl_Window *target = fl_find( hWnd ); if (target) { - float s = Fl::screen_driver()->scale(target->driver()->screen_num()); + float s = Fl::screen_driver()->scale(Fl_Window_Driver::driver(target)->screen_num()); Fl::e_x_root /= s; Fl::e_y_root /= s; Fl::e_x = Fl::e_x_root-target->x(); @@ -125,7 +125,7 @@ public: Fl::e_x_root = pt.x; Fl::e_y_root = pt.y; if (fl_dnd_target_window) { - float s = Fl::screen_driver()->scale(fl_dnd_target_window->driver()->screen_num()); + float s = Fl::screen_driver()->scale(Fl_Window_Driver::driver(fl_dnd_target_window)->screen_num()); Fl::e_x_root /= s; Fl::e_y_root /= s; Fl::e_x = Fl::e_x_root-fl_dnd_target_window->x(); @@ -162,7 +162,7 @@ public: fl_dnd_target_window = 0; Fl::e_x_root = pt.x; Fl::e_y_root = pt.y; - float s = Fl::screen_driver()->scale(target->driver()->screen_num()); + float s = Fl::screen_driver()->scale(Fl_Window_Driver::driver(target)->screen_num()); Fl::e_x_root /= s; Fl::e_y_root /= s; if (target) { diff --git a/src/fl_scroll_area.cxx b/src/fl_scroll_area.cxx index 0eacd7820..36f27b75d 100644 --- a/src/fl_scroll_area.cxx +++ b/src/fl_scroll_area.cxx @@ -72,7 +72,7 @@ void fl_scroll(int X, int Y, int W, int H, int dx, int dy, clip_h = H-src_h; } - int retval = Fl_Window::current()->driver()->scroll(src_x, src_y, src_w, src_h, + int retval = Fl_Window_Driver::driver(Fl_Window::current())->scroll(src_x, src_y, src_w, src_h, dest_x, dest_y, draw_area, data); if (retval) { draw_area(data,X,Y,W,H); |
