diff --git a/Userland/Applications/DisplaySettings/MonitorSettings.gml b/Userland/Applications/DisplaySettings/MonitorSettings.gml index fc15a4d8d8..e03f842e19 100644 --- a/Userland/Applications/DisplaySettings/MonitorSettings.gml +++ b/Userland/Applications/DisplaySettings/MonitorSettings.gml @@ -24,7 +24,7 @@ @GUI::Label { text: "Screen:" text_alignment: "CenterLeft" - fixed_width: 95 + fixed_width: 55 } @GUI::ComboBox { diff --git a/Userland/Applications/DisplaySettings/MonitorSettingsWidget.cpp b/Userland/Applications/DisplaySettings/MonitorSettingsWidget.cpp index 079a017a70..6d8cea4ff5 100644 --- a/Userland/Applications/DisplaySettings/MonitorSettingsWidget.cpp +++ b/Userland/Applications/DisplaySettings/MonitorSettingsWidget.cpp @@ -7,7 +7,6 @@ #include "MonitorSettingsWidget.h" #include -#include #include #include #include @@ -100,16 +99,45 @@ void MonitorSettingsWidget::create_frame() m_dpi_label = *find_descendant_of_type_named("display_dpi"); } +static String display_name_from_edid(EDID::Parser const& edid) +{ + auto manufacturer_name = edid.manufacturer_name(); + auto product_name = edid.display_product_name(); + + auto build_manufacturer_product_name = [&]() { + if (product_name.is_null() || product_name.is_empty()) + return manufacturer_name; + return String::formatted("{} {}", manufacturer_name, product_name); + }; + + if (auto screen_size = edid.screen_size(); screen_size.has_value()) { + auto diagonal_inch = hypot(screen_size.value().horizontal_cm(), screen_size.value().vertical_cm()) / 2.54; + return String::formatted("{} {}\"", build_manufacturer_product_name(), roundf(diagonal_inch)); + } + + return build_manufacturer_product_name(); +} + void MonitorSettingsWidget::load_current_settings() { m_screen_layout = GUI::WindowServerConnection::the().get_screen_layout(); m_screens.clear(); + m_screen_edids.clear(); for (size_t i = 0; i < m_screen_layout.screens.size(); i++) { + String screen_display_name; + if (auto edid = EDID::Parser::from_framebuffer_device(m_screen_layout.screens[i].device, 0); !edid.is_error()) { // TODO: multihead + screen_display_name = display_name_from_edid(edid.value()); + m_screen_edids.append(edid.release_value()); + } else { + dbgln("Error getting EDID from device {}: {}", m_screen_layout.screens[i].device, edid.error()); + screen_display_name = m_screen_layout.screens[i].device; + m_screen_edids.append({}); + } if (i == m_screen_layout.main_screen_index) - m_screens.append(String::formatted("{}: {} (main screen)", i + 1, m_screen_layout.screens[i].device)); + m_screens.append(String::formatted("{}: {} (main screen)", i + 1, screen_display_name)); else - m_screens.append(String::formatted("{}: {}", i + 1, m_screen_layout.screens[i].device)); + m_screens.append(String::formatted("{}: {}", i + 1, screen_display_name)); } m_selected_screen_index = m_screen_layout.main_screen_index; m_screen_combo->set_selected_index(m_selected_screen_index); @@ -126,19 +154,18 @@ void MonitorSettingsWidget::selected_screen_index_or_resolution_changed() Optional screen_dpi; String screen_dpi_tooltip; - if (auto edid = EDID::Parser::from_framebuffer_device(screen.device, 0); !edid.is_error()) { // TODO: multihead + if (m_screen_edids[m_selected_screen_index].has_value()) { + auto& edid = m_screen_edids[m_selected_screen_index]; if (auto screen_size = edid.value().screen_size(); screen_size.has_value()) { - float x_cm = screen_size.value().horizontal_cm(); - float y_cm = screen_size.value().vertical_cm(); - float diagonal_inch = sqrtf(x_cm * x_cm + y_cm * y_cm) / 2.54f; - float diagonal_pixels = sqrtf(current_resolution.width() * current_resolution.width() + current_resolution.height() * current_resolution.height()); - if (diagonal_pixels != 0.0f) { + auto x_cm = screen_size.value().horizontal_cm(); + auto y_cm = screen_size.value().vertical_cm(); + auto diagonal_inch = hypot(x_cm, y_cm) / 2.54; + auto diagonal_pixels = hypot(current_resolution.width(), current_resolution.height()); + if (diagonal_pixels != 0.0) { screen_dpi = diagonal_pixels / diagonal_inch; screen_dpi_tooltip = String::formatted("{} inch display ({}cm x {}cm)", roundf(diagonal_inch), x_cm, y_cm); } } - } else { - dbgln("Error getting EDID from device {}: {}", screen.device, edid.error()); } if (screen_dpi.has_value()) { diff --git a/Userland/Applications/DisplaySettings/MonitorSettingsWidget.h b/Userland/Applications/DisplaySettings/MonitorSettingsWidget.h index 909624fecb..965478fe47 100644 --- a/Userland/Applications/DisplaySettings/MonitorSettingsWidget.h +++ b/Userland/Applications/DisplaySettings/MonitorSettingsWidget.h @@ -8,6 +8,7 @@ #include "MonitorWidget.h" #include +#include #include #include #include @@ -45,6 +46,7 @@ private: WindowServer::ScreenLayout m_screen_layout; Vector m_screens; + Vector> m_screen_edids; Vector m_resolutions; RefPtr m_monitor_widget;