detached a53fe57

fix(plymouth): center logo+entry as group on password prompt, fix theme name

commit
a53fe57e9b781270f924f5abc5551c5799c1ac74
author
brice · · 2026-02-27 19:41 UTC
parent
a2309fb
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +47 -27
M assets/plymouth/archup.plymouth +2 -2
@@ -1,6 +1,6 @@
11 [Plymouth Theme]
2-Name=ArchUp
3-Description=ArchUp splash screen.
2+Name=Arch Linux
3+Description=Arch Linux splash screen.
44 ModuleName=script
55
66 [script]
@@ -1,6 +1,6 @@
1 [Plymouth Theme]1 [Plymouth Theme]
2-Name=ArchUp2+Name=Arch Linux
3-Description=ArchUp splash screen.3+Description=Arch Linux splash screen.
4 ModuleName=script4 ModuleName=script
5 5
6 [script]6 [script]
M assets/plymouth/archup.script +45 -25
@@ -1,13 +1,16 @@
1-# Omarchy Plymouth Theme Script
1+# Arch Linux Plymouth Theme Script
22
33 Window.SetBackgroundTopColor(0.020, 0.039, 0.078);
44 Window.SetBackgroundBottomColor(0.020, 0.039, 0.078);
55
66 logo.image = Image("logo.png");
77 logo.sprite = Sprite(logo.image);
8-logo.sprite.SetX (Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
9-logo.sprite.SetY (Window.GetHeight() / 2 - logo.image.GetHeight() / 2);
10-logo.sprite.SetOpacity (1);
8+
9+# Center the logo during boot
10+logo.normal_x = Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
11+logo.normal_y = Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
12+logo.sprite.SetPosition(logo.normal_x, logo.normal_y, 1);
13+logo.sprite.SetOpacity(1);
1114
1215 # Use these to adjust the progress bar timing
1316 global.fake_progress_limit = 0.7; # Target percentage for fake progress (0.0 to 1.0)
@@ -25,25 +28,25 @@ global.max_progress = 0.0; # Track the maximum progress reached to prevent back
2528 fun refresh_callback ()
2629 {
2730 global.animation_frame++;
28-
31+
2932 # Animate fake progress to limit over time with easing
3033 if (global.fake_progress_active == 1)
3134 {
3235 # Calculate elapsed time since start
3336 elapsed_time = global.animation_frame / 50.0; # Convert frames to seconds (50 FPS)
34-
37+
3538 # Calculate linear progress ratio (0 to 1) based on time
3639 time_ratio = elapsed_time / global.fake_progress_duration;
3740 if (time_ratio > 1.0)
3841 time_ratio = 1.0;
39-
42+
4043 # Apply easing curve: ease-out quadratic
4144 # Formula: 1 - (1 - x)^2
4245 eased_ratio = 1 - ((1 - time_ratio) * (1 - time_ratio));
43-
46+
4447 # Calculate fake progress based on eased ratio
4548 global.fake_progress = eased_ratio * global.fake_progress_limit;
46-
49+
4750 # Update progress bar with fake progress
4851 update_progress_bar(global.fake_progress);
4952 }
@@ -62,7 +65,7 @@ fun update_progress_bar(progress)
6265 global.max_progress = progress;
6366 width = Math.Int(progress_bar.original_image.GetWidth() * progress);
6467 if (width < 1) width = 1; # Ensure minimum width of 1 pixel
65-
68+
6669 progress_bar.image = progress_bar.original_image.Scale(width, progress_bar.original_image.GetHeight());
6770 progress_bar.sprite.SetImage(progress_bar.image);
6871 }
@@ -118,14 +121,24 @@ lock.image = Image("lock.png");
118121 entry.image = Image("entry.png");
119122 bullet.image = Image("bullet.png");
120123
124+# Gap between logo bottom and entry top when password dialog is shown
125+dialog_gap = 32;
126+
127+# Total height of logo + gap + entry when grouped for password dialog
128+dialog_group_height = logo.image.GetHeight() + dialog_gap + entry.image.GetHeight();
129+
130+# Vertical start so the group is centered on screen
131+dialog_group_y = Window.GetHeight() / 2 - dialog_group_height / 2;
132+
133+# Entry sits below the logo in password mode
134+entry.dialog_y = dialog_group_y + logo.image.GetHeight() + dialog_gap;
135+entry.x = Window.GetWidth() / 2 - entry.image.GetWidth() / 2;
136+
121137 entry.sprite = Sprite(entry.image);
122-entry.x = Window.GetWidth()/2 - entry.image.GetWidth() / 2;
123-entry.y = logo.sprite.GetY() + logo.image.GetHeight() + 40;
124-entry.sprite.SetPosition(entry.x, entry.y, 10001);
138+entry.sprite.SetPosition(entry.x, entry.dialog_y, 10001);
125139 entry.sprite.SetOpacity(0);
126140
127-# Scale lock to be slightly shorter than entry field height
128-# Original lock is 84x96, entry height determines scale
141+# Scale lock icon to match entry field height
129142 lock_height = entry.image.GetHeight() * 0.8;
130143 lock_scale = lock_height / 96;
131144 lock_width = 84 * lock_scale;
@@ -133,7 +146,7 @@ lock_width = 84 * lock_scale;
133146 scaled_lock = lock.image.Scale(lock_width, lock_height);
134147 lock.sprite = Sprite(scaled_lock);
135148 lock.x = entry.x - lock_width - 15;
136-lock.y = entry.y + entry.image.GetHeight()/2 - lock_height/2;
149+lock.y = entry.dialog_y + entry.image.GetHeight() / 2 - lock_height / 2;
137150 lock.sprite.SetPosition(lock.x, lock.y, 10001);
138151 lock.sprite.SetOpacity(0);
139152
@@ -143,10 +156,13 @@ bullet.sprites = [];
143156 fun display_normal_callback ()
144157 {
145158 hide_password_dialog();
146-
159+
160+ # Restore logo to center when back to normal boot screen
161+ logo.sprite.SetPosition(logo.normal_x, logo.normal_y, 1);
162+
147163 # Get current mode
148164 mode = Plymouth.GetMode();
149-
165+
150166 # Only show progress bar for boot and resume modes
151167 if ((mode == "boot" || mode == "resume") && global.password_shown == 1)
152168 {
@@ -158,7 +174,11 @@ fun display_normal_callback ()
158174 fun display_password_callback (prompt, bullets)
159175 {
160176 global.password_shown = 1; # Mark that password dialog has been shown
161-
177+
178+ # Move logo up so logo + entry are centered together as a group
179+ logo_dialog_y = dialog_group_y;
180+ logo.sprite.SetPosition(logo.normal_x, logo_dialog_y, 1);
181+
162182 # Reset progress when password dialog appears
163183 stop_fake_progress();
164184 hide_progress_bar();
@@ -166,17 +186,17 @@ fun display_password_callback (prompt, bullets)
166186 global.fake_progress = 0.0;
167187 global.real_progress = 0.0;
168188 show_password_dialog();
169-
189+
170190 # Clear all bullets first
171191 for (index = 0; bullet.sprites[index]; index++)
172192 bullet.sprites[index].SetOpacity(0);
173-
193+
174194 # Create and show bullets for current password (max 21)
175195 max_bullets = 21;
176196 bullets_to_show = bullets;
177197 if (bullets_to_show > max_bullets)
178198 bullets_to_show = max_bullets;
179-
199+
180200 for (index = 0; index < bullets_to_show; index++)
181201 {
182202 if (!bullet.sprites[index])
@@ -185,7 +205,7 @@ fun display_password_callback (prompt, bullets)
185205 scaled_bullet = bullet.image.Scale(7, 7);
186206 bullet.sprites[index] = Sprite(scaled_bullet);
187207 bullet.x = entry.x + 20 + index * (7 + 5);
188- bullet.y = entry.y + entry.image.GetHeight() / 2 - 3.5;
208+ bullet.y = entry.dialog_y + entry.image.GetHeight() / 2 - 3.5;
189209 bullet.sprites[index].SetPosition(bullet.x, bullet.y, 10002);
190210 }
191211 bullet.sprites[index].SetOpacity(1);
@@ -201,7 +221,7 @@ progress_box.image = Image("progress_box.png");
201221 progress_box.sprite = Sprite(progress_box.image);
202222
203223 progress_box.x = Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
204-progress_box.y = entry.y + entry.image.GetHeight() / 2 - progress_box.image.GetHeight() / 2;
224+progress_box.y = logo.normal_y + logo.image.GetHeight() + 40;
205225 progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);
206226 progress_box.sprite.SetOpacity(0);
207227
@@ -217,7 +237,7 @@ progress_bar.sprite.SetOpacity(0);
217237 fun progress_callback (duration, progress)
218238 {
219239 global.real_progress = progress;
220-
240+
221241 # If real progress is above limit, stop fake progress and use real progress
222242 if (progress > global.fake_progress_limit)
223243 {
@@ -1,13 +1,16 @@
1-# Omarchy Plymouth Theme Script1+# Arch Linux Plymouth Theme Script
2 2
3 Window.SetBackgroundTopColor(0.020, 0.039, 0.078);3 Window.SetBackgroundTopColor(0.020, 0.039, 0.078);
4 Window.SetBackgroundBottomColor(0.020, 0.039, 0.078);4 Window.SetBackgroundBottomColor(0.020, 0.039, 0.078);
5 5
6 logo.image = Image("logo.png");6 logo.image = Image("logo.png");
7 logo.sprite = Sprite(logo.image);7 logo.sprite = Sprite(logo.image);
8-logo.sprite.SetX (Window.GetWidth() / 2 - logo.image.GetWidth() / 2);8+
9-logo.sprite.SetY (Window.GetHeight() / 2 - logo.image.GetHeight() / 2);9+# Center the logo during boot
10-logo.sprite.SetOpacity (1);10+logo.normal_x = Window.GetWidth() / 2 - logo.image.GetWidth() / 2;
11+logo.normal_y = Window.GetHeight() / 2 - logo.image.GetHeight() / 2;
12+logo.sprite.SetPosition(logo.normal_x, logo.normal_y, 1);
13+logo.sprite.SetOpacity(1);
11 14
12 # Use these to adjust the progress bar timing15 # Use these to adjust the progress bar timing
13 global.fake_progress_limit = 0.7; # Target percentage for fake progress (0.0 to 1.0)16 global.fake_progress_limit = 0.7; # Target percentage for fake progress (0.0 to 1.0)
@@ -25,25 +28,25 @@ global.max_progress = 0.0; # Track the maximum progress reached to prevent back
25 fun refresh_callback ()28 fun refresh_callback ()
26 {29 {
27 global.animation_frame++;30 global.animation_frame++;
28- 31+
29 # Animate fake progress to limit over time with easing32 # Animate fake progress to limit over time with easing
30 if (global.fake_progress_active == 1)33 if (global.fake_progress_active == 1)
31 {34 {
32 # Calculate elapsed time since start35 # Calculate elapsed time since start
33 elapsed_time = global.animation_frame / 50.0; # Convert frames to seconds (50 FPS)36 elapsed_time = global.animation_frame / 50.0; # Convert frames to seconds (50 FPS)
34- 37+
35 # Calculate linear progress ratio (0 to 1) based on time38 # Calculate linear progress ratio (0 to 1) based on time
36 time_ratio = elapsed_time / global.fake_progress_duration;39 time_ratio = elapsed_time / global.fake_progress_duration;
37 if (time_ratio > 1.0)40 if (time_ratio > 1.0)
38 time_ratio = 1.0;41 time_ratio = 1.0;
39- 42+
40 # Apply easing curve: ease-out quadratic43 # Apply easing curve: ease-out quadratic
41 # Formula: 1 - (1 - x)^244 # Formula: 1 - (1 - x)^2
42 eased_ratio = 1 - ((1 - time_ratio) * (1 - time_ratio));45 eased_ratio = 1 - ((1 - time_ratio) * (1 - time_ratio));
43- 46+
44 # Calculate fake progress based on eased ratio47 # Calculate fake progress based on eased ratio
45 global.fake_progress = eased_ratio * global.fake_progress_limit;48 global.fake_progress = eased_ratio * global.fake_progress_limit;
46- 49+
47 # Update progress bar with fake progress50 # Update progress bar with fake progress
48 update_progress_bar(global.fake_progress);51 update_progress_bar(global.fake_progress);
49 }52 }
@@ -62,7 +65,7 @@ fun update_progress_bar(progress)
62 global.max_progress = progress;65 global.max_progress = progress;
63 width = Math.Int(progress_bar.original_image.GetWidth() * progress);66 width = Math.Int(progress_bar.original_image.GetWidth() * progress);
64 if (width < 1) width = 1; # Ensure minimum width of 1 pixel67 if (width < 1) width = 1; # Ensure minimum width of 1 pixel
65- 68+
66 progress_bar.image = progress_bar.original_image.Scale(width, progress_bar.original_image.GetHeight());69 progress_bar.image = progress_bar.original_image.Scale(width, progress_bar.original_image.GetHeight());
67 progress_bar.sprite.SetImage(progress_bar.image);70 progress_bar.sprite.SetImage(progress_bar.image);
68 }71 }
@@ -118,14 +121,24 @@ lock.image = Image("lock.png");
118 entry.image = Image("entry.png");121 entry.image = Image("entry.png");
119 bullet.image = Image("bullet.png");122 bullet.image = Image("bullet.png");
120 123
124+# Gap between logo bottom and entry top when password dialog is shown
125+dialog_gap = 32;
126+
127+# Total height of logo + gap + entry when grouped for password dialog
128+dialog_group_height = logo.image.GetHeight() + dialog_gap + entry.image.GetHeight();
129+
130+# Vertical start so the group is centered on screen
131+dialog_group_y = Window.GetHeight() / 2 - dialog_group_height / 2;
132+
133+# Entry sits below the logo in password mode
134+entry.dialog_y = dialog_group_y + logo.image.GetHeight() + dialog_gap;
135+entry.x = Window.GetWidth() / 2 - entry.image.GetWidth() / 2;
136+
121 entry.sprite = Sprite(entry.image);137 entry.sprite = Sprite(entry.image);
122-entry.x = Window.GetWidth()/2 - entry.image.GetWidth() / 2;138+entry.sprite.SetPosition(entry.x, entry.dialog_y, 10001);
123-entry.y = logo.sprite.GetY() + logo.image.GetHeight() + 40;
124-entry.sprite.SetPosition(entry.x, entry.y, 10001);
125 entry.sprite.SetOpacity(0);139 entry.sprite.SetOpacity(0);
126 140
127-# Scale lock to be slightly shorter than entry field height141+# Scale lock icon to match entry field height
128-# Original lock is 84x96, entry height determines scale
129 lock_height = entry.image.GetHeight() * 0.8;142 lock_height = entry.image.GetHeight() * 0.8;
130 lock_scale = lock_height / 96;143 lock_scale = lock_height / 96;
131 lock_width = 84 * lock_scale;144 lock_width = 84 * lock_scale;
@@ -133,7 +146,7 @@ lock_width = 84 * lock_scale;
133 scaled_lock = lock.image.Scale(lock_width, lock_height);146 scaled_lock = lock.image.Scale(lock_width, lock_height);
134 lock.sprite = Sprite(scaled_lock);147 lock.sprite = Sprite(scaled_lock);
135 lock.x = entry.x - lock_width - 15;148 lock.x = entry.x - lock_width - 15;
136-lock.y = entry.y + entry.image.GetHeight()/2 - lock_height/2;149+lock.y = entry.dialog_y + entry.image.GetHeight() / 2 - lock_height / 2;
137 lock.sprite.SetPosition(lock.x, lock.y, 10001);150 lock.sprite.SetPosition(lock.x, lock.y, 10001);
138 lock.sprite.SetOpacity(0);151 lock.sprite.SetOpacity(0);
139 152
@@ -143,10 +156,13 @@ bullet.sprites = [];
143 fun display_normal_callback ()156 fun display_normal_callback ()
144 {157 {
145 hide_password_dialog();158 hide_password_dialog();
146- 159+
160+ # Restore logo to center when back to normal boot screen
161+ logo.sprite.SetPosition(logo.normal_x, logo.normal_y, 1);
162+
147 # Get current mode163 # Get current mode
148 mode = Plymouth.GetMode();164 mode = Plymouth.GetMode();
149- 165+
150 # Only show progress bar for boot and resume modes166 # Only show progress bar for boot and resume modes
151 if ((mode == "boot" || mode == "resume") && global.password_shown == 1)167 if ((mode == "boot" || mode == "resume") && global.password_shown == 1)
152 {168 {
@@ -158,7 +174,11 @@ fun display_normal_callback ()
158 fun display_password_callback (prompt, bullets)174 fun display_password_callback (prompt, bullets)
159 {175 {
160 global.password_shown = 1; # Mark that password dialog has been shown176 global.password_shown = 1; # Mark that password dialog has been shown
161- 177+
178+ # Move logo up so logo + entry are centered together as a group
179+ logo_dialog_y = dialog_group_y;
180+ logo.sprite.SetPosition(logo.normal_x, logo_dialog_y, 1);
181+
162 # Reset progress when password dialog appears182 # Reset progress when password dialog appears
163 stop_fake_progress();183 stop_fake_progress();
164 hide_progress_bar();184 hide_progress_bar();
@@ -166,17 +186,17 @@ fun display_password_callback (prompt, bullets)
166 global.fake_progress = 0.0;186 global.fake_progress = 0.0;
167 global.real_progress = 0.0;187 global.real_progress = 0.0;
168 show_password_dialog();188 show_password_dialog();
169- 189+
170 # Clear all bullets first190 # Clear all bullets first
171 for (index = 0; bullet.sprites[index]; index++)191 for (index = 0; bullet.sprites[index]; index++)
172 bullet.sprites[index].SetOpacity(0);192 bullet.sprites[index].SetOpacity(0);
173- 193+
174 # Create and show bullets for current password (max 21)194 # Create and show bullets for current password (max 21)
175 max_bullets = 21;195 max_bullets = 21;
176 bullets_to_show = bullets;196 bullets_to_show = bullets;
177 if (bullets_to_show > max_bullets)197 if (bullets_to_show > max_bullets)
178 bullets_to_show = max_bullets;198 bullets_to_show = max_bullets;
179- 199+
180 for (index = 0; index < bullets_to_show; index++)200 for (index = 0; index < bullets_to_show; index++)
181 {201 {
182 if (!bullet.sprites[index])202 if (!bullet.sprites[index])
@@ -185,7 +205,7 @@ fun display_password_callback (prompt, bullets)
185 scaled_bullet = bullet.image.Scale(7, 7);205 scaled_bullet = bullet.image.Scale(7, 7);
186 bullet.sprites[index] = Sprite(scaled_bullet);206 bullet.sprites[index] = Sprite(scaled_bullet);
187 bullet.x = entry.x + 20 + index * (7 + 5);207 bullet.x = entry.x + 20 + index * (7 + 5);
188- bullet.y = entry.y + entry.image.GetHeight() / 2 - 3.5;208+ bullet.y = entry.dialog_y + entry.image.GetHeight() / 2 - 3.5;
189 bullet.sprites[index].SetPosition(bullet.x, bullet.y, 10002);209 bullet.sprites[index].SetPosition(bullet.x, bullet.y, 10002);
190 }210 }
191 bullet.sprites[index].SetOpacity(1);211 bullet.sprites[index].SetOpacity(1);
@@ -201,7 +221,7 @@ progress_box.image = Image("progress_box.png");
201 progress_box.sprite = Sprite(progress_box.image);221 progress_box.sprite = Sprite(progress_box.image);
202 222
203 progress_box.x = Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;223 progress_box.x = Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
204-progress_box.y = entry.y + entry.image.GetHeight() / 2 - progress_box.image.GetHeight() / 2;224+progress_box.y = logo.normal_y + logo.image.GetHeight() + 40;
205 progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);225 progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);
206 progress_box.sprite.SetOpacity(0);226 progress_box.sprite.SetOpacity(0);
207 227
@@ -217,7 +237,7 @@ progress_bar.sprite.SetOpacity(0);
217 fun progress_callback (duration, progress)237 fun progress_callback (duration, progress)
218 {238 {
219 global.real_progress = progress;239 global.real_progress = progress;
220- 240+
221 # If real progress is above limit, stop fake progress and use real progress241 # If real progress is above limit, stop fake progress and use real progress
222 if (progress > global.fake_progress_limit)242 if (progress > global.fake_progress_limit)
223 {243 {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 0

    ↑↓ moveenter openesc close