From 008c59a301c46b9fd32908bfd0d9735b59573830 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 15 Jul 2006 19:25:13 +0000 Subject: [PATCH] Windows: Move more of Display.getVersion to java --- src/java/org/lwjgl/Sys.java | 2 +- src/java/org/lwjgl/opengl/WindowsDisplay.java | 9 ++-- .../org/lwjgl/opengl/WindowsFileVersion.java | 54 +++++++++++++++++++ src/native/windows/display.c | 31 ++++++----- src/native/windows/display.h | 2 +- src/native/windows/org_lwjgl_opengl_Display.c | 2 +- 6 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 src/java/org/lwjgl/opengl/WindowsFileVersion.java diff --git a/src/java/org/lwjgl/Sys.java b/src/java/org/lwjgl/Sys.java index ab4e7084..3744a0b7 100644 --- a/src/java/org/lwjgl/Sys.java +++ b/src/java/org/lwjgl/Sys.java @@ -57,7 +57,7 @@ public final class Sys { private static final String VERSION = "1.0beta2"; /** Current version of the JNI library */ - static final int JNI_VERSION = 1; + static final int JNI_VERSION = 2; /** The implementation instance to delegate platform specific behavior to */ private final static SysImplementation implementation; diff --git a/src/java/org/lwjgl/opengl/WindowsDisplay.java b/src/java/org/lwjgl/opengl/WindowsDisplay.java index 4788dd50..6d8a0395 100644 --- a/src/java/org/lwjgl/opengl/WindowsDisplay.java +++ b/src/java/org/lwjgl/opengl/WindowsDisplay.java @@ -248,12 +248,13 @@ final class WindowsDisplay implements DisplayImplementation { public String getVersion() { String driver = getAdapter(); - if (driver != null) - return nGetVersion(driver); - else + if (driver != null) { + WindowsFileVersion version = nGetVersion(driver + ".dll"); + return version.toString(); + } else return null; } - private native String nGetVersion(String driver); + private native WindowsFileVersion nGetVersion(String driver); public DisplayMode init() throws LWJGLException { current_gamma = saved_gamma = getCurrentGammaRamp(); diff --git a/src/java/org/lwjgl/opengl/WindowsFileVersion.java b/src/java/org/lwjgl/opengl/WindowsFileVersion.java new file mode 100644 index 00000000..6aa96062 --- /dev/null +++ b/src/java/org/lwjgl/opengl/WindowsFileVersion.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2004 LWJGL 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 'LWJGL' 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. + */ +package org.lwjgl.opengl; + +/** + * @author elias_naur + */ + +final class WindowsFileVersion { + private final int product_version_ms; + private final int product_version_ls; + + public WindowsFileVersion(int product_version_ms, int product_version_ls) { + this.product_version_ms = product_version_ms; + this.product_version_ls = product_version_ls; + } + + public String toString() { + int f1 = (product_version_ms >> 16) & 0xFFFF; + int f2 = product_version_ms & 0xFFFF; + int f3 = (product_version_ls >> 16) & 0xFFFF; + int f4 = product_version_ls & 0xFFFF; + return f1 + "." + f2 + "." + f3 + "." + f4; + } +} diff --git a/src/native/windows/display.c b/src/native/windows/display.c index de8257e4..75a8855f 100644 --- a/src/native/windows/display.c +++ b/src/native/windows/display.c @@ -241,16 +241,22 @@ void resetDisplayMode(JNIEnv * env) { ChangeDisplaySettings(NULL, 0); } -jstring getVersion(JNIEnv * env, char *driver) +jobject getVersion(JNIEnv * env, char *driver) { -#define BUFFER_SIZE 1024 - jstring ret = NULL; - - const char *dll_ext = ".dll"; DWORD var = 0; DWORD dwInfoSize; LPVOID lpInfoBuff; BOOL bRetval; + jclass version_class; + jmethodID version_cons; + jobject ret = NULL; + + version_class = (*env)->FindClass(env, "org/lwjgl/opengl/WindowsFileVersion"); + if (version_class == NULL) + return NULL; + version_cons = (*env)->GetMethodID(env, version_class, "", "(II)V"); + if (version_cons == NULL) + return NULL; dwInfoSize = GetFileVersionInfoSize(driver, &var); lpInfoBuff = malloc(dwInfoSize); @@ -259,20 +265,13 @@ jstring getVersion(JNIEnv * env, char *driver) return NULL; } bRetval = GetFileVersionInfo(driver, 0, dwInfoSize, lpInfoBuff); - if (bRetval == 0) { - } else { + if (bRetval != 0) { VS_FIXEDFILEINFO * fxdFileInfo; UINT uiLen = 0; - bRetval = VerQueryValue(lpInfoBuff, TEXT("\\"), (void *)&fxdFileInfo, &uiLen); - if (bRetval != 0) { - TCHAR version[BUFFER_SIZE]; - TCHAR ms[BUFFER_SIZE], ls[BUFFER_SIZE]; - _snprintf_s(ms, BUFFER_SIZE, _TRUNCATE, "%d.%d\0", fxdFileInfo->dwProductVersionMS >> 16, fxdFileInfo->dwProductVersionMS & 0xFFFF); - _snprintf_s(ls, BUFFER_SIZE, _TRUNCATE, "%d.%d\0", fxdFileInfo->dwProductVersionLS >> 16, fxdFileInfo->dwProductVersionLS & 0xFFFF); - _snprintf_s(version, BUFFER_SIZE, _TRUNCATE, "%s.%s\0", ms, ls); - ret = NewStringNative(env, version); - } + bRetval = VerQueryValue(lpInfoBuff, TEXT("\\"), &fxdFileInfo, &uiLen); + if (bRetval != 0) + ret = (*env)->NewObject(env, version_class, version_cons, fxdFileInfo->dwProductVersionMS, fxdFileInfo->dwProductVersionLS); } free(lpInfoBuff); diff --git a/src/native/windows/display.h b/src/native/windows/display.h index 8cfae7ee..a7478cdb 100644 --- a/src/native/windows/display.h +++ b/src/native/windows/display.h @@ -51,7 +51,7 @@ extern void restoreDisplayMode(void); extern void setGammaRamp(JNIEnv * env, jobject gammaRampBuffer); extern jobject getCurrentGammaRamp(JNIEnv *env); extern jobject getCurrentDisplayMode(JNIEnv * env); -extern jstring getVersion(JNIEnv * env, char *driver); +extern jobject getVersion(JNIEnv * env, char *driver); extern jobject convertToNativeRamp(JNIEnv *env, jobject float_gamma_obj); #endif diff --git a/src/native/windows/org_lwjgl_opengl_Display.c b/src/native/windows/org_lwjgl_opengl_Display.c index fb05900b..3fad26cf 100644 --- a/src/native/windows/org_lwjgl_opengl_Display.c +++ b/src/native/windows/org_lwjgl_opengl_Display.c @@ -275,7 +275,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_setFocus(JNIEnv *env SetFocus(hwnd); } -JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nGetVersion(JNIEnv *env, jobject self, jstring driver) { +JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nGetVersion(JNIEnv *env, jobject self, jstring driver) { char *driver_str; jstring result; driver_str = GetStringNativeChars(env, driver);