From 6565ec59fafd1aec63d4325d3088b04515fa5dc2 Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 17 Jan 2022 16:56:48 -0700 Subject: [PATCH] DisplaySettings: Show display's manufacturer and size instead of device Rather than displaying the path of the framebuffer, try and display the manufacturer name and the size of the display. If no EDID data is available, fall back to showing the device path. --- .../DisplaySettings/MonitorSettings.gml | 2 +- .../DisplaySettings/MonitorSettingsWidget.cpp | 49 ++++++++++++++----- .../DisplaySettings/MonitorSettingsWidget.h | 2 + 3 files changed, 41 insertions(+), 12 deletions(-) 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;