Various Mac stuff
This commit is contained in:
parent
26ca56212c
commit
4111a08857
|
@ -30,8 +30,43 @@ public final class Window {
|
|||
|
||||
static {
|
||||
System.loadLibrary(Sys.getLibraryName());
|
||||
/*
|
||||
* elias: Mac OS X hacks. We need to fetch the toolkit to acquire a Dock icon, a system menu
|
||||
* and to make windows behave normally. We also need to intercept the quit event from
|
||||
* Swing. Luckily, Swing can be assumed to be present on Mac OS X. Because some of this
|
||||
* is apple extensions to java, we need stub files to successfully compile on other platforms.
|
||||
*
|
||||
* Additionally, because of the way swing works, applications now need to do an
|
||||
* explicit System.exit() to quit. Returning from the main thread is not enough any
|
||||
* more.
|
||||
*
|
||||
* I've wasted a significant amount of time searching for an acceptable solution, without
|
||||
* finding a way to avoid Swing. AFAIK,
|
||||
*
|
||||
* 1. There's no way to acquire the Dock icon, system menu and normal window behaviour.
|
||||
* For that, you either need a proper bundled, native application or initialize Swing.
|
||||
* 2. Even if there were a way around it, Swing is automatically started anyway if you
|
||||
* use Java Web Start.
|
||||
* 3. Swing gains total control over the main event loop, so the native library need to
|
||||
* work around by maintaining an internal event queue. That's really boring stuff, indeed.
|
||||
*
|
||||
* I have posted a bug report to apple regarding the behaviour.
|
||||
*
|
||||
*/
|
||||
if (Display.getPlatform() == Display.PLATFORM_AGL) {
|
||||
java.awt.Toolkit.getDefaultToolkit();
|
||||
new com.apple.eawt.Application().addApplicationListener(new com.apple.eawt.ApplicationAdapter() {
|
||||
public void handleQuit(com.apple.eawt.ApplicationEvent e) {
|
||||
e.setHandled(false);
|
||||
apple_quit = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/** Special quit boolean set from the apple version */
|
||||
private static boolean apple_quit;
|
||||
|
||||
/** Whether the window is currently created, ie. has a native peer */
|
||||
private static boolean created;
|
||||
|
||||
|
@ -150,7 +185,9 @@ public final class Window {
|
|||
*/
|
||||
public static boolean isCloseRequested() {
|
||||
assert isCreated() : "Cannot determine state of uncreated window";
|
||||
return nIsCloseRequested();
|
||||
boolean result = nIsCloseRequested() || apple_quit;
|
||||
apple_quit = false;
|
||||
return result;
|
||||
}
|
||||
|
||||
private static native boolean nIsCloseRequested();
|
||||
|
@ -305,6 +342,7 @@ public final class Window {
|
|||
throws Exception;
|
||||
|
||||
private static void createWindow() throws Exception {
|
||||
apple_quit = false;
|
||||
HashSet extensions = new HashSet();
|
||||
nCreate(title, x, y, width, height, fullscreen, color, alpha, depth, stencil, extensions);
|
||||
GLCaps.determineAvailableExtensions(extensions);
|
||||
|
|
|
@ -88,6 +88,42 @@ glXQueryServerStringPROC glXQueryServerString = NULL;
|
|||
glXQueryExtensionsStringPROC glXQueryExtensionsString = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef _AGL
|
||||
aglChoosePixelFormatPROC aglChoosePixelFormat = NULL;
|
||||
aglDestroyPixelFormatPROC aglDestroyPixelFormat = NULL;
|
||||
aglNextPixelFormatPROC aglNextPixelFormat = NULL;
|
||||
aglDescribePixelFormatPROC aglDescribePixelFormat = NULL;
|
||||
aglDevicesOfPixelFormatPROC aglDevicesOfPixelFormat = NULL;
|
||||
aglQueryRendererInfoPROC aglQueryRendererInfo = NULL;
|
||||
aglDestroyRendererInfoPROC aglDestroyRendererInfo = NULL;
|
||||
aglNextRendererInfoPROC aglNextRendererInfo = NULL;
|
||||
aglDescribeRendererPROC aglDescribeRenderer = NULL;
|
||||
aglCreateContextPROC aglCreateContext = NULL;
|
||||
aglDestroyContextPROC aglDestroyContext = NULL;
|
||||
aglCopyContextPROC aglCopyContext = NULL;
|
||||
aglUpdateContextPROC aglUpdateContext = NULL;
|
||||
aglSetCurrentContextPROC aglSetCurrentContext = NULL;
|
||||
aglGetCurrentContextPROC aglGetCurrentContext = NULL;
|
||||
aglSetDrawablePROC aglSetDrawable = NULL;
|
||||
aglSetOffScreenPROC aglSetOffScreen = NULL;
|
||||
aglSetFullScreenPROC aglSetFullScreen = NULL;
|
||||
aglGetDrawablePROC aglGetDrawable = NULL;
|
||||
aglSetVirtualScreenPROC aglSetVirtualScreen = NULL;
|
||||
aglGetVirtualScreenPROC aglGetVirtualScreen = NULL;
|
||||
aglGetVersionPROC aglGetVersion = NULL;
|
||||
aglSwapBuffersPROC aglSwapBuffers = NULL;
|
||||
aglEnablePROC aglEnable = NULL;
|
||||
aglDisablePROC aglDisable = NULL;
|
||||
aglIsEnabledPROC aglIsEnabled = NULL;
|
||||
aglSetIntegerPROC aglSetInteger = NULL;
|
||||
aglGetIntegerPROC aglGetInteger = NULL;
|
||||
aglUseFontPROC aglUseFont = NULL;
|
||||
aglGetErrorPROC aglGetError = NULL;
|
||||
aglErrorStringPROC aglErrorString = NULL;
|
||||
aglResetLibraryPROC aglResetLibrary = NULL;
|
||||
aglSurfaceTexturePROC aglSurfaceTexture = NULL;
|
||||
#endif
|
||||
|
||||
gluBeginCurvePROC gluBeginCurve = NULL;
|
||||
gluBeginPolygonPROC gluBeginPolygon = NULL;
|
||||
gluBeginSurfacePROC gluBeginSurface = NULL;
|
||||
|
@ -1311,7 +1347,9 @@ OSStatus aglInitEntryPoints (void)
|
|||
|
||||
if (noErr != err)
|
||||
{
|
||||
DebugStr ("\pCould make FSref to frameworks folder");
|
||||
#ifdef _DEBUG
|
||||
printf("Could make FSref to frameworks folder\n");
|
||||
#endif
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1320,7 +1358,9 @@ OSStatus aglInitEntryPoints (void)
|
|||
bundleURLOpenGL = CFURLCreateFromFSRef (kCFAllocatorDefault, &fileRef);
|
||||
if (!bundleURLOpenGL)
|
||||
{
|
||||
DebugStr ("\pCould create OpenGL Framework bundle URL");
|
||||
#ifdef _DEBUG
|
||||
printf("Could create OpenGL Framework bundle URL\n");
|
||||
#endif
|
||||
return paramErr;
|
||||
}
|
||||
|
||||
|
@ -1329,7 +1369,9 @@ OSStatus aglInitEntryPoints (void)
|
|||
gBundleRefOpenGL = CFBundleCreate (kCFAllocatorDefault,bundleURLOpenGL);
|
||||
if (!gBundleRefOpenGL)
|
||||
{
|
||||
DebugStr ("\pCould not create OpenGL Framework bundle");
|
||||
#ifdef _DEBUG
|
||||
printf("Could not create OpenGL Framework bundle\n");
|
||||
#endif
|
||||
return paramErr;
|
||||
}
|
||||
|
||||
|
@ -1340,7 +1382,9 @@ OSStatus aglInitEntryPoints (void)
|
|||
// if the code was successfully loaded, look for our function.
|
||||
if (!CFBundleLoadExecutable (gBundleRefOpenGL))
|
||||
{
|
||||
DebugStr ("\pCould not load MachO executable");
|
||||
#ifdef _DEBUG
|
||||
printf("Could not load MachO executable\n");
|
||||
#endif
|
||||
return paramErr;
|
||||
}
|
||||
|
||||
|
@ -1362,7 +1406,10 @@ static void aglDellocEntryPoints (void)
|
|||
|
||||
static void * aglGetProcAddress (char * pszProc)
|
||||
{
|
||||
return CFBundleGetFunctionPointerForName (gBundleRefOpenGL,CFStringCreateWithCStringNoCopy (NULL, pszProc, CFStringGetSystemEncoding (), NULL));
|
||||
CFStringRef str = CFStringCreateWithCStringNoCopy(NULL, pszProc, kCFStringEncodingUTF8, kCFAllocatorNull);
|
||||
void *func_pointer = CFBundleGetFunctionPointerForName(gBundleRefOpenGL, str);
|
||||
CFRelease(str);
|
||||
return func_pointer;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1579,11 +1626,42 @@ static void extgl_InitializeWGL(JNIEnv *env, jobject ext_set)
|
|||
/*-----------------------------------------------------*/
|
||||
#ifdef _AGL
|
||||
|
||||
static int extgl_InitializeAGL(JNIEnv *env, jobject ext_set)
|
||||
bool extgl_InitAGL(JNIEnv *env, jobject ext_set)
|
||||
{
|
||||
// add in AGL extensions here
|
||||
|
||||
return 0;
|
||||
aglChoosePixelFormat = (aglChoosePixelFormatPROC)extgl_GetProcAddress("aglChoosePixelFormat");
|
||||
aglDestroyPixelFormat = (aglDestroyPixelFormatPROC)extgl_GetProcAddress("aglDestroyPixelFormat");
|
||||
aglNextPixelFormat = (aglNextPixelFormatPROC)extgl_GetProcAddress("aglNextPixelFormat");
|
||||
aglDescribePixelFormat = (aglDescribePixelFormatPROC)extgl_GetProcAddress("aglDescribePixelFormat");
|
||||
aglDevicesOfPixelFormat = (aglDevicesOfPixelFormatPROC)extgl_GetProcAddress("aglDevicesOfPixelFormat");
|
||||
aglQueryRendererInfo = (aglQueryRendererInfoPROC)extgl_GetProcAddress("aglQueryRendererInfo");
|
||||
aglDestroyRendererInfo = (aglDestroyRendererInfoPROC)extgl_GetProcAddress("aglDestroyRendererInfo");
|
||||
aglNextRendererInfo = (aglNextRendererInfoPROC)extgl_GetProcAddress("aglNextRendererInfo");
|
||||
aglDescribeRenderer = (aglDescribeRendererPROC)extgl_GetProcAddress("aglDescribeRenderer");
|
||||
aglCreateContext = (aglCreateContextPROC)extgl_GetProcAddress("aglCreateContext");
|
||||
aglDestroyContext = (aglDestroyContextPROC)extgl_GetProcAddress("aglDestroyContext");
|
||||
aglCopyContext = (aglCopyContextPROC)extgl_GetProcAddress("aglCopyContext");
|
||||
aglUpdateContext = (aglUpdateContextPROC)extgl_GetProcAddress("aglUpdateContext");
|
||||
aglSetCurrentContext = (aglSetCurrentContextPROC)extgl_GetProcAddress("aglSetCurrentContext");
|
||||
aglGetCurrentContext = (aglGetCurrentContextPROC)extgl_GetProcAddress("aglGetCurrentContext");
|
||||
aglSetDrawable = (aglSetDrawablePROC)extgl_GetProcAddress("aglSetDrawable");
|
||||
aglSetOffScreen = (aglSetOffScreenPROC)extgl_GetProcAddress("aglSetOffScreen");
|
||||
aglSetFullScreen = (aglSetFullScreenPROC)extgl_GetProcAddress("aglSetFullScreen");
|
||||
aglGetDrawable = (aglGetDrawablePROC)extgl_GetProcAddress("aglGetDrawable");
|
||||
aglSetVirtualScreen = (aglSetVirtualScreenPROC)extgl_GetProcAddress("aglSetVirtualScreen");
|
||||
aglGetVirtualScreen = (aglGetVirtualScreenPROC)extgl_GetProcAddress("aglGetVirtualScreen");
|
||||
aglGetVersion = (aglGetVersionPROC)extgl_GetProcAddress("aglGetVersion");
|
||||
aglSwapBuffers = (aglSwapBuffersPROC)extgl_GetProcAddress("aglSwapBuffers");
|
||||
aglEnable = (aglEnablePROC)extgl_GetProcAddress("aglEnable");
|
||||
aglDisable = (aglDisablePROC)extgl_GetProcAddress("aglDisable");
|
||||
aglIsEnabled = (aglIsEnabledPROC)extgl_GetProcAddress("aglIsEnabled");
|
||||
aglSetInteger = (aglSetIntegerPROC)extgl_GetProcAddress("aglSetInteger");
|
||||
aglGetInteger = (aglGetIntegerPROC)extgl_GetProcAddress("aglGetInteger");
|
||||
aglUseFont = (aglUseFontPROC)extgl_GetProcAddress("aglUseFont");
|
||||
aglGetError = (aglGetErrorPROC)extgl_GetProcAddress("aglGetError");
|
||||
aglErrorString = (aglErrorStringPROC)extgl_GetProcAddress("aglErrorString");
|
||||
aglResetLibrary = (aglResetLibraryPROC)extgl_GetProcAddress("aglResetLibrary");
|
||||
aglSurfaceTexture = (aglSurfaceTexturePROC)extgl_GetProcAddress("aglSurfaceTexture");
|
||||
return !extgl_error;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -3046,7 +3124,6 @@ static void extgl_InitSupportedExtensions(JNIEnv *env, jobject ext_set)
|
|||
extgl_Extensions.OpenGL12 = false;
|
||||
extgl_Extensions.OpenGL13 = false;
|
||||
extgl_Extensions.OpenGL14 = false;
|
||||
|
||||
if (s != NULL)
|
||||
{
|
||||
// Fall trhough
|
||||
|
@ -3154,7 +3231,6 @@ static void extgl_InitSupportedExtensions(JNIEnv *env, jobject ext_set)
|
|||
bool extgl_Initialize(JNIEnv *env, jobject ext_set)
|
||||
{
|
||||
extgl_error = false;
|
||||
|
||||
extgl_InitOpenGL1_1();
|
||||
extgl_InitGLU12();
|
||||
if (extgl_error)
|
||||
|
@ -3219,11 +3295,6 @@ bool extgl_Initialize(JNIEnv *env, jobject ext_set)
|
|||
/* load WGL extensions */
|
||||
extgl_InitializeWGL(env, ext_set);
|
||||
#endif
|
||||
|
||||
#ifdef _AGL
|
||||
/* load AGL extensions */
|
||||
extgl_InitializeAGL(env, ext_set);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -343,73 +343,73 @@ typedef CGrafPtr AGLDrawable;
|
|||
void aglDellocEntryPoints (void);
|
||||
void * aglGetProcAddress (char * pszProc);
|
||||
*/
|
||||
typedef AGLPixelFormat (APIENTRY * aglChoosePixelFormatEXTPROC)(const AGLDevice *gdevs, GLint ndev, const GLint *attribs);
|
||||
typedef void (APIENTRY * aglDestroyPixelFormatEXTPROC)(AGLPixelFormat pix);
|
||||
typedef AGLPixelFormat (APIENTRY * aglNextPixelFormatEXTPROC)(AGLPixelFormat pix);
|
||||
typedef GLboolean (APIENTRY * aglDescribePixelFormatEXTPROC)(AGLPixelFormat pix, GLint attrib, GLint *value);
|
||||
typedef AGLDevice * (APIENTRY * aglDevicesOfPixelFormatEXTPROC)(AGLPixelFormat pix, GLint *ndevs);
|
||||
typedef AGLRendererInfo (APIENTRY * aglQueryRendererInfoEXTPROC)(const AGLDevice *gdevs, GLint ndev);
|
||||
typedef void (APIENTRY * aglDestroyRendererInfoEXTPROC)(AGLRendererInfo rend);
|
||||
typedef AGLRendererInfo (APIENTRY * aglNextRendererInfoEXTPROC)(AGLRendererInfo rend);
|
||||
typedef GLboolean (APIENTRY * aglDescribeRendererEXTPROC)(AGLRendererInfo rend, GLint prop, GLint *value);
|
||||
typedef AGLContext (APIENTRY * aglCreateContextEXTPROC)(AGLPixelFormat pix, AGLContext share);
|
||||
typedef GLboolean (APIENTRY * aglDestroyContextEXTPROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglCopyContextEXTPROC)(AGLContext src, AGLContext dst, GLuint mask);
|
||||
typedef GLboolean (APIENTRY * aglUpdateContextEXTPROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglSetCurrentContextEXTPROC)(AGLContext ctx);
|
||||
typedef AGLContext (APIENTRY * aglGetCurrentContextEXTPROC)(void);
|
||||
typedef GLboolean (APIENTRY * aglSetDrawableEXTPROC)(AGLContext ctx, AGLDrawable draw);
|
||||
typedef GLboolean (APIENTRY * aglSetOffScreenEXTPROC)(AGLContext ctx, GLsizei width, GLsizei height, GLsizei rowbytes, GLvoid *baseaddr);
|
||||
typedef GLboolean (APIENTRY * aglSetFullScreenEXTPROC)(AGLContext ctx, GLsizei width, GLsizei height, GLsizei freq, GLint device);
|
||||
typedef AGLDrawable (APIENTRY * aglGetDrawableEXTPROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglSetVirtualScreenEXTPROC)(AGLContext ctx, GLint screen);
|
||||
typedef GLint (APIENTRY * aglGetVirtualScreenEXTPROC)(AGLContext ctx);
|
||||
typedef void (APIENTRY * aglGetVersionEXTPROC)(GLint *major, GLint *minor);
|
||||
typedef void (APIENTRY * aglSwapBuffersEXTPROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglEnableEXTPROC)(AGLContext ctx, GLenum pname);
|
||||
typedef GLboolean (APIENTRY * aglDisableEXTPROC)(AGLContext ctx, GLenum pname);
|
||||
typedef GLboolean (APIENTRY * aglIsEnabledEXTPROC)(AGLContext ctx, GLenum pname);
|
||||
typedef GLboolean (APIENTRY * aglSetIntegerEXTPROC)(AGLContext ctx, GLenum pname, const GLint *params);
|
||||
typedef GLboolean (APIENTRY * aglGetIntegerEXTPROC)(AGLContext ctx, GLenum pname, GLint *params);
|
||||
typedef GLboolean (APIENTRY * aglUseFontEXTPROC)(AGLContext ctx, GLint fontID, Style face, GLint size, GLint first, GLint count, GLint base);
|
||||
typedef GLenum (APIENTRY * aglGetErrorEXTPROC)(void);
|
||||
typedef const GLubyte * (APIENTRY * aglErrorStringEXTPROC)(GLenum code);
|
||||
typedef void (APIENTRY * aglResetLibraryEXTPROC)(void);
|
||||
typedef void (APIENTRY * aglSurfaceTextureEXTPROC) (AGLContext context, GLenum target, GLenum internalformat, AGLContext surfacecontext);
|
||||
typedef AGLPixelFormat (APIENTRY * aglChoosePixelFormatPROC)(const AGLDevice *gdevs, GLint ndev, const GLint *attribs);
|
||||
typedef void (APIENTRY * aglDestroyPixelFormatPROC)(AGLPixelFormat pix);
|
||||
typedef AGLPixelFormat (APIENTRY * aglNextPixelFormatPROC)(AGLPixelFormat pix);
|
||||
typedef GLboolean (APIENTRY * aglDescribePixelFormatPROC)(AGLPixelFormat pix, GLint attrib, GLint *value);
|
||||
typedef AGLDevice * (APIENTRY * aglDevicesOfPixelFormatPROC)(AGLPixelFormat pix, GLint *ndevs);
|
||||
typedef AGLRendererInfo (APIENTRY * aglQueryRendererInfoPROC)(const AGLDevice *gdevs, GLint ndev);
|
||||
typedef void (APIENTRY * aglDestroyRendererInfoPROC)(AGLRendererInfo rend);
|
||||
typedef AGLRendererInfo (APIENTRY * aglNextRendererInfoPROC)(AGLRendererInfo rend);
|
||||
typedef GLboolean (APIENTRY * aglDescribeRendererPROC)(AGLRendererInfo rend, GLint prop, GLint *value);
|
||||
typedef AGLContext (APIENTRY * aglCreateContextPROC)(AGLPixelFormat pix, AGLContext share);
|
||||
typedef GLboolean (APIENTRY * aglDestroyContextPROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglCopyContextPROC)(AGLContext src, AGLContext dst, GLuint mask);
|
||||
typedef GLboolean (APIENTRY * aglUpdateContextPROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglSetCurrentContextPROC)(AGLContext ctx);
|
||||
typedef AGLContext (APIENTRY * aglGetCurrentContextPROC)(void);
|
||||
typedef GLboolean (APIENTRY * aglSetDrawablePROC)(AGLContext ctx, AGLDrawable draw);
|
||||
typedef GLboolean (APIENTRY * aglSetOffScreenPROC)(AGLContext ctx, GLsizei width, GLsizei height, GLsizei rowbytes, GLvoid *baseaddr);
|
||||
typedef GLboolean (APIENTRY * aglSetFullScreenPROC)(AGLContext ctx, GLsizei width, GLsizei height, GLsizei freq, GLint device);
|
||||
typedef AGLDrawable (APIENTRY * aglGetDrawablePROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglSetVirtualScreenPROC)(AGLContext ctx, GLint screen);
|
||||
typedef GLint (APIENTRY * aglGetVirtualScreenPROC)(AGLContext ctx);
|
||||
typedef void (APIENTRY * aglGetVersionPROC)(GLint *major, GLint *minor);
|
||||
typedef void (APIENTRY * aglSwapBuffersPROC)(AGLContext ctx);
|
||||
typedef GLboolean (APIENTRY * aglEnablePROC)(AGLContext ctx, GLenum pname);
|
||||
typedef GLboolean (APIENTRY * aglDisablePROC)(AGLContext ctx, GLenum pname);
|
||||
typedef GLboolean (APIENTRY * aglIsEnabledPROC)(AGLContext ctx, GLenum pname);
|
||||
typedef GLboolean (APIENTRY * aglSetIntegerPROC)(AGLContext ctx, GLenum pname, const GLint *params);
|
||||
typedef GLboolean (APIENTRY * aglGetIntegerPROC)(AGLContext ctx, GLenum pname, GLint *params);
|
||||
typedef GLboolean (APIENTRY * aglUseFontPROC)(AGLContext ctx, GLint fontID, Style face, GLint size, GLint first, GLint count, GLint base);
|
||||
typedef GLenum (APIENTRY * aglGetErrorPROC)(void);
|
||||
typedef const GLubyte * (APIENTRY * aglErrorStringPROC)(GLenum code);
|
||||
typedef void (APIENTRY * aglResetLibraryPROC)(void);
|
||||
typedef void (APIENTRY * aglSurfaceTexturePROC) (AGLContext context, GLenum target, GLenum internalformat, AGLContext surfacecontext);
|
||||
|
||||
extern aglChoosePixelFormatEXTPROC aglChoosePixelFormat;
|
||||
extern aglDestroyPixelFormatEXTPROC aglDestroyPixelFormat;
|
||||
extern aglNextPixelFormatEXTPROC aglNextPixelFormat;
|
||||
extern aglDescribePixelFormatEXTPROC aglDescribePixelFormat;
|
||||
extern aglDevicesOfPixelFormatEXTPROC aglDevicesOfPixelFormat;
|
||||
extern aglQueryRendererInfoEXTPROC aglQueryRendererInfo;
|
||||
extern aglDestroyRendererInfoEXTPROC aglDestroyRendererInfo;
|
||||
extern aglNextRendererInfoEXTPROC aglNextRendererInfo;
|
||||
extern aglDescribeRendererEXTPROC aglDescribeRenderer;
|
||||
extern aglCreateContextEXTPROC aglCreateContext;
|
||||
extern aglDestroyContextEXTPROC aglDestroyContext;
|
||||
extern aglCopyContextEXTPROC aglCopyContext;
|
||||
extern aglUpdateContextEXTPROC aglUpdateContext;
|
||||
extern aglSetCurrentContextEXTPROC aglSetCurrentContext;
|
||||
extern aglGetCurrentContextEXTPROC aglGetCurrentContext;
|
||||
extern aglSetDrawableEXTPROC aglSetDrawable;
|
||||
extern aglSetOffScreenEXTPROC aglSetOffScreen;
|
||||
extern aglSetFullScreenEXTPROC aglSetFullScreen;
|
||||
extern aglGetDrawableEXTPROC aglGetDrawable;
|
||||
extern aglSetVirtualScreenEXTPROC aglSetVirtualScreen;
|
||||
extern aglGetVirtualScreenEXTPROC aglGetVirtualScreen;
|
||||
extern aglGetVersionEXTPROC aglGetVersion;
|
||||
extern aglSwapBuffersEXTPROC aglSwapBuffers;
|
||||
extern aglEnableEXTPROC aglEnable;
|
||||
extern aglDisableEXTPROC aglDisable;
|
||||
extern aglIsEnabledEXTPROC aglIsEnabled;
|
||||
extern aglSetIntegerEXTPROC aglSetInteger;
|
||||
extern aglGetIntegerEXTPROC aglGetInteger;
|
||||
extern aglUseFontEXTPROC aglUseFont;
|
||||
extern aglGetErrorEXTPROC aglGetError;
|
||||
extern aglErrorStringEXTPROC aglErrorString;
|
||||
extern aglResetLibraryEXTPROC aglResetlibrary;
|
||||
extern aglSurfaceTextureEXTPROC aglSurfaceTexture;
|
||||
extern aglChoosePixelFormatPROC aglChoosePixelFormat;
|
||||
extern aglDestroyPixelFormatPROC aglDestroyPixelFormat;
|
||||
extern aglNextPixelFormatPROC aglNextPixelFormat;
|
||||
extern aglDescribePixelFormatPROC aglDescribePixelFormat;
|
||||
extern aglDevicesOfPixelFormatPROC aglDevicesOfPixelFormat;
|
||||
extern aglQueryRendererInfoPROC aglQueryRendererInfo;
|
||||
extern aglDestroyRendererInfoPROC aglDestroyRendererInfo;
|
||||
extern aglNextRendererInfoPROC aglNextRendererInfo;
|
||||
extern aglDescribeRendererPROC aglDescribeRenderer;
|
||||
extern aglCreateContextPROC aglCreateContext;
|
||||
extern aglDestroyContextPROC aglDestroyContext;
|
||||
extern aglCopyContextPROC aglCopyContext;
|
||||
extern aglUpdateContextPROC aglUpdateContext;
|
||||
extern aglSetCurrentContextPROC aglSetCurrentContext;
|
||||
extern aglGetCurrentContextPROC aglGetCurrentContext;
|
||||
extern aglSetDrawablePROC aglSetDrawable;
|
||||
extern aglSetOffScreenPROC aglSetOffScreen;
|
||||
extern aglSetFullScreenPROC aglSetFullScreen;
|
||||
extern aglGetDrawablePROC aglGetDrawable;
|
||||
extern aglSetVirtualScreenPROC aglSetVirtualScreen;
|
||||
extern aglGetVirtualScreenPROC aglGetVirtualScreen;
|
||||
extern aglGetVersionPROC aglGetVersion;
|
||||
extern aglSwapBuffersPROC aglSwapBuffers;
|
||||
extern aglEnablePROC aglEnable;
|
||||
extern aglDisablePROC aglDisable;
|
||||
extern aglIsEnabledPROC aglIsEnabled;
|
||||
extern aglSetIntegerPROC aglSetInteger;
|
||||
extern aglGetIntegerPROC aglGetInteger;
|
||||
extern aglUseFontPROC aglUseFont;
|
||||
extern aglGetErrorPROC aglGetError;
|
||||
extern aglErrorStringPROC aglErrorString;
|
||||
extern aglResetLibraryPROC aglResetLibrary;
|
||||
extern aglSurfaceTexturePROC aglSurfaceTexture;
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
|
@ -5425,6 +5425,9 @@ bool extgl_Open(void);
|
|||
#ifdef _X11
|
||||
bool extgl_InitGLX(JNIEnv *env, jobject ext_set, Display *disp, int screen);
|
||||
#endif
|
||||
#ifdef _AGL
|
||||
bool extgl_InitAGL(JNIEnv *env, jobject ext_set);
|
||||
#endif
|
||||
|
||||
void extgl_Close(void);
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include <Carbon/Carbon.h>
|
||||
#include <JavaVM/jni.h>
|
||||
#include "org_lwjgl_opengl_Window.h"
|
||||
#include "extgl.h"
|
||||
|
||||
static WindowRef win_ref;
|
||||
static bool close_requested;
|
||||
|
@ -56,24 +57,9 @@ static void throwException(JNIEnv * env, const char * err)
|
|||
env->DeleteLocalRef(cls);
|
||||
}
|
||||
|
||||
/*static void dumpRootMenu() {
|
||||
MenuRef root = AcquireRootMenu();
|
||||
if (root == NULL)
|
||||
printf("NULL menu\n");
|
||||
UInt16 count = CountMenuItems(root);
|
||||
printf("item count: %d\n", count);
|
||||
for (int i = 0; i < count; i++) {
|
||||
Str255 menu_text;
|
||||
GetMenuItemText(root, i, menu_text);
|
||||
printf("Item text: %s\n", menu_text);
|
||||
}
|
||||
ReleaseMenu(root);
|
||||
}
|
||||
*/
|
||||
static void setWindowTitle(JNIEnv *env, jstring title_obj) {
|
||||
const char* title = env->GetStringUTFChars(title_obj, NULL);
|
||||
int str_len = env->GetStringUTFLength(title_obj);
|
||||
CFStringRef cf_title = CFStringCreateWithBytes(NULL, (const UInt8*)title, str_len, kCFStringEncodingUTF8, false);
|
||||
CFStringRef cf_title = CFStringCreateWithCStringNoCopy(NULL, title, kCFStringEncodingUTF8, kCFAllocatorNull);
|
||||
if (cf_title == NULL) {
|
||||
#ifdef _DEBUG
|
||||
printf("Could not set window title\n");
|
||||
|
@ -81,18 +67,8 @@ static void setWindowTitle(JNIEnv *env, jstring title_obj) {
|
|||
return;
|
||||
}
|
||||
SetWindowTitleWithCFString(win_ref, cf_title);
|
||||
/* MenuRef root;
|
||||
OSStatus err = CreateNewMenu(1, 0, &root);
|
||||
assert(err == noErr);
|
||||
MenuItemIndex item_index;
|
||||
err = AppendMenuItemTextWithCFString(root, cf_title, 0, FOUR_CHAR_CODE('1234'), &item_index);
|
||||
assert(err == noErr);
|
||||
err = SetRootMenu(root);
|
||||
assert(err == noErr);
|
||||
ReleaseMenu(root);*/
|
||||
CFRelease(cf_title);
|
||||
env->ReleaseStringUTFChars(title_obj, title);
|
||||
// dumpRootMenu();
|
||||
}
|
||||
|
||||
static pascal OSStatus doQuit(EventHandlerCallRef next_handler, EventRef event, void *user_data) {
|
||||
|
@ -102,37 +78,47 @@ printf("Close requested\n");
|
|||
}
|
||||
|
||||
static void registerEventHandlers(JNIEnv *env) {
|
||||
/*EventTargetRef event_target = GetWindowEventTarget(win_ref);
|
||||
status = InstallStandardEventHandler(event_target);
|
||||
if (noErr != status) {
|
||||
DisposeWindow(win_ref);
|
||||
throwException(env, "Could not install default window event handler");
|
||||
return;
|
||||
}*/
|
||||
EventTypeSpec event_types[1];
|
||||
EventTypeSpec event_type;
|
||||
OSStatus err;
|
||||
EventHandlerUPP handler_upp = NewEventHandlerUPP(doQuit);
|
||||
event_types[0].eventClass = kEventClassWindow;
|
||||
event_types[0].eventKind = kEventWindowClose;
|
||||
err = InstallWindowEventHandler(win_ref, handler_upp, 1, event_types, NULL, NULL);
|
||||
event_type.eventClass = kEventClassWindow;
|
||||
event_type.eventKind = kEventWindowClose;
|
||||
err = InstallWindowEventHandler(win_ref, handler_upp, 1, &event_type, NULL, NULL);
|
||||
if (noErr != err) {
|
||||
DisposeEventHandlerUPP(handler_upp);
|
||||
throwException(env, "Could not register window event handler");
|
||||
return;
|
||||
}
|
||||
event_types[0].eventClass = kEventClassApplication;
|
||||
event_types[0].eventKind = kEventAppQuit;
|
||||
/*event_types[1].eventClass = kEventClassAppleEvent;
|
||||
event_types[1].eventKind = kEventAppleEvent;*/
|
||||
err = InstallApplicationEventHandler(handler_upp, 1, event_types, NULL, NULL);
|
||||
if (noErr != err) {
|
||||
DisposeEventHandlerUPP(handler_upp);
|
||||
throwException(env, "Could not register application event handler");
|
||||
return;
|
||||
}
|
||||
DisposeEventHandlerUPP(handler_upp);
|
||||
}
|
||||
|
||||
static void destroy(void) {
|
||||
DisposeWindow(win_ref);
|
||||
extgl_Close();
|
||||
}
|
||||
|
||||
static bool createContext(JNIEnv *env, jint bpp, jint alpha, jint depth, jint stencil) {
|
||||
SetPort(GetWindowPort(win_ref));
|
||||
GLint attrib[] = {AGL_RGBA,
|
||||
AGL_DOUBLEBUFFER,
|
||||
AGL_ACCELERATED,
|
||||
AGL_SINGLE_RENDERER,
|
||||
AGL_FULLSCREEN,
|
||||
AGL_MINIMUM_POLICY,
|
||||
AGL_PIXEL_SIZE, bpp,
|
||||
AGL_DEPTH_SIZE, depth,
|
||||
AGL_ALPHA_SIZE, alpha,
|
||||
AGL_STENCIL_SIZE, stencil,
|
||||
AGL_NONE};
|
||||
AGLPixelFormat format = aglChoosePixelFormat(NULL, 0, attrib);
|
||||
if (format == NULL) {
|
||||
throwException(env, "Could not find matching pixel format");
|
||||
return false;
|
||||
}
|
||||
printf("Found matching pixel format\n ");
|
||||
aglDestroyPixelFormat(format);
|
||||
return true;
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsCloseRequested(JNIEnv *, jclass) {
|
||||
const bool saved = close_requested;
|
||||
|
@ -140,50 +126,22 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsCloseRequested(JNIEnv
|
|||
return saved;
|
||||
}
|
||||
|
||||
/*OSErr aehandler(const AppleEvent * theAppleEvent, AppleEvent * reply, SInt32 handlerRefcon) {
|
||||
printf("handler called\n");
|
||||
return noErr;
|
||||
}
|
||||
*/
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate(JNIEnv *env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jobject ext_set) {
|
||||
Rect rect;
|
||||
OSStatus status;
|
||||
const WindowAttributes window_attr = kWindowCloseBoxAttribute|
|
||||
kWindowCollapseBoxAttribute|
|
||||
kWindowStandardHandlerAttribute;
|
||||
// CPSEnableForegroundOperation();
|
||||
/*//AEObjectInit();
|
||||
AEEventHandlerUPP handler = NewAEEventHandlerUPP(aehandler);
|
||||
if (noErr != AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, handler, 0, FALSE))
|
||||
printf("error\n");
|
||||
if (noErr != AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, handler, 0, FALSE))
|
||||
printf("error\n");
|
||||
if (noErr != AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, handler, 0, FALSE))
|
||||
printf("error\n");
|
||||
if (noErr != AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, handler, 0, FALSE))
|
||||
printf("error\n");
|
||||
DisposeAEEventHandlerUPP(handler);*/
|
||||
/*
|
||||
* Hacks to activate the application window
|
||||
*/
|
||||
/*CFBundleRef bundle = CFBundleGetMainBundle();
|
||||
if (bundle != NULL) {
|
||||
printf("bundle != NULL\n");
|
||||
CFRelease(bundle);
|
||||
}*/
|
||||
/*ProcessSerialNumber PSN;
|
||||
GetCurrentProcess(&PSN);
|
||||
SetFrontProcess(&PSN);*/
|
||||
EventLoopRef queue = GetCurrentEventLoop();
|
||||
EventLoopRef main = GetMainEventLoop();
|
||||
QuitEventLoop(queue);
|
||||
QuitEventLoop(main);
|
||||
/*if (queue == main)
|
||||
printf("equals\n");*/
|
||||
SetRect(&rect, x, y, x + width, y + height);
|
||||
close_requested = false;
|
||||
|
||||
if (!extgl_Open()) {
|
||||
throwException(env, "Could not load gl library");
|
||||
return;
|
||||
}
|
||||
if (!extgl_InitAGL(env, ext_set)) {
|
||||
throwException(env, "Could not load agl function pointers");
|
||||
return;
|
||||
}
|
||||
status = CreateNewWindow(kDocumentWindowClass, window_attr, &rect, &win_ref);
|
||||
if (noErr != status) {
|
||||
throwException(env, "Could not create window");
|
||||
|
@ -193,43 +151,27 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate(JNIEnv *env, jclass
|
|||
setWindowTitle(env, title);
|
||||
const RGBColor background_color = { 0, 0, 0 };
|
||||
SetWindowContentColor(win_ref, &background_color);
|
||||
status = TransitionWindow(win_ref, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL);
|
||||
if (noErr != status) {
|
||||
if (!createContext(env, bpp, alpha, depth, stencil)) {
|
||||
DisposeWindow(win_ref);
|
||||
throwException(env, "Could not show window");
|
||||
extgl_Close();
|
||||
return;
|
||||
}
|
||||
if (!extgl_Initialize(env, ext_set)) {
|
||||
destroy();
|
||||
throwException(env, "Could not load gl function pointers");
|
||||
return;
|
||||
}
|
||||
TransitionWindow(win_ref, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL);
|
||||
SelectWindow(win_ref);
|
||||
InitCursor();
|
||||
//QuitApplicationEventLoop();
|
||||
//RunApplicationEventLoop();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_update
|
||||
(JNIEnv *env, jclass clazz)
|
||||
{
|
||||
/*EventRef event;
|
||||
OSStatus err;
|
||||
int num_events = GetNumEventsInQueue(GetCurrentEventQueue());
|
||||
for (int i = 0; i < num_events; i++) {
|
||||
UInt32 class_type = GetEventClass(event);
|
||||
UInt32 kind = GetEventKind(event);
|
||||
UInt32 test = FOUR_CHAR_CODE('eppc');
|
||||
EventTime event_time = GetEventTime(event);
|
||||
//UInt32 test = FOUR_CHAR_CODE('appl');
|
||||
printf("recieved event: %x %x %x at %f\n", class_type, kind, test, event_time);
|
||||
err = ReceiveNextEvent(0, NULL, 0, true, &event);
|
||||
/* if (kind == kEventClassAppleEvent)
|
||||
AEProcessAppleEvent(event);*/
|
||||
/* ReleaseEvent(event);
|
||||
}
|
||||
//RunCurrentEventLoop(0);
|
||||
/* if (eventLoopTimedOutErr != RunCurrentEventLoop(0))
|
||||
printf("Could not run current event loop\n");*/
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nDestroy
|
||||
(JNIEnv *env, jclass clazz)
|
||||
{
|
||||
DisposeWindow(win_ref);
|
||||
destroy();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue