首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDDM忽略自定义配置(/etc/sddm.conf)

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

Stack Overflow用户
提问于 2018-11-14 13:49:01
回答 1查看 3.2K关注 0票数 1

我一直在尝试为SDDM配置一个新的主题,但是无论我在/etc/sddm.conf中做了什么设置窗口或手动更改,嵌入式默认greeter仍然是我在引导时得到的,默认的锁定屏幕仍然是我睡后得到的。我在Fedora 28,KDE 5.13.5,内核4.19,试图设置辣椒作为我的锁定屏幕和问候。通过KDE的SDDM设置GUI安装它,检查install,一切都在它应该在的位置。这是我的/etc/sddm.conf:

代码语言:javascript
复制
       │ 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年以来的人们也有同样的问题,但我在任何地方都找不到解决办法。

EN

回答 1

Stack Overflow用户

发布于 2019-03-04 04:56:07

它实际上并没有忽视它--或者说,它是复杂的。

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

在sddm源文件daemon/PowerManager.cpp中,列出了几个后端,应该如何处理按下关机或重新启动按钮,其中只有一个使用来自/etc/sddm.confHaltCommand

对于关闭/HaltCommand,相关函数是powerOff()。

那么,powerOff()实际上是做什么的?

代码语言:javascript
复制
/************************************************/
/* 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代码进行调查。我查了最新的消息来源

src/守护进程/PowerManager.cpp

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

尽管我没有检查它(甚至不确定该如何做),但是如果切换到UPower后端,您将获得HaltCommand功能。

而且,在我看来,所有后端中的几个if-s都会起到使用HaltCommand的作用,只要用户将其从默认状态更改。

在此期间,请检查最新源代码中的Current配置项发生了什么。看来,它应该有效:

下面是主题配置,正如代码所看到的那样:

src/公共/配置。

代码语言:javascript
复制
    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/守护进程/Display.cpp

代码语言:javascript
复制
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

src/守护进程/Greeter.cpp

代码语言:javascript
复制
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,复制/符号链接您的主题在那个位置(可能备份原始),看看会发生什么。

注意:除了“这个文件存在吗?”之外,我没有在代码中看到任何使用主题的条件--这并不意味着它们不存在。然而,我确实看到了这个主题被用来创建用户图标,用户脸,任何东西,所以它有可能因为缺少一些资源而失败--我怀疑这是真的,但这是可能的。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53301772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档