@@ -21,11 +21,11 @@ AuthInterface::AuthInterface(SessionBaseModel *const model, QObject *parent)
2121 , m_accountsInter(new AccountsInter(DSS_DBUS::accountsService, DSS_DBUS::accountsPath, QDBusConnection::systemBus(), this))
2222 , m_loginedInter(new LoginedInter(DSS_DBUS::accountsService, DSS_DBUS::loginedPath, QDBusConnection::systemBus(), this))
2323 , m_login1Inter(new DBusLogin1Manager(" org.freedesktop.login1" , " /org/freedesktop/login1" , QDBusConnection::systemBus(), this))
24- , m_powerManagerInter(new PowerManagerInter(DSS_DBUS::powerManagerService, DSS_DBUS::powerManagerPath, QDBusConnection::systemBus(), this))
2524 , m_dbusInter(new DBusObjectInter(" org.freedesktop.DBus" , " /org/freedesktop/DBus" , QDBusConnection::systemBus(), this))
2625 , m_lastLogoutUid(0 )
2726 , m_currentUserUid(0 )
2827 , m_loginUserList(0 )
28+ , m_isVM(detectVirtualMachine())
2929{
3030#ifndef ENABLE_DSS_SNIPE
3131 // 需要先初始化m_gsettings
@@ -241,15 +241,11 @@ void AuthInterface::checkPowerInfo()
241241 // 替换接口org.freedesktop.login1 为com.deepin.sessionManager,原接口的是否支持待机和休眠的信息不准确
242242 QProcessEnvironment env = QProcessEnvironment::systemEnvironment ();
243243#ifndef ENABLE_DSS_SNIPE
244- bool can_sleep = env.contains (POWER_CAN_SLEEP) ? QVariant (env.value (POWER_CAN_SLEEP)).toBool ()
245- : getGSettings (" Power" ," sleep" ).toBool () && m_powerManagerInter->CanSuspend ();
246- bool can_hibernate = env.contains (POWER_CAN_HIBERNATE) ? QVariant (env.value (POWER_CAN_HIBERNATE)).toBool ()
247- : getGSettings (" Power" ," hibernate" ).toBool () && m_powerManagerInter->CanHibernate ();
244+ bool can_sleep = getGSettings (" Power" ," sleep" ).toBool () && canSuspend ();
245+ bool can_hibernate = getGSettings (" Power" ," hibernate" ).toBool () && canHibernate ();
248246#else
249- bool can_sleep = env.contains (POWER_CAN_SLEEP) ? QVariant (env.value (POWER_CAN_SLEEP)).toBool ()
250- : getDconfigValue (" sleep" , true ).toBool () && m_powerManagerInter->CanSuspend ();
251- bool can_hibernate = env.contains (POWER_CAN_HIBERNATE) ? QVariant (env.value (POWER_CAN_HIBERNATE)).toBool ()
252- : getDconfigValue (" hibernate" , true ).toBool () && m_powerManagerInter->CanHibernate ();
247+ bool can_sleep = getDconfigValue (" sleep" , true ).toBool () && canSuspend ();
248+ bool can_hibernate = getDconfigValue (" hibernate" , true ).toBool () && canHibernate ();
253249#endif
254250
255251 m_model->setCanSleep (can_sleep);
@@ -261,3 +257,44 @@ bool AuthInterface::checkIsADDomain()
261257 // 只有加入AD域后,才会生成此文件
262258 return QFile::exists (" /etc/krb5.keytab" );
263259}
260+
261+ bool AuthInterface::canSuspend ()
262+ {
263+ if (QString (getenv (" POWER_CAN_SLEEP" )) == " 0" || m_isVM)
264+ return false ;
265+
266+ // 检查内存休眠支持文件是否存在
267+ if (!QFile::exists (" /sys/power/mem_sleep" ))
268+ return false ;
269+
270+ QString canSuspend = m_login1Inter->CanSuspend ();
271+ return canSuspend == " yes" ;
272+ }
273+
274+ bool AuthInterface::canHibernate ()
275+ {
276+ if (QString (getenv (" POWER_CAN_HIBERNATE" )) == " 0" || m_isVM)
277+ return false ;
278+
279+ QString canHibernate = m_login1Inter->CanHibernate ();
280+ return canHibernate == " yes" ;
281+ }
282+
283+ bool AuthInterface::detectVirtualMachine ()
284+ {
285+ QProcess process;
286+ process.start (" /usr/bin/systemd-detect-virt" , QStringList ());
287+ // 添加超时限制,例如 3000ms
288+ if (!process.waitForFinished (3000 )) {
289+ qWarning () << " Timeout detecting virtual machine" ;
290+ return false ;
291+ }
292+
293+ if (process.exitCode () != 0 ) {
294+ qWarning () << " Failed to detect virtual machine, error:" << process.errorString ();
295+ return false ;
296+ }
297+
298+ QString name = QString::fromUtf8 (process.readAllStandardOutput ()).trimmed ();
299+ return name != " none" && !name.isEmpty ();
300+ }
0 commit comments