forked from eden-emu/eden
		
	Merge pull request #4949 from Morph1984/hidpi-temp-fix
main: Enable High DPI fixes for Qt >= 5.14
This commit is contained in:
		
						commit
						1f3e8d633a
					
				
					 3 changed files with 65 additions and 8 deletions
				
			
		|  | @ -575,7 +575,7 @@ void QtSoftwareKeyboardDialog::MoveAndResizeWindow(QPoint pos, QSize size) { | |||
|     QDialog::resize(size); | ||||
| 
 | ||||
|     // High DPI
 | ||||
|     const float dpi_scale = qApp->screenAt(pos)->logicalDotsPerInch() / 96.0f; | ||||
|     const float dpi_scale = screen()->logicalDotsPerInch() / 96.0f; | ||||
| 
 | ||||
|     RescaleKeyboardElements(size.width(), size.height(), dpi_scale); | ||||
| } | ||||
|  |  | |||
|  | @ -680,8 +680,10 @@ void GMainWindow::SoftwareKeyboardShowNormal() { | |||
|     const auto y = layout.screen.top; | ||||
|     const auto w = layout.screen.GetWidth(); | ||||
|     const auto h = layout.screen.GetHeight(); | ||||
|     const auto scale_ratio = devicePixelRatioF(); | ||||
| 
 | ||||
|     software_keyboard->ShowNormalKeyboard(render_window->mapToGlobal(QPoint(x, y)), QSize(w, h)); | ||||
|     software_keyboard->ShowNormalKeyboard(render_window->mapToGlobal(QPoint(x, y) / scale_ratio), | ||||
|                                           QSize(w, h) / scale_ratio); | ||||
| } | ||||
| 
 | ||||
| void GMainWindow::SoftwareKeyboardShowTextCheck( | ||||
|  | @ -714,9 +716,11 @@ void GMainWindow::SoftwareKeyboardShowInline( | |||
|                                                (1.0f - appear_parameters.key_top_scale_y)))); | ||||
|     const auto w = static_cast<int>(layout.screen.GetWidth() * appear_parameters.key_top_scale_x); | ||||
|     const auto h = static_cast<int>(layout.screen.GetHeight() * appear_parameters.key_top_scale_y); | ||||
|     const auto scale_ratio = devicePixelRatioF(); | ||||
| 
 | ||||
|     software_keyboard->ShowInlineKeyboard(std::move(appear_parameters), | ||||
|                                           render_window->mapToGlobal(QPoint(x, y)), QSize(w, h)); | ||||
|                                           render_window->mapToGlobal(QPoint(x, y) / scale_ratio), | ||||
|                                           QSize(w, h) / scale_ratio); | ||||
| } | ||||
| 
 | ||||
| void GMainWindow::SoftwareKeyboardHideInline() { | ||||
|  | @ -796,10 +800,11 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, | |||
|         } | ||||
| 
 | ||||
|         const auto& layout = render_window->GetFramebufferLayout(); | ||||
|         web_browser_view.resize(layout.screen.GetWidth(), layout.screen.GetHeight()); | ||||
|         web_browser_view.move(layout.screen.left, layout.screen.top + menuBar()->height()); | ||||
|         web_browser_view.setZoomFactor(static_cast<qreal>(layout.screen.GetWidth()) / | ||||
|                                        static_cast<qreal>(Layout::ScreenUndocked::Width)); | ||||
|         const auto scale_ratio = devicePixelRatioF(); | ||||
|         web_browser_view.resize(layout.screen.GetWidth() / scale_ratio, | ||||
|                                 layout.screen.GetHeight() / scale_ratio); | ||||
|         web_browser_view.move(layout.screen.left / scale_ratio, | ||||
|                               (layout.screen.top / scale_ratio) + menuBar()->height()); | ||||
| 
 | ||||
|         web_browser_view.setFocus(); | ||||
|         web_browser_view.show(); | ||||
|  | @ -4448,6 +4453,55 @@ void GMainWindow::changeEvent(QEvent* event) { | |||
| #undef main | ||||
| #endif | ||||
| 
 | ||||
| static void SetHighDPIAttributes() { | ||||
| #ifdef _WIN32 | ||||
|     // For Windows, we want to avoid scaling artifacts on fractional scaling ratios.
 | ||||
|     // This is done by setting the optimal scaling policy for the primary screen.
 | ||||
| 
 | ||||
|     // Create a temporary QApplication.
 | ||||
|     int temp_argc = 0; | ||||
|     char** temp_argv = nullptr; | ||||
|     QApplication temp{temp_argc, temp_argv}; | ||||
| 
 | ||||
|     // Get the current screen geometry.
 | ||||
|     const QScreen* primary_screen = QGuiApplication::primaryScreen(); | ||||
|     if (primary_screen == nullptr) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     const QRect screen_rect = primary_screen->geometry(); | ||||
|     const int real_width = screen_rect.width(); | ||||
|     const int real_height = screen_rect.height(); | ||||
|     const float real_ratio = primary_screen->logicalDotsPerInch() / 96.0f; | ||||
| 
 | ||||
|     // Recommended minimum width and height for proper window fit.
 | ||||
|     // Any screen with a lower resolution than this will still have a scale of 1.
 | ||||
|     constexpr float minimum_width = 1350.0f; | ||||
|     constexpr float minimum_height = 900.0f; | ||||
| 
 | ||||
|     const float width_ratio = std::max(1.0f, real_width / minimum_width); | ||||
|     const float height_ratio = std::max(1.0f, real_height / minimum_height); | ||||
| 
 | ||||
|     // Get the lower of the 2 ratios and truncate, this is the maximum integer scale.
 | ||||
|     const float max_ratio = std::trunc(std::min(width_ratio, height_ratio)); | ||||
| 
 | ||||
|     if (max_ratio > real_ratio) { | ||||
|         QApplication::setHighDpiScaleFactorRoundingPolicy( | ||||
|             Qt::HighDpiScaleFactorRoundingPolicy::Round); | ||||
|     } else { | ||||
|         QApplication::setHighDpiScaleFactorRoundingPolicy( | ||||
|             Qt::HighDpiScaleFactorRoundingPolicy::Floor); | ||||
|     } | ||||
| #else | ||||
|     // Other OSes should be better than Windows at fractional scaling.
 | ||||
|     QApplication::setHighDpiScaleFactorRoundingPolicy( | ||||
|         Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); | ||||
| #endif | ||||
| 
 | ||||
|     QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); | ||||
|     QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); | ||||
| } | ||||
| 
 | ||||
| int main(int argc, char* argv[]) { | ||||
|     std::unique_ptr<Config> config = std::make_unique<Config>(); | ||||
|     bool has_broken_vulkan = false; | ||||
|  | @ -4503,6 +4557,8 @@ int main(int argc, char* argv[]) { | |||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     SetHighDPIAttributes(); | ||||
| 
 | ||||
| #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) | ||||
|     // Disables the "?" button on all dialogs. Disabled by default on Qt6.
 | ||||
|     QCoreApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton); | ||||
|  | @ -4510,6 +4566,7 @@ int main(int argc, char* argv[]) { | |||
| 
 | ||||
|     // Enables the core to make the qt created contexts current on std::threads
 | ||||
|     QCoreApplication::setAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity); | ||||
| 
 | ||||
|     QApplication app(argc, argv); | ||||
| 
 | ||||
| #ifdef _WIN32 | ||||
|  |  | |||
|  | @ -163,7 +163,7 @@ void OverlayDialog::MoveAndResizeWindow() { | |||
|     const auto height = static_cast<float>(parentWidget()->height()); | ||||
| 
 | ||||
|     // High DPI
 | ||||
|     const float dpi_scale = parentWidget()->windowHandle()->screen()->logicalDotsPerInch() / 96.0f; | ||||
|     const float dpi_scale = screen()->logicalDotsPerInch() / 96.0f; | ||||
| 
 | ||||
|     const auto title_text_font_size = BASE_TITLE_FONT_SIZE * (height / BASE_HEIGHT) / dpi_scale; | ||||
|     const auto body_text_font_size = | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 liamwhite
						liamwhite