SDDM игнорирует пользовательскую конфигурацию (/etc/sddm.conf) - PullRequest
0 голосов
/ 14 ноября 2018

Я пытался настроить новую тему для 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 года, у которых были такие же проблемы, но я нигде не мог найти решение.

1 Ответ

0 голосов
/ 04 марта 2019

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

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

В исходном файле 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 / демон / PowerManager.cpp

И, похоже, этот код не изменился.

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

Кроме того, мне кажется, что пара if -х во всех бэкэндах могла бы использовать HaltCommand, когда бы пользователь не изменил значение по умолчанию.


Пока я на нем, проверил, что происходит с элементом конфигурации Current в последнем источнике. Кажется, должно работать:

Вот конфиг [theme], как его видит код:

ЦСИ / общие / 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"));
    );

Это часть, где тема "Current" фактически анализируется и проверяется. Похоже, она должна дать вам предупреждение - может быть, в /var/log/sddm.log - если она не найдет:

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

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

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

...