From d515c8cb05927eee9efc5211fda1b14c1c9e3e46 Mon Sep 17 00:00:00 2001 From: zhanghongyuan Date: Tue, 27 Oct 2026 16:14:33 +0800 Subject: [PATCH] fix(display): get monitor info from display dbus on hw platforms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 根因:Wayland 会话下 xrandr 连接的是 Xwayland,RandR 数据由 wl_output/xdg-output 仿真合成,模式经 CVT 公式生成(受全局缩放 与合成器刷新率影响),显示 2400×1350@49.93Hz 等虚假分辨率, 且输出无 EDID 属性,无法解析屏幕尺寸与厂商信息 2. 修复:HW 平台机型(Common::isHwPlatform)显示器信息优先走 com.deepin.daemon.Display DBus 获取真实模式数据,DBus 不可用 时回退 xrandr;接口类型由 DBus 连接器名切分填充 3. 影响:HW 机型在 Wayland 下显示真实分辨率/刷新率/接口类型, X11 下除 PGUV 增加 DBus 失败回退外行为不变;非 HW 机型不受影响 PMS: https://pms.uniontech.com/bug-view-380841.html --- .../src/DeviceManager/DeviceMonitor.cpp | 13 +++++++++++++ .../src/Tool/ThreadExecXrandr.cpp | 15 +++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp b/deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp index 6d766f13e..d0f79c198 100644 --- a/deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp +++ b/deepin-devicemanager/src/DeviceManager/DeviceMonitor.cpp @@ -179,7 +179,20 @@ void DeviceMonitor::setInfoFromEdidForCustom(const QMap &mapIn void DeviceMonitor::setInfoFromDbus(const QMap &mapInfo) { if (mapInfo["Name"].toLower().contains(m_DisplayInput.toLower(), Qt::CaseInsensitive)) { + QRegExp reInput("^([a-zA-Z]*)-[\\s\\S]*"); + if (m_Interface.isEmpty() && reInput.exactMatch(mapInfo["Name"])) { + m_Interface = reInput.cap(1); + } + setAttribute(mapInfo, "CurResolution", m_CurrentResolution); + + if (Common::specialComType == Common::kSpecialType10) { + QRegExp reResolution("^([0-9]{1,5})×([0-9]{1,5})@([0-9.]+)Hz$"); + if (reResolution.exactMatch(m_CurrentResolution)) { + m_CurrentResolution = QString("%1×%2").arg(reResolution.cap(1)).arg(reResolution.cap(2)); + m_RefreshRate = QString::number(ceil(reResolution.cap(3).toDouble())) + "Hz"; + } + } } } diff --git a/deepin-devicemanager/src/Tool/ThreadExecXrandr.cpp b/deepin-devicemanager/src/Tool/ThreadExecXrandr.cpp index 2d3f4e7b4..64b9f43e5 100644 --- a/deepin-devicemanager/src/Tool/ThreadExecXrandr.cpp +++ b/deepin-devicemanager/src/Tool/ThreadExecXrandr.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 -2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -50,12 +50,15 @@ void ThreadExecXrandr::run() { if (m_Gpu) { getGpuInfoFromXrandr(); - } else { - if(Common::boardVendorType() == "PGUV") { - QList> lstMap; - getResolutionRateFromDBus(lstMap); - }else + } else { + if (Common::isHwPlatform()) { + QList> lstMap; + getResolutionRateFromDBus(lstMap); + if (lstMap.isEmpty()) + getMonitorInfoFromXrandrVerbose(); + } else { getMonitorInfoFromXrandrVerbose(); + } } }