Index: src/unix/devQuartz.c =================================================================== --- src/unix/devQuartz.c (revision 30471) +++ src/unix/devQuartz.c (working copy) @@ -282,6 +282,13 @@ #if HAVE_AQUA extern DL_FUNC ptr_GetQuartzParameters; extern DL_FUNC ptr_FocusOnConsole; +extern Rboolean (*cocoaInnerQuartzDevice)(NewDevDesc*dd,char*display, + double width,double height, + double pointsize,char*family, + Rboolean antialias, + Rboolean autorefresh,int quartzpos, + int bg); +extern extern Rboolean useaqua; void GetQuartzParameters(double *width, double *height, double *ps, char *family, Rboolean *antialias, Rboolean *autorefresh, int *quartzpos) {ptr_GetQuartzParameters(width, height, ps, family, antialias, autorefresh, quartzpos);} @@ -510,9 +517,15 @@ char *family, Rboolean antialias, Rboolean autorefresh, int quartzpos, int bg) { -return innerQuartzDeviceDriver((NewDevDesc *)dd, display, - width, height, pointsize, family, antialias, autorefresh, - quartzpos, bg); + if(cocoaInnerQuartzDevice) + return cocoaInnerQuartzDevice((NewDevDesc*)dd,display,width,height, + pointsize,family,antialias, + autorefresh,quartzpos,bg); + else + return innerQuartzDeviceDriver((NewDevDesc *)dd, display, + width,height,pointsize, + family,antialias,autorefresh, + quartzpos, bg); } Index: src/unix/aqua.c =================================================================== --- src/unix/aqua.c (revision 30471) +++ src/unix/aqua.c (working copy) @@ -60,6 +60,8 @@ #define __DEBUGGING__ #include +#include +#include #include extern Rboolean useaqua; /* from src/unix/system.c */ @@ -73,6 +75,8 @@ #define cocoa_basic 0x0001 /* basic functionality */ #define cocoa_loop 0x0002 /* event loop functionality */ #define cocoa_menu 0x0004 /* if set, Cocoa provides its own menu, Carbon should skip menu creation */ +#define cocoa_dev 0x0008 /* if set, Cocoa provides its own graphics device handler */ +#define cocoa_extra 0x0010 /* if set, Cocoa provides its own widgets */ int cocoaFeatures=0; /* defines the capabilities of the currently loaded bundle */ @@ -105,6 +109,22 @@ /* - this function is called after initialization such as that Cocoa may build the application menu */ int (*cocoaSetupMenu)(int); /* optional - menu may already have been created in initializeBundle */ +/*===feature group: cocoa_dev */ +Rboolean (*cocoaInnerQuartzDevice)(NewDevDesc*dd,char*display, + double width,double height, + double pointsize,char*family, + Rboolean antialias,Rboolean autorefresh, + int quartzpos,int bg); +void (*cocoaGetQuartzParameters)(double *width, double *height, double *ps, char *family, Rboolean *antialias, Rboolean *autorefresh, int *quartzpos); + +/*===feature group: cocoa_extra */ +SEXP (*cocoaDoWorkspaceBrowser)(SEXP call,SEXP op,SEXP args,SEXP env); +SEXP (*cocoaDataEntry)(SEXP call,SEXP op,SEXP args,SEXP env); +SEXP (*cocoaBrowsePackages)(SEXP call,SEXP op,SEXP args,SEXP env); +SEXP (*cocoaDataManager)(SEXP call,SEXP op,SEXP args,SEXP env); +SEXP (*cocoaHelpBrowser)(SEXP call,SEXP op,SEXP args,SEXP env); +SEXP (*cocoaPackageManager)(SEXP call,SEXP op,SEXP args,SEXP env); + static void loadRGUIBundle(CFBundleRef *bundlePtr); static int userInput(const char *text); void RGUI_WriteConsole(char *str, int len); @@ -458,7 +478,17 @@ cocoaRisBusy = CFBundleGetFunctionPointerForName(*bundlePtr, CFSTR("RisBusy")); cocoaSetupMenu = CFBundleGetFunctionPointerForName(*bundlePtr, CFSTR("setupMenu")); cocoaProcessEvents = CFBundleGetFunctionPointerForName(*bundlePtr, CFSTR("processEvents")); - + + cocoaInnerQuartzDevice = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("innerQuartzDevice")); + cocoaGetQuartzParameters = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("getQuartzParameters")); + + cocoaDoWorkspaceBrowser = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("doWorkspaceBrowser")); + cocoaDataEntry = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("doDataEntry")); + cocoaBrowsePackages = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("doBrowsePackages")); + cocoaDataManager = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("doDataManager")); + cocoaHelpBrowser = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("doHelpBrowser")); + cocoaPackageManager = CFBundleGetFunctionPointerForName(*bundlePtr,CFSTR("doPackageManager")); + if (!cocoaInitializeBundle) REprintf("Cocoa bundle found, but initializeBundle function is not present. The bundle won't be used.\n"); else @@ -474,6 +504,27 @@ REprintf("Cocoa bundle advertizes event loop features, but at least one feature was not found! Disabling bundle.\n"); cocoaFeatures=0; } + if (((cocoaFeatures&cocoa_dev)>0) && ((!cocoaInnerQuartzDevice) || (!cocoaGetQuartzParameters))) { + REprintf("Cocoa bundle advertizes the quartz device feature, but at least one feature was not found! Disabling bundle.\n"); + cocoaFeatures=0; + } else { + ptr_GetQuartzParameters = cocoaGetQuartzParameters; + } + if (((cocoaFeatures&cocoa_extra)>0)) { + if(cocoaDoWorkspaceBrowser && cocoaDataEntry && + cocoaBrowsePackages && cocoaDataManager && + cocoaHelpBrowser && cocoaPackageManager) { + ptr_do_wsbrowser = (DL_FUNC)cocoaDoWorkspaceBrowser; + ptr_do_dataentry = (DL_FUNC)cocoaDataEntry; + ptr_do_browsepkgs = (DL_FUNC)cocoaBrowsePackages; + ptr_do_datamanger = (DL_FUNC)cocoaDataManager; /* sic */ + ptr_do_hsbrowser = (DL_FUNC)cocoaHelpBrowser; + ptr_do_packagemanger = (DL_FUNC)cocoaPackageManager; /* sic */ + } else { + REprintf("Cocoa bundle advertizes the widgets feature, but at least one feature was not found! Disabling bundle.\n"); + cocoaFeatures=0; + } + } } else fprintf(stderr,"\nCannot load the Cocoa GUI");