From 75df7db66f307528cf59cc78935c317ae0a054fc Mon Sep 17 00:00:00 2001 From: fengli Date: Thu, 9 Nov 2023 21:03:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BE=85=E6=9C=BA=E5=90=8E=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E9=80=9A=E8=BF=87PS2=E9=BC=A0=E6=A0=87=E5=94=A4?= =?UTF-8?q?=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复待机后不能通过PS2鼠标唤醒 Log: 修复待机后不能通过PS2鼠标唤醒 Bug: https://pms.uniontech.com/bug-view-219597.html --- .../src/DeviceManager/DeviceInput.cpp | 24 ++++++- .../src/Page/PageSingleInfo.cpp | 2 +- .../src/WakeupControl/DBusWakeupInterface.cpp | 63 ++++++++++++++----- .../src/WakeupControl/DBusWakeupInterface.h | 4 +- .../src/Widget/TextBrowser.cpp | 2 +- 5 files changed, 72 insertions(+), 23 deletions(-) diff --git a/deepin-devicemanager/src/DeviceManager/DeviceInput.cpp b/deepin-devicemanager/src/DeviceManager/DeviceInput.cpp index 12397f5b..9d231482 100644 --- a/deepin-devicemanager/src/DeviceManager/DeviceInput.cpp +++ b/deepin-devicemanager/src/DeviceManager/DeviceInput.cpp @@ -399,8 +399,21 @@ bool DeviceInput::isWakeupMachine() return false; } QString info = file.readAll(); - if (info.contains("disabled")) - return false; + + if (m_Name.contains("PS/2")) { +// QStringList lines = info.split("\n"); +// for (QString line : lines) { +// if (line.startsWith("PS2M" && line.contains("disabled"))) { +// return false; +// } + // /proc/acpi/wakeup文件中状态未刷新,ps2设备通过dbus获取状态 + return DBusWakeupInterface::getInstance()->isInputWakeupMachine(m_SysPath, m_Name); + + } else { + if (info.contains("disabled")) + return false; + } + return true; } @@ -410,7 +423,12 @@ QString DeviceInput::wakeupPath() if (index < 1) { return ""; } - return QString("/sys") + m_SysPath.left(index) + QString("/power/wakeup"); + + if (m_Name.contains("PS/2")) { + return "/proc/acpi/wakeup"; + } else { + return QString("/sys") + m_SysPath.left(index) + QString("/power/wakeup"); + } } const QString &DeviceInput::wakeupID() diff --git a/deepin-devicemanager/src/Page/PageSingleInfo.cpp b/deepin-devicemanager/src/Page/PageSingleInfo.cpp index 11a3b49f..2b37eaea 100644 --- a/deepin-devicemanager/src/Page/PageSingleInfo.cpp +++ b/deepin-devicemanager/src/Page/PageSingleInfo.cpp @@ -349,7 +349,7 @@ void PageSingleInfo::slotWakeupMachine() // 键盘鼠标唤醒机器 DeviceInput *input = qobject_cast(mp_Device); if (input && !input->wakeupID().isEmpty() && !input->sysPath().isEmpty()) { - DBusWakeupInterface::getInstance()->setWakeupMachine(input->wakeupID(), input->sysPath(), mp_WakeupMachine->isChecked()); + DBusWakeupInterface::getInstance()->setWakeupMachine(input->wakeupID(), input->sysPath(), mp_WakeupMachine->isChecked(), input->name()); } // 网卡的远程唤醒 diff --git a/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.cpp b/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.cpp index 52899bcf..6206cacc 100644 --- a/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.cpp +++ b/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.cpp @@ -29,23 +29,46 @@ DBusWakeupInterface::DBusWakeupInterface() init(); } -bool DBusWakeupInterface::setWakeupMachine(const QString &unique_id, const QString &path, bool wakeup) +bool DBusWakeupInterface::setWakeupMachine(const QString &unique_id, const QString &path, bool wakeup, const QString &name) { if (nullptr != mp_InputIface && mp_InputIface->isValid()) { QStringList pathList = path.split("/", QString::SkipEmptyParts); if (pathList.size() < 3) return false; - auto metaObject = mp_InputIface->metaObject(); - for (int i = 0 ; i < metaObject->methodCount(); ++i) { - if (metaObject->method(i).name() == "SetWakeupDevices") { - QString curPath = pathList[pathList.size() - 2]; - QString busPath = QString("/sys/bus/usb/devices/%1/power/wakeup").arg(curPath); - mp_InputIface->call("SetWakeupDevices", busPath, wakeup ? "enabled" : "disabled"); - return true; + if (name.contains("PS/2")) { + // ps2设备无法通过/sys/devices/platform/i8042/serio1/power/wakeup控制,只能通过acpi的接口进行控制 + QDBusInterface interface(INPUT_SERVICE_NAME, INPUT_WAKEUP_SERVICE_PATH, INPUT_WAKEUP_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); + if (interface.isValid()) { + QDBusMessage replay = interface.call("Get", INPUT_WAKEUP_INTERFACE, "SupportWakeupDevices"); + QVariant v = replay.arguments().first(); + if (v.isValid()) { + QDBusArgument arg = v.value().variant().value(); + QMap allSupportWakeupDevices; + arg >> allSupportWakeupDevices; + QStringList pathList = allSupportWakeupDevices.keys(); + + for (QString path : pathList) { + if (path.contains("PS2")) { + mp_InputIface->call("SetWakeupDevices", path, wakeup ? "enabled" : "disabled"); + return true; + } + } + } + } + } else { + auto metaObject = mp_InputIface->metaObject(); + for (int i = 0 ; i < metaObject->methodCount(); ++i) { + if (metaObject->method(i).name() == "SetWakeupDevices") { + QString curPath = pathList[pathList.size() - 2]; + QString busPath = QString("/sys/bus/usb/devices/%1/power/wakeup").arg(curPath); + mp_InputIface->call("SetWakeupDevices", busPath, wakeup ? "enabled" : "disabled"); + return true; + } } } } + QDBusReply reply = mp_Iface->call("setWakeupMachine", unique_id, path, wakeup); if (reply.isValid()) { return reply.value(); @@ -81,7 +104,7 @@ bool DBusWakeupInterface::canInputWakeupMachine(const QString &path) return file.open(QIODevice::ReadOnly); } -bool DBusWakeupInterface::isInputWakeupMachine(const QString &path) +bool DBusWakeupInterface::isInputWakeupMachine(const QString &path, const QString &name) { if (nullptr != mp_InputIface && mp_InputIface->isValid()) { QDBusInterface interface(INPUT_SERVICE_NAME, INPUT_WAKEUP_SERVICE_PATH, INPUT_WAKEUP_PROPERTIES_INTERFACE, QDBusConnection::systemBus()); @@ -93,13 +116,21 @@ bool DBusWakeupInterface::isInputWakeupMachine(const QString &path) QMap allSupportWakeupDevices; arg >> allSupportWakeupDevices; - QString curPath = path.left(path.size() - 13); - int index = curPath.lastIndexOf('/'); - if (index < 1) - return false; - curPath = curPath.right(curPath.size() - index - 1); - QString busPath = QString("/sys/bus/usb/devices/%1/power/wakeup").arg(curPath); - return (allSupportWakeupDevices.contains(busPath) && allSupportWakeupDevices[busPath] == "enabled"); + if (name.contains("PS/2")) { + for(QString path : allSupportWakeupDevices.keys()) { + if (path.contains("PS2")) { + return allSupportWakeupDevices[path] == "enabled"; + } + } + } else { + QString curPath = path.left(path.size() - 13); + int index = curPath.lastIndexOf('/'); + if (index < 1) + return false; + curPath = curPath.right(curPath.size() - index - 1); + QString busPath = QString("/sys/bus/usb/devices/%1/power/wakeup").arg(curPath); + return (allSupportWakeupDevices.contains(busPath) && allSupportWakeupDevices[busPath] == "enabled"); + } } } } diff --git a/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.h b/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.h index 79fe7764..d9e8e995 100644 --- a/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.h +++ b/deepin-devicemanager/src/WakeupControl/DBusWakeupInterface.h @@ -40,7 +40,7 @@ class DBusWakeupInterface * @param wakeup 可唤醒 不可唤醒 * @return */ - bool setWakeupMachine(const QString &unique_id, const QString &path, bool wakeup); + bool setWakeupMachine(const QString &unique_id, const QString &path, bool wakeup, const QString &name); /** * @brief canWakeupMachine 获取input是否支持唤醒 @@ -54,7 +54,7 @@ class DBusWakeupInterface * @param path 设备节点路径 * @return */ - bool isInputWakeupMachine(const QString &path); + bool isInputWakeupMachine(const QString &path, const QString &name); /** * @brief isNetworkWakeup 获取网卡是否支持远程唤醒 diff --git a/deepin-devicemanager/src/Widget/TextBrowser.cpp b/deepin-devicemanager/src/Widget/TextBrowser.cpp index eb6d2a0d..33dbdb1d 100644 --- a/deepin-devicemanager/src/Widget/TextBrowser.cpp +++ b/deepin-devicemanager/src/Widget/TextBrowser.cpp @@ -111,7 +111,7 @@ void TextBrowser::setWakeupMachine(bool wakeup) // 键盘鼠标唤醒机器 DeviceInput *input = qobject_cast(mp_Info); if(input && !input->wakeupID().isEmpty() && !input->sysPath().isEmpty()){ - DBusWakeupInterface::getInstance()->setWakeupMachine(input->wakeupID(),input->sysPath(),wakeup); + DBusWakeupInterface::getInstance()->setWakeupMachine(input->wakeupID(),input->sysPath(),wakeup, input->name()); } // 网卡的远程唤醒