Можно ли портировать экранную заставку OSX в Linux?

Основываясь на ответе Брента Романа , я реализовал сценарий, используя dbus-monitor, а затем заменил его на gdbus, который имеет более понятный интерфейс и более четкий вывод. Сценарий довольно длинный, я уберу все, что не связано с -dbus, чтобы проиллюстрировать смысл запуска сценария при разблокировке экрана.

Сначала пример вывода при запуске gdbus, блокировке и затем разблокировке экрана:

paulo@monk:~$ gdbus monitor --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c2
Monitoring signals on object /org/freedesktop/login1/session/c2 owned by org.freedesktop.login1
The name org.freedesktop.login1 is owned by :1.6
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': }, @as [])
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Lock ()
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Unlock ()
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': }, @as [])

Итак, скелет скрипта:

OBJECT_PATH=/org/freedesktop/login1/session/$XDG_SESSION_ID
BUS_NAME=org.freedesktop.login1
UNLOCK="$OBJECT_PATH: $BUS_NAME.Session.Unlock ()"
GDBUS_MONITOR="gdbus monitor --system --dest $BUS_NAME --object-path $OBJECT_PATH"
PROGNAME=$(basename "$0")
LOGFILE=~/log/$PROGNAME.log

#...

function log {
    echo "$(date +'%F %T.%3N') [$$]" "$@"
}

#...

function run_daemon {
    exec &>>"$LOGFILE"

    kill_running "$GDBUS_MONITOR"

    local signal
    while read -r signal; do
        log "$signal"
        if [[ $signal == "$UNLOCK" ]]; then
            check_quodlibet
        fi
    done < <(eval "exec $GDBUS_MONITOR")
}

#...

run_daemon

Функция kill_runningпроверяет, запущен ли экземпляр, и уничтожает его. Если скрипт запускается автоматически при каждом входе в систему lightdm, у нас потенциально может быть запущено несколько экземпляров, следовательно, перед запуском необходимо убить все текущие экземпляры.

Функция check_quodlibetперезапускает quodlibet если подключенное USB-устройство (с моей музыкальной коллекцией )было сброшено (это происходит случайным образом после выхода из режима ожидания ). Я не думал, что это уместно включать его.

execпри запуске gdbusне является строго обязательным, но тогда он позволяет избежать дополнительного процесса, поскольку сценарий разветвляется перед запуском gdbus. Таким образом, будет только 2 процесса, выполняющих :сам скрипт и gdbus.

Я создал~/.config/autostart/quodr.desktop(quodr — это имя скрипта )для запуска скрипта при каждом входе в систему lightdm:

[Desktop Entry]
Version=1.0
Type=Application
Name=quodr
Exec=quodr
Comment=Check if quodlibet needs refresh
Icon=dialog-question-symbolic
Hidden=false

В качестве TODO для себя :Я намерен выяснить, как запустить скрипт в качестве пользовательской службы systemd, D -Bus -активирован.

Этот вопрос со всеми ответами был неоценим для меня, чтобы найти это решение. Эта проблема глючила очень давно, я перепробовал множество решений, но более четкое представление о том, что нужно, я получил только после прочтения того, что здесь все писали. Спасибо всем, и в частности Бренту Роману .

В качестве последнего комментария:Я построил и установил d -ножки и турнюр , пока я исследовал это, они были действительно полезны.

Я работаю Xubuntu 17.10 .

0
16.04.2020, 02:39
1 ответ

Технически всегда можно перенести часть программного обеспечения с одной платформы на другую, но требуемые для этого усилия различаются. В случае с ScreenMazer следующие проблемы несколько усложняют эту задачу:

  • лицензия отсутствует, поэтому изменение ScreenMazer или создание его производной является незаконным;
  • несмотря на наличие компилятора Swift и библиотеки для Linux , он не поддерживает две платформы, которые ScreenMazer интенсивно использует:SpriteKit , специфичный для Metal -, и поддержка ScreenSaver.

Что касается первого, если ScreenMazer основан на алгоритмах генерации лабиринтов Лукаса Тулио , он может получить лицензию GPL -. Что касается последнего, я не знаю, сколько усилий потребуется, чтобы добавить поддержку другого бэкэнда рендеринга или подключиться к совместимой с Linux -среде экранной заставки...

1
19.03.2021, 02:28

Теги

Похожие вопросы