我一直在尝试为SDDM配置一个新的主题,但无论我在设置窗口中进行哪些更改或在/etc/sddm.conf中手动执行,嵌入式默认的greeter仍然是我在启动时获得的,并且是默认的锁定屏幕仍然是我睡觉后得到的那个。我在Fedora 28,KDE 5.13.5,内核4.19,试图将Chili设置为我的锁屏和欢迎。通过KDE的SDDM设置GUI安装它,检查安装目录和所有应有的位置。这是我的/etc/sddm.conf:
│ File: sddm.conf
│________________________
1 │ [Autologin]
2 │ Relogin=false
3 │ Session=plasma.desktop
4 │ User=renard
5 │
6 │ [General]
7 │ Numlock=on
8 │ HaltCommand=
9 │ RebootCommand=
10 │
11 │ [Theme]
12 │ Current=plasma-chili
13 │ CursorTheme=Adwaita
14 │
15 │ [Users]
16 │ MaximumUid=65000
17 │ MinimumUid=1000
使用sddm-greeter --test-mode --theme /usr/share/sddm/themes/plasma-chili/
时,主题也可以正常使用。我无法访问看似正常的/ var / lib / ssdm,而且我的任何地方都没有sddm.conf.d文件夹。更令人费解的是,这是我在来到这里之前已经阅读过的一个问题,而且我看到2014年以后的人有同样的问题,但我无法在任何地方找到解决办法。
它实际上并没有忽略它 - 或者更确切地说:它很复杂。
我有同样的问题,所以我检查了它是如何工作的:
在sddm源文件daemon/PowerManager.cpp
中列出了几个后端,如何处理关闭或重启按钮,并且只有其中一个使用来自HaltCommand
的/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
中的/etc/fstab
是一个正在进行中的功能,最终将在每个后端实现,或者文档被破坏,因为它没有提到这只能用于特定的后端。 ..
我没有查看整个代码,所以甚至可能的意图是如果在sddm.conf中显示HaltCommand,那么无论后端如何,该命令都应该被执行,只有它们没有实现它,或者他们随着时间的推移忘记了
我正在使用Debian Stretch和systemd,所以我很确定,我有LOGIN1 && ConsoleKit2后端。 Wile这不是理想的,至少我现在知道我没有弄乱配置,相反,我想要的不能用sddm调整...
注意:我使用Debian源代码中的sddm-0.14.0代码进行调查。我检查了最新消息来源
看起来,这段代码没有改变。
虽然,我没有检查它(甚至不确定,怎么做),似乎,如果你切换到UPower
后端,你将获得HaltCommand
功能。
此外,在我看来,所有后端中的几个if
-s都可以使用HaltCommand
,无论何时用户默认更改它。
当我在它时,检查最新源中的Current
配置项会发生什么。它似乎应该工作:
这是[theme]配置,代码看到它:
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中 - 如果找不到它:
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
。
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
,复制/符号链接你在该位置的主题(也许备份原始),看看会发生什么注意:除了“这个文件是否存在?”之外,我在代码中没有看到使用主题的任何条件。 - 这并不意味着他们不在那里。但是,我确实看到主题用于创建用户图标,用户脸,无论如何,所以它可能因为一些缺失的资源而失败 - 我怀疑是这种情况,但它是可能的。
虽然它不是一个完整的答案,但我已经查看了代码,所以我试了一下,我希望我找到了可以用来解决问题的东西!