153 lines
6.5 KiB
Diff
153 lines
6.5 KiB
Diff
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
|
|
|