From d968dc71c978c79118f6c3cf267bf06908bcc374 Mon Sep 17 00:00:00 2001 From: meizhigang Date: Tue, 10 Jan 2023 17:28:14 +0800 Subject: [PATCH] fix(display): Fix user add custom mode display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 适配用户自定义分辨率显示 Signed-off-by: meizhigang --- plugins/display/display-monitor.cpp | 11 ++++------- plugins/display/xrandr-manager.cpp | 20 ++++++++++++-------- plugins/display/xrandr-manager.h | 13 +++++++------ 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/plugins/display/display-monitor.cpp b/plugins/display/display-monitor.cpp index c063925..cefecea 100644 --- a/plugins/display/display-monitor.cpp +++ b/plugins/display/display-monitor.cpp @@ -112,10 +112,7 @@ std::string DisplayMonitor::generate_cmdline(bool priamry) } else { - result += fmt::format(" --mode {0}x{1} --rate {2}", - mode->width, - mode->height, - mode->refresh_rate); + result += fmt::format(" --mode 0x{0:x}", mode->id); } if (this->monitor_info_.x >= 0 && this->monitor_info_.y >= 0) @@ -228,7 +225,7 @@ void DisplayMonitor::ListModes(MethodInvocation &invocation) auto monitor = XrandrManager::get_instance()->get_mode(mode_id); if (monitor) { - result.push_back(*monitor.get()); + result.push_back(std::make_tuple(monitor->id, monitor->width, monitor->height, monitor->refresh_rate)); } else { @@ -248,7 +245,7 @@ void DisplayMonitor::ListPreferredModes(MethodInvocation &invocation) auto monitor = XrandrManager::get_instance()->get_mode(this->monitor_info_.modes[i]); if (monitor) { - result.push_back(*monitor.get()); + result.push_back(std::make_tuple(monitor->id, monitor->width, monitor->height, monitor->refresh_rate)); } else { @@ -266,7 +263,7 @@ void DisplayMonitor::GetCurrentMode(MethodInvocation &invocation) auto monitor = XrandrManager::get_instance()->get_mode(this->monitor_info_.mode); if (monitor) { - result = *monitor.get(); + result = std::make_tuple(monitor->id, monitor->width, monitor->height, monitor->refresh_rate); invocation.ret(result); } else diff --git a/plugins/display/xrandr-manager.cpp b/plugins/display/xrandr-manager.cpp index a92501b..4f6b2e6 100644 --- a/plugins/display/xrandr-manager.cpp +++ b/plugins/display/xrandr-manager.cpp @@ -77,21 +77,24 @@ CrtcInfo::CrtcInfo(RRCrtc crtc_id, XRRCrtcInfo* crtc_info) : id(crtc_id), ModeInfo::ModeInfo() : id(0), width(0), height(0), - refresh_rate(0) + refresh_rate(0), + name(std::string("")) { } ModeInfo::ModeInfo(XRRModeInfo* mode_info) : id(mode_info->id), width(mode_info->width), height(mode_info->height), - refresh_rate((mode_info->dotClock / (double)mode_info->hTotal) / mode_info->vTotal) + refresh_rate((mode_info->dotClock / (double)mode_info->hTotal) / mode_info->vTotal), + name(std::string(mode_info->name)) { } -ModeInfo::ModeInfo(std::tuple mode_info) : id(std::get<0>(mode_info)), - width(std::get<1>(mode_info)), - height(std::get<2>(mode_info)), - refresh_rate(std::get<3>(mode_info)) +ModeInfo::ModeInfo(std::tuple mode_info) : id(std::get<0>(mode_info)), + width(std::get<1>(mode_info)), + height(std::get<2>(mode_info)), + refresh_rate(std::get<3>(mode_info)), + name(std::get<4>(mode_info)) { } @@ -485,11 +488,12 @@ void XrandrManager::load_mods() auto mode = std::make_shared(&this->resources_->modes[i]); this->modes_.emplace(mode->id, mode); - KLOG_DEBUG("mode(%u) width: %u, height: %u refresh_rate: %f.", + KLOG_DEBUG("mode(%u) width: %u, height: %u refresh_rate: %f name: %s.", mode->id, mode->width, mode->height, - mode->refresh_rate); + mode->refresh_rate, + mode->name.c_str()); } } diff --git a/plugins/display/xrandr-manager.h b/plugins/display/xrandr-manager.h index 90677d0..e87ac19 100644 --- a/plugins/display/xrandr-manager.h +++ b/plugins/display/xrandr-manager.h @@ -99,27 +99,28 @@ struct ModeInfo { ModeInfo(); ModeInfo(XRRModeInfo* mode_info); - ModeInfo(std::tuple mode_info); + ModeInfo(std::tuple mode_info); RRMode id; - // mode的名字 - // std::string name; // 分辨率大小 unsigned int width; unsigned int height; // 刷新率 double refresh_rate; + // mode的名字 + std::string name; - operator std::tuple() const + operator std::tuple() const { - return std::make_tuple(id, width, height, refresh_rate); + return std::make_tuple(id, width, height, refresh_rate, name); } - ModeInfo& operator=(const std::tuple& value) + ModeInfo& operator=(const std::tuple& value) { this->id = std::get<0>(value); this->width = std::get<1>(value); this->height = std::get<2>(value); this->refresh_rate = std::get<3>(value); + this->name = std::get<4>(value); return *this; } }; -- 2.27.0