gnm_desktops() {
    getent passwd | while IFS=: read -r user _ uid _ _ home _; do
        [ "$uid" -ge 1000 ] 2>/dev/null && [ "$uid" -lt 60000 ] && [ -d "$home" ] || continue
        d="$home/Desktop"
        if [ -r "$home/.config/user-dirs.dirs" ]; then
            x=$(sed -n 's/^XDG_DESKTOP_DIR="\(.*\)"/\1/p' "$home/.config/user-dirs.dirs" | head -1 | sed "s|\$HOME|$home|")
            [ -n "$x" ] && d="$x"
        fi
        [ -d "$d" ] && [ "$d" != "$home" ] && echo "$user:$d"
    done
}
gnm_add_icons() {
    gnm_desktops | while IFS=: read -r user d; do
        for n in gizmo-network-manager gizmo-network-share; do
            src="/usr/share/applications/$n.desktop"
            [ -f "$src" ] && [ ! -e "$d/$n.desktop" ] || continue
            sed "s|^Icon=.*|Icon=/usr/share/icons/hicolor/256x256/apps/$n.png|" "$src" > "$d/$n.desktop"
            chown "$user" "$d/$n.desktop" 2>/dev/null || true
            chmod 755 "$d/$n.desktop"
            ( command -v runuser >/dev/null 2>&1 && runuser -u "$user" -- gio set "$d/$n.desktop" metadata::trusted true ) >/dev/null 2>&1 || true
        done
    done
}
gnm_start_tray() {
    # start the program quietly in the system tray for each person logged in at a screen now
    command -v gizmo-network-manager >/dev/null 2>&1 || return 0
    command -v runuser >/dev/null 2>&1 || return 0
    for s in /run/user/*; do
        [ -S "$s/bus" ] || continue
        uid=${s##*/}
        [ "$uid" -ge 1000 ] 2>/dev/null || continue
        user=$(getent passwd "$uid" | cut -d: -f1)
        [ -n "$user" ] || continue
        pgrep -u "$uid" -f 'gizmo-network-manager --background' >/dev/null 2>&1 && continue
        # borrow the screen and desktop settings from the person's own session
        pid=$(pgrep -u "$uid" -n -f 'xfce4-session|gnome-session-binary|cinnamon-session|mate-session|plasmashell' 2>/dev/null | head -1)
        [ -n "$pid" ] || continue
        env=$(tr '\0' '\n' < "/proc/$pid/environ" 2>/dev/null)
        disp=$(echo "$env" | sed -n 's/^DISPLAY=//p' | head -1)
        wl=$(echo "$env" | sed -n 's/^WAYLAND_DISPLAY=//p' | head -1)
        dsk=$(echo "$env" | sed -n 's/^XDG_CURRENT_DESKTOP=//p' | head -1)
        [ -n "$disp$wl" ] || continue
        ( runuser -u "$user" -- env DISPLAY="$disp" WAYLAND_DISPLAY="$wl" XDG_RUNTIME_DIR="$s" \
            DBUS_SESSION_BUS_ADDRESS="unix:path=$s/bus" XDG_CURRENT_DESKTOP="$dsk" \
            nohup gizmo-network-manager --background >/dev/null 2>&1 & ) >/dev/null 2>&1 || true
    done
}
gnm_remove_icons() {
    getent passwd | while IFS=: read -r user _ uid _ _ home _; do
        [ "$uid" -ge 1000 ] 2>/dev/null && [ -d "$home" ] || continue
        for d in "$home/Desktop" "$home"/*/Desktop; do
            for n in gizmo-network-manager gizmo-network-share; do
                f="$d/$n.desktop"
                [ -f "$f" ] && grep -q '^Exec=gizmo-network-manager' "$f" && rm -f "$f"
            done
        done
    done
    # desktop folders with another name, as the person's settings say
    getent passwd | while IFS=: read -r user _ uid _ _ home _; do
        [ "$uid" -ge 1000 ] 2>/dev/null && [ -r "$home/.config/user-dirs.dirs" ] || continue
        x=$(sed -n 's/^XDG_DESKTOP_DIR="\(.*\)"/\1/p' "$home/.config/user-dirs.dirs" | head -1 | sed "s|\$HOME|$home|")
        [ -n "$x" ] && [ "$x" != "$home" ] || continue
        for n in gizmo-network-manager gizmo-network-share; do
            f="$x/$n.desktop"
            [ -f "$f" ] && grep -q '^Exec=gizmo-network-manager' "$f" && rm -f "$f"
        done
    done
}
post_install() { gnm_add_icons || true; gnm_start_tray || true; }
post_remove() { gnm_remove_icons || true; }
