Это на самом деле не игнорирует это - или, скорее: это сложно.
У меня была такая же проблема, поэтому я проверил, как она работает:
В исходном файле 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);
}
}
В целом, вы можете попробовать изучить (от решения проблем до обходного пути):
- ваша тема на пути? попробуйте дать абсолютный путь! проверьте
/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
, скопируйте / вставьте ссылку на свою тему в это место (возможно, сделайте резервную копию оригинала) и посмотрите, что произойдет
ПРИМЕЧАНИЕ. Я не увидел в коде больше условий для использования темы, кроме "существует ли этот файл?" - что не значит, что их там нет. Тем не менее, я видел, что тема используется для создания пользовательских значков, лица пользователя, чего угодно, поэтому возможно, что он потерпит неудачу из-за нехватки ресурсов в будущем - я сомневаюсь, что это так, но это возможно.
Хотя это не полный ответ, я уже посмотрел код, поэтому я попробовал его, надеюсь, я нашел то, что вы можете использовать для решения проблемы!