Add static Fl_XXX_Window_Driver *driver(Fl_Window*) to get the platform-specific driver of a window.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11663 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2016-04-19 17:34:15 +00:00
parent 9f78323574
commit 4aa388d4ff
9 changed files with 25 additions and 22 deletions

View File

@ -114,7 +114,7 @@ void Fl_Gl_Window::show() {
int Fl_Gl_Window::pixels_per_unit()
{
return (fl_mac_os_version >= 100700 && Fl::use_high_res_GL() && Fl_X::i(this) &&
((Fl_Cocoa_Window_Driver*)driver())->mapped_to_retina()) ? 2 : 1;
Fl_Cocoa_Window_Driver::driver(this)->mapped_to_retina()) ? 2 : 1;
}
#endif // __APPLE__ // PORTME: platform OpenGL management
@ -198,7 +198,7 @@ void Fl_Gl_Window::make_current() {
// printf("make_current: context_=%p\n", context_);
#if defined(__APPLE__) // PORTME: platform OpenGL management
// detect if the window was moved between low and high resolution displays
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)driver();
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(this);
if (d->changed_resolution()){
d->changed_resolution(false);
invalidate();
@ -443,7 +443,7 @@ void Fl_Gl_Window::resize(int X,int Y,int W,int H) {
#ifdef __APPLE__ // PORTME: platform OpenGL management
Fl_X *flx = Fl_X::i(this);
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)driver();
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(this);
if (flx && d->in_windowDidResize()) Fl_Cocoa_Screen_Driver::GLcontext_update(context_);
#endif

View File

@ -754,7 +754,7 @@ void Fl_Cocoa_Screen_Driver::remove_timeout(Fl_Timeout_Handler cb, void* data)
srect = CGRectIntersection(prect, srect); // area of subwindow inside its parent
from = parent;
}
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)w->driver();
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(w);
CGRect *r = d->subRect();
CGRect current_clip = (r ? *r : full); // current subwindow clip
if (!CGRectEqualToRect(srect, current_clip)) { // if new clip differs from current clip
@ -1350,7 +1350,7 @@ static FLWindowDelegate *flwindowdelegate_instance = nil;
parent = parent->window();
}
resize_from_system = window;
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)window->driver();
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(window);
if (window->as_gl_window() && Fl_X::i(window)) d->in_windowDidResize(true);
update_e_xy_and_e_xy_root(nsw);
window->resize((int)pt2.x, (int)pt2.y, (int)r.size.width, (int)r.size.height);
@ -1925,7 +1925,7 @@ static void handleUpdateEvent( Fl_Window *window )
{
if ( !window ) return;
Fl_X *i = Fl_X::i( window );
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)window->driver();
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(window);
if (fl_mac_os_version >= 100700) { // determine whether window is mapped to a retina display
bool previous = d->mapped_to_retina();
// rewrite next call that requires 10.7 and therefore triggers a compiler warning on old SDKs
@ -2321,8 +2321,8 @@ static FLTextInputContext* fltextinputcontext_instance = nil;
if (!i) return; // fix for STR #3128
// We have to have at least one cursor rect for invalidateCursorRectsForView
// to work, hence the "else" clause.
if (((Fl_Cocoa_Window_Driver*)w->driver())->cursor)
[self addCursorRect:[self visibleRect] cursor:((Fl_Cocoa_Window_Driver*)w->driver())->cursor];
if (Fl_Cocoa_Window_Driver::driver(w)->cursor)
[self addCursorRect:[self visibleRect] cursor:Fl_Cocoa_Window_Driver::driver(w)->cursor];
else
[self addCursorRect:[self visibleRect] cursor:[NSCursor arrowCursor]];
}

View File

@ -1356,7 +1356,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
}
case WM_GETMINMAXINFO:
((Fl_WinAPI_Window_Driver*)window->driver())->set_minmax((LPMINMAXINFO)lParam);
Fl_WinAPI_Window_Driver::driver(window)->set_minmax((LPMINMAXINFO)lParam);
break;
case WM_SIZE:
@ -1383,7 +1383,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
case WM_SETCURSOR:
if (LOWORD(lParam) == HTCLIENT) {
while (window->parent()) window = window->window();
SetCursor(((Fl_WinAPI_Window_Driver*)window->driver())->cursor);
SetCursor(Fl_WinAPI_Window_Driver::driver(window)->cursor);
return 0;
}
break;
@ -2070,12 +2070,12 @@ void Fl_Window::icons(HICON big_icon, HICON small_icon)
free_icons();
if (big_icon != NULL)
((Fl_WinAPI_Window_Driver*)pWindowDriver)->icon_->big_icon = CopyIcon(big_icon);
Fl_WinAPI_Window_Driver::driver(this)->icon_->big_icon = CopyIcon(big_icon);
if (small_icon != NULL)
((Fl_WinAPI_Window_Driver*)pWindowDriver)->icon_->small_icon = CopyIcon(small_icon);
Fl_WinAPI_Window_Driver::driver(this)->icon_->small_icon = CopyIcon(small_icon);
if (Fl_X::i(this))
((Fl_WinAPI_Window_Driver*)pWindowDriver)->set_icons();
Fl_WinAPI_Window_Driver::driver(this)->set_icons();
}
/** Sets the default window icons.

View File

@ -2222,7 +2222,7 @@ Fl_X* Fl_X::set_xid(Fl_Window* win, Window winxid) {
xp->region = 0;
win->driver()->wait_for_expose_value = 1;
#ifdef USE_XDBE
((Fl_X11_Window_Driver*)win->pWindowDriver)->backbuffer_bad = 1;
Fl_X11_Window_Driver::driver(win)->backbuffer_bad = 1;
#endif
Fl_X::first = xp;
if (win->modal()) {Fl::modal_ = win; fl_fix_focus();}
@ -2386,7 +2386,7 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap)
XA_ATOM, 32, 0, (uchar*)&WM_DELETE_WINDOW, 1);
// send size limits and border:
((Fl_X11_Window_Driver*)win->pWindowDriver)->sendxjunk();
Fl_X11_Window_Driver::driver(win)->sendxjunk();
// set the class property, which controls the icon used:
if (win->xclass()) {
@ -2453,14 +2453,14 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap)
Fl_Window::show_iconic_ = 0;
showit = 0;
}
if (((Fl_X11_Window_Driver*)win->pWindowDriver)->icon_->legacy_icon) {
hints->icon_pixmap = (Pixmap)((Fl_X11_Window_Driver*)win->pWindowDriver)->icon_->legacy_icon;
if (Fl_X11_Window_Driver::driver(win)->icon_->legacy_icon) {
hints->icon_pixmap = (Pixmap)Fl_X11_Window_Driver::driver(win)->icon_->legacy_icon;
hints->flags |= IconPixmapHint;
}
XSetWMHints(fl_display, xp->xid, hints);
XFree(hints);
((Fl_X11_Window_Driver*)win->pWindowDriver)->set_icons();
Fl_X11_Window_Driver::driver(win)->set_icons();
}
// set the window type for menu and tooltip windows to avoid animations (compiz)
@ -2481,7 +2481,7 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap)
#endif
if (win->is_shaped()) {
((Fl_X11_Window_Driver*)win->pWindowDriver)->combine_mask();
Fl_X11_Window_Driver::driver(win)->combine_mask();
}
XMapWindow(fl_display, xp->xid);
if (showit) {

View File

@ -373,7 +373,7 @@ void Fl_Cocoa_Printer_Driver::print_window_part(Fl_Window *win, int x, int y, in
Fl_Window *save_front = Fl::first_window();
win->show();
Fl::check();
CGImageRef img = ((Fl_Cocoa_Window_Driver*)win->driver())->CGImage_from_window_rect(x, y, w, h);
CGImageRef img = Fl_Cocoa_Window_Driver::driver(win)->CGImage_from_window_rect(x, y, w, h);
if (save_front != win) save_front->show();
current->set_current();
((Fl_Quartz_Graphics_Driver*)driver())->draw_CGImage(img,delta_x, delta_y, w, h, 0,0,w,h);

View File

@ -168,7 +168,7 @@ void Fl_Cocoa_Screen_Driver::grab(Fl_Window* win)
if (win) {
if (!Fl::grab_) {
fl_capture = Fl_X::i(Fl::first_window())->xid;
((Fl_Cocoa_Window_Driver*)Fl::first_window()->driver())->set_key_window();
Fl_Cocoa_Window_Driver::driver(Fl::first_window())->set_key_window();
}
Fl::grab_ = win;
} else {
@ -339,7 +339,7 @@ Fl_Cocoa_Screen_Driver::read_image(uchar *p, // I - Pixel buffer or NULL to all
if( (sw - x < w) || (sh - y < h) ) return NULL;
}
else { // reading from current window
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)Fl_Window::current()->driver();
Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(Fl_Window::current());
base = d->bitmap_from_window_rect(x,y,w,h,&delta);
if (!base) return NULL;
rowBytes = delta*w;

View File

@ -75,6 +75,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();}
CGContextRef gc; // graphics context
NSCursor *cursor;
static void q_release_context(Fl_Cocoa_Window_Driver *x = 0); // free all resources associated with gc

View File

@ -68,6 +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();}
struct icon_data *icon_;
HCURSOR cursor;

View File

@ -78,6 +78,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();}
// --- window data
virtual int decorated_w();