modules/graphics/src/main/native-glass/win/GlassWindow.cpp

Print this page

        

*** 645,685 **** type, pRect->right-pRect->left, pRect->bottom-pRect->top); CheckAndClearException(env); } void GlassWindow::HandleDPIEvent(WPARAM wParam, LPARAM lParam) { UINT xDPI = LOWORD(wParam); UINT yDPI = HIWORD(wParam); - // fprintf(stderr, "DPI Changed (=> %d, %d)!\n", yDPI, xDPI); JNIEnv* env = GetEnv(); ! jfloat newUIScale = GlassApplication::GetUIScale(xDPI); ! jfloat newRenderScale = GlassApplication::getRenderScale(newUIScale); ! env->CallVoidMethod(m_grefThis, midNotifyScaleChanged, newUIScale, newRenderScale); CheckAndClearException(env); ! LPRECT lprcNewScale = (LPRECT) lParam; ! #if 0 ! RECT oldBounds, oldClient; ::GetWindowRect(GetHWND(), &oldBounds); ::GetClientRect(GetHWND(), &oldClient); POINT cursor; ::GetCursorPos(&cursor); fprintf(stderr, " @ %d, %d\n", cursor.x, cursor.y); ! fprintf(stderr, " (%d, %d, %d, %d) [%d x %d] in (%d, %d, %d, %d) [%d x %d] => (%d, %d, %d, %d) [%d x %d]\n", oldClient.left, oldClient.top, oldClient.right, oldClient.bottom, oldClient.right - oldClient.left, oldClient.bottom - oldClient.top, oldBounds.left, oldBounds.top, oldBounds.right, oldBounds.bottom, ! oldBounds.right - oldBounds.left, oldBounds.bottom - oldBounds.top, ! lprcNewScale->left, lprcNewScale->top, lprcNewScale->right, lprcNewScale->bottom, ! lprcNewScale->right - lprcNewScale->left, lprcNewScale->bottom - lprcNewScale->top); #endif ::SetWindowPos(GetHWND(), HWND_TOP, ! lprcNewScale->left, ! lprcNewScale->top, ! lprcNewScale->right - lprcNewScale->left, ! lprcNewScale->bottom - lprcNewScale->top, SWP_NOZORDER | SWP_NOACTIVATE); } void GlassWindow::HandleWindowPosChangedEvent() { --- 645,731 ---- type, pRect->right-pRect->left, pRect->bottom-pRect->top); CheckAndClearException(env); } void GlassWindow::HandleDPIEvent(WPARAM wParam, LPARAM lParam) { + if (GlassApplication::IsUIScaleOverridden()) { + return; + } + UINT xDPI = LOWORD(wParam); UINT yDPI = HIWORD(wParam); JNIEnv* env = GetEnv(); ! jfloat xScale = xDPI / 96.0f; ! jfloat yScale = yDPI / 96.0f; ! env->CallVoidMethod(m_grefThis, midNotifyScaleChanged, xScale, yScale, xScale, yScale); CheckAndClearException(env); ! // Windows provides new bounds for the window, but they assume that ! // all parts (client and non-client) will be rescaled equally. ! // Unfortunately, the basic window decoration support does not scale ! // so we need to adjust the new bounds to represent the new intended ! // client dimensions padded for the unchanging frame border. ! LPRECT lprcNewBounds = (LPRECT) lParam; ! RECT oldBounds, oldClient, padding, newClient, newBounds; ::GetWindowRect(GetHWND(), &oldBounds); ::GetClientRect(GetHWND(), &oldClient); + float rescaleX = ((float) (lprcNewBounds->right - lprcNewBounds->left)) / + (oldBounds.right - oldBounds.left); + float rescaleY = ((float) (lprcNewBounds->bottom - lprcNewBounds->top)) / + (oldBounds.bottom - oldBounds.top); + + // First compute the padding between non-client and client for the old + // values for the window. This is the size of the frame border + // decorations. These will remain unchanged after the change in DPI. + padding.left = oldClient.left - oldBounds.left; + padding.top = oldClient.top - oldBounds.top; + padding.right = oldBounds.right - oldClient.right; + padding.bottom = oldBounds.bottom - oldClient.bottom; + + // Next compute the correctly scaled new dimensions for the client + // area, based on the ratio of the old window bounds to the suggested + // new window bounds. + jint newClientW = (jint) ceil((oldClient.right - oldClient.left) * rescaleX); + jint newClientH = (jint) ceil((oldClient.bottom - oldClient.top) * rescaleY); + + // Next compute the new client bounds implied by the values provided by + // the WM event data + newClient.left = lprcNewBounds->left + padding.left; + newClient.top = lprcNewBounds->top + padding.top; + newClient.right = newClient.left + newClientW; + newClient.bottom = newClient.top + newClientH; + + // Finally, compute the new bounds of the window by padding out the + // correctly scaled new client region. + newBounds.left = newClient.left - padding.left; + newBounds.top = newClient.top - padding.top; + newBounds.right = newClient.right + padding.right; + newBounds.bottom = newClient.bottom + padding.bottom; + #if 0 POINT cursor; ::GetCursorPos(&cursor); fprintf(stderr, " @ %d, %d\n", cursor.x, cursor.y); ! fprintf(stderr, " (%d, %d, %d, %d) [%d x %d] in (%d, %d, %d, %d) [%d x %d]\n", oldClient.left, oldClient.top, oldClient.right, oldClient.bottom, oldClient.right - oldClient.left, oldClient.bottom - oldClient.top, oldBounds.left, oldBounds.top, oldBounds.right, oldBounds.bottom, ! oldBounds.right - oldBounds.left, oldBounds.bottom - oldBounds.top); ! fprintf(stderr, " => (suggested) (%d, %d, %d, %d) [%d x %d]\n", ! lprcNewBounds->left, lprcNewBounds->top, lprcNewBounds->right, lprcNewBounds->bottom, ! lprcNewBounds->right - lprcNewBounds->left, lprcNewBounds->bottom - lprcNewBounds->top); ! fprintf(stderr, " => (recomputed) (%d, %d, %d, %d) [%d x %d] in (%d, %d, %d, %d) [%d x %d]\n", ! newClient.left, newClient.top, newClient.right, newClient.bottom, ! newClient.right - newClient.left, newClient.bottom - newClient.top, ! newBounds.left, newBounds.top, newBounds.right, newBounds.bottom, ! newBounds.right - newBounds.left, newBounds.bottom - newBounds.top); #endif ::SetWindowPos(GetHWND(), HWND_TOP, ! newBounds.left, ! newBounds.top, ! newBounds.right - newBounds.left, ! newBounds.bottom - newBounds.top, SWP_NOZORDER | SWP_NOACTIVATE); } void GlassWindow::HandleWindowPosChangedEvent() {
*** 1094,1104 **** midNotifyResize = env->GetMethodID(cls, "notifyResize", "(III)V"); ASSERT(midNotifyResize); if (env->ExceptionCheck()) return; ! midNotifyScaleChanged = env->GetMethodID(cls, "notifyScaleChanged", "(FF)V"); ASSERT(midNotifyScaleChanged); if (env->ExceptionCheck()) return; javaIDs.Window.notifyFocus = env->GetMethodID(cls, "notifyFocus", "(I)V"); ASSERT(javaIDs.Window.notifyFocus); --- 1140,1150 ---- midNotifyResize = env->GetMethodID(cls, "notifyResize", "(III)V"); ASSERT(midNotifyResize); if (env->ExceptionCheck()) return; ! midNotifyScaleChanged = env->GetMethodID(cls, "notifyScaleChanged", "(FFFF)V"); ASSERT(midNotifyScaleChanged); if (env->ExceptionCheck()) return; javaIDs.Window.notifyFocus = env->GetMethodID(cls, "notifyFocus", "(I)V"); ASSERT(javaIDs.Window.notifyFocus);