Various Mac stuff

This commit is contained in:
Elias Naur 2003-09-29 09:26:20 +00:00
parent 26ca56212c
commit 4111a08857
4 changed files with 245 additions and 191 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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();
}