diff --git a/src/citron/configuration/configure.ui b/src/citron/configuration/configure.ui
index fa192dc2f..b785db8e2 100644
--- a/src/citron/configuration/configure.ui
+++ b/src/citron/configuration/configure.ui
@@ -25,6 +25,14 @@
0
+
+
+ Qt::ApplicationModal
+
+
+
+ citron Configuration
+
QDialog {
background-color: #2b2b2b;
@@ -441,6 +449,77 @@ QRadioButton::indicator:checked {
QRadioButton::indicator:hover {
border-color: #4a9eff;
}
+
+/* High DPI specific styles */
+@media (min-resolution: 192dpi) {
+ QPushButton.tabButton {
+ padding: 12px 16px;
+ min-width: 90px;
+ max-width: 170px;
+ font-size: 14px;
+ }
+
+ QComboBox {
+ min-width: 140px;
+ min-height: 32px;
+ padding: 10px 14px;
+ }
+
+ QLineEdit {
+ min-height: 24px;
+ padding: 10px 14px;
+ }
+
+ QPushButton {
+ min-height: 24px;
+ padding: 12px 24px;
+ }
+
+ QCheckBox::indicator {
+ width: 20px;
+ height: 20px;
+ }
+
+ QRadioButton::indicator {
+ width: 18px;
+ height: 18px;
+ }
+}
+
+@media (min-resolution: 240dpi) {
+ QPushButton.tabButton {
+ padding: 14px 18px;
+ min-width: 95px;
+ max-width: 180px;
+ font-size: 16px;
+ }
+
+ QComboBox {
+ min-width: 160px;
+ min-height: 36px;
+ padding: 12px 16px;
+ }
+
+ QLineEdit {
+ min-height: 28px;
+ padding: 12px 16px;
+ }
+
+ QPushButton {
+ min-height: 28px;
+ padding: 14px 28px;
+ }
+
+ QCheckBox::indicator {
+ width: 22px;
+ height: 22px;
+ }
+
+ QRadioButton::indicator {
+ width: 20px;
+ height: 20px;
+ }
+}
diff --git a/src/citron/configuration/configure_dialog.cpp b/src/citron/configuration/configure_dialog.cpp
index 0743da933..63784d0fd 100644
--- a/src/citron/configuration/configure_dialog.cpp
+++ b/src/citron/configuration/configure_dialog.cpp
@@ -43,7 +43,60 @@ QScrollArea* CreateScrollArea(QWidget* widget) {
scroll_area->setFrameShape(QFrame::NoFrame);
scroll_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scroll_area->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- scroll_area->setStyleSheet(QLatin1String("QScrollArea { border: none; background-color: #2b2b2b; }"));
+
+ // High DPI support: Scroll area will inherit scaling from parent
+
+ // Set style with high DPI aware styling
+ scroll_area->setStyleSheet(QLatin1String(
+ "QScrollArea { "
+ "border: none; "
+ "background-color: #2b2b2b; "
+ "}"
+ "QScrollArea > QWidget > QWidget { "
+ "background-color: #2b2b2b; "
+ "}"
+ "QScrollBar:vertical { "
+ "background-color: #3d3d3d; "
+ "width: 14px; "
+ "border-radius: 7px; "
+ "margin: 2px; "
+ "}"
+ "QScrollBar::handle:vertical { "
+ "background-color: #5d5d5d; "
+ "border-radius: 6px; "
+ "min-height: 30px; "
+ "margin: 1px; "
+ "}"
+ "QScrollBar::handle:vertical:hover { "
+ "background-color: #4a9eff; "
+ "}"
+ "QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { "
+ "border: none; "
+ "background: none; "
+ "height: 0px; "
+ "}"
+ "QScrollBar:horizontal { "
+ "background-color: #3d3d3d; "
+ "height: 14px; "
+ "border-radius: 7px; "
+ "margin: 2px; "
+ "}"
+ "QScrollBar::handle:horizontal { "
+ "background-color: #5d5d5d; "
+ "border-radius: 6px; "
+ "min-width: 30px; "
+ "margin: 1px; "
+ "}"
+ "QScrollBar::handle:horizontal:hover { "
+ "background-color: #4a9eff; "
+ "}"
+ "QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { "
+ "border: none; "
+ "background: none; "
+ "width: 0px; "
+ "}"
+ ));
+
return scroll_area;
}
@@ -81,16 +134,28 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,
setWindowFlags(Qt::Dialog | Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
+ // High DPI support: Set proper attributes for scaling
+ setAttribute(Qt::WA_TranslucentBackground, false);
+ setAttribute(Qt::WA_NoSystemBackground, false);
+ setAttribute(Qt::WA_DontShowOnScreen, false);
+
ui->setupUi(this);
// Set size policy and enable resizing
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- // Get screen geometry and set to fullscreen
+ // Get screen geometry and set to fullscreen with high DPI awareness
QScreen* screen = QApplication::primaryScreen();
if (screen) {
QRect screenGeometry = screen->availableGeometry();
- setGeometry(screenGeometry);
+
+ // Calculate logical size based on device pixel ratio for high DPI support
+ qreal devicePixelRatio = screen->devicePixelRatio();
+ int logicalWidth = static_cast(screenGeometry.width() / devicePixelRatio);
+ int logicalHeight = static_cast(screenGeometry.height() / devicePixelRatio);
+
+ // Set geometry using logical units
+ setGeometry(0, 0, logicalWidth, logicalHeight);
showMaximized(); // Start maximized/fullscreen
}
diff --git a/src/citron/main.cpp b/src/citron/main.cpp
index c417fb96d..7c2f20214 100644
--- a/src/citron/main.cpp
+++ b/src/citron/main.cpp
@@ -183,6 +183,7 @@ Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
#ifdef _WIN32
#include
+#include
extern "C" {
// tells Nvidia and AMD drivers to use the dedicated GPU by default on laptops with switchable
// graphics
@@ -5252,8 +5253,29 @@ static void SetHighDPIAttributes() {
Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif
+ // Enable high DPI scaling and pixmaps
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
+
+ // Set the DPI awareness for better scaling on Windows
+#ifdef _WIN32
+ // Enable Per Monitor DPI Awareness for Windows 8.1+
+ SetProcessDPIAware();
+
+ // For Windows 10+, use Per Monitor v2 DPI Awareness
+ // This provides better scaling for multi-monitor setups
+ HMODULE shcore = LoadLibrary(L"shcore.dll");
+ if (shcore) {
+ typedef HRESULT(WINAPI* SetProcessDpiAwarenessFunc)(int);
+ SetProcessDpiAwarenessFunc setProcessDpiAwareness =
+ (SetProcessDpiAwarenessFunc)GetProcAddress(shcore, "SetProcessDpiAwareness");
+ if (setProcessDpiAwareness) {
+ // PROCESS_PER_MONITOR_DPI_AWARE_V2 = 2
+ setProcessDpiAwareness(2);
+ }
+ FreeLibrary(shcore);
+ }
+#endif
}
int main(int argc, char* argv[]) {