1
1
mirror of https://github.com/NixOS/mobile-nixos.git synced 2024-12-17 21:11:34 +03:00
mobile-nixos/boot/splash/main.rb
2020-12-27 17:50:30 -05:00

95 lines
2.4 KiB
Ruby
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Note about those lengths:
# In millisecond, this much combined time (fade and progress update) will
# *also* be taken at the end to ensure animations can finish smoothly without
# being all weird.
# So adding to these values increase the boot time artificially.
# Adding less than a second overall for a cleaner UX is a good trade-off.
# More and it's not worth it.
FADE_LENGTH = 400
PROGRESS_UPDATE_LENGTH = 500
VERBOSE = !!Args.get(:verbose, false)
SKIP_FADEIN = !!Args.get(:skip_fadein, false)
SOCKET = File.expand_path(Args.get(:socket, "/run/mobile-nixos-init"))
# Create the UI
ui = UI.new
# Socket for status updates
puts "[splash] Listening on: ipc://#{SOCKET}-messages"
$messages = ZMQ::Sub.new("ipc://#{SOCKET}-messages", "")
puts "[splash] Replying on: ipc://#{SOCKET}-replies"
$replies = ZMQ::Pub.new("ipc://#{SOCKET}-replies")
# Initial fade-in
if SKIP_FADEIN
ui.fade_in(0)
else
ui.fade_in(FADE_LENGTH)
end
# Main loop handles updating the UI, and doing some work...
LVGUI.main_loop do
# ... work like handling the queue!
# Empty all messages from the queue before continuing.
loop do
begin
msg = JSON.parse($messages.recv(LibZMQ::DONTWAIT).to_str)
rescue Errno::EWOULDBLOCK
# No messages left? break out!
break
end
if VERBOSE
print "[splash:recv] "
p msg
end
# Update the UI...
# First updating the current progress
ui.set_progress(msg["progress"])
ui.show_recovery_notice(msg["recovery"])
# Update the label as needed.
if msg["label"]
ui.set_label(msg["label"])
else
ui.set_label("")
end
# We might have a special command; handle it.
if msg["command"] then
command = msg["command"]
case command["name"]
when "quit"
sticky = msg["sticky"]
ui.quit!(sticky: sticky)
when "ask"
ui.ask_user(placeholder: command["placeholder"], identifier: command["identifier"], cb: ->(value) do
msg = {
type: "reply",
identifier: command["identifier"],
value: value,
}.to_json
if VERBOSE
print "[splash:send] "
p msg
end
$replies.send(msg)
end)
else
$stderr.puts "[splash] Unexpected command #{command.to_json}..."
end
end
end
end
$stderr.puts "[splash] Broke out of the rendering loop. That's not supposed to happen."
exit(1)