From b7407c39c0d3785f2fc21782d31c439622f0d744 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Mon, 27 Feb 2012 18:20:37 +0100 Subject: NativeWindow: Relax Xinerama dependency / Rename Windows impl subfolder to common name win32 (same as stub_include) Utilizing dlopen/dlsym in an efficient way relaxes the platform requirement of having Xinerama available. This allows using Nokia N9 MeeGo out of the box. --- .../media/nativewindow/x11/X11GraphicsScreen.java | 3 +- .../classes/jogamp/nativewindow/x11/X11Util.java | 32 +++ src/nativewindow/native/win32/GDImisc.c | 226 +++++++++++++++++++++ src/nativewindow/native/win32/WindowsDWM.c | 95 +++++++++ src/nativewindow/native/win32/WindowsDWM.h | 32 +++ src/nativewindow/native/windows/GDImisc.c | 226 --------------------- src/nativewindow/native/windows/WindowsDWM.c | 95 --------- src/nativewindow/native/windows/WindowsDWM.h | 32 --- src/nativewindow/native/x11/XineramaHelper.c | 202 ++++++++++-------- src/nativewindow/native/x11/XineramaHelper.h | 40 ++++ src/nativewindow/native/x11/Xmisc.c | 3 - .../classes/jogamp/newt/driver/x11/X11Screen.java | 2 +- 12 files changed, 543 insertions(+), 445 deletions(-) create mode 100644 src/nativewindow/native/win32/GDImisc.c create mode 100644 src/nativewindow/native/win32/WindowsDWM.c create mode 100644 src/nativewindow/native/win32/WindowsDWM.h delete mode 100644 src/nativewindow/native/windows/GDImisc.c delete mode 100644 src/nativewindow/native/windows/WindowsDWM.c delete mode 100644 src/nativewindow/native/windows/WindowsDWM.h create mode 100644 src/nativewindow/native/x11/XineramaHelper.h (limited to 'src') diff --git a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java index 6473b9f67..ed59861ca 100644 --- a/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java +++ b/src/nativewindow/classes/javax/media/nativewindow/x11/X11GraphicsScreen.java @@ -65,8 +65,7 @@ public class X11GraphicsScreen extends DefaultGraphicsScreen implements Cloneabl private static int fetchScreen(X11GraphicsDevice device, int screen) { // It still could be an AWT hold handle .. - long display = device.getHandle(); - if(X11Lib.XineramaEnabled(display)) { + if(X11Util.XineramaIsEnabled(device.getHandle())) { screen = 0; // Xinerama -> 1 screen } return screen; diff --git a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java index 7e5155771..4cbc1e367 100644 --- a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java +++ b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java @@ -485,6 +485,38 @@ public class X11Util { } } + static volatile boolean XineramaFetched = false; + static long XineramaLibHandle = 0; + static long XineramaQueryFunc = 0; + + public static boolean XineramaIsEnabled(long display) { + if(0==display) { + throw new IllegalArgumentException("Display NULL"); + } + if(!XineramaFetched) { // volatile: ok + synchronized(X11Util.class) { + if( !XineramaFetched ) { + XineramaLibHandle = X11Lib.XineramaGetLibHandle(); + if(0 != XineramaLibHandle) { + XineramaQueryFunc = X11Lib.XineramaGetQueryFunc(XineramaLibHandle); + } + XineramaFetched = true; + } + } + } + if(0!=XineramaQueryFunc) { + final boolean res = X11Lib.XineramaIsEnabled(XineramaQueryFunc, display); + if(DEBUG) { + System.err.println("XineramaIsEnabled: "+res); + } + return res; + } else if(DEBUG) { + System.err.println("XineramaIsEnabled: Couldn't bind to Xinerama - lib 0x"+Long.toHexString(XineramaLibHandle)+ + "query 0x"+Long.toHexString(XineramaQueryFunc)); + } + return false; + } + private static native boolean initialize0(boolean firstUIActionOnProcess); private static native void shutdown0(); private static native void setX11ErrorHandler0(boolean onoff, boolean quiet); diff --git a/src/nativewindow/native/win32/GDImisc.c b/src/nativewindow/native/win32/GDImisc.c new file mode 100644 index 000000000..3ab7f9859 --- /dev/null +++ b/src/nativewindow/native/win32/GDImisc.c @@ -0,0 +1,226 @@ +#include +#include +#include + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +#include + +#include + +#include "NativewindowCommon.h" +#include "jogamp_nativewindow_windows_GDIUtil.h" + +// #define VERBOSE_ON 1 + +#ifdef VERBOSE_ON + #define DBG_PRINT(args...) fprintf(stderr, args); +#else + #define DBG_PRINT(args...) +#endif + +static const char * const ClazzNamePoint = "javax/media/nativewindow/util/Point"; +static const char * const ClazzAnyCstrName = ""; +static const char * const ClazzNamePointCstrSignature = "(II)V"; + +static jclass pointClz = NULL; +static jmethodID pointCstr = NULL; + +HINSTANCE GetApplicationHandle() { + return GetModuleHandle(NULL); +} + +/* Java->C glue code: + * Java package: jogamp.nativewindow.windows.GDIUtil + * Java method: boolean CreateWindowClass(long hInstance, java.lang.String clazzName, long wndProc) + * C function: BOOL CreateWindowClass(HANDLE hInstance, LPCSTR clazzName, HANDLE wndProc); + */ +JNIEXPORT jboolean JNICALL +Java_jogamp_nativewindow_windows_GDIUtil_CreateWindowClass + (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName, jlong wndProc) +{ + HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance; + const TCHAR* clazzName = NULL; + WNDCLASS wc; + jboolean res; + +#ifdef UNICODE + clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName); +#else + clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL); +#endif + + ZeroMemory( &wc, sizeof( wc ) ); + if( GetClassInfo( hInstance, clazzName, &wc ) ) { + // registered already + res = JNI_TRUE; + } else { + // register now + ZeroMemory( &wc, sizeof( wc ) ); + wc.style = CS_HREDRAW | CS_VREDRAW ; + wc.lpfnWndProc = (WNDPROC) (intptr_t) wndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = NULL; + wc.hCursor = LoadCursor( NULL, IDC_ARROW); + wc.hbrBackground = NULL; // no background paint - GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName = clazzName; + res = ( 0 != RegisterClass( &wc ) ) ? JNI_TRUE : JNI_FALSE ; + } + +#ifdef UNICODE + free((void*) clazzName); +#else + (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName); +#endif + + return res; +} + +/* Java->C glue code: + * Java package: jogamp.nativewindow.windows.GDIUtil + * Java method: boolean DestroyWindowClass(long hInstance, java.lang.String className) + * C function: BOOL DestroyWindowClass(HANDLE hInstance, LPCSTR className); + */ +JNIEXPORT jboolean JNICALL +Java_jogamp_nativewindow_windows_GDIUtil_DestroyWindowClass + (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName) +{ + HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance; + const TCHAR* clazzName = NULL; + jboolean res; + +#ifdef UNICODE + clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName); +#else + clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL); +#endif + + res = ( 0 != UnregisterClass( clazzName, hInstance ) ) ? JNI_TRUE : JNI_FALSE ; + +#ifdef UNICODE + free((void*) clazzName); +#else + (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName); +#endif + + return res; +} + + +/* Java->C glue code: + * Java package: jogamp.nativewindow.windows.GDIUtil + * Java method: long CreateDummyWindow0(long hInstance, java.lang.String className, java.lang.String windowName, int x, int y, int width, int height) + * C function: HANDLE CreateDummyWindow0(HANDLE hInstance, LPCSTR className, LPCSTR windowName, int x, int y, int width, int height); + */ +JNIEXPORT jlong JNICALL +Java_jogamp_nativewindow_windows_GDIUtil_CreateDummyWindow0 + (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jWndClassName, jstring jWndName, jint x, jint y, jint width, jint height) +{ + HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance; + const TCHAR* wndClassName = NULL; + const TCHAR* wndName = NULL; + DWORD dwExStyle; + DWORD dwStyle; + HWND hWnd; + +#ifdef UNICODE + wndClassName = NewtCommon_GetNullTerminatedStringChars(env, jWndClassName); + wndName = NewtCommon_GetNullTerminatedStringChars(env, jWndName); +#else + wndClassName = (*env)->GetStringUTFChars(env, jWndClassName, NULL); + wndName = (*env)->GetStringUTFChars(env, jWndName, NULL); +#endif + + dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + dwStyle = WS_OVERLAPPEDWINDOW; + + hWnd = CreateWindowEx( dwExStyle, + wndClassName, + wndName, + dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, + x, y, width, height, + NULL, NULL, hInstance, NULL ); + +#ifdef UNICODE + free((void*) wndClassName); + free((void*) wndName); +#else + (*env)->ReleaseStringUTFChars(env, jWndClassName, wndClassName); + (*env)->ReleaseStringUTFChars(env, jWndName, wndName); +#endif + + return (jlong) (intptr_t) hWnd; +} + + +/* + * Class: jogamp_nativewindow_windows_GDIUtil + * Method: initIDs0 + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_jogamp_nativewindow_windows_GDIUtil_initIDs0 + (JNIEnv *env, jclass clazz) +{ + if(NativewindowCommon_init(env)) { + jclass c = (*env)->FindClass(env, ClazzNamePoint); + if(NULL==c) { + NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't find %s", ClazzNamePoint); + } + pointClz = (jclass)(*env)->NewGlobalRef(env, c); + (*env)->DeleteLocalRef(env, c); + if(NULL==pointClz) { + NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't use %s", ClazzNamePoint); + } + pointCstr = (*env)->GetMethodID(env, pointClz, ClazzAnyCstrName, ClazzNamePointCstrSignature); + if(NULL==pointCstr) { + NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't fetch %s.%s %s", + ClazzNamePoint, ClazzAnyCstrName, ClazzNamePointCstrSignature); + } + } + return JNI_TRUE; +} + +LRESULT CALLBACK DummyWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + return DefWindowProc(hWnd,uMsg,wParam,lParam); +} + +/* + * Class: jogamp_nativewindow_windows_GDIUtil + * Method: getDummyWndProc0 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_windows_GDIUtil_getDummyWndProc0 + (JNIEnv *env, jclass clazz) +{ + return (jlong) (intptr_t) DummyWndProc; +} + +/* + * Class: jogamp_nativewindow_windows_GDIUtil + * Method: GetRelativeLocation0 + * Signature: (JJII)Ljavax/media/nativewindow/util/Point; + */ +JNIEXPORT jobject JNICALL Java_jogamp_nativewindow_windows_GDIUtil_GetRelativeLocation0 + (JNIEnv *env, jclass unused, jlong jsrc_win, jlong jdest_win, jint src_x, jint src_y) +{ + HWND src_win = (HWND) (intptr_t) jsrc_win; + HWND dest_win = (HWND) (intptr_t) jdest_win; + POINT dest = { src_x, src_y } ; + int res; + + res = MapWindowPoints(src_win, dest_win, &dest, 1); + + DBG_PRINT("*** WindowsWindow: getRelativeLocation0: %p %d/%d -> %p %d/%d - ok: %d\n", + (void*)src_win, src_x, src_y, (void*)dest_win, (int)dest.x, (int)dest.y, res); + + return (*env)->NewObject(env, pointClz, pointCstr, (jint)dest.x, (jint)dest.y); +} + diff --git a/src/nativewindow/native/win32/WindowsDWM.c b/src/nativewindow/native/win32/WindowsDWM.c new file mode 100644 index 000000000..cc9ed6d8c --- /dev/null +++ b/src/nativewindow/native/win32/WindowsDWM.c @@ -0,0 +1,95 @@ + +#include "WindowsDWM.h" + +#include +#include + +// #define VERBOSE_ON 1 + +#ifdef VERBOSE_ON + #define DBG_PRINT(args...) fprintf(stderr, args); +#else + #define DBG_PRINT(args...) +#endif + +/* GetProcAddress doesn't exist in A/W variants under desktop Windows */ +#ifndef UNDER_CE +#define GetProcAddressA GetProcAddress +#endif + +typedef HRESULT (WINAPI *DwmEnableCompositionPROCADDR)(UINT uCompositionAction); +typedef HRESULT (WINAPI *DwmIsCompositionEnabledPROCADDR)(BOOL * pfEnabled); +typedef HRESULT (WINAPI *DwmEnableBlurBehindWindowPROCADDR)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind); +typedef HRESULT (WINAPI *DwmExtendFrameIntoClientAreaPROCADDR)(HWND hwnd, const MARGINS *pMarInset); + +static int _init = 0; // 1: init, 2: has DWM extension +static DwmEnableCompositionPROCADDR _DwmEnableComposition = NULL; +static DwmIsCompositionEnabledPROCADDR _DwmIsCompositionEnabled = NULL; +static DwmEnableBlurBehindWindowPROCADDR _DwmEnableBlurBehindWindow = NULL; +static DwmExtendFrameIntoClientAreaPROCADDR _DwmExtendFrameIntoClientArea = NULL; + +static int initWindowsDWM() { + if(0 == _init) { + _init = 1; + HANDLE shell = LoadLibrary(TEXT("dwmapi.dll")); + if (shell) { + _DwmEnableComposition = (DwmEnableCompositionPROCADDR) GetProcAddressA (shell, "DwmEnableComposition"); + _DwmIsCompositionEnabled = (DwmIsCompositionEnabledPROCADDR) GetProcAddressA (shell, "DwmIsCompositionEnabled"); + _DwmEnableBlurBehindWindow = (DwmEnableBlurBehindWindowPROCADDR) GetProcAddressA (shell, "DwmEnableBlurBehindWindow"); + _DwmExtendFrameIntoClientArea = (DwmExtendFrameIntoClientAreaPROCADDR) GetProcAddressA (shell, "DwmExtendFrameIntoClientArea"); + if(NULL != _DwmEnableComposition && NULL != _DwmIsCompositionEnabled && + NULL != _DwmEnableBlurBehindWindow && NULL != _DwmExtendFrameIntoClientArea) { + _init = 2; + } + } + // FreeLibrary (shell); + DBG_PRINT("DWM - initWindowsDWM: %d - s %p, e %p, c %p\n", _init, shell, _DwmEnableBlurBehindWindow, _DwmExtendFrameIntoClientArea); + } + return _init; +} + +BOOL DwmIsExtensionAvailable() { + return (2 == initWindowsDWM()) ? TRUE : FALSE; +} + +BOOL DwmIsCompositionEnabled( ) { + if(2 == initWindowsDWM()) { + BOOL fEnabled = FALSE; + if( 0 == _DwmIsCompositionEnabled(&fEnabled) ) { + DBG_PRINT("DWM - DwmIsCompositionEnabled: %d\n", fEnabled); + return fEnabled; + } + } + DBG_PRINT("DWM - DwmIsCompositionEnabled failed\n"); + return FALSE; +} + +BOOL DwmEnableComposition( UINT uCompositionAction ) { + if(2 == initWindowsDWM()) { + return 0 == _DwmEnableComposition(uCompositionAction) ? TRUE : FALSE; + } + return FALSE; +} + +BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind) { + if(2 == initWindowsDWM()) { + _DwmEnableBlurBehindWindow(hwnd, pBlurBehind); + DBG_PRINT("DWM - DwmEnableBlurBehindWindow: hwnd %p, f %d, on %d, %p\n", + (void *)hwnd, + (int) pBlurBehind->dwFlags, + (int) pBlurBehind->fEnable, + (void *)pBlurBehind->hRgnBlur); + return TRUE; + } + DBG_PRINT("DWM - DwmEnableBlurBehindWindow: n/a\n"); + return FALSE; +} + +BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset) { + if(2 == initWindowsDWM()) { + _DwmExtendFrameIntoClientArea(hwnd, pMarInset); + return TRUE; + } + return FALSE; +} + diff --git a/src/nativewindow/native/win32/WindowsDWM.h b/src/nativewindow/native/win32/WindowsDWM.h new file mode 100644 index 000000000..36f82fc94 --- /dev/null +++ b/src/nativewindow/native/win32/WindowsDWM.h @@ -0,0 +1,32 @@ +#ifndef _WINDOWS_DWM_H_ +#define _WINDOWS_DWM_H_ + + #include + + #define DWM_BB_ENABLE 0x00000001 // fEnable has been specified + #define DWM_EC_DISABLECOMPOSITION 0 + #define DWM_EC_ENABLECOMPOSITION 1 + + typedef struct _DWM_BLURBEHIND + { + DWORD dwFlags; + BOOL fEnable; + HRGN hRgnBlur; + BOOL fTransitionOnMaximized; + } DWM_BLURBEHIND, *PDWM_BLURBEHIND; + + typedef struct _MARGINS + { + int cxLeftWidth; // width of left border that retains its size + int cxRightWidth; // width of right border that retains its size + int cyTopHeight; // height of top border that retains its size + int cyBottomHeight; // height of bottom border that retains its size + } MARGINS, *PMARGINS; + + BOOL DwmIsExtensionAvailable(); + BOOL DwmIsCompositionEnabled(); + BOOL DwmEnableComposition( UINT uCompositionAction ); + BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind); + BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset); + +#endif /* _WINDOWS_DWM_H_ */ diff --git a/src/nativewindow/native/windows/GDImisc.c b/src/nativewindow/native/windows/GDImisc.c deleted file mode 100644 index 3ab7f9859..000000000 --- a/src/nativewindow/native/windows/GDImisc.c +++ /dev/null @@ -1,226 +0,0 @@ -#include -#include -#include - -#define WIN32_LEAN_AND_MEAN -#include -#undef WIN32_LEAN_AND_MEAN - -#include -#include - -#include - -#include - -#include "NativewindowCommon.h" -#include "jogamp_nativewindow_windows_GDIUtil.h" - -// #define VERBOSE_ON 1 - -#ifdef VERBOSE_ON - #define DBG_PRINT(args...) fprintf(stderr, args); -#else - #define DBG_PRINT(args...) -#endif - -static const char * const ClazzNamePoint = "javax/media/nativewindow/util/Point"; -static const char * const ClazzAnyCstrName = ""; -static const char * const ClazzNamePointCstrSignature = "(II)V"; - -static jclass pointClz = NULL; -static jmethodID pointCstr = NULL; - -HINSTANCE GetApplicationHandle() { - return GetModuleHandle(NULL); -} - -/* Java->C glue code: - * Java package: jogamp.nativewindow.windows.GDIUtil - * Java method: boolean CreateWindowClass(long hInstance, java.lang.String clazzName, long wndProc) - * C function: BOOL CreateWindowClass(HANDLE hInstance, LPCSTR clazzName, HANDLE wndProc); - */ -JNIEXPORT jboolean JNICALL -Java_jogamp_nativewindow_windows_GDIUtil_CreateWindowClass - (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName, jlong wndProc) -{ - HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance; - const TCHAR* clazzName = NULL; - WNDCLASS wc; - jboolean res; - -#ifdef UNICODE - clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName); -#else - clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL); -#endif - - ZeroMemory( &wc, sizeof( wc ) ); - if( GetClassInfo( hInstance, clazzName, &wc ) ) { - // registered already - res = JNI_TRUE; - } else { - // register now - ZeroMemory( &wc, sizeof( wc ) ); - wc.style = CS_HREDRAW | CS_VREDRAW ; - wc.lpfnWndProc = (WNDPROC) (intptr_t) wndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = NULL; - wc.hCursor = LoadCursor( NULL, IDC_ARROW); - wc.hbrBackground = NULL; // no background paint - GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName = clazzName; - res = ( 0 != RegisterClass( &wc ) ) ? JNI_TRUE : JNI_FALSE ; - } - -#ifdef UNICODE - free((void*) clazzName); -#else - (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName); -#endif - - return res; -} - -/* Java->C glue code: - * Java package: jogamp.nativewindow.windows.GDIUtil - * Java method: boolean DestroyWindowClass(long hInstance, java.lang.String className) - * C function: BOOL DestroyWindowClass(HANDLE hInstance, LPCSTR className); - */ -JNIEXPORT jboolean JNICALL -Java_jogamp_nativewindow_windows_GDIUtil_DestroyWindowClass - (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jClazzName) -{ - HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance; - const TCHAR* clazzName = NULL; - jboolean res; - -#ifdef UNICODE - clazzName = NewtCommon_GetNullTerminatedStringChars(env, jClazzName); -#else - clazzName = (*env)->GetStringUTFChars(env, jClazzName, NULL); -#endif - - res = ( 0 != UnregisterClass( clazzName, hInstance ) ) ? JNI_TRUE : JNI_FALSE ; - -#ifdef UNICODE - free((void*) clazzName); -#else - (*env)->ReleaseStringUTFChars(env, jClazzName, clazzName); -#endif - - return res; -} - - -/* Java->C glue code: - * Java package: jogamp.nativewindow.windows.GDIUtil - * Java method: long CreateDummyWindow0(long hInstance, java.lang.String className, java.lang.String windowName, int x, int y, int width, int height) - * C function: HANDLE CreateDummyWindow0(HANDLE hInstance, LPCSTR className, LPCSTR windowName, int x, int y, int width, int height); - */ -JNIEXPORT jlong JNICALL -Java_jogamp_nativewindow_windows_GDIUtil_CreateDummyWindow0 - (JNIEnv *env, jclass _unused, jlong jHInstance, jstring jWndClassName, jstring jWndName, jint x, jint y, jint width, jint height) -{ - HINSTANCE hInstance = (HINSTANCE) (intptr_t) jHInstance; - const TCHAR* wndClassName = NULL; - const TCHAR* wndName = NULL; - DWORD dwExStyle; - DWORD dwStyle; - HWND hWnd; - -#ifdef UNICODE - wndClassName = NewtCommon_GetNullTerminatedStringChars(env, jWndClassName); - wndName = NewtCommon_GetNullTerminatedStringChars(env, jWndName); -#else - wndClassName = (*env)->GetStringUTFChars(env, jWndClassName, NULL); - wndName = (*env)->GetStringUTFChars(env, jWndName, NULL); -#endif - - dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; - dwStyle = WS_OVERLAPPEDWINDOW; - - hWnd = CreateWindowEx( dwExStyle, - wndClassName, - wndName, - dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, - x, y, width, height, - NULL, NULL, hInstance, NULL ); - -#ifdef UNICODE - free((void*) wndClassName); - free((void*) wndName); -#else - (*env)->ReleaseStringUTFChars(env, jWndClassName, wndClassName); - (*env)->ReleaseStringUTFChars(env, jWndName, wndName); -#endif - - return (jlong) (intptr_t) hWnd; -} - - -/* - * Class: jogamp_nativewindow_windows_GDIUtil - * Method: initIDs0 - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_jogamp_nativewindow_windows_GDIUtil_initIDs0 - (JNIEnv *env, jclass clazz) -{ - if(NativewindowCommon_init(env)) { - jclass c = (*env)->FindClass(env, ClazzNamePoint); - if(NULL==c) { - NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't find %s", ClazzNamePoint); - } - pointClz = (jclass)(*env)->NewGlobalRef(env, c); - (*env)->DeleteLocalRef(env, c); - if(NULL==pointClz) { - NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't use %s", ClazzNamePoint); - } - pointCstr = (*env)->GetMethodID(env, pointClz, ClazzAnyCstrName, ClazzNamePointCstrSignature); - if(NULL==pointCstr) { - NativewindowCommon_FatalError(env, "FatalError jogamp_nativewindow_windows_GDIUtil: can't fetch %s.%s %s", - ClazzNamePoint, ClazzAnyCstrName, ClazzNamePointCstrSignature); - } - } - return JNI_TRUE; -} - -LRESULT CALLBACK DummyWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - return DefWindowProc(hWnd,uMsg,wParam,lParam); -} - -/* - * Class: jogamp_nativewindow_windows_GDIUtil - * Method: getDummyWndProc0 - * Signature: ()J - */ -JNIEXPORT jlong JNICALL Java_jogamp_nativewindow_windows_GDIUtil_getDummyWndProc0 - (JNIEnv *env, jclass clazz) -{ - return (jlong) (intptr_t) DummyWndProc; -} - -/* - * Class: jogamp_nativewindow_windows_GDIUtil - * Method: GetRelativeLocation0 - * Signature: (JJII)Ljavax/media/nativewindow/util/Point; - */ -JNIEXPORT jobject JNICALL Java_jogamp_nativewindow_windows_GDIUtil_GetRelativeLocation0 - (JNIEnv *env, jclass unused, jlong jsrc_win, jlong jdest_win, jint src_x, jint src_y) -{ - HWND src_win = (HWND) (intptr_t) jsrc_win; - HWND dest_win = (HWND) (intptr_t) jdest_win; - POINT dest = { src_x, src_y } ; - int res; - - res = MapWindowPoints(src_win, dest_win, &dest, 1); - - DBG_PRINT("*** WindowsWindow: getRelativeLocation0: %p %d/%d -> %p %d/%d - ok: %d\n", - (void*)src_win, src_x, src_y, (void*)dest_win, (int)dest.x, (int)dest.y, res); - - return (*env)->NewObject(env, pointClz, pointCstr, (jint)dest.x, (jint)dest.y); -} - diff --git a/src/nativewindow/native/windows/WindowsDWM.c b/src/nativewindow/native/windows/WindowsDWM.c deleted file mode 100644 index cc9ed6d8c..000000000 --- a/src/nativewindow/native/windows/WindowsDWM.c +++ /dev/null @@ -1,95 +0,0 @@ - -#include "WindowsDWM.h" - -#include -#include - -// #define VERBOSE_ON 1 - -#ifdef VERBOSE_ON - #define DBG_PRINT(args...) fprintf(stderr, args); -#else - #define DBG_PRINT(args...) -#endif - -/* GetProcAddress doesn't exist in A/W variants under desktop Windows */ -#ifndef UNDER_CE -#define GetProcAddressA GetProcAddress -#endif - -typedef HRESULT (WINAPI *DwmEnableCompositionPROCADDR)(UINT uCompositionAction); -typedef HRESULT (WINAPI *DwmIsCompositionEnabledPROCADDR)(BOOL * pfEnabled); -typedef HRESULT (WINAPI *DwmEnableBlurBehindWindowPROCADDR)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind); -typedef HRESULT (WINAPI *DwmExtendFrameIntoClientAreaPROCADDR)(HWND hwnd, const MARGINS *pMarInset); - -static int _init = 0; // 1: init, 2: has DWM extension -static DwmEnableCompositionPROCADDR _DwmEnableComposition = NULL; -static DwmIsCompositionEnabledPROCADDR _DwmIsCompositionEnabled = NULL; -static DwmEnableBlurBehindWindowPROCADDR _DwmEnableBlurBehindWindow = NULL; -static DwmExtendFrameIntoClientAreaPROCADDR _DwmExtendFrameIntoClientArea = NULL; - -static int initWindowsDWM() { - if(0 == _init) { - _init = 1; - HANDLE shell = LoadLibrary(TEXT("dwmapi.dll")); - if (shell) { - _DwmEnableComposition = (DwmEnableCompositionPROCADDR) GetProcAddressA (shell, "DwmEnableComposition"); - _DwmIsCompositionEnabled = (DwmIsCompositionEnabledPROCADDR) GetProcAddressA (shell, "DwmIsCompositionEnabled"); - _DwmEnableBlurBehindWindow = (DwmEnableBlurBehindWindowPROCADDR) GetProcAddressA (shell, "DwmEnableBlurBehindWindow"); - _DwmExtendFrameIntoClientArea = (DwmExtendFrameIntoClientAreaPROCADDR) GetProcAddressA (shell, "DwmExtendFrameIntoClientArea"); - if(NULL != _DwmEnableComposition && NULL != _DwmIsCompositionEnabled && - NULL != _DwmEnableBlurBehindWindow && NULL != _DwmExtendFrameIntoClientArea) { - _init = 2; - } - } - // FreeLibrary (shell); - DBG_PRINT("DWM - initWindowsDWM: %d - s %p, e %p, c %p\n", _init, shell, _DwmEnableBlurBehindWindow, _DwmExtendFrameIntoClientArea); - } - return _init; -} - -BOOL DwmIsExtensionAvailable() { - return (2 == initWindowsDWM()) ? TRUE : FALSE; -} - -BOOL DwmIsCompositionEnabled( ) { - if(2 == initWindowsDWM()) { - BOOL fEnabled = FALSE; - if( 0 == _DwmIsCompositionEnabled(&fEnabled) ) { - DBG_PRINT("DWM - DwmIsCompositionEnabled: %d\n", fEnabled); - return fEnabled; - } - } - DBG_PRINT("DWM - DwmIsCompositionEnabled failed\n"); - return FALSE; -} - -BOOL DwmEnableComposition( UINT uCompositionAction ) { - if(2 == initWindowsDWM()) { - return 0 == _DwmEnableComposition(uCompositionAction) ? TRUE : FALSE; - } - return FALSE; -} - -BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind) { - if(2 == initWindowsDWM()) { - _DwmEnableBlurBehindWindow(hwnd, pBlurBehind); - DBG_PRINT("DWM - DwmEnableBlurBehindWindow: hwnd %p, f %d, on %d, %p\n", - (void *)hwnd, - (int) pBlurBehind->dwFlags, - (int) pBlurBehind->fEnable, - (void *)pBlurBehind->hRgnBlur); - return TRUE; - } - DBG_PRINT("DWM - DwmEnableBlurBehindWindow: n/a\n"); - return FALSE; -} - -BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset) { - if(2 == initWindowsDWM()) { - _DwmExtendFrameIntoClientArea(hwnd, pMarInset); - return TRUE; - } - return FALSE; -} - diff --git a/src/nativewindow/native/windows/WindowsDWM.h b/src/nativewindow/native/windows/WindowsDWM.h deleted file mode 100644 index 36f82fc94..000000000 --- a/src/nativewindow/native/windows/WindowsDWM.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _WINDOWS_DWM_H_ -#define _WINDOWS_DWM_H_ - - #include - - #define DWM_BB_ENABLE 0x00000001 // fEnable has been specified - #define DWM_EC_DISABLECOMPOSITION 0 - #define DWM_EC_ENABLECOMPOSITION 1 - - typedef struct _DWM_BLURBEHIND - { - DWORD dwFlags; - BOOL fEnable; - HRGN hRgnBlur; - BOOL fTransitionOnMaximized; - } DWM_BLURBEHIND, *PDWM_BLURBEHIND; - - typedef struct _MARGINS - { - int cxLeftWidth; // width of left border that retains its size - int cxRightWidth; // width of right border that retains its size - int cyTopHeight; // height of top border that retains its size - int cyBottomHeight; // height of bottom border that retains its size - } MARGINS, *PMARGINS; - - BOOL DwmIsExtensionAvailable(); - BOOL DwmIsCompositionEnabled(); - BOOL DwmEnableComposition( UINT uCompositionAction ); - BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind); - BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset); - -#endif /* _WINDOWS_DWM_H_ */ diff --git a/src/nativewindow/native/x11/XineramaHelper.c b/src/nativewindow/native/x11/XineramaHelper.c index 62c02c8c8..ffd66a1b9 100644 --- a/src/nativewindow/native/x11/XineramaHelper.c +++ b/src/nativewindow/native/x11/XineramaHelper.c @@ -1,122 +1,152 @@ -/* - * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * Copyright (c) 2010 JogAmp Community. All rights reserved. +/** + * Copyright 2011 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * 2. 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. * - * - Redistribution 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. + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community 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. * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. */ -/* This file contains a helper routine to be called by Java code to - determine whether the Xinerama extension is in use and therefore to - treat the multiple AWT screens as one large screen. */ +#include -#include -#include #include +#include + +// #define DEBUG 1 + +static const char* XinExtName = "XINERAMA"; #ifdef __sun_obsolete -typedef Status XineramaGetInfoFunc(Display* display, int screen_number, +static const char* XineramaLibNames[] = { "libXext.so", NULL } ; +static const char* XineramaGetInfoName = "XineramaGetInfo"; + +typedef Status (* PFNXineramaGetInfoPROC) (Display* display, int screen_number, XRectangle* framebuffer_rects, unsigned char* framebuffer_hints, int* num_framebuffers); -typedef Status XineramaGetCenterHintFunc(Display* display, int screen_number, - int* x, int* y); - -XineramaGetCenterHintFunc* XineramaSolarisCenterFunc = NULL; -#include #else -#include +static const char* XineramaLibNames[]= { "libXinerama.so.1", "libXinerama.so", NULL }; +static const char* XineramaIsActiveName = "XineramaIsActive"; -#endif +typedef Bool (* PFNXineramaIsActivePROC) (Display *display); -Bool XineramaEnabled(Display* display) { -#ifdef __sun_obsolete +#endif -#define MAXFRAMEBUFFERS 16 - char* XinExtName = "XINERAMA"; - int32_t major_opcode, first_event, first_error; - Bool gotXinExt = False; - void* libHandle = 0; - unsigned char fbhints[MAXFRAMEBUFFERS]; - XRectangle fbrects[MAXFRAMEBUFFERS]; - int locNumScr = 0; - Bool usingXinerama = False; +static Bool XineramaIsEnabledPlatform(void *xineramaQueryFunc, Display* display) { + Bool res = False; + #ifdef __sun_obsolete + #define MAXFRAMEBUFFERS 16 + unsigned char fbhints[MAXFRAMEBUFFERS]; + XRectangle fbrects[MAXFRAMEBUFFERS]; + int locNumScr = 0; + + if(NULL!=xineramaQueryFunc && NULL!=display) { + PFNXineramaGetInfoPROC XineramaSolarisPROC = (PFNXineramaGetInfoPROC)xineramaQueryFunc; + res = XineramaSolarisPROC(display, 0, &fbrects[0], &fbhints[0], &locNumScr) != 0; + } + #else + if(NULL!=xineramaQueryFunc && NULL!=display) { + PFNXineramaIsActivePROC XineramaIsActivePROC = (PFNXineramaIsActivePROC) xineramaQueryFunc; + res = XineramaIsActivePROC(display); + } + #endif + return res; +} - char* XineramaLibName= "libXext.so"; - char* XineramaGetInfoName = "XineramaGetInfo"; - char* XineramaGetCenterHintName = "XineramaGetCenterHint"; - XineramaGetInfoFunc* XineramaSolarisFunc = NULL; +void* XineramaGetLibHandle() { + void* xineramaLibHandle = NULL; + int i; - gotXinExt = XQueryExtension(display, XinExtName, &major_opcode, - &first_event, &first_error); + for(i=0; NULL==xineramaLibHandle && NULL!=XineramaLibNames[i]; i++) { + xineramaLibHandle = dlopen(XineramaLibNames[i], RTLD_LAZY | RTLD_GLOBAL); + } - if (gotXinExt) { - /* load library, load and run XineramaGetInfo */ - libHandle = dlopen(XineramaLibName, RTLD_LAZY | RTLD_GLOBAL); - if (libHandle != 0) { - XineramaSolarisFunc = (XineramaGetInfoFunc*)dlsym(libHandle, XineramaGetInfoName); - XineramaSolarisCenterFunc = - (XineramaGetCenterHintFunc*)dlsym(libHandle, - XineramaGetCenterHintName); - if (XineramaSolarisFunc != NULL) { - if ((*XineramaSolarisFunc)(display, 0, &fbrects[0], - &fbhints[0], &locNumScr) != 0) { - - usingXinerama = True; - } - } - dlclose(libHandle); + #ifdef DEBUG + if(NULL!=xineramaLibHandle) { + fprintf(stderr, "XineramaGetLibHandle: using lib %s -> %p\n", XineramaLibNames[i-1], xineramaLibHandle); + } else { + fprintf(stderr, "XineramaGetLibHandle: no native lib available\n"); } + #endif + + return xineramaLibHandle; +} + +Bool XineramaReleaseLibHandle(void* xineramaLibHandle) { + #ifdef DEBUG + fprintf(stderr, "XineramaReleaseLibHandle: release lib %p\n", xineramaLibHandle); + #endif + if(NULL==xineramaLibHandle) { + return False; } - return usingXinerama; - -#else + return 0 == dlclose(xineramaLibHandle) ? True : False; +} + +void* XineramaGetQueryFunc(void *xineramaLibHandle) { + void * funcptr = NULL; - static const char* XinExtName = "XINERAMA"; + if(NULL==xineramaLibHandle) { + return NULL; + } + + #ifdef __sun_obsolete + #ifdef DEBUG + fprintf(stderr, "XineramaGetQueryFunc: trying func %p -> %s\n", xineramaLibHandle, XineramaGetInfoName); + #endif + funcptr = dlsym(xineramaLibHandle, XineramaGetInfoName); + #else + #ifdef DEBUG + fprintf(stderr, "XineramaGetQueryFunc: trying func %p -> %s\n", xineramaLibHandle, XineramaIsActiveName); + #endif + funcptr = dlsym(xineramaLibHandle, XineramaIsActiveName); + #endif + #ifdef DEBUG + fprintf(stderr, "XineramaGetQueryFunc: got func %p\n", funcptr); + #endif + return funcptr; +} + +Bool XineramaIsEnabled(void *xineramaQueryFunc, Display* display) { int32_t major_opcode, first_event, first_error; Bool gotXinExt = False; - Bool isXinActive = False; + Bool res = False; - // fprintf(stderr, "XineramaEnabled: p0\n"); fflush(stderr); + if(NULL==xineramaQueryFunc || NULL==display) { + return False; + } gotXinExt = XQueryExtension(display, XinExtName, &major_opcode, &first_event, &first_error); - // fprintf(stderr, "XineramaEnabled: p1 gotXinExt %d\n",gotXinExt); fflush(stderr); - if (gotXinExt) { - isXinActive = XineramaIsActive(display); - } - // fprintf(stderr, "XineramaEnabled: p2 XineramaIsActive %d\n", isXinActive); fflush(stderr); + #ifdef DEBUG + fprintf(stderr, "XineramaIsEnabled: has Xinerama Ext: ext %d, query-func %p\n", gotXinExt, xineramaQueryFunc); + #endif - return isXinActive; + if(gotXinExt) { + res = XineramaIsEnabledPlatform(xineramaQueryFunc, display); + } -#endif + return res; } diff --git a/src/nativewindow/native/x11/XineramaHelper.h b/src/nativewindow/native/x11/XineramaHelper.h new file mode 100644 index 000000000..42b6a03ae --- /dev/null +++ b/src/nativewindow/native/x11/XineramaHelper.h @@ -0,0 +1,40 @@ +/** + * Copyright 2011 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community 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. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +#ifndef XineramaHelper_h +#define XineramaHelper_h + +#include +#include + +void* XineramaGetLibHandle(); +Bool XineramaReleaseLibHandle(void* xineramaLibHandle); +void* XineramaGetQueryFunc(void *xineramaLibHandle); +Bool XineramaIsEnabled(void *xineramaQueryFunc, Display* display); + +#endif /* XineramaHelper_h */ diff --git a/src/nativewindow/native/x11/Xmisc.c b/src/nativewindow/native/x11/Xmisc.c index d28891cda..a99499879 100644 --- a/src/nativewindow/native/x11/Xmisc.c +++ b/src/nativewindow/native/x11/Xmisc.c @@ -91,9 +91,6 @@ Bool XF86VidModeSetGammaRamp( #define DBG_PRINT(args...) #endif -/* Need to pull this in as we don't have a stub header for it */ -extern Bool XineramaEnabled(Display* display); - static const char * const ClazzNameBuffers = "com/jogamp/common/nio/Buffers"; static const char * const ClazzNameBuffersStaticCstrName = "copyByteBuffer"; static const char * const ClazzNameBuffersStaticCstrSignature = "(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;"; diff --git a/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java b/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java index ba1aed308..b688c6870 100644 --- a/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java +++ b/src/newt/classes/jogamp/newt/driver/x11/X11Screen.java @@ -277,7 +277,7 @@ public class X11Screen extends ScreenImpl { private class XineramaEnabledQuery implements DisplayImpl.DisplayRunnable { public Boolean run(long dpy) { - return new Boolean(X11Lib.XineramaEnabled(dpy)); + return new Boolean(X11Util.XineramaIsEnabled(dpy)); } } private XineramaEnabledQuery xineramaEnabledQuery = new XineramaEnabledQuery(); -- cgit v1.2.3