mirror of https://github.com/fltk/fltk
Move several of the methods of class Fl_X for Mac platform to class Fl_Cocoa_Window_Driver.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11657 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
034cfc94a3
commit
f9edd86753
23
FL/mac.H
23
FL/mac.H
|
@ -86,15 +86,11 @@ typedef unsigned int NSUInteger;
|
|||
#endif
|
||||
|
||||
#ifdef __OBJC__
|
||||
@class NSCursor;
|
||||
@class NSOpenGLPixelFormat;
|
||||
@class NSOpenGLContext;
|
||||
@class CALayer;
|
||||
#else
|
||||
class NSCursor;
|
||||
class NSOpenGLPixelFormat;
|
||||
class NSOpenGLContext;
|
||||
class CALayer;
|
||||
#endif // __OBJC__
|
||||
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
|
||||
|
@ -116,9 +112,6 @@ typedef float CGFloat;
|
|||
#endif
|
||||
#endif // CGFLOAT_DEFINED
|
||||
|
||||
//extern CGRect fl_cgrectmake_cocoa(int x, int y, int w, int h);
|
||||
extern NSCursor *fl_default_cursor;
|
||||
|
||||
// This object contains all mac-specific stuff about a window:
|
||||
// WARNING: this object is highly subject to change!
|
||||
class Fl_X {
|
||||
|
@ -130,14 +123,6 @@ public:
|
|||
static Fl_X* first;
|
||||
static Fl_X* i(const Fl_Window* w) {return (Fl_X*)w->i;}
|
||||
static void make(Fl_Window*);
|
||||
CGRect* subRect() { return subRect_; } // getter
|
||||
void subRect(CGRect *r) { subRect_ = r; } // setter
|
||||
bool mapped_to_retina(); // is window mapped to retina display?
|
||||
void mapped_to_retina(bool); // sets whether window is mapped to retina display
|
||||
bool changed_resolution(); // did window just moved to display with another resolution?
|
||||
void changed_resolution(bool);// sets whether window just moved to display with another resolution
|
||||
bool in_windowDidResize(); // is window performing windowDidResize?
|
||||
void in_windowDidResize(bool); // sets whether window is performing windowDidResize
|
||||
// Cocoa additions
|
||||
static NSOpenGLPixelFormat *mode_to_NSOpenGLPixelFormat(int mode, const int*); // computes NSOpenGLPixelFormat from Gl window's mode
|
||||
static NSOpenGLContext* create_GLcontext_for_window(NSOpenGLPixelFormat *pixelformat, NSOpenGLContext *shared_ctx, Fl_Window *window);
|
||||
|
@ -146,14 +131,6 @@ public:
|
|||
static void GLcontext_release(NSOpenGLContext*);
|
||||
static void GLcontext_makecurrent(NSOpenGLContext*);
|
||||
static void GL_cleardrawable(void);
|
||||
void destroy(void);
|
||||
static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h);
|
||||
static unsigned char *bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel);
|
||||
private:
|
||||
CGRect* subRect_; // makes sure subwindow remains inside its parent window
|
||||
// stores 3 binary flags: whether window is mapped to retina display; whether resolution just changed;
|
||||
// whether window is OpenGL and is currently being resized.
|
||||
unsigned mapped_to_retina_;
|
||||
};
|
||||
|
||||
extern Window fl_window;
|
||||
|
|
|
@ -24,11 +24,13 @@ extern int fl_gl_load_plugin;
|
|||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Graphics_Driver.H>
|
||||
#include <FL/Fl_Window_Driver.H>
|
||||
#include <FL/x.H>
|
||||
#include "Fl_Gl_Choice.H"
|
||||
#ifdef __APPLE__ // PORTME: platform OpenGL management
|
||||
#include <FL/gl.h>
|
||||
#include <OpenGL/OpenGL.h>
|
||||
#include "drivers/Cocoa/Fl_Cocoa_Window_Driver.H"
|
||||
#endif
|
||||
#include <FL/Fl_Gl_Window.H>
|
||||
#include <FL/Fl_Device.H>
|
||||
|
@ -110,7 +112,8 @@ 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_X::i(this)->mapped_to_retina()) ? 2 : 1;
|
||||
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;
|
||||
}
|
||||
|
||||
#endif // __APPLE__ // PORTME: platform OpenGL management
|
||||
|
@ -194,8 +197,9 @@ 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
|
||||
if (Fl_X::i(this)->changed_resolution()){
|
||||
Fl_X::i(this)->changed_resolution(false);
|
||||
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)driver();
|
||||
if (d->changed_resolution()){
|
||||
d->changed_resolution(false);
|
||||
invalidate();
|
||||
Fl_X::GLcontext_update(context_);
|
||||
}
|
||||
|
@ -438,7 +442,8 @@ 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);
|
||||
if (flx && flx->in_windowDidResize()) Fl_X::GLcontext_update(context_);
|
||||
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)driver();
|
||||
if (flx && d->in_windowDidResize()) Fl_X::GLcontext_update(context_);
|
||||
#endif
|
||||
|
||||
#if ! ( defined(__APPLE__) || defined(WIN32) ) // PORTME: platform OpenGL management
|
||||
|
|
|
@ -754,7 +754,8 @@ 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;
|
||||
}
|
||||
CGRect *r = Fl_X::i(w)->subRect();
|
||||
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)w->driver();
|
||||
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
|
||||
delete r;
|
||||
|
@ -764,7 +765,7 @@ void Fl_Cocoa_Screen_Driver::remove_timeout(Fl_Timeout_Handler cb, void* data)
|
|||
r = new CGRect(srect);
|
||||
if (r->size.width == 0 && r->size.height == 0) r->origin.x = r->origin.y = 0;
|
||||
}
|
||||
Fl_X::i(w)->subRect(r);
|
||||
d->subRect(r);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1229,34 +1230,34 @@ static void orderfront_subwindows(FLWindow *xid)
|
|||
|
||||
static const unsigned windowDidResize_mask = 1;
|
||||
|
||||
bool Fl_X::in_windowDidResize() {
|
||||
return mapped_to_retina_ & windowDidResize_mask;
|
||||
bool Fl_Cocoa_Window_Driver::in_windowDidResize() {
|
||||
return window_flags_ & windowDidResize_mask;
|
||||
}
|
||||
|
||||
void Fl_X::in_windowDidResize(bool b) {
|
||||
if (b) mapped_to_retina_ |= windowDidResize_mask;
|
||||
else mapped_to_retina_ &= ~windowDidResize_mask;
|
||||
void Fl_Cocoa_Window_Driver::in_windowDidResize(bool b) {
|
||||
if (b) window_flags_ |= windowDidResize_mask;
|
||||
else window_flags_ &= ~windowDidResize_mask;
|
||||
}
|
||||
|
||||
static const unsigned mapped_mask = 2;
|
||||
static const unsigned changed_mask = 4;
|
||||
|
||||
bool Fl_X::mapped_to_retina() {
|
||||
return mapped_to_retina_ & mapped_mask;
|
||||
bool Fl_Cocoa_Window_Driver::mapped_to_retina() {
|
||||
return window_flags_ & mapped_mask;
|
||||
}
|
||||
|
||||
void Fl_X::mapped_to_retina(bool b) {
|
||||
if (b) mapped_to_retina_ |= mapped_mask;
|
||||
else mapped_to_retina_ &= ~mapped_mask;
|
||||
void Fl_Cocoa_Window_Driver::mapped_to_retina(bool b) {
|
||||
if (b) window_flags_ |= mapped_mask;
|
||||
else window_flags_ &= ~mapped_mask;
|
||||
}
|
||||
|
||||
bool Fl_X::changed_resolution() {
|
||||
return mapped_to_retina_ & changed_mask;
|
||||
bool Fl_Cocoa_Window_Driver::changed_resolution() {
|
||||
return window_flags_ & changed_mask;
|
||||
}
|
||||
|
||||
void Fl_X::changed_resolution(bool b) {
|
||||
if (b) mapped_to_retina_ |= changed_mask;
|
||||
else mapped_to_retina_ &= ~changed_mask;
|
||||
void Fl_Cocoa_Window_Driver::changed_resolution(bool b) {
|
||||
if (b) window_flags_ |= changed_mask;
|
||||
else window_flags_ &= ~changed_mask;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1349,12 +1350,13 @@ static FLWindowDelegate *flwindowdelegate_instance = nil;
|
|||
parent = parent->window();
|
||||
}
|
||||
resize_from_system = window;
|
||||
if (window->as_gl_window() && Fl_X::i(window)) Fl_X::i(window)->in_windowDidResize(true);
|
||||
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)window->driver();
|
||||
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);
|
||||
[nsw recursivelySendToSubwindows:@selector(setSubwindowFrame)];
|
||||
[nsw recursivelySendToSubwindows:@selector(checkSubwindowFrame)];
|
||||
if (window->as_gl_window() && Fl_X::i(window)) Fl_X::i(window)->in_windowDidResize(false);
|
||||
if (window->as_gl_window() && Fl_X::i(window)) d->in_windowDidResize(false);
|
||||
fl_unlock_function();
|
||||
}
|
||||
- (void)windowDidResignKey:(NSNotification *)notif
|
||||
|
@ -1923,24 +1925,25 @@ 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();
|
||||
if (fl_mac_os_version >= 100700) { // determine whether window is mapped to a retina display
|
||||
bool previous = i->mapped_to_retina();
|
||||
bool previous = d->mapped_to_retina();
|
||||
// rewrite next call that requires 10.7 and therefore triggers a compiler warning on old SDKs
|
||||
//NSSize s = [[i->xid contentView] convertSizeToBacking:NSMakeSize(10, 10)];
|
||||
typedef NSSize (*convertSizeIMP)(id, SEL, NSSize);
|
||||
static convertSizeIMP addr = (convertSizeIMP)[NSView instanceMethodForSelector:@selector(convertSizeToBacking:)];
|
||||
NSSize s = addr([i->xid contentView], @selector(convertSizeToBacking:), NSMakeSize(10, 10));
|
||||
i->mapped_to_retina( int(s.width + 0.5) > 10 );
|
||||
if (window->driver()->wait_for_expose_value == 0 && previous != i->mapped_to_retina()) i->changed_resolution(true);
|
||||
d->mapped_to_retina( int(s.width + 0.5) > 10 );
|
||||
if (d->wait_for_expose_value == 0 && previous != d->mapped_to_retina()) d->changed_resolution(true);
|
||||
}
|
||||
window->driver()->wait_for_expose_value = 0;
|
||||
d->wait_for_expose_value = 0;
|
||||
|
||||
if ( i->region ) {
|
||||
Fl_Graphics_Driver::default_driver().XDestroyRegion(i->region);
|
||||
i->region = 0;
|
||||
}
|
||||
window->clear_damage(FL_DAMAGE_ALL);
|
||||
window->driver()->flush();
|
||||
d->flush();
|
||||
window->clear_damage();
|
||||
}
|
||||
|
||||
|
@ -2944,13 +2947,14 @@ void Fl_X::make(Fl_Window* w)
|
|||
}
|
||||
|
||||
Fl_X *x = new Fl_X;
|
||||
w->driver()->other_xid = 0; // room for doublebuffering image map. On OS X this is only used by overlay windows
|
||||
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)w->pWindowDriver;
|
||||
d->other_xid = 0; // room for doublebuffering image map. On OS X this is only used by overlay windows
|
||||
x->region = 0;
|
||||
x->subRect(0);
|
||||
((Fl_Cocoa_Window_Driver*)w->pWindowDriver)->gc = 0;
|
||||
x->mapped_to_retina(false);
|
||||
x->changed_resolution(false);
|
||||
x->in_windowDidResize(false);
|
||||
d->subRect(0);
|
||||
d->gc = 0;
|
||||
d->mapped_to_retina(false);
|
||||
d->changed_resolution(false);
|
||||
d->in_windowDidResize(false);
|
||||
|
||||
NSRect crect;
|
||||
if (w->fullscreen_active()) {
|
||||
|
@ -3251,7 +3255,7 @@ void Fl_Cocoa_Window_Driver::make_current()
|
|||
q_release_context();
|
||||
Fl_X *i = Fl_X::i(pWindow);
|
||||
fl_window = i->xid;
|
||||
((Fl_Quartz_Graphics_Driver*)Fl_Display_Device::display_device()->driver())->high_resolution( i->mapped_to_retina() );
|
||||
((Fl_Quartz_Graphics_Driver*)Fl_Display_Device::display_device()->driver())->high_resolution( mapped_to_retina() );
|
||||
|
||||
NSGraphicsContext *nsgc;
|
||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
|
||||
|
@ -3272,7 +3276,7 @@ void Fl_Cocoa_Window_Driver::make_current()
|
|||
CGContextScaleCTM(gc, 1.0f, -1.0f); // now 0,0 is top-left point of the window
|
||||
// for subwindows, limit drawing to inside of parent window
|
||||
// half pixel offset is necessary for clipping as done by fl_cgrectmake_cocoa()
|
||||
if (i->subRect()) CGContextClipToRect(gc, CGRectOffset(*(i->subRect()), -0.5, -0.5));
|
||||
if (subRect()) CGContextClipToRect(gc, CGRectOffset(*(subRect()), -0.5, -0.5));
|
||||
|
||||
// this is the context with origin at top left of (sub)window
|
||||
CGContextSaveGState(gc);
|
||||
|
@ -3498,7 +3502,8 @@ int Fl_Darwin_System_Driver::clipboard_contains(const char *type) {
|
|||
return found != nil;
|
||||
}
|
||||
|
||||
void Fl_X::destroy() {
|
||||
void Fl_Cocoa_Window_Driver::destroy() {
|
||||
FLWindow *xid = fl_xid(pWindow);
|
||||
if (xid) {
|
||||
[xid close];
|
||||
}
|
||||
|
@ -4115,7 +4120,7 @@ static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y,
|
|||
}
|
||||
|
||||
|
||||
unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel)
|
||||
unsigned char *Fl_Cocoa_Window_Driver::bitmap_from_window_rect(int x, int y, int w, int h, int *bytesPerPixel)
|
||||
/* Returns a capture of a rectangle of a mapped window as a pre-multiplied RGBA array of bytes.
|
||||
Alpha values are always 1 (except for the angles of a window title bar)
|
||||
so pre-multiplication can be ignored.
|
||||
|
@ -4123,6 +4128,7 @@ unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w
|
|||
delete[] the returned pointer after use
|
||||
*/
|
||||
{
|
||||
Fl_Window *win = pWindow;
|
||||
NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h);
|
||||
if (bitmap == nil) return NULL;
|
||||
*bytesPerPixel = [bitmap bitsPerPixel]/8;
|
||||
|
@ -4192,12 +4198,13 @@ static void nsbitmapProviderReleaseData (void *info, const void *data, size_t si
|
|||
[(NSBitmapImageRep*)info release];
|
||||
}
|
||||
|
||||
CGImageRef Fl_X::CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h)
|
||||
CGImageRef Fl_Cocoa_Window_Driver::CGImage_from_window_rect(int x, int y, int w, int h)
|
||||
/* Returns a capture of a rectangle of a mapped window as a CGImage.
|
||||
With retina displays, the returned image has twice the width and height.
|
||||
CFRelease the returned CGImageRef after use
|
||||
*/
|
||||
{
|
||||
Fl_Window *win = pWindow;
|
||||
CGImageRef img;
|
||||
NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h);
|
||||
if (fl_mac_os_version >= 100500) {
|
||||
|
@ -4296,7 +4303,7 @@ void Fl_Cocoa_Window_Driver::capture_titlebar_and_borders(Fl_Shared_Image*& top,
|
|||
if (layer) {
|
||||
Fl_Cocoa_Window_Driver::draw_layer_to_context(layer, auxgc, w(), htop);
|
||||
} else {
|
||||
CGImageRef img = Fl_X::CGImage_from_window_rect(pWindow, 0, -htop, w(), htop);
|
||||
CGImageRef img = CGImage_from_window_rect(0, -htop, w(), htop);
|
||||
CGContextSaveGState(auxgc);
|
||||
clip_to_rounded_corners(auxgc, w(), htop);
|
||||
CGContextDrawImage(auxgc, CGRectMake(0, 0, w(), htop), img);
|
||||
|
|
|
@ -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_X::CGImage_from_window_rect(win, x, y, w, h);
|
||||
CGImageRef img = ((Fl_Cocoa_Window_Driver*)win->driver())->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);
|
||||
|
|
|
@ -339,7 +339,8 @@ 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
|
||||
base = Fl_X::bitmap_from_window_rect(Fl_Window::current(),x,y,w,h,&delta);
|
||||
Fl_Cocoa_Window_Driver *d = (Fl_Cocoa_Window_Driver*)Fl_Window::current()->driver();
|
||||
base = d->bitmap_from_window_rect(x,y,w,h,&delta);
|
||||
if (!base) return NULL;
|
||||
rowBytes = delta*w;
|
||||
x = y = 0;
|
||||
|
|
|
@ -66,7 +66,10 @@ class FL_EXPORT Fl_Cocoa_Window_Driver : public Fl_Window_Driver
|
|||
private:
|
||||
void shape_bitmap_(Fl_Image* b);
|
||||
void shape_alpha_(Fl_Image* img, int offset);
|
||||
|
||||
CGRect* subRect_; // makes sure subwindow remains inside its parent window
|
||||
// stores 3 binary flags: whether window is mapped to retina display; whether resolution just changed;
|
||||
// whether window is OpenGL and is currently being resized.
|
||||
unsigned window_flags_;
|
||||
public:
|
||||
Fl_Cocoa_Window_Driver(Fl_Window*);
|
||||
~Fl_Cocoa_Window_Driver();
|
||||
|
@ -74,6 +77,17 @@ public:
|
|||
NSCursor *cursor;
|
||||
static void q_release_context(Fl_Cocoa_Window_Driver *x = 0); // free all resources associated with gc
|
||||
void set_key_window();
|
||||
bool mapped_to_retina(); // is window mapped to retina display?
|
||||
void mapped_to_retina(bool); // sets whether window is mapped to retina display
|
||||
bool changed_resolution(); // did window just moved to display with another resolution?
|
||||
void changed_resolution(bool);// sets whether window just moved to display with another resolution
|
||||
bool in_windowDidResize(); // is window performing windowDidResize?
|
||||
void in_windowDidResize(bool); // sets whether window is performing windowDidResize
|
||||
CGRect* subRect() { return subRect_; } // getter
|
||||
void subRect(CGRect *r) { subRect_ = r; } // setter
|
||||
void destroy();
|
||||
unsigned char *bitmap_from_window_rect(int x, int y, int w, int h, int *bytesPerPixel);
|
||||
CGImageRef CGImage_from_window_rect(int x, int y, int w, int h);
|
||||
|
||||
// --- window data
|
||||
virtual int decorated_w();
|
||||
|
|
|
@ -240,7 +240,7 @@ void Fl_Cocoa_Window_Driver::hide() {
|
|||
if ( ip->xid == fl_window )
|
||||
fl_window = 0;
|
||||
if (ip->region) Fl_Graphics_Driver::default_driver().XDestroyRegion(ip->region);
|
||||
ip->destroy();
|
||||
destroy();
|
||||
delete ip;
|
||||
}
|
||||
|
||||
|
@ -273,7 +273,7 @@ void Fl_Cocoa_Window_Driver::decoration_sizes(int *top, int *left, int *right,
|
|||
|
||||
int Fl_Cocoa_Window_Driver::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)
|
||||
{
|
||||
CGImageRef img = Fl_X::CGImage_from_window_rect(Fl_Window::current(), src_x, src_y, src_w, src_h);
|
||||
CGImageRef img = CGImage_from_window_rect(src_x, src_y, src_w, src_h);
|
||||
if (img) {
|
||||
((Fl_Quartz_Graphics_Driver*)fl_graphics_driver)->draw_CGImage(img,dest_x,dest_y,src_w,src_h,0,0,src_w,src_h);
|
||||
CFRelease(img);
|
||||
|
|
Loading…
Reference in New Issue