diff --git a/src/native/macosx/Makefile.am b/src/native/macosx/Makefile.am index 425a7ab8..7b3d0464 100644 --- a/src/native/macosx/Makefile.am +++ b/src/native/macosx/Makefile.am @@ -7,7 +7,7 @@ NATIVE = \ org_lwjgl_Display.cpp \ org_lwjgl_Sys.cpp \ # org_lwjgl_input_Controller.cpp \ -# org_lwjgl_input_Keyboard.cpp \ + org_lwjgl_input_Keyboard.cpp \ # org_lwjgl_input_Mouse.cpp \ # org_lwjgl_input_Cursor.cpp \ org_lwjgl_opengl_Window.cpp diff --git a/src/native/macosx/org_lwjgl_input_Keyboard.cpp b/src/native/macosx/org_lwjgl_input_Keyboard.cpp index 673a0e49..86d3c6db 100644 --- a/src/native/macosx/org_lwjgl_input_Keyboard.cpp +++ b/src/native/macosx/org_lwjgl_input_Keyboard.cpp @@ -39,6 +39,11 @@ * @version $Revision$ */ +#include +#include +#include +#include +#include "tools.h" #include "org_lwjgl_input_Keyboard.h" #define KEYBOARD_BUFFER_SIZE 50 @@ -55,6 +60,36 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_initIDs { } +static void printCFString(CFStringRef str) { + CFIndex buffer_size = CFStringGetLength(str) + 1; + char * buffer = (char *)malloc(buffer_size); + if (buffer != NULL) { + if (CFStringGetCString(str, buffer, buffer_size, CFStringGetSystemEncoding())) + printf("%s", buffer); + free(buffer); + } +} + +static void printCFNumber(CFNumberRef num) { + long number; + + if (CFNumberGetValue(num, kCFNumberLongType, &number)) + printf("0x%lx (%ld)", number, number); +} + +static void printProperty(CFDictionaryRef dict, CFStringRef key) { + CFTypeRef val = CFDictionaryGetValue(dict, key); + if (val != NULL) { + CFTypeID type = CFGetTypeID(val); + if (type == CFArrayGetTypeID()) printf("array\n"); + else if (type == CFBooleanGetTypeID()) printf("boolean\n"); + else if (type == CFDictionaryGetTypeID()) printf("dictionary\n"); + else if (type == CFNumberGetTypeID()) printCFNumber((CFNumberRef)val); + else if (type == CFStringGetTypeID()) printCFString((CFStringRef)val); + else printf("\n"); + } +} + /* * Class: org_lwjgl_input_Keyboard * Method: nCreate @@ -63,6 +98,31 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_initIDs JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nCreate (JNIEnv * env, jclass clazz) { + io_iterator_t device_iterator; + io_object_t hid_device; + kern_return_t kern_err; + CFMutableDictionaryRef dev_props; + CFMutableDictionaryRef matching_dic = IOServiceMatching(kIOHIDDeviceKey); + IOReturn err = IOServiceGetMatchingServices(kIOMasterPortDefault, matching_dic, &device_iterator); + if (err != kIOReturnSuccess) { + throwException(env, "Could not find matching devices"); + return; + } + while ((hid_device = IOIteratorNext(device_iterator)) != NULL) { + kern_err = IORegistryEntryCreateCFProperties(hid_device, &dev_props, kCFAllocatorDefault, kNilOptions); + IOObjectRelease(hid_device); + if (kern_err == KERN_SUCCESS && dev_props != NULL) { + printf("Device found: "); + printProperty(dev_props, CFSTR(kIOHIDProductKey)); + printf(" usage "); + printProperty(dev_props, CFSTR(kIOHIDPrimaryUsageKey)); + printf(" usage page "); + printProperty(dev_props, CFSTR(kIOHIDPrimaryUsagePageKey)); + printf("\n"); + CFRelease(dev_props); + } + } + IOObjectRelease(device_iterator); } /* @@ -90,16 +150,17 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll * Method: nRead * Signature: (I)V */ -JNIEXPORT int JNICALL Java_org_lwjgl_input_Keyboard_nRead +JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead (JNIEnv * env, jclass clazz) { +} /* * Class: org_lwjgl_input_Keyboard * Method: nEnableTranslation * Signature: ()I */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation +JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation (JNIEnv *env, jclass clazz) { } diff --git a/src/native/macosx/org_lwjgl_opengl_BaseGL.cpp b/src/native/macosx/org_lwjgl_opengl_BaseGL.cpp deleted file mode 100644 index 90d55c9e..00000000 --- a/src/native/macosx/org_lwjgl_opengl_BaseGL.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) 2002 Light Weight Java Game Library Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'Light Weight Java Game Library' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * $Id$ - * - * Base OSX functionality for GL. - * - * @author Gregory Pierce - * @version $Revision$ - */ - -#include "extgl.h" -#include "org_lwjgl_opengl_BaseGL.h" -#include -#include - - -static CGLContextObj contextObj; -static CGDirectDisplayID displayID = kCGDirectMainDisplay; - -/* - * Utility function to throw an Exception - */ -void throwException(JNIEnv * env, const char * err) -{ - jclass cls = env->FindClass("java/lang/Exception"); - env->ThrowNew(cls, err); - env->DeleteLocalRef(cls); -} - -/* - * Class: org_lwjgl_opengl_BaseGL - * Method: nCreate - * Signature: (Ljava/lang/String;IIIIIIIIZ)V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nCreate -(JNIEnv * env, jobject obj, jstring title, jint x, jint y, jint width, jint height, jint bpp, jint alpha, jint depth, jint stencil, jboolean fullscreen) -{ - CGLPixelFormatObj pixelFormatObj; - long numPixelFormats; - CFDictionaryRef displayMode; - - if( extgl_Open() != 0 ) - { - throwException( env, "Could not load gl libs" ); - return; - } - displayMode = CGDisplayBestModeForParametersAndRefreshRate( displayID, - bpp, - width, height, - 60, - NULL ); - - CGDisplaySwitchToMode( displayID, displayMode ); - - CGOpenGLDisplayMask displayMask = CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ) ; - CGLPixelFormatAttribute attribs[] = - { - kCGLPFAFullScreen, - kCGLPFADoubleBuffer, - kCGLPFADisplayMask, - displayMask, - NULL - } ; - long swapInterval; - - CGLChoosePixelFormat( attribs, &pixelFormatObj, &numPixelFormats ); - if ( pixelFormatObj != NULL ) - { - CGLCreateContext( pixelFormatObj, NULL, &contextObj ); - CGLDestroyPixelFormat( pixelFormatObj ); - - swapInterval = 1; - CGLSetParameter( contextObj, kCGLCPSwapInterval, &swapInterval ); - CGLSetCurrentContext( contextObj ); - CGLSetFullScreen( contextObj ); - if (extgl_Initialize() != 0) - { - // TODO: destroy stuff created this far - throwException( env, "Could not init gl function pointers\n"); - CGLSetCurrentContext( NULL ); - CGLClearDrawable( contextObj ); - CGLDestroyContext( contextObj ); - contextObj = NULL; - return; - } - } - else - { - throwException( env, "Failed to choose pixel format\n"); - } -} - -/* - * Class: org_lwjgl_opengl_BaseGL - * Method: nDestroyGL - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_nDestroyGL -(JNIEnv * env, jobject obj) -{ - if ( contextObj != NULL ) - { - CGLSetCurrentContext( NULL ); - CGLClearDrawable( contextObj ); - CGLDestroyContext( contextObj ); - - contextObj = NULL; - } -} - -/* - * Class: org_lwjgl_opengl_BaseGL - * Method: swapBuffers - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_BaseGL_swapBuffers -(JNIEnv *, jobject) -{ - CGLFlushDrawable( contextObj ); -} - - - diff --git a/src/native/macosx/org_lwjgl_opengl_Window.cpp b/src/native/macosx/org_lwjgl_opengl_Window.cpp index 2b1b5f7e..88f1d4ae 100644 --- a/src/native/macosx/org_lwjgl_opengl_Window.cpp +++ b/src/native/macosx/org_lwjgl_opengl_Window.cpp @@ -40,24 +40,14 @@ */ #include -#include #include "org_lwjgl_opengl_Window.h" #include "extgl.h" +#include "tools.h" static WindowRef win_ref; static AGLContext context; static bool close_requested; -/* - * Utility function to throw an Exception - */ -static void throwException(JNIEnv * env, const char * err) -{ - jclass cls = env->FindClass("java/lang/Exception"); - env->ThrowNew(cls, err); - env->DeleteLocalRef(cls); -} - static void setWindowTitle(JNIEnv *env, jstring title_obj) { const char* title = env->GetStringUTFChars(title_obj, NULL); CFStringRef cf_title = CFStringCreateWithCString(NULL, title, kCFStringEncodingUTF8); @@ -184,7 +174,6 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate(JNIEnv *env, jclass JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_update (JNIEnv *env, jclass clazz) { - RunApplicationEventLoop(); } JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_swapBuffers(JNIEnv * env, jclass clazz) diff --git a/src/native/macosx/tools.cpp b/src/native/macosx/tools.cpp new file mode 100644 index 00000000..0b0ba376 --- /dev/null +++ b/src/native/macosx/tools.cpp @@ -0,0 +1,7 @@ +#include "tools.h" + +void throwException(JNIEnv* env, const char* msg) { + jclass cls = env->FindClass("java/lang/Exception"); + env->ThrowNew(cls, err); + env->DeleteLocalRef(cls); +} diff --git a/src/native/macosx/tools.h b/src/native/macosx/tools.h new file mode 100644 index 00000000..06577fc4 --- /dev/null +++ b/src/native/macosx/tools.h @@ -0,0 +1,8 @@ +#ifndef TOOLS_H +#define TOOLS_H + +#include + +void throwException(JNIEnv* env, const char* msg); + +#endif