SDDM忽略自定义配置(/etc/sddm.conf)

问题描述 投票:0回答:1

我一直在尝试为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年以后的人有同样的问题,但我无法在任何地方找到解决办法。

lockscreen display-manager kde-plasma fedora-28
1个回答
0
投票

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

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

在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代码进行调查。我检查了最新消息来源

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] ThemeDirsddm.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,复制/符号链接你在该位置的主题(也许备份原始),看看会发生什么

注意:除了“这个文件是否存在?”之外,我在代码中没有看到使用主题的任何条件。 - 这并不意味着他们不在那里。但是,我确实看到主题用于创建用户图标,用户脸,无论如何,所以它可能因为一些缺失的资源而失败 - 我怀疑是这种情况,但它是可能的。

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

© www.soinside.com 2019 - 2024. All rights reserved.