#gnome-shell #gnome-shell-extensions
Вопрос:
Я пишу свое первое расширение gnome shell для обновления фона рабочего стола до Microsoft Daily Wallpaper, создав и запустив сценарий оболочки. Вот сценарий оболочки, он повторяется каждые 15 минут
while :
do
result=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=jsamp;idx=0amp;n=1amp;mkt=en-US")
regex="th. .jpg"
if [[ $result =~ $regex ]]
then
gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"
fi
sleep 900
done
Вот extension.js
файл, я создал его, чтобы создать сценарий оболочки выше, а затем запустить его
const Util = imports.misc.util;
const loc = "~/.local/share/gnome-shell/extensions/bingwall@anb1142.io/bing_wallpaper.sh";
function init() {
const command = `printf 'while :ndonresult=$(curl -s -X GET --header "Accept: */*" "http://www.bing.com/HPImageArchive.aspx?format=jsamp;idx=0amp;n=1amp;mkt=en-US")nregex="th. .jpg"nif [[ $result =~ $regex ]]nthenn gsettings set org.gnome.desktop.background picture-uri "http://bing.com/${BASH_REMATCH[0]}"nfinsleep 900ndonen' > ${loc}`;
Util.spawn(["/bin/bash", "-c", command]);
Util.spawn(["/bin/bash", "-c", `chmod rwx ${loc}`]);
}
function enable() {
Util.spawn(["/bin/bash", "-c", loc]);
}
function disable() {
// stop that script
}
Вот проблема. Я знаю, как его запустить, но я не знаю, как разорвать этот цикл или уничтожить скрипт. Я хочу, чтобы это происходило при отключении. Как мне это сделать? Заранее спасибо
Ответ №1:
Во-первых, стоит отметить, что вы не должны делать ничего из этого в сценарии оболочки. Комбинация libsoup и GSettings позволит вам делать то, что вы хотите, не блокируя основной поток GNOME Shell или не создавая сценарий оболочки.
Существует учебное пособие по gjs.guide, в котором описывается, как создавать и управлять подпроцессами в GJS. В принципе, процессы могут быть запущены Gio.Subprocess.new()
и остановлены вызовом force_exit()
возвращаемого объекта:
const {Gio} = import.gi;
try {
// If no error is thrown, the process started successfully and
// is now running in the background
let proc = Gio.Subprocess.new(['ls'], Gio.SubprocessFlags.NONE);
// At any time call force_exit() to stop the process
proc.force_exit();
} catch (e) {
logError(e, 'Error executing process');
}