From d968dc71c978c79118f6c3cf267bf06908bcc374 Mon Sep 17 00:00:00 2001
From: meizhigang <meizhigang@kylinsec.com.cn>
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 <meizhigang@kylinsec.com.cn>
---
 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<guint32, guint32, guint32, double> 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<guint32, guint32, guint32, double, std::string> 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<ModeInfo>(&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<guint32, guint32, guint32, double> mode_info);
+    ModeInfo(std::tuple<guint32, guint32, guint32, double, std::string> mode_info);
     RRMode id;
-    // mode的名字
-    // std::string name;
     // 分辨率大小
     unsigned int width;
     unsigned int height;
     // 刷新率
     double refresh_rate;
+    // mode的名字
+    std::string name;
 
-    operator std::tuple<guint32, guint32, guint32, double>() const
+    operator std::tuple<guint32, guint32, guint32, double, std::string>() 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<guint32, guint32, guint32, double>& value)
+    ModeInfo& operator=(const std::tuple<guint32, guint32, guint32, double, std::string>& 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

