diff options
Diffstat (limited to 'src/newt/native/WindowsWindow.c')
-rw-r--r-- | src/newt/native/WindowsWindow.c | 67 |
1 files changed, 36 insertions, 31 deletions
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; |