From 5cf83d207382aaa8ab7e2eb912204f5ec93b67f3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 11:16:40 +0200 Subject: [PATCH] Match sddm to decrypt style (#5645) * Make SDDM screen match the normal decrypt screen as close as possible * Try with a different error style on wrong pw * Do red lock on failure too --- bin/omarchy-plymouth-set | 10 +- default/sddm/omarchy/Main.qml | 173 ++++++++++++++------------ default/sddm/omarchy/bullet.png | Bin 0 -> 293 bytes default/sddm/omarchy/entry-failed.png | Bin 0 -> 419 bytes default/sddm/omarchy/entry.png | Bin 0 -> 694 bytes default/sddm/omarchy/lock-failed.png | Bin 0 -> 1444 bytes default/sddm/omarchy/lock.png | Bin 0 -> 1537 bytes default/sddm/omarchy/logo.png | Bin 0 -> 3072 bytes default/sddm/omarchy/logo.svg | 1 - 9 files changed, 103 insertions(+), 81 deletions(-) create mode 100644 default/sddm/omarchy/bullet.png create mode 100644 default/sddm/omarchy/entry-failed.png create mode 100644 default/sddm/omarchy/entry.png create mode 100644 default/sddm/omarchy/lock-failed.png create mode 100644 default/sddm/omarchy/lock.png create mode 100644 default/sddm/omarchy/logo.png delete mode 100644 default/sddm/omarchy/logo.svg diff --git a/bin/omarchy-plymouth-set b/bin/omarchy-plymouth-set index ff9ca27d..c92ca53c 100755 --- a/bin/omarchy-plymouth-set +++ b/bin/omarchy-plymouth-set @@ -68,10 +68,16 @@ sddm_dir="/usr/share/sddm/themes/omarchy" sddm_template="$HOME/.local/share/omarchy/default/sddm/omarchy/Main.qml" sed \ - -e "s/#000000/#$bg_hex/g" \ + -e "s/#1a1b26/#$bg_hex/g" \ -e "s/#ffffff/#$text_hex/g" \ - -e 's|source: "logo.svg"|source: "logo.png"|' \ "$sddm_template" | sudo tee "$sddm_dir/Main.qml" >/dev/null sudo cp "$logo_path" "$sddm_dir/logo.png" +for asset in bullet.png entry.png lock.png; do + sudo cp "$staging_dir/$asset" "$sddm_dir/$asset" +done +for asset in entry lock; do + magick "$staging_dir/$asset.png" -channel RGB +level-colors "#f7768e","#f7768e" "$staging_dir/$asset-failed.png" + sudo cp "$staging_dir/$asset-failed.png" "$sddm_dir/$asset-failed.png" +done sudo rm -f "$sddm_dir/logo.svg" diff --git a/default/sddm/omarchy/Main.qml b/default/sddm/omarchy/Main.qml index d074913e..a65411e2 100644 --- a/default/sddm/omarchy/Main.qml +++ b/default/sddm/omarchy/Main.qml @@ -2,98 +2,115 @@ import QtQuick 2.0 import SddmComponents 2.0 Rectangle { - id: root - width: 640 - height: 480 - color: "#000000" + id: root + width: 640 + height: 480 + color: "#1a1b26" - property string currentUser: userModel.lastUser - property int sessionIndex: { - for (var i = 0; i < sessionModel.rowCount(); i++) { - var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString() - if (name.indexOf("uwsm") !== -1) - return i - } - return sessionModel.lastIndex + property string currentUser: userModel.lastUser + property bool loginFailed: false + property int sessionIndex: { + for (var i = 0; i < sessionModel.rowCount(); i++) { + var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString() + if (name.indexOf("uwsm") !== -1) + return i + } + return sessionModel.lastIndex + } + + Connections { + target: sddm + function onLoginFailed() { + root.loginFailed = true + password.text = "" + password.focus = true + } + function onLoginSucceeded() { + root.loginFailed = false + } + } + + Column { + anchors.centerIn: parent + spacing: 40 + + Image { + id: logo + source: "logo.png" + width: Math.min(sourceSize.width, root.width * 0.8) + height: sourceSize.width > 0 ? Math.round(width * sourceSize.height / sourceSize.width) : 0 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter: parent.horizontalCenter } - Connections { - target: sddm - function onLoginFailed() { - errorMessage.text = "Login failed" - password.text = "" - password.focus = true - } - function onLoginSucceeded() { - errorMessage.text = "" - } - } + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 15 - Column { - anchors.centerIn: parent - spacing: root.height * 0.04 - width: parent.width + Image { + source: root.loginFailed ? "lock-failed.png" : "lock.png" + width: 34 + height: 38 + fillMode: Image.PreserveAspectFit + anchors.verticalCenter: parent.verticalCenter + } + + Item { + width: entry.width + height: entry.height Image { - source: "logo.svg" - width: root.width * 0.35 - height: Math.round(width * sourceSize.height / sourceSize.width) - fillMode: Image.PreserveAspectFit - anchors.horizontalCenter: parent.horizontalCenter + id: entry + source: root.loginFailed ? "entry-failed.png" : "entry.png" + anchors.centerIn: parent } Row { - anchors.horizontalCenter: parent.horizontalCenter - spacing: root.width * 0.007 + anchors.left: parent.left + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + spacing: 5 - Text { - text: "\uf023" - color: "#ffffff" - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.025 - anchors.verticalCenter: parent.verticalCenter - } - - Rectangle { - width: root.width * 0.17 - height: root.height * 0.04 - color: "#000000" - border.color: "#ffffff" - border.width: 1 - clip: true - - TextInput { - id: password - anchors.fill: parent - anchors.margins: root.height * 0.008 - verticalAlignment: TextInput.AlignVCenter - echoMode: TextInput.Password - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.02 - font.letterSpacing: root.height * 0.004 - passwordCharacter: "\u2022" - color: "#ffffff" - focus: true - - Keys.onPressed: { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - sddm.login(root.currentUser, password.text, root.sessionIndex) - event.accepted = true - } - } - } + Repeater { + model: Math.min(password.text.length, 21) + + Image { + source: "bullet.png" + width: 7 + height: 7 } + } } - Text { - id: errorMessage - text: "" - color: "#f7768e" - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.018 - anchors.horizontalCenter: parent.horizontalCenter + TextInput { + id: password + anchors.fill: parent + anchors.leftMargin: 20 + anchors.rightMargin: 20 + verticalAlignment: TextInput.AlignVCenter + echoMode: TextInput.Password + font.family: "JetBrainsMono Nerd Font" + font.pixelSize: 24 + font.letterSpacing: 5 + passwordCharacter: "\u2022" + color: "transparent" + selectionColor: "transparent" + selectedTextColor: "transparent" + focus: true + + onTextChanged: root.loginFailed = false + + Keys.onPressed: { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(root.currentUser, password.text, root.sessionIndex) + event.accepted = true + } + } } + } } - Component.onCompleted: password.forceActiveFocus() + } + + Component.onCompleted: password.forceActiveFocus() } diff --git a/default/sddm/omarchy/bullet.png b/default/sddm/omarchy/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..62249b3bd82b0b670a8a503a3bb69bbfe79cc4f4 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK^6z-MIEH9U zoIA;|uZcmx^}qZQCjEr9ou<6JoZt7m0FRe~3I-q?kdfVZu-@kQlF=GdcP{_{ literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/entry-failed.png b/default/sddm/omarchy/entry-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..a42f9188478f536ac0e439b61bcf86db9919346e GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y&04Op0gq^TK)IFM3E_6YK2V5m}KU}$JzVE6?T zYIwoGP-?)y@G60U!DUO_QmvAUQh^kM zk%5t!u7Rnpfq965g_Ws+m4T7A0gyCcysEw%MMG|WN@iLmZVd$;^VxwKG~hOrWag$8 zmn7yEpzATSGBSWz^562tX`r4sPZ!6Kh{JDhItn%z2(TRNZgvn6U>Etf_n^7pfxC;{ z9k17!-wIqQ_ju(MS>@_UOV1advx>Dr0j!T6Lcq_%lWPUv)H{A_-Sk&e7pV9j(}Cj3 VCsvWJ$AC65c)I$ztaD0e0su?Dgzo?V literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/entry.png b/default/sddm/omarchy/entry.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7891792b8872db933f17a667a449a478c0be53 GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y&04FuSLa@a2CEqi4B`cIb_Lo1CD@X@-Ch2J0cXVbJ3tZk5>H=O_LuA|BAOCC zHaNEIWB8gpRxhIrP-q3h6ugFYL#HXzL zs@XQt|A*ck*2`WtwNt_B=Yyw}k1W;qd^{d$X}`l_w|(sWyd1OlR=bb4vobhzyu2J; zZnSHU?(>Dgw^zkpzx{Xds&+;O9q+{%->h5%r*w;NJ|6l0@y}PwUNtf>?BDuhVsPE} zg8wPcOLO0+EPi#6fx-T(fyDNE?akAVe!dFQ`p5hrGs6*K8wLlPp~KkoX?J(~!5v@i zWcGyE3NSoazmLT~cXe58{`dY>a%>D6be?{Bxz<`T_MTZ++WO$HQVb2Mv&zq@Pirx0 z4OBAy4vaL_64!{5l*E!$tK_0oAjM#0U}UOmV6JOm5@KXvWnyS$WTI_gU}a!%k#!|7 zD3LVe=BH$)RpQpLAVSa+oZUJsR-+c`p0rfC=y85}Sb4q9e01cG# AHUIzs literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/lock-failed.png b/default/sddm/omarchy/lock-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..a88afece7ac58e0a76d6177d7d4cb9ce11791138 GIT binary patch literal 1444 zcmeAS@N?(olHy`uVBq!ia0vp^AwZnK!3-p~#4YszQVPi)LB0$ORcZ_j4J`}|zkosw zFBlj~4Hy_+B``2p&0t^k#5KkdlGMqr5NmIV0) zGcf5zHOyPTn>%*RTa7ti6j%IXtNwn<^?mp+cjZs)XIs}*hPoUH-1^YRaFgKbxy&NJ zv+wX8aN_u}-O(Zc5#!XEI}?vuU(|Y_5V!2g2d?J3pFgsk&$wqbjpvowAIn7^asn!0 zX{Ym?cg)v3>AOLQf5kOEpv8o>z%ybP*bq&lz3@ofn4Xg}|v<-ly z0pnHm-6$Gz^HVa@DsgKl=$OwA)Sv;kp(HamwYVfPw*Xy_rIm>R#F7)ST?ZK$m=<}u zIEF+VetRQ4{F8$~!$XZMod^cOz>qgdj=VP<-e^edPI}KOGUI=Jwu`E;S6SoEpMQ+X zPRyQ`R?M1` zJ)4!QZ|T~tK9{nx+ZSEV+dQpwcG(5lYDx3k4;hYGSb3RR&(#q=a5HjN=B5q4Pd^(? zO)4wAlm0Aj_m8uA;`2Elyn1F@T~+DZa8J%}i~j%SvhVyne0*Paf8H-tTeHmaJFl$N zxw?yM4?FM7*S_yx=2Ct2#f)!HHwM0at!%T*z547AmplW*b-Fe(FP1#((#)@WIQNpu z#2oKo3N_^d-g4V`$3(I2lW85D~G2eA~yDV-; z=OJFUU9Gn^#7Ve46l1>Y_O>r>NAsavX44Dx5?@^x?dFS|_EGMX>T8~RMT+o7rUKza_YIo(!ps~bw$nP<;4{WmliK7b9OVXWBwbx;+U9?ukd49;3 zP9D+FDe2RX>~wRjJImpJw$p09F}wZ3^mR|CRNt+ytgWuDeVG0K9^X+1Z^y@9GGaU~ zEap7hsCkj4wY=&}tbpB$v;0prCoXZD9DjbE$l95wY?LntJ)L9~^y~SZu7IhV)KfAy zl`BkjTOR9K{ZygBc4o1jIG@_1e_U$wIMVo!*)vAG@La=^Dg-QE85lfW{an^LB{Ts5 D{FkOh literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/lock.png b/default/sddm/omarchy/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..3046de1b6a3f20d194f010fee671c936326beb27 GIT binary patch literal 1537 zcmaKseKgYx7{|AHUkq{cvLRb`y@V2`mnmXdjLEhr)$(pBuF;Fg7MiYcO37PGhEj}Q zjkx2~FG}6iyi`n^Yf__8QcEw2yZ-5)d(J)Q^E}@_p65B=bDrm%=QKHZn*rPs4uL=n zhyi{()JjnYT~}M3b6C_2wdkb;L@*(cWhOrZ3aPkg4uNP1iGDtmqZi-uNcB{I6qr4G z#i8)RDVJ5cL1!Nt{l+uGVeBIuqiPA1leLuzROguk=T?Ra9MON;!yO9zRCRCo6Z~dO zZEkEpocTDP92U}<@#4T*rj2a+(x$Pv@seyCNY93qf#zr(*_!G?;{%hf$7{)0wjI)D_X( zm}u}Ln8`jY-p@J5VO8CjI08(3E0;){?Q-|cD59AsumI2J9^x48{P#=1M@1> z`3H_14&4M@jmRG{e0-T%a$_};xp+UGO5W(w?k>lx9F;;;TAULlesb+OonM22Q!c81az}6c*t>v7~tOVPm zhU!UpisjNWSukBNpiE6b9Q+!olgTZa?zW>>3@H1~d|7^cD&u?XCD2;IcY{V&A|v%} zdgu$wb94J!*DI4eckMCCA2lAHSD>gLRdsonw|WzWbCTnPs>+EhLc?+2mx$6;Pv&90 z`0L*_g4}j}dR=HC;<$8$V8H_R+5)ZzLV8t}3+GKlEaK#JdXNo5RObC<{#qWnTDYlq z)?=4}W)I5KWoU07<8~IqmNFI8_hC%4r#B}#Xw19S$T7|LGujzt$Su_wD^oXACsp6Y z@KIlS8YxqxORtv@zY6`OX~XEy`ZfP$tM|_>py#PwsWV|^yI&|}5<#J-3naFWlPt&0 zMM1pA=0DF$cD`C*@wVbov-TLG5Xo`|Cp3#t1lw$AGfc{*?c{bf87cSbWy55&%tM%p zeXIrPK75<{GLPwF=XCHZ+fTLU^X`|rK`Cd;+jrMtGa(^cXr+} zgVU;=CUsvl!V_DzOK)XsWtP;Abb!{3qlSAP;8kvbDCe<{Y>C!!vz1@u+lCa}en)#) z;t*rZHexumT)tUH-d4SN1?85h(q5JM8U5Fz3%*u)MG1WJ{{KN~pSIm6Hn6(LH){pv ze0V$g{08_ag*>vOzNWv9Sb-lDoN*GiYdmB~>U7k^= z!sR4-SaIB}#^(07LNV=C+^Wxvp#$8peZDi2`#_iZs= zqu`0Tb?EN1+Q1#UGG4l`!VHb{C~R_k3u*CyVN%VraV9KWDT5xw*ws95W?`)tyZ4)2<_Ue8M2_Lb zaSg1=`gadV(~oTBd5ZNyUQ=(QUE*OKK)-|hxBH_7i+@D@94nGF6k#qnb#ZuUGt_nK Vg$$|X5%o`p5dDMwntbUe{{_St%Ul2e literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/logo.png b/default/sddm/omarchy/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f185b2660763bebf2343775d2a682133d5bf78d2 GIT binary patch literal 3072 zcmb7`dpwi<8^>>l=qXa_p(N|vOGGPYhGLi+QCbc)wX$TC#G18HejOx@XQ8JxE6K`X zni(~wJcT0b$sxxnDQvUJlO34D@2)?7uU^03^Splfp+o^$^kjx+aiZi_`>w)u{kD<}Yyv zeX!A-4*(fnfCd1x%wG)v?j{=A0N}GO8MHgnS8w=p-P`fatOEAO!K#L|&c*B8BJ5M< zKTSV+EHKwLpyqmJcfOpk{n|E_MGu=qNKy`O^J;{ui5ORG$7dcaKi;t+n=PAUG1*BC z9+J4%*>d_gEW)Fd84A6l&>FGCJa;HhxZB%z1KHOuXXIuXGIZREkfeQiu2;uQ#xJKp zEx4|f5M>JEU>yWf;lByG)84pCVe-XJWr3+F2(wM9M&-E}kQE*iGsPs{%609P)>asy zT&O#<_&uZC-vFaEE=_9+!IPBdnX~w_c=C|SQs<+QB^ZPBpNv7G!CDu-L+@yzIg+z9 zD%|iG^G#dhgzS`7@Fj(8`VCL)TLOWX)QX4WtojaImapJK?-JH0mQ)oqKsVG?iR$Sc zpAc=7r~#9$I*f}#~e0iq6IL%hfZ)qb6 zaAN%3S z+lpX@bZ4-hBXqiQR?Tqk2o0sT=InY1fv<|WXoVqpr3c^OK`dmnv=kz8yNE60>F$}< zl(ILc$m{xig^`rdp-EFtjxnVG)trDwnxUecHk6<<-FdHGsxBkXg&00rDU-2PYpbPDT%+$8$2anSv(+QmRX&$t= zz#RQ%RIf5XIk2?qA6XLrw>{Un4C%^pW1hXtMxJn=bsZRJVdQ|ysSx_ zCiyVv{ZdgS$-UXvMkAj#)Cvwnhb=_zWn`J9b!|EDU+Jg4cn&)K$;ELN0Pybpv2+!W zQjDrZk6H$a4VyHI^(w(X#kiRMo7IAh3d$s3m_Is}0?g{g4k^TVhNw<=JJaX50jfO|E6`y!)ZlW>SU`3ue<5~ z3ufkPwENsnBwU|<$W)N{s~ytPV^mqGQ+Bzwgjyqcfq%VCudAT~qyB3~_VyTVzJ_+V zepU#>yF?B3+*?ZO%bJHy-@Hm^y>J&H^nBw&NKV5I}W0OZ=765$6i{evd{UOT!7aRo=*Ni|i7Xe*2lwS?2{sg!tqMWjDA#uYXtkjQ;OHjz4q7}b@A zV}+@&B!WK>x96?5*x(vj+5>^}oYMP;(<~x_N$fUNwK-M5MdhuCu@0380u}WEvoIZ- zho9fZn|}kg?R#fe(Pk&U!)@-Gqt5_CjzTNR$b$6-Z?B4ynOS!;sVrXW*OcHT?si?D zx4qjmTAHe&W9pB$cSb@Ij&McacNy!Lo%|HU;296;dgxpdIgO;3RyIoT#P+1dIh|&& zcyIYCR1S(Qgh62}e0Rg_m0vsXR|jrJAM8MZ1uTul3luX0B;-fiPV9DiQ-`p9g||HM zVz%7-Q+`p5WO5P-jKa}jTO=*U>f$OeqKcuJHJ1t2aN_G49HlF-D8{*hNXPOuUrr0L z_Oo3Glu%UHPgcWA&jBLmy4crb`N^kG93!3mds{~rDR%v`{|cg}=)NaG{S2C7;QOCH zC!BPNQr25Q-1C0F-8^c_sB`bV0JfMv(c68O0J3z)zev#y?X;o@bxiT&iM|sCYo<0- z+?pKW;pk`Dqu+P?F}%82%%=Or%ux1~4G)k?&-S;p-F{+9tkJ9NSb;)@-xcDYud0Tf zbS4gDNa7+%nM$Vh3?J-CB&P+7_y#swE5lRx4sK_AT$|T+e5~!G_GFHXPkng6ABJ5& zU*10;%b=duu)8=Xg|9ec=mZpB3^~+M^4BmU3+G>9t(A=44QM1k4f?43Dja|VTOH<9 bg1%yVhS4QqD-cs);|n0*ex9tI;TQf5WcB8Z literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/logo.svg b/default/sddm/omarchy/logo.svg deleted file mode 100644 index 0853b047..00000000 --- a/default/sddm/omarchy/logo.svg +++ /dev/null @@ -1 +0,0 @@ -