我一直在尝试为SDDM配置一个新的主题,但是无论我在/etc/sddm.conf中做了什么设置窗口或手动更改,嵌入式默认greeter仍然是我在引导时得到的,默认的锁定屏幕仍然是我睡后得到的。我在Fedora 28,KDE 5.13.5,内核4.19,试图设置辣椒作为我的锁定屏幕和问候。通过KDE的SDDM设置GUI安装它,检查install,一切都在它应该在的位置。这是我的/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年以来的人们也有同样的问题,但我在任何地方都找不到解决办法。
发布于 2019-03-04 04:56:07
它实际上并没有忽视它--或者说,它是复杂的。
我也有同样的问题,所以我检查了它是如何工作的:
在sddm源文件daemon/PowerManager.cpp中,列出了几个后端,应该如何处理按下关机或重新启动按钮,其中只有一个使用来自/etc/sddm.conf的HaltCommand。
对于关闭/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是一个正在进行的特性,它最终将在每个后端中实现,或者文档被破坏,因为它没有提到这只会对特定的后端起作用.
我没有检查整个代码,所以可能的目的是,如果HaltCommand是以sddm.conf表示的,那么无论后端如何,都应该执行该命令,只是它们没有时间来实现它,或者随着时间的推移而忘记了它。
我使用的是带有systemd的Debian扩展,所以我非常肯定,我有LOGIN1 && ConsoleKit2后端。这是不理想的,至少我现在知道我没有搞砸配置,相反,我想要做的是不能通过调整.
注意:我正在使用Debian源代码中的sddm-0.14.0代码进行调查。我查了最新的消息来源
看起来,这段代码并没有改变。
尽管我没有检查它(甚至不确定该如何做),但是如果切换到UPower后端,您将获得HaltCommand功能。
而且,在我看来,所有后端中的几个if-s都会起到使用HaltCommand的作用,只要用户将其从默认状态更改。
在此期间,请检查最新源代码中的Current配置项发生了什么。看来,它应该有效:
下面是主题配置,正如代码所看到的那样:
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 in 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"错误消息!themeDirmetadata.desktop文件吗?如果不是,尝试重命名/符号链接一个文件,该文件看起来可能是主题的版本。sddm --example-config打印您当前的配置;如果它弹出一个[theme] Current,复制/符号链接您的主题在那个位置(可能备份原始),看看会发生什么。注意:除了“这个文件存在吗?”之外,我没有在代码中看到任何使用主题的条件--这并不意味着它们不存在。然而,我确实看到了这个主题被用来创建用户图标,用户脸,任何东西,所以它有可能因为缺少一些资源而失败--我怀疑这是真的,但这是可能的。
虽然这不是一个完整的答案,但我已经看过了代码,所以我试了一下,我希望我找到了一些你可以用来解决问题的东西!
https://stackoverflow.com/questions/53301772
复制相似问题