它实际上并没有忽略它——或者更确切地说:它很复杂。
我有同样的问题,所以我检查了它是如何工作的:
在 sddm 源文件daemon/PowerManager.cpp
中列出了几个后端,应该如何处理按下关机或重启按钮,其中只有一个使用HaltCommand
from /etc/sddm.conf
。
对于shutdown/HaltCommand,相关函数是powerOff()。
那么,powerOff() 实际上做了什么?
/************************************************/
/* POWER MANAGER BACKEND */
/************************************************/
virtual void powerOff() const = 0;
/**********************************************/
/* UPOWER BACKEND */
/**********************************************/
// comment from me: some reference to org.freedesktop.UPower"
void powerOff() const {
QProcess::execute(mainConfig.HaltCommand.get()); // <---------------
}
/**********************************************/
/* LOGIN1 && ConsoleKit2 BACKEND */
/**********************************************/
void powerOff() const {
m_interface->call(QStringLiteral("PowerOff"), true);
}
/**********************************************/
/* POWER MANAGER */
/**********************************************/
void PowerManager::powerOff() const {
if (daemonApp->testing())
return;
for (PowerManagerBackend *backend: m_backends) {
if (backend->capabilities() & Capability::PowerOff) {
backend->powerOff();
break;
}
}
}
被sddm.conf
读入mainConfig
,因此mainConfig.HaltCommand
保存来自 的命令/etc/sddm.conf
,当您按下屏幕上的按钮时,您非常渴望执行该命令。
我不知道,如果HaltCommand
in/etc/fstab
是一个正在进行的功能,最终将在每个后端实现,或者文档被破坏,因为它没有提到这只适用于特定的后端......
我没有仔细阅读整个代码,所以甚至有可能的意图是,如果在 sddm.conf 中提供了 HaltCommand,那么无论后端如何,都应该执行该命令,只是他们没有绕过来实现它,或者他们随着时间的推移忘记了它。
我正在使用带有 systemd 的 Debian Stretch,所以我很确定,我有 LOGIN1 && ConsoleKit2 后端。虽然这并不理想,但至少我现在知道我并没有弄乱配置,而是我想要的 sddm 调整无法完成......
注意:我使用 Debian 源代码中的 sddm-0.14.0 代码进行调查。我检查了最新的来源
src/daemon/PowerManager.cpp
看来,这段代码没有改变。
虽然,我没有检查它(甚至不确定,如何做),但似乎,如果你切换到UPower
后端,你会得到这个HaltCommand
功能。
此外,在我看来,if
所有后端中的几个 -s 都会起到使用 的技巧HaltCommand
,只要它被用户从默认值更改。
当我这样做时,检查Current
了最新源中的配置项发生了什么。看来,它应该工作:
这是 [theme] 配置,如代码所示:
src/common/Configuration.h
Section(Theme,
Entry(ThemeDir, QString, _S(DATA_INSTALL_DIR "/themes"), _S("Theme directory path"));
Entry(Current, QString, _S(""), _S("Current theme name"));
Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Global directory for user avatars\n"
"The files should be named <username>.face.icon"));
Entry(CursorTheme, QString, QString(), _S("Cursor theme used in the greeter"));
Entry(EnableAvatars, bool, true, _S("Enable display of custom user avatars"));
Entry(DisableAvatarsThreshold,int, 7, _S("Number of users to use as threshold\n"
"above which avatars are disabled\n"
"unless explicitly enabled with EnableAvatars"));
);
这是“当前”主题实际上被解析和检查的部分,它似乎应该给你一个警告 - 也许在 /var/log/sddm.log - 如果它没有找到它:
src/daemon/Display.cpp
QString Display::findGreeterTheme() const {
QString themeName = mainConfig.Theme.Current.get();
// an unconfigured theme means the user wants to load the
// default theme from the resources
if (themeName.isEmpty())
return QString();
QDir dir(mainConfig.Theme.ThemeDir.get());
// return the default theme if it exists
if (dir.exists(themeName))
return dir.absoluteFilePath(themeName);
// otherwise use the embedded theme
qWarning() << "The configured theme" << themeName << "doesn't exist, using the embedded theme instead";
return QString();
}
我在这里有点迷路,但似乎,如果在路径上找到主题,那么它会在 中查找主题配置文件,或者themePath/metadata.desktop
以某种方式您可以配置自定义命名的主题配置文件。我认为themePath
在[theme] ThemeDir
.sddm.conf
src/daemon/Greeter.cpp
void Greeter::setTheme(const QString &theme) {
m_themePath = theme;
if (theme.isEmpty()) {
m_metadata->setTo(QString());
m_themeConfig->setTo(QString());
} else {
const QString path = QStringLiteral("%1/metadata.desktop").arg(m_themePath);
m_metadata->setTo(path);
QString configFile = QStringLiteral("%1/%2").arg(m_themePath).arg(m_metadata->configFile());
m_themeConfig->setTo(configFile);
}
}
总而言之,您可以尝试研究(从解决问题到变通方法):
- 你的主题在路上吗?尝试给出绝对路径!检查
/var/log/sddm.log
并/var/log/syslog
查看此"The configured theme" << themeName << "doesn't exist, using the embedded theme instead"
错误消息!
- 尝试添加
themeDir
- 你的主题有
metadata.desktop
文件吗?如果不是,请尝试重命名/符号链接一个看起来可能是主题版本的文件
sddm --example-config
打印您当前的配置;如果它弹出一个[theme] Current
,复制/符号链接你的主题在那个位置(也许备份原来的),看看会发生什么
注意:除了“此文件是否存在?”之外,我没有在代码中看到任何其他使用主题的条件。- 这并不意味着他们不在那里。但是,我确实看到该主题用于创建用户图标、用户面孔等,因此它可能由于某些资源丢失而失败 - 我怀疑是这种情况,但有可能。
虽然这不是一个完整的答案,但我已经看过代码,所以我试了一下,我希望我找到了一些你可以用来解决问题的东西!