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

时间:2018-11-14 13:49:01

标签: lockscreen display-manager kde-plasma fedora-28

我一直在尝试为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年以后的人们也遇到了同样的问题,但是我找不到任何解决方法。

1 个答案:

答案 0 :(得分: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后端。这不是很理想,至少我现在知道我没有弄乱配置,相反,我想要的东西无法通过sddm调整来完成...

注意:我正在使用Debian来源的sddm-0.14.0代码进行调查。我在以下位置查看了最新消息来源

src/daemon/PowerManager.cpp

看来,这段代码没有改变。

尽管我没有检查它(甚至不确定如何操作),但看来,如果切换到UPower后端,则会获得HaltCommand功能。

在我看来,只要用户将默认值更改为if,所有后端中的几个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")); ); 配置项目发生了什么。看来,它应该可以工作:

这是[theme]配置,如代码所示:

src/common/Configuration.h

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();
}

这是实际分析和检查“当前”主题的部分,看来,它应该给您警告-也许在/var/log/sddm.log中-如果找不到它:< / p>

src/daemon/Display.cpp

themePath/metadata.desktop

我在这里有点迷失了,但是看起来,如果在路径上找到了主题,那么它将在themePath中寻找主题配置文件,或者以某种方式可以配置自定义命名主题配置文件。我认为[theme] ThemeDir中的sddm.confvoid 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

src/daemon/Greeter.cpp

/var/log/syslog

所有方面,您都可以尝试研究(从解决问题到解决方法):

  1. 您的主题在路上吗?尝试给出绝对的路径!检查"The configured theme" << themeName << "doesn't exist, using the embedded theme instead"以及themeDir以获得此metadata.desktop错误消息!
  2. 尝试添加sddm --example-config
  3. 您的主题是否有[theme] Current文件?如果不是,请尝试重命名/符号链接一个看起来像是主题版本的文件
  4. settings.xml显示您当前的配置;如果它弹出artifact-id,请在该位置复制/符号链接主题(也许备份原始主题),然后看看会发生什么情况

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

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