diff options
-rwxr-xr-x | make/scripts/tests-x64.bat | 5 | ||||
-rwxr-xr-x | make/scripts/tests.sh | 3 | ||||
-rw-r--r-- | src/newt/native/WindowsWindow.c | 67 |
3 files changed, 41 insertions, 34 deletions
diff --git a/make/scripts/tests-x64.bat b/make/scripts/tests-x64.bat index 1f4b23d8c..237770488 100755 --- a/make/scripts/tests-x64.bat +++ b/make/scripts/tests-x64.bat @@ -50,7 +50,7 @@ REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.awt.TestIsReali REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.demos.gl2.newt.TestGearsNewtAWTWrapper %* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.demos.gl2.newt.TestGearsNEWT -time 30000 REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.demos.es1.newt.TestGearsES1NEWT %* -REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NEWT %* +scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NEWT %* REM scripts\java-win64.bat com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NEWT -vsync -time 4000 -x 10 -y 10 -width 100 -height 100 -screen 0 REM scripts\java-win64.bat com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NEWT -vsync -time 40000 -width 100 -height 100 -screen 0 %* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.demos.gl2.awt.TestGearsAWT -time 5000 @@ -65,7 +65,7 @@ REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestParenting01 REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestListenerCom01AWT REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.event.TestNewtKeyEventOrderAWT %* -scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.event.TestNewtKeyCodeModifiersAWT %* +REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.event.TestNewtKeyCodeModifiersAWT %* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.event.TestNewtKeyEventAutoRepeatAWT %* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.event.TestNewtKeyPressReleaseUnmaskRepeatAWT %* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.event.TestNewtKeyCodesAWT %* @@ -96,6 +96,7 @@ REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.jogl.swt.TestSWTBug6 REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestWindows01NEWT REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestGLWindows01NEWT REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestGLWindows02NEWTAnimated +REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestGLWindowInvisiblePointer01NEWT $* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestFocus01SwingAWTRobot %* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.newt.TestFocus02SwingAWTRobot %* REM scripts\java-win64-dbg.bat com.jogamp.opengl.test.junit.nativewindow.TestRecursiveToolkitLockCORE diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh index 983c27a07..35d669a47 100755 --- a/make/scripts/tests.sh +++ b/make/scripts/tests.sh @@ -370,6 +370,7 @@ function testawtswt() { #testnoawt com.jogamp.opengl.test.junit.newt.TestWindowClosingProtocol02NEWT $* #testnoawt com.jogamp.opengl.test.junit.newt.TestGLWindows01NEWT $* #testnoawt com.jogamp.opengl.test.junit.newt.TestGLWindows02NEWTAnimated $* +testnoawt com.jogamp.opengl.test.junit.newt.TestGLWindowInvisiblePointer01NEWT $* #testnoawt com.jogamp.opengl.test.junit.newt.TestDisplayLifecycle01NEWT #testnoawt com.jogamp.opengl.test.junit.newt.TestDisplayLifecycle02NEWT #testnoawt com.jogamp.opengl.test.junit.newt.TestScreenMode00NEWT $* @@ -445,7 +446,7 @@ function testawtswt() { #testawt com.jogamp.opengl.test.junit.newt.event.TestNewtKeyEventAutoRepeatAWT $* #testawt com.jogamp.opengl.test.junit.newt.event.TestNewtKeyPressReleaseUnmaskRepeatAWT $* #testawt com.jogamp.opengl.test.junit.newt.event.TestNewtKeyCodesAWT $* -testawt com.jogamp.opengl.test.junit.newt.event.TestNewtKeyCodeModifiersAWT $* +#testawt com.jogamp.opengl.test.junit.newt.event.TestNewtKeyCodeModifiersAWT $* #testawt com.jogamp.opengl.test.junit.newt.event.TestNewtEventModifiersNEWTWindowAWT $* #testawt com.jogamp.opengl.test.junit.newt.event.TestNewtEventModifiersAWTCanvas $* #testawt com.jogamp.opengl.test.junit.newt.event.TestNewtEventModifiersNewtCanvasAWT $* diff --git a/src/newt/native/WindowsWindow.c b/src/newt/native/WindowsWindow.c index 7d161d57c..5c1115592 100644 --- a/src/newt/native/WindowsWindow.c +++ b/src/newt/native/WindowsWindow.c @@ -141,7 +141,8 @@ static RECT* UpdateInsets(JNIEnv *env, jobject window, HWND hwnd); typedef struct { JNIEnv* jenv; jobject jinstance; - int pointerVisible; + /** Tristate: -1 HIDE, 0 NOP, 1 SHOW */ + int setPointerVisible; } WindowUserData; typedef struct { @@ -751,6 +752,31 @@ static LRESULT CALLBACK HookMouseProc (int code, WPARAM wParam, LPARAM lParam) #endif +static BOOL SafeShowCursor(BOOL show) { + int count, countPre; + BOOL b; + + if( show ) { + count = ShowCursor(TRUE); + if(count < 0) { + do { + countPre = count; + count = ShowCursor(TRUE); + } while( count > countPre && count < 0 ); + } + b = count>=0 ? TRUE : FALSE; + } else { + count = ShowCursor(FALSE); + if(count >= 0) { + do { + countPre = count; + count = ShowCursor(FALSE); + } while( count < countPre && count >= 0 ); + } + b = count<0 ? TRUE : FALSE; + } + return b; +} static LRESULT CALLBACK wndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) { LRESULT res = 0; @@ -1039,18 +1065,19 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lP res = 1; // return 1 == done, OpenGL, etc .. erases the background, hence we claim to have just done this break; case WM_SETCURSOR : - if (0 != wud->pointerVisible) { + if (0 != wud->setPointerVisible) { // Tristate, -1, 0, 1 BOOL visibilityChangeSuccessful; - if (1 == wud->pointerVisible) { + if (1 == wud->setPointerVisible) { visibilityChangeSuccessful = SafeShowCursor(TRUE); - } else /* -1 == wud->pointerVisible */ { + } else /* -1 == wud->setPointerVisible */ { visibilityChangeSuccessful = SafeShowCursor(FALSE); } useDefWindowProc = visibilityChangeSuccessful ? 1 : 0; - pointerVisible = 0; - DBG_PRINT("*** WindowsWindow: WM_SETCURSOR requested visibility: %d success: %d\n", wud->pointerVisible, visibilityChangeSuccessful); + DBG_PRINT("*** WindowsWindow: WM_SETCURSOR requested visibility: %d success: %d\n", wud->setPointerVisible, visibilityChangeSuccessful); + wud->setPointerVisible = 0; + useDefWindowProc = 0; // own signal, consumed } else { - useDefWindowProc = 0; + useDefWindowProc = 1; // NOP for us, allow parent to act } break; default: @@ -1063,28 +1090,6 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lP return res; } -static BOOL SafeShowCursor(BOOL show) { - int attempt = 0, maxAttempt, previousDisplayCount, currentDisplayCount; - currentDisplayCount = ShowCursor(show); - if (show) { - success = currentDisplayCount >= 0; - maxAttempt = -currentDisplayCount; - } else { - success = currentDisplayCount < 0; - maxAttempt = currentDisplayCount + 1; - } - while (!success && attempt < maxAttempt) { - previousDisplayCount = currentDisplayCount; - currentDisplayCount = ShowCursor(show); - success = show ? currentDisplayCount >= 0 : currentDisplayCount < 0; - attempt++; - if (previousDisplayCount == currentDisplayCount) { - break; - } - } - return success; -} - /* * Class: jogamp_newt_driver_windows_DisplayDriver * Method: DispatchMessages @@ -1496,7 +1501,7 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_windows_WindowDriver_CreateWindo WindowUserData * wud = (WindowUserData *) malloc(sizeof(WindowUserData)); wud->jinstance = (*env)->NewGlobalRef(env, obj); wud->jenv = env; - wud->pointerVisible = 0; + wud->setPointerVisible = 0; #if !defined(__MINGW64__) && ( defined(UNDER_CE) || _MSC_VER <= 1200 ) SetWindowLong(window, GWL_USERDATA, (intptr_t) wud); #else @@ -1711,7 +1716,7 @@ JNIEXPORT jboolean JNICALL Java_jogamp_newt_driver_windows_WindowDriver_setPoint #else wud = (WindowUserData *) GetWindowLongPtr(hwnd, GWLP_USERDATA); #endif - wud->pointerVisible = mouseVisible ? 1 : -1; + wud->setPointerVisible = mouseVisible ? 1 : -1; SendMessage(hwnd, WM_SETCURSOR, 0, 0); return JNI_TRUE; |