SDDM игнорирует пользовательскую конфигурацию (/etc/sddm.conf)

Я пытался настроить новую тему для SDDM, но независимо от того, какие изменения я делаю в окне настроек или вручную в /etc/sddm.conf, встроенный приветствующий по умолчанию по-прежнему тот, который я получаю при загрузке, и экран блокировки по умолчанию по-прежнему тот, который я получаю после сна. Я использую Fedora 28, KDE 5.13.5, ядро ​​4.19, пытаюсь установить Chili как мой экран блокировки и приветствие. Установил его через графический интерфейс настроек KDE SDDM, проверил каталог установки и все там, где оно должно быть. Вот мой файл /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 года, у которых были такие же проблемы, но я нигде не мог найти решение.


person Renard    schedule 14.11.2018    source источник
comment
Ну, этот вопрос, кажется, не популярен. Я опубликую ответ, если я когда-нибудь найду его. Кроме того, не стесняйтесь давать свои, если найдете решение, в любое время.   -  person Renard    schedule 20.11.2018


Ответы (1)


Это на самом деле не игнорирует его - или, скорее: это сложно.

У меня была такая же проблема, поэтому я проверил, как это работает:

В исходном файле 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 функцией в разработке, которая в конечном итоге будет реализована в каждом бэкэнде, или документация повреждена, поскольку в ней не упоминается, что это когда-либо будет работать только с конкретным бэкэндом. ..

Весь код я не просматривал, так что даже возможно, что намерение в том, что если HaltCommand представлена ​​в sddm.conf, то вне зависимости от бэкенда эта команда должна выполняться, вот только реализовать ее не удосужились, или забыли со временем.

Я использую Debian Stretch с systemd, поэтому я уверен, что у меня есть бэкэнд LOGIN1 && ConsoleKit2. Хотя это не идеально, по крайней мере, теперь я знаю, что я не испортил конфигурацию, скорее, то, что я хотел, не может быть сделано с настройкой sddm...

ПРИМЕЧАНИЕ. Для своего исследования я использовал код sddm-0.14.0 из исходников Debian. Я проверил последние источники на

src/daemon/PowerManager.cpp

И вроде бы этот код не изменился.

Хотя, я не проверял (даже не уверен, как это сделать), похоже, если перейти на UPower бэкенд, то получится HaltCommand функционал.

Кроме того, мне кажется, пара if во всех бэкэндах поможет использовать 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, скопируйте/символизируйте свою тему в этом месте (возможно, создайте резервную копию оригинала) и посмотрите, что произойдет

ПРИМЕЧАНИЕ. Я не видел в коде других условий для использования темы, кроме «существует ли этот файл?» - это не значит, что их нет. Тем не менее, я видел, что тема используется для создания пользовательских значков, пользовательского лица и т. д., поэтому возможен сбой из-за отсутствия некоторых ресурсов в будущем — я сомневаюсь, что это так, но это возможно.

Хотя это не полный ответ, я уже посмотрел код, поэтому попробовал, надеюсь, я нашел что-то, что вы можете использовать для решения проблемы!

person Zoltan K.    schedule 04.03.2019
comment
Это интересно, но это не моя проблема. Строки HaltCommand et RebootCommand были там до того, как я что-то написал. Моя проблема связана с приветствием и экраном блокировки. По сей день я не нашел ни способа избавиться от этого уродливого приветствия XFCE по умолчанию, ни даже изменить свой экран блокировки на Chili. - person Renard; 04.03.2019
comment
Да все верно. Я в основном ответил, читает ли это вообще мой конфиг? - что сводило меня с ума около суток. Во всяком случае, я быстро проверил, что происходит с темой, я добавил это в свой ответ. - person Zoltan K.; 06.03.2019