1

我一直在尝试为 SDDM 配置一个新主题,但是无论我在设置窗口中进行更改还是在 /etc/sddm.conf 中手动进行更改,嵌入式默认欢迎程序仍然是我在启动时得到的,并且默认锁定屏幕仍然是我睡后得到的那个。我在 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 年就看到人们有同样的问题,但我在任何地方都找不到解决办法。

4

1 回答 1

2

它实际上并没有忽略它——或者更确切地说:它很复杂。

我有同样的问题,所以我检查了它是如何工作的:

在 sddm 源文件daemon/PowerManager.cpp中列出了几个后端,应该如何处理按下关机或重启按钮,其中只有一个使用HaltCommandfrom /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,当您按下屏幕上的按钮时,您非常渴望执行该命令。

我不知道,如果HaltCommandin/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);
    }
}

总而言之,您可以尝试研究(从解决问题到变通方法):

  1. 你的主题在路上吗?尝试给出绝对路径!检查/var/log/sddm.log/var/log/syslog查看此"The configured theme" << themeName << "doesn't exist, using the embedded theme instead"错误消息!
  2. 尝试添加themeDir
  3. 你的主题有metadata.desktop文件吗?如果不是,请尝试重命名/符号链接一个看起来可能是主题版本的文件
  4. sddm --example-config打印您当前的配置;如果它弹出一个[theme] Current,复制/符号链接你的主题在那个位置(也许备份原来的),看看会发生什么

注意:除了“此文件是否存在?”之外,我没有在代码中看到任何其他使用主题的条件。- 这并不意味着他们不在那里。但是,我确实看到该主题用于创建用户图标、用户面孔等,因此它可能由于某些资源丢失而失败 - 我怀疑是这种情况,但有可能。

虽然这不是一个完整的答案,但我已经看过代码,所以我试了一下,我希望我找到了一些你可以用来解决问题的东西!

于 2019-03-04T04:56:07.893 回答