Это на самом деле не игнорирует его - или, скорее: это сложно.
У меня была такая же проблема, поэтому я проверил, как это работает:
В исходном файле 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);
}
}
В целом, вы можете попробовать изучить (от решения проблем до обхода):
- ваша тема на пути? попробуйте указать абсолютный путь! проверьте
/var/log/sddm.log
, а также /var/log/syslog
для этого сообщения об ошибке "The configured theme" << themeName << "doesn't exist, using the embedded theme instead"
!
- попробуйте добавить
themeDir
- в вашей теме есть файл
metadata.desktop
? если нет, попробуйте переименовать / создать символическую ссылку на файл, который может быть версией темы.
sddm --example-config
печатает вашу текущую конфигурацию; если появится [theme] Current
, скопируйте/символизируйте свою тему в этом месте (возможно, создайте резервную копию оригинала) и посмотрите, что произойдет
ПРИМЕЧАНИЕ. Я не видел в коде других условий для использования темы, кроме «существует ли этот файл?» - это не значит, что их нет. Тем не менее, я видел, что тема используется для создания пользовательских значков, пользовательского лица и т. д., поэтому возможен сбой из-за отсутствия некоторых ресурсов в будущем — я сомневаюсь, что это так, но это возможно.
Хотя это не полный ответ, я уже посмотрел код, поэтому попробовал, надеюсь, я нашел что-то, что вы можете использовать для решения проблемы!
person
Zoltan K.
schedule
04.03.2019