feat: GPU切换回退保护逻辑

- switchGpu切换前写入备份文件(.gpu-switch-backup)记录之前模式
- init()检测未确认的切换,启动30秒自动回退计时器
- QML弹出'显示是否正常'确认覆盖层,支持手动确认/回退/超时自动回退
- confirmSwitchSuccess()用户确认正常后删除备份
- restoreFromBackup()自动恢复之前模式并发送通知
- primeOffloadEnabled属性检测当前PRIME offload状态
- switchGpu改用environment.d方式,不需要root/pkexec
- 翻译更新:回退确认相关8条新增
This commit is contained in:
2026-07-14 22:15:52 +08:00
parent 64408bf842
commit 9e474de717
5 changed files with 349 additions and 11 deletions
+17
View File
@@ -47,6 +47,9 @@ class GraphicsDriverApplet : public DApplet
Q_PROPERTY(QVariantList tempHistory READ tempHistory NOTIFY tempHistoryChanged)
Q_PROPERTY(QStringList gpuProcesses READ gpuProcesses NOTIFY gpuProcessesChanged)
Q_PROPERTY(bool tempAlertEnabled READ tempAlertEnabled WRITE setTempAlertEnabled NOTIFY tempAlertEnabledChanged)
Q_PROPERTY(bool primeOffloadEnabled READ primeOffloadEnabled NOTIFY primeOffloadEnabledChanged)
Q_PROPERTY(bool switchPending READ switchPending NOTIFY switchPendingChanged)
Q_PROPERTY(int restoreCountdown READ restoreCountdown NOTIFY restoreCountdownChanged)
public:
explicit GraphicsDriverApplet(QObject *parent = nullptr);
@@ -66,10 +69,15 @@ public:
QStringList gpuProcesses() const;
bool tempAlertEnabled() const;
void setTempAlertEnabled(bool enabled);
bool primeOffloadEnabled() const;
bool switchPending() const;
int restoreCountdown() const;
Q_INVOKABLE void refreshDeviceInfo();
Q_INVOKABLE void refreshStats();
Q_INVOKABLE bool switchGpu(const QString &mode);
Q_INVOKABLE void confirmSwitchSuccess();
Q_INVOKABLE void restoreSwitch();
signals:
void deviceInfoChanged();
@@ -82,6 +90,9 @@ signals:
void tempHistoryChanged();
void gpuProcessesChanged();
void tempAlertEnabledChanged();
void primeOffloadEnabledChanged();
void switchPendingChanged();
void restoreCountdownChanged();
private:
void detectGpus();
@@ -90,6 +101,9 @@ private:
void detectGpuMode();
void checkTempAlert();
void sendNotification(const QString &summary, const QString &body);
void restoreFromBackup();
static QString primeConfigPath();
static QString backupFilePath();
static int findDrmCard(const QString &pciId);
static QStringList runCommand(const QString &cmd, const QStringList &args);
static QString parseGpuName(const QString &line);
@@ -110,6 +124,9 @@ private:
// 温度告警冷却时间戳
qint64 m_lastAlertTime;
bool m_tempAlertEnabled;
bool m_switchPending;
int m_restoreCountdown;
QTimer *m_restoreTimer;
};
DS_END_NAMESPACE