Merge pull request #1 from Tile-OS/systemd-integration
Systemd integration
This commit is contained in:
commit
6058c356cc
14 changed files with 180 additions and 66 deletions
4
debian/control
vendored
4
debian/control
vendored
|
@ -2,13 +2,13 @@ Source: tileos-settings-river
|
||||||
Section: x11
|
Section: x11
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: Aleksey Samoilov <samoilov.lex@gmail.com>
|
Maintainer: Aleksey Samoilov <samoilov.lex@gmail.com>
|
||||||
Build-Depends: debhelper-compat (= 13)
|
Build-Depends: debhelper-compat (= 13),
|
||||||
Standards-Version: 4.6.0
|
Standards-Version: 4.6.0
|
||||||
Homepage: https://github.com/Tile-OS/tileos-settings-river.git
|
Homepage: https://github.com/Tile-OS/tileos-settings-river.git
|
||||||
Rules-Requires-Root: no
|
Rules-Requires-Root: no
|
||||||
|
|
||||||
Package: tileos-settings-river
|
Package: tileos-settings-river
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
Depends: ${misc:Depends}, python3-tenacity, python3-dbus-next
|
||||||
Conflicts: tileos-settings-sway
|
Conflicts: tileos-settings-sway
|
||||||
Description: default settings for River on TileOS
|
Description: default settings for River on TileOS
|
||||||
|
|
17
etc/environment.d/90tileos-river.conf
Normal file
17
etc/environment.d/90tileos-river.conf
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Force Wayland for Mozilla Firefox
|
||||||
|
MOZ_ENABLE_WAYLAND=1
|
||||||
|
MOZ_DBUS_REMOTE=1
|
||||||
|
|
||||||
|
# Force Wayland for Qt apps
|
||||||
|
QT_QPA_PLATFORM="wayland;xcb"
|
||||||
|
QT_QPA_PLATFORMTHEME=qt5ct
|
||||||
|
|
||||||
|
# Set default cursor size
|
||||||
|
XCURSOR_SIZE=24
|
||||||
|
|
||||||
|
# Force Wayland for EFL (Enlightenment) apps
|
||||||
|
ECORE_EVAS_ENGINE="wayland-egl"
|
||||||
|
ELM_ACCEL="gl"
|
||||||
|
|
||||||
|
# Java XWayland blank screens fix
|
||||||
|
_JAVA_AWT_WM_NONREPARENTING=1
|
|
@ -1,3 +0,0 @@
|
||||||
# This file is a part of TileOS configuration for River and will be sourced
|
|
||||||
# from /usr/bin/start-river script for all users of the system.
|
|
||||||
# User-specific variables should be placed in $XDG_CONFIG_HOME/river/environment
|
|
|
@ -1,5 +1,41 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
export XDG_CURRENT_DESKTOP=river
|
||||||
|
export XDG_SESSION_DESKTOP="${XDG_SESSION_DESKTOP:-river}"
|
||||||
|
export XDG_SESSION_TYPE=wayland
|
||||||
|
VARIABLES="DESKTOP_SESSION XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP XDG_SESSION_TYPE"
|
||||||
|
VARIABLES="${VARIABLES} DISPLAY WAYLAND_DISPLAY"
|
||||||
|
SESSION_TARGET="river-session.target"
|
||||||
|
SESSION_SHUTDOWN_TARGET="river-session-shutdown.target"
|
||||||
|
SESSION_XDG_AUTOSTART_TARGET="river-xdg-autostart.target"
|
||||||
|
SNI_CHECK="/usr/share/river/scripts/wait-sni-ready"
|
||||||
|
|
||||||
|
if hash dbus-update-activation-environment 2>/dev/null; then
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
dbus-update-activation-environment --systemd ${VARIABLES:- --all}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# reset failed state of all user units
|
||||||
|
systemctl --user reset-failed
|
||||||
|
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
systemctl --user import-environment $VARIABLES
|
||||||
|
systemctl --user start "$SESSION_TARGET"
|
||||||
|
|
||||||
|
# declare cleanup handler and run it on init termination via kill, Ctrl-C or 'riverctl exit'
|
||||||
|
session_cleanup () {
|
||||||
|
# stop the session target and unset the variables
|
||||||
|
systemctl --user start --job-mode=replace-irreversibly "$SESSION_SHUTDOWN_TARGET"
|
||||||
|
if [ -n "$VARIABLES" ]; then
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
systemctl --user unset-environment $VARIABLES
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
trap session_cleanup EXIT INT TERM
|
||||||
|
|
||||||
|
# Wait for StatusNotifierWatcher is available and start XDG Autostart target
|
||||||
|
"$SNI_CHECK" && systemctl --user start "$SESSION_XDG_AUTOSTART_TARGET"
|
||||||
|
|
||||||
# Set keyboard layout. See man riverctl
|
# Set keyboard layout. See man riverctl
|
||||||
# riverctl keyboard-layout -options "grp:caps_toggle" "us,ru"
|
# riverctl keyboard-layout -options "grp:caps_toggle" "us,ru"
|
||||||
|
|
||||||
|
@ -12,9 +48,6 @@ riverctl spawn "/usr/bin/mate-polkit"
|
||||||
# Wallpaper
|
# Wallpaper
|
||||||
riverctl spawn $HOME/.azotebg
|
riverctl spawn $HOME/.azotebg
|
||||||
|
|
||||||
# Waybar
|
|
||||||
riverctl spawn $HOME/.config/river/waybar.sh
|
|
||||||
|
|
||||||
# Include keybindings
|
# Include keybindings
|
||||||
riverctl spawn $HOME/.config/river/keybindings.sh
|
riverctl spawn $HOME/.config/river/keybindings.sh
|
||||||
|
|
||||||
|
@ -34,24 +67,13 @@ nwg-drawer -r & disown
|
||||||
# Screenshot notification
|
# Screenshot notification
|
||||||
riverctl spawn /usr/share/river/scripts/screenshot-notify.sh & disown
|
riverctl spawn /usr/share/river/scripts/screenshot-notify.sh & disown
|
||||||
|
|
||||||
# Lock screen daemon
|
|
||||||
riverctl spawn $HOME/.config/river/screenlock.sh
|
|
||||||
|
|
||||||
# Poweralertd daemon
|
|
||||||
pkill poweralertd
|
|
||||||
poweralertd -s -i "line power" & disown
|
|
||||||
|
|
||||||
# Set background and border color
|
# Set background and border color
|
||||||
riverctl background-color 0x002b36
|
riverctl background-color 0x002b36
|
||||||
riverctl border-color-focused 0x8aadf4
|
riverctl border-color-focused 0x8aadf4
|
||||||
riverctl border-color-unfocused 0xa5adcb
|
riverctl border-color-unfocused 0xa5adcb
|
||||||
riverctl border-width 2
|
riverctl border-width 2
|
||||||
|
|
||||||
# Import environment variables to D-Bus and systemd
|
# Set the default layout generator to be rivertile and start it.
|
||||||
VARIABLES="DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE"
|
# River will send the process group of the init executable SIGTERM on exit.
|
||||||
|
riverctl default-layout rivertile
|
||||||
exec systemctl --user import-environment $VARIABLES
|
rivertile -view-padding 6 -outer-padding 6
|
||||||
|
|
||||||
if hash dbus-update-activation-environment 2>/dev/null; then
|
|
||||||
exec dbus-update-activation-environment --systemd ${VARIABLES:- --all}
|
|
||||||
fi
|
|
||||||
|
|
|
@ -170,8 +170,3 @@ riverctl float-filter-add app-id "qt6ct"
|
||||||
riverctl float-filter-add app-id "pavucontrol"
|
riverctl float-filter-add app-id "pavucontrol"
|
||||||
riverctl float-filter-add title "Picture-in-Picture"
|
riverctl float-filter-add title "Picture-in-Picture"
|
||||||
riverctl float-filter-add title "Firefox — Sharing Indicator"
|
riverctl float-filter-add title "Firefox — Sharing Indicator"
|
||||||
|
|
||||||
# Set the default layout generator to be rivertile and start it.
|
|
||||||
# River will send the process group of the init executable SIGTERM on exit.
|
|
||||||
riverctl default-layout rivertile
|
|
||||||
rivertile -view-padding 6 -outer-padding 6 &
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
lock="~/.config/swaylock/lock.sh"
|
|
||||||
|
|
||||||
pkill swayidle
|
|
||||||
sleep 1s
|
|
||||||
|
|
||||||
exec swayidle -w \
|
|
||||||
timeout 240 'light -G > /tmp/brightness && light -S 10' resume 'light -S $([ -f /tmp/brightness ] && cat /tmp/brightness || echo 100%)' \
|
|
||||||
timeout 300 $lock \
|
|
||||||
before-sleep 'playerctl pause' \
|
|
||||||
before-sleep $lock \
|
|
||||||
lock $lock & disown
|
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
killall -q waybar
|
|
||||||
while pgrep -x waybar >/dev/null; do sleep 2s; done
|
|
||||||
exec waybar & disown
|
|
||||||
exit
|
|
6
etc/skel/.config/swayidle/config
Normal file
6
etc/skel/.config/swayidle/config
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
timeout 240 'light -G > /tmp/brightness && light -S 10' resume 'light -S $([ -f /tmp/brightness ] && cat /tmp/brightness || echo 100%)'
|
||||||
|
timeout 300 ~/.config/swaylock/lock.sh
|
||||||
|
timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"'
|
||||||
|
before-sleep 'playerctl pause'
|
||||||
|
before-sleep ~/.config/swaylock/lock.sh
|
||||||
|
lock ~/.config/swaylock/lock.sh
|
|
@ -5,21 +5,6 @@ export XDG_CURRENT_DESKTOP=river
|
||||||
export XDG_SESSION_DESKTOP=river
|
export XDG_SESSION_DESKTOP=river
|
||||||
export XDG_SESSION_TYPE=wayland
|
export XDG_SESSION_TYPE=wayland
|
||||||
|
|
||||||
# Force Wayland for Mozilla Firefox
|
|
||||||
export MOZ_ENABLE_WAYLAND=1
|
|
||||||
export MOZ_DBUS_REMOTE=1
|
|
||||||
|
|
||||||
# Force Wayland for Qt apps
|
|
||||||
export QT_QPA_PLATFORM="wayland;xcb"
|
|
||||||
export QT_QPA_PLATFORMTHEME=qt5ct
|
|
||||||
|
|
||||||
# Force Wayland for EFL (Enlightenment) apps
|
|
||||||
export ECORE_EVAS_ENGINE="wayland-egl"
|
|
||||||
export ELM_ACCEL="gl"
|
|
||||||
|
|
||||||
# Java XWayland blank screens fix
|
|
||||||
export _JAVA_AWT_WM_NONREPARENTING=1
|
|
||||||
|
|
||||||
# Check if system is running in virtual machine
|
# Check if system is running in virtual machine
|
||||||
case "$(systemd-detect-virt)" in
|
case "$(systemd-detect-virt)" in
|
||||||
qemu)
|
qemu)
|
||||||
|
@ -42,11 +27,23 @@ if [ -d /sys/module/nvidia ]; then
|
||||||
export LIBVA_DRIVER_NAME=nvidia
|
export LIBVA_DRIVER_NAME=nvidia
|
||||||
fi
|
fi
|
||||||
|
|
||||||
## Load user environment customizations
|
## Load system environment customizations
|
||||||
if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/river/environment" ]; then
|
if [ -d /etc/environment.d ]; then
|
||||||
set -o allexport
|
set -o allexport
|
||||||
# shellcheck source=/dev/null
|
for f in /etc/environment.d/*.conf; do
|
||||||
. "${XDG_CONFIG_HOME:-$HOME/.config}/river/environment"
|
# shellcheck source=/dev/null
|
||||||
|
. "$f"
|
||||||
|
done
|
||||||
|
set +o allexport
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Load user environment customizations
|
||||||
|
if [ -d "${XDG_CONFIG_HOME:-$HOME/.config}/environment.d" ]; then
|
||||||
|
set -o allexport
|
||||||
|
for i in "${XDG_CONFIG_HOME:-$HOME/.config}/environment.d"/*.conf; do
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
. "$i"
|
||||||
|
done
|
||||||
set +o allexport
|
set +o allexport
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
10
usr/lib/systemd/user/river-session-shutdown.target
Normal file
10
usr/lib/systemd/user/river-session-shutdown.target
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Shutdown running River session
|
||||||
|
DefaultDependencies=no
|
||||||
|
StopWhenUnneeded=true
|
||||||
|
|
||||||
|
Conflicts=graphical-session.target graphical-session-pre.target
|
||||||
|
After=graphical-session.target graphical-session-pre.target
|
||||||
|
|
||||||
|
Conflicts=river-session.target
|
||||||
|
After=river-session.target
|
6
usr/lib/systemd/user/river-session.target
Normal file
6
usr/lib/systemd/user/river-session.target
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[Unit]
|
||||||
|
Description=River session
|
||||||
|
Documentation=man:systemd.special(7)
|
||||||
|
BindsTo=graphical-session.target
|
||||||
|
Wants=graphical-session-pre.target
|
||||||
|
After=graphical-session-pre.target
|
10
usr/lib/systemd/user/river-xdg-autostart.target
Normal file
10
usr/lib/systemd/user/river-xdg-autostart.target
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Systemd provides xdg-desktop-autostart.target as a way to process XDG autostart
|
||||||
|
# desktop files. The target sets RefuseManualStart though, and thus cannot be
|
||||||
|
# used from scripts.
|
||||||
|
#
|
||||||
|
[Unit]
|
||||||
|
Description=XDG autostart for River session
|
||||||
|
Documentation=man:systemd.special(7) man:systemd-xdg-autostart-generator(8)
|
||||||
|
BindsTo=xdg-desktop-autostart.target
|
||||||
|
PartOf=river-session.target
|
||||||
|
After=river-session.target
|
12
usr/lib/systemd/user/swayidle.service
Normal file
12
usr/lib/systemd/user/swayidle.service
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Idle manager for Wayland
|
||||||
|
Documentation=man:swayidle(1)
|
||||||
|
PartOf=graphical-session.target
|
||||||
|
ConditionPathExists=/usr/bin/swayidle
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/swayidle
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=river-session.target
|
61
usr/share/river/scripts/wait-sni-ready
Executable file
61
usr/share/river/scripts/wait-sni-ready
Executable file
|
@ -0,0 +1,61 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
A simple script for waiting until an org.kde.StatusNotifierItem host implementation
|
||||||
|
is available and ready.
|
||||||
|
|
||||||
|
Dependencies: dbus-next, tenacity
|
||||||
|
"""
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
from dbus_next.aio import MessageBus
|
||||||
|
from tenacity import retry, stop_after_delay, wait_fixed
|
||||||
|
|
||||||
|
LOG = logging.getLogger("wait-sni-host")
|
||||||
|
TIMEOUT = int(os.environ.get("SNI_WAIT_TIMEOUT", default=25))
|
||||||
|
|
||||||
|
|
||||||
|
@retry(reraise=True, stop=stop_after_delay(TIMEOUT), wait=wait_fixed(0.5))
|
||||||
|
async def get_service(bus, name, object_path, interface_name):
|
||||||
|
"""Wait until the service appears on the bus"""
|
||||||
|
introspection = await bus.introspect(name, object_path)
|
||||||
|
proxy = bus.get_proxy_object(name, object_path, introspection)
|
||||||
|
return proxy.get_interface(interface_name)
|
||||||
|
|
||||||
|
|
||||||
|
async def wait_sni_host(bus: MessageBus):
|
||||||
|
"""Wait until a StatusNotifierWatcher service is available and has a
|
||||||
|
StatusNotifierHost instance"""
|
||||||
|
future = asyncio.get_event_loop().create_future()
|
||||||
|
|
||||||
|
async def on_host_registered():
|
||||||
|
value = await sni_watcher.get_is_status_notifier_host_registered()
|
||||||
|
LOG.debug("StatusNotifierHostRegistered: %s", value)
|
||||||
|
if value:
|
||||||
|
future.set_result(value)
|
||||||
|
|
||||||
|
sni_watcher = await get_service(bus, "org.kde.StatusNotifierWatcher",
|
||||||
|
"/StatusNotifierWatcher",
|
||||||
|
"org.kde.StatusNotifierWatcher")
|
||||||
|
sni_watcher.on_status_notifier_host_registered(on_host_registered)
|
||||||
|
# fetch initial value
|
||||||
|
await on_host_registered()
|
||||||
|
return await asyncio.wait_for(future, timeout=TIMEOUT)
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
"""asyncio entrypoint"""
|
||||||
|
bus = await MessageBus().connect()
|
||||||
|
try:
|
||||||
|
await wait_sni_host(bus)
|
||||||
|
LOG.info("Successfully waited for org.kde.StatusNotifierHost")
|
||||||
|
# pylint: disable=broad-except
|
||||||
|
except Exception as err:
|
||||||
|
LOG.error("Failed to wait for org.kde.StatusNotifierHost: %s",
|
||||||
|
str(err))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
asyncio.run(main())
|
Loading…
Add table
Reference in a new issue