Вопрос или проблема
Я хочу, чтобы dwm закрывал все окна корректно, когда я нажимаю горячую клавишу выхода. Мне нравится поведение Unity: он отображает список окон, не позволяя выйти из системы (например, редакторы с несохраненными изменениями) и не выходит до тех пор, пока все проблемы не будут решены и приложения закрыты. По умолчанию, dwm просто завершает X-сессию и все запущенные приложения закрываются.
Я думал о написании скрипта, который будет получать список всех окон, корректно закрывать их и ждать завершения их процессов. Но я даже не знаю, как закрыть окна. Единственный способ, который я знаю, это использование wmctrl, и это утилита не работает с dwm.
Возможно, вам потребуется запустить dwm из X11 менеджера сеансов
Вот один из способов сделать это с помощью Gnome Display Manager (GDM)
Добавьте следующее в /usr/share/xsessions/dwm.desktop
[Desktop Entry]
Encoding=UTF-8
Name=dwm
Comment=This session starts dwm
Exec=/usr/local/bin/dwm-start
Type=Application
Создайте новый файл в /usr/local/bin/dwm-start с правами 755.
#!/bin/sh
# Вы можете добавить другие программы для установки фона, автозагрузки
# и автозагрузки для USB и подобного здесь
# Убедитесь, что вы запускаете dwm последним, так как он никогда не возвращает управление этому скрипту
exec /usr/local/bin/dwm > /dev/null
Если GDM правильно настроен на вашем компьютере, вы должны увидеть новую запись dwm в меню сеансов на экране входа в систему.
Другие настройки dwm, включая настройки для гибернации/выключения здесь.
Ответ или решение
Загрузка оконного менеджера dwm через Gnome Display Manager (GDM) и обеспечение корректного завершения его работы представляет собой задачу, которая требует как понимания характеристик dwm, так и базовых навыков работы с Linux. dwm (Dynamic Window Manager) известен своей минималистичностью и производительностью, однако по умолчанию он просто завершает X-сессию, закрывая все текущие приложения. Это может быть проблематично, если у вас открыты программы с несохраненными изменениями. В этой статье я постараюсь подробно рассказать, как можно организовать более "гибкое" завершение работы dwm, включающее проверку открытых приложений.
Теоретическая часть
dwm — это оконный менеджер для X11, написанный на языке программирования C. dwm известен своей легкостью и простотой, однако именно это может стать препятствием для более сложного управления окнами, требующего дополнительных настроек. Одной из интересных особенностей таких более "тяжелых" оконных сред, как Unity, является функция, которая предоставляет пользователю список программ, не позволяющих завершить сеанс, например, открытые редакторы с несохраненными изменениями.
Для реализации подобной функции в dwm понадобится несколько шагов:
- Конфигурация X11-сессии: dwm должен быть запущен из сессионного менеджера, такого как GDM.
- Сценарий завершения работы: нужен скрипт, который позволит идентифицировать открытые приложения, посылать им сигналы для "мягкого" завершения и, возможно, в дальнейшем интегрировать их подтверждение завершения.
- Взаимодействие с окнами: dwm не имеет встроенных инструментов управления окнами, подобных тем, что предоставляет Unity, поэтому используемые инструменты должны быть совместимы с dwm.
Пример
Начнем с настройки GDM для запуска dwm. Для этого следует создать файл конфигурации /usr/share/xsessions/dwm.desktop
, позволяющий выбрать сеанс dwm при входе:
[Desktop Entry]
Encoding=UTF-8
Name=dwm
Comment=This session starts dwm
Exec=/usr/local/bin/dwm-start
Type=Application
Следующий шаг — создать скрипт в /usr/local/bin/dwm-start
, с соответствующими правами (755):
#!/bin/sh
# Здесь можно добавить команды для настройки фона, автозагрузки и других служб
# Убедитесь, что dwm запускается последним, так как он никогда не возвращает управление обратно в скрипт
exec /usr/local/bin/dwm > /dev/null
Этот базовый скрипт запускает dwm от имени текущего пользователя. Однако, для реализации механизма "гибкого" завершения нам потребуется более сложный сценарий.
Применение
Теперь мы можем обратить внимание на реализацию завершения сеанса. Так как dwm не интегрируется напрямую с инструментами, такими как wmctrl
, стоит рассмотреть использование более низкоуровневых системных вызовов и утилит.
-
Получение списка окон: используйте
xprop
иxwininfo
для получения списка окон и связанных с ними приложений. С их помощью можно выяснить, какие программы активно используют весь экран, и отправить им сигнал для завершения работы. -
Посылка сигналов: для каждого окна или процесса можно применить команды
xdotool
или использовать сигналы POSIX для отправки предупреждений (например,SIGTERM
, а при необходимости принудительно закрыть —SIGKILL
). -
Интерактивность: для выявления несохраненных данных в приложениях понадобится реализовать обработку подтверждений – работа с
zenity
илиkdialog
для вывода диалоговых окон, которые позволят пользователю сохранить изменения перед закрытием.
Вот пример скрипта, который влечет взаимодействие с программами для мягкого завершения:
#!/bin/sh
# Образец того, как можно завершить работу с использованием xdotool/zenity
for win in $(xprop -root _NET_CLIENT_LIST | cut -d'#' -f2 | tr -d ',' | xargs); do
win_class=$(xprop -id $win WM_CLASS)
if [[ $win_class == *"my-blocking-app-class"* ]]; then
# Предположительно, "my-blocking-app-class" требует сохранения состояния
zenity --question --text "Сохранить изменения в $(xprop -id $win WM_NAME | cut -d'=' -f2)?"
if [ $? -ne 0 ]; then
exit 1 # Прерываем завершение, если пользователь не согласен
fi
fi
xdotool windowclose $win
done
# Завершаем X-сессию
pkill X
Этот скрипт использует функции xprop
для идентификации окон и zenity
для взаимодействия с пользователем. Обратите внимание, что подобный подход потребует доработки и тестирования, чтобы адаптировать к вашей специфике.
Заключение
Настройка dwm для корректного завершения сеансов может потребовать значительных усилий и понимания работы в Linux-среде. В этом случае особенно полезен скриптовый подход, позволяющий настроить процесс завершения более детально. Главное — это понимание потребностей пользователей и гибкости системы, что помогает сократить риск потери данных и максимизировать эффективность работы.