From 42d10ca8c8a744b321cc9fb991305bb880161d09 Mon Sep 17 00:00:00 2001 From: Rex Dieter Date: Fri, 11 Mar 2016 21:13:19 -0600 Subject: [PATCH] 0.13.0-7 - pull in upstream fixes, some new features - The desktop selection drop down list has an empty box (#1222228) - sddm: RememberLastUser=false does not work (#1240749) --- .gitignore | 1 + ...ity-neutral-images-for-default-faces.patch | 297 +++++++++++ ...tall-the-default-sddm.conf-after-sdd.patch | 31 ++ ...dd-a-config-option-to-enable-avatars.patch | 82 +++ ...nstead-of-default.face.icon-and-rena.patch | 486 ++++++++++++++++++ 0006-Fix-mixed-indents.patch | 46 ++ ...o-regular-login-when-autologin-fails.patch | 88 ++++ 0008-Enable-PrivateTmp-again.patch | 26 + 0009-Improve-config-file-comments.patch | 115 +++++ ...un-Remove-duplicate-session-selector.patch | 35 ++ 0012-Configurable-user-session-log.patch | 98 ++++ 0013-Configurable-Xauthority-file.patch | 89 ++++ 0015-Expose-arrow-background-color.patch | 29 ++ 0020-Adds-a-count-property-to-UserModel.patch | 26 + ...ored-ConfigReader-is-matches-Default.patch | 104 ++++ ...a-users-threshold-to-disable-avatars.patch | 132 +++++ ...y-and-WaylandDisplay-config-sections.patch | 246 +++++++++ ...ash-reading-lists-from-configuration.patch | 38 ++ 0026-Do-not-read-multiple-lines.patch | 41 ++ 0027-Fix-moc-include-name.patch | 34 ++ ...riding-the-text-color-of-PasswordBox.patch | 26 + ...dd-instructions-on-how-to-change-DPI.patch | 37 ++ ...stUser-and-RememberLastSession-setti.patch | 38 ++ ...tivate-window-for-the-primary-screen.patch | 112 ++++ 0034-Theme-Maui-Prevent-losing-focus.patch | 44 ++ fedora-Main.qml | 4 + sddm-0.13.0-fedora_config.patch | 47 +- sddm.conf | 68 ++- sddm.spec | 57 +- sources | 1 + 30 files changed, 2417 insertions(+), 61 deletions(-) create mode 100644 0002-Use-higher-quality-neutral-images-for-default-faces.patch create mode 100644 0003-Generate-and-install-the-default-sddm.conf-after-sdd.patch create mode 100644 0004-Add-a-config-option-to-enable-avatars.patch create mode 100644 0005-Use-.face.icon-instead-of-default.face.icon-and-rena.patch create mode 100644 0006-Fix-mixed-indents.patch create mode 100644 0007-Fall-back-to-regular-login-when-autologin-fails.patch create mode 100644 0008-Enable-PrivateTmp-again.patch create mode 100644 0009-Improve-config-file-comments.patch create mode 100644 0010-elarun-Remove-duplicate-session-selector.patch create mode 100644 0012-Configurable-user-session-log.patch create mode 100644 0013-Configurable-Xauthority-file.patch create mode 100644 0015-Expose-arrow-background-color.patch create mode 100644 0020-Adds-a-count-property-to-UserModel.patch create mode 100644 0021-Refactored-ConfigReader-is-matches-Default.patch create mode 100644 0022-Defines-a-users-threshold-to-disable-avatars.patch create mode 100644 0024-Rename-XDisplay-and-WaylandDisplay-config-sections.patch create mode 100644 0025-Fix-crash-reading-lists-from-configuration.patch create mode 100644 0026-Do-not-read-multiple-lines.patch create mode 100644 0027-Fix-moc-include-name.patch create mode 100644 0028-Allow-for-overriding-the-text-color-of-PasswordBox.patch create mode 100644 0031-Add-instructions-on-how-to-change-DPI.patch create mode 100644 0032-Honor-RememberLastUser-and-RememberLastSession-setti.patch create mode 100644 0033-Activate-window-for-the-primary-screen.patch create mode 100644 0034-Theme-Maui-Prevent-losing-focus.patch diff --git a/.gitignore b/.gitignore index 3a8aa2d..e943b2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /v0.12.0.tar.gz /v0.13.0.tar.gz +/angle-down.png diff --git a/0002-Use-higher-quality-neutral-images-for-default-faces.patch b/0002-Use-higher-quality-neutral-images-for-default-faces.patch new file mode 100644 index 0000000..902482e --- /dev/null +++ b/0002-Use-higher-quality-neutral-images-for-default-faces.patch @@ -0,0 +1,297 @@ +From 71a1925151e71d2ade4588f06a39402e87d10ee8 Mon Sep 17 00:00:00 2001 +From: Jerome Leclanche +Date: Thu, 5 Nov 2015 13:10:39 +0200 +Subject: [PATCH 02/34] Use higher quality neutral images for default faces + +Images in the public domain. Root recolored. + +Touches #174 +--- + ChangeLog | 1 + + data/faces/default.face.icon | Bin 1830 -> 4920 bytes + data/faces/root.face.icon | Bin 2138 -> 5111 bytes + 3 files changed, 1 insertion(+) + +diff --git a/data/faces/default.face.icon b/data/faces/default.face.icon +index 3ec0da8ba441fc6bb8cffd44b1d9a4e760149eb9..cd7c4fdeecce8508d39ffd927de81cf89cb334cd 100644 +GIT binary patch +literal 4920 +zcmcgw`8(8o)c$;Dj2KI3@DP=eUG|+&#+IyELnh)uvL+H{h89Z?N%k3gjIxxJMwXFe +zZ<4(%Lou{4GKIpt-v8mf-k;7nzuf0s=f2K;opVwh>@4|^;z$4hpS2an2>@u{g#Z`l +zzVV7A2LK?%w#J-tj{W$9w31C6i@sB`I%OHyqzV@jI;O_Sn*`K#GSnwk4DFn1jvxIQ +zQ|0uO)E{tv@+mj!Z2MuLAY+6bcEeQH#E{B|<$lTU#i;^`5>)YHJGiSq +zpM6sz?{VA@R)+?^oGwA|LpKP?)b^c!>%1zJE{kkgESdYr|0y3v)I%j-qNGgn&S`~) +zFxgT_d~Nn#eY>IPHX&Xla=313#0TG&H1~r^yA01(;C&n<$?B&28s|OdM}aAW7|1em +zShW(IWxShJ7?vosa L!t+oqsnzWk2-9&Ij42SVwfmdmg(aosPbN%U)JM!KGLJC- +zIPjiA0go<6dY{&hSG-AaZE3WI+4ma|6Ui)S@Pxv@`(+)4x91qLBjK}syx}5S_Vjo@ +zj2(23FLOJCwN_%s-izxJIi+-q&dV&iE2^xojl#=rZCVm6Q(4|4B715l(cyZ0tvs#J +z4#7%04d$REn@XMCrIIkHIjyO@o&$61wEa8_T|B^mz>^(BteUFb4*Fc4XM6Q-)ye(NP?9-)I~FV?9d)2)6mzR2p^%I7eW +zO4f;3qTc0j=-h3jskJ`L=m62m#5Jt~K5h2K(O9}st{gmg`(GS7X78lRUeNo^dOWdzpyU?i54`__~h7Oax>z`yYjlz^G{<(FBv4YS8m3UZlAi`l#cs51xfU1_#&{p(|PF~iwmlJZA~1j +z=npsDB!m!HRJ?S;-u$?y6Tbn~4s8}LxHT>12-3b-(=)xd9$p(Vzy#3clV4ma2O$ML +zsYV@Q**`~Q3Ug*{N4e!;NNR4ZKp;o)T9}s+ +zRwVYWo?$7_%KtZY;|tRC*|GowVW*YAr?ovWXM@=t+SJWj@-=lqHNLYE~M!$C0mct0D9Gw +zFeiF%!W`Dt;!Fg8{craB=epu +z1EZPO=~Ar}x6n0C2^oG~1)yD)^NI}(;V68Pft8X@9M+voxmd+d~(H7ClnEH3z3aC1t&16AvcB5l6nt; +zbCD&pw;_b+8YF3{QocKSLS)%ZdX33c3zvi&c(l^> +zqr0lQQTvZJgf#8evr7I-@vl7GcM(w<_g&6OuXrcBPJ>Tb9*p^Bir`V0JiWuE!1-p4 +zbI2}Ep`Y*NIf%@^@n+1v3Opohm-9GCU903;X4^Opj*UI6eT=|Z>&F3X2OUT^`T;ix*ssImmWE6k~GB+CP +zw?FVQg8@~>4*ax`>~NPnfq%STZg1nh?qDIWi1vQ2r7;&osrYp1?N0HjYdrME{eINL +zCy39S1a`#%q7?0A4XN=TGk@wlVf!#6{mc3DP!;SUSIekgz4OFBRAGcEvityXpRI2H +z;KJsdr75UB&}jle3*fTHAH*L>KlD|pmr +zIr@Z39sBOW2$Nq>)Cu^B9F~1#tnB;3PnlE~khf +z`r`6AXUnQ2@rCl>Bt3>ojPe{`(J8Kydicdw0I$M?w6Cljzon5S@_D-|e!hyMr(Qse +z5X5*n9q>$VrgErU0rmvhI*018(=q4Sl89}#_Gz(RdCG&iG|>VmVkZ}-*)oXIV&&?V +zIqF^f^z@l{N{~-W5JH1(Q^|4i=&`P|fNcg}dl2Y*YkHrDTJ_x<)P};X#Ugod^h2pu +z=5($;eJ(I?Ev0I_m#tZR@SfT(+Z1lMI};2Fdy#@%MizVx@ww5O+&d3AMN_q}i^j`% +z6RamrNf&S?+Em_g1cjCdVg>(l>O?cx|7<0U%;84Ted`Yi(r>I=%*zhbwo8Klm}+^0 +zILtP~7@Ie4Djg{JYp)~ne?<)0DMMH3sZe*FvtM75M_^NIFveR?%p7lAsC?^|pa6;( +z%Hdp-$vH{USAPYJtg+j=%0T?saeXrmj(>#-=i4T()3xb&{5^S3#a9Qs;Cqlg&v>d> +zdG}@*D*6Qe*OLdU)QWuZ+Ahu*u`N0DCutv*PBYby+4Z0wP4z4@hvc0(>=qeqX{HJV9EldJ1QY^$T%GU?!?zs~ +za@?tk)Nx=(iE{^qR}atVoR{LMd6B2%*!qhnCJ})p5^1S1@_z6DuD3L;;UR{3`3HLx +z{^?I^;~N_u>MCkF0jZ{QxcAK53rOnkpNL_v^8dt=A_{g6QJ6k&50?nzg`S+PF>{NApW4!+FW5ihXCFDolM9KO>3G)0#ANGZzsM9nLKiYi;wmq7>e=TJ6Rcw`_WXy)|;LwkwiHIXN--v~T??5{XBA4-F=950a}aQ`uA+* +z%NLQnCVdE|V`1+uu7kho=Poto=ikJ!mn`pRZiG3PF~vX^<|YYhhm5jR1O4Gi>zu>t +zFEVcF8KxXtm~FawZE?<)uZ=NlYwT&pj*m6InmRh2qcv|b#E9QZ@Yc7ISZ?tn`Re41 +zcMd3U47dn&Dsofp%B2`1m2eQlze2vRqr7R1u63XtyCE90BsDroBK=W3qm)=kE0mjti&042Xj;%}SyX#y0EAl@{DW~QzCD6RtwU>Kpcz_&q=$4KW=Bj65*V$05zdcO$S5LSP +z?Ikr0#$@aB?jRi7bl+*6N$;#N@;s}XY=~cDyfdl~aZoj95T--w=ZeNR-&}1Dhk&sDB&J)JR3eMSV;9f=1Vyd|k$XuiME2vQ`zpuEd +zpVKv`bIIt*J)MDt=Ua6QI%K>is${iz96#fAWya;`5zb;6WWTG88m%g7!?2mOO1*}p +z!k81hkB0kCtJdLf{9K&8)BY#^(3W(0NV8}8^>Nua^Y$(sVcsiwU{GLqPh+m$&{6`q +zUCY~E7!p@}vg8%6;QBqi>JLFlpedC#@a}%cgGBz#&L)`3{1p=y-=h&^#*u!UQ$tBc +zVv%}J@e4Ch%(?pbJ?3jwfev^4yKx%2cbUQBMh`Ws+I~|cUZ2Y9_*-DGFEA^aEs^v-h0l@^Y!7^=()D3%OXNLEEZ+ +z$4+{IY{E!nj{XXb^XPw~de$2qs#Ee+wxj61! +z`pwt-i0sEqH&>9sNWYBSwWe61u1Q!SHpOd))NQWf67Q4yiDe!Id6cUsR9##^u`~>C +zTVck*y(vU^WL}=xZjSlpS1A9_ja+iaWM|;V*DeGS)zbxqHylwd4%xa?e0J_RZky4g +zwRwiwP_Es??67{oJmMQ(eX3!8gYlX?-RFp;_OUJ=Uv9n?r`Wx&m>l}lmPG$Sq`!)6 +zW~*nptk8$Xx?u06GOFDyz*1C?CpB>Eylcwmx0#hbpTsr7+{86FpHY@G4~dnpRpyL# +zxb$?h7qvh7Ve;;0^c$Jvt4@wY=~mki)rbRqxa60%n_7Y_ibGdyr&gBCRCeNS7Aq_a +zdynOMHB$N{l}klhG6#I8d52DI#&|ZDcD&CNgt};{E|Jb&zbRZgT=`@WS*P^&gjNUeclQrhe_)`8)82vL3Zvt6latYXgm5ZvNvDg(;0u +zANn(c!G`5@E>^TjopaUMzefh2yTn1u2Vw`Wi^_3bPWDYW_vd)>jjyWy-|4=4+fnG~ +zrj`JyhTW;@FN}liSJ{;8wf=v@T4G;`X+?Qo6lnbx;{=0K&EFBcDKF0afHg%${?jc< +ztNbV9>GwfvjRJezrgtB1&B9p8jOT?RYxZMMz5U|rVr!ntlJvEz{969q=81`v+jlcu +z>+7P-TP7+5@bF1_Kf{FX#rU|(gPR3ql9kVwo^1-3=#K9wPZ_&LU3osB3=X}S3PF@g +z7{2{TqBNfxXAgP93HE5|GScN*7YpbZPJalOHB5nS9cc&?-5D5C1ZZht{OJkzVG*iUE=a$dwpaK1 +zfeVn0w?s?(mk+|;vsO=_E3QFjNSvrFWEn`22k3H;k^(!1M&ke90vKK3|1wvOApU~! +fev@uBG_c{q+VdEAc+S@TM+{h-+hOWYW0U>|lk^G) + +literal 1830 +zcmV+>2if?EP)FgQ3kK|w)DNl8&rQCV48VPRouX=!nBad~-phK7cYj*ga= +zmY$xTrlzK@uCBJWw!OW*zP`T4$H&jl&)3)2-{0To=jZS5?}TK|kpKVy0d!JMQvg8b +z*k%9#00Cl4M?@D3)|ig~00q-YL_t&-8I8ehb6ZyxhT;2JYahvOD6#p#G?MlIf0*UK +z4DEEVLTc&kwH}OVcu9%PbtV7lhwbf&U+u1LPJHptKdKVIhrp%j`fZ& +zf<0e+9OjGQu)E{Mes@59;2-Wj+=0!D-5z!EV!z`+9r%^luOWr*Ih6dwCMBTZT+4!V +z&mPr}aB`&=LdCxO(IGa*<$s-@0oY>loBm48rD1}DeAI@jC&Pt{3_fH+}v3&pp +zckRoJX0uV99WEtWMxQ%b!yaRB`DNKomlz}K99e5G+q@^?@pRi57qv-3Ul)~V6R44ep=c~xt!rPR!2+?tJL8N3sDn!W(QqD++EC+R-$`pGH6-> +zA+jp6u_m(GyXx4 +zfvgNNW!GvfW|g8q(QKo~kpcJn33j%T?8s22=I8S){wX$B*V(FQ7pPTIhk$YL +zQ369&K!+vF_4fvcf1%1Jl&?I|MWr9qgKQ4W4O^FRIaqf^QlTq>3^!sO#k +zmn>ltl({_qjc=&SyJ%!=YrFZ=iR5(Kv_c>e8uMqqsp>o0I6`uqAmQ`}l^hUO<~UvW +zwl%NZfNc5wCjvM|VsL}PPrT-_Q%0reId=^1CYHl(DnoPfnmWB7UI`-u0d-jm?1X4t +zc-=3pSllsUEIJI1J56MZPDAs$dD%3}^q}KNz{ephsRM<0%OzC3s1!gP4oIYpOz^fz +zs;0Um7;U7eA_5UQ^9Bl1jE)enyN7F3SM(_T|Mn0!t=5g1oKiB1#~T2Uh)0!YF2|4bOpU9 +zj#-zYGXjJ8w(IvjyPKBO&DBdbiZH +zp@jflCJ^v&l}ysz9`E?3@7&#vi7Y#r>jy|U5Zy-4xZZ5GgXXu!@4MR2!qHL_eRCS@ +z&z95`(N=D+F;9;xUz4!GX$PGSD|{FPJw!Y%@c!-2pdMVIAjpxRe_ +z?d+tHEn`t7LDW1bK_P)L2v=`|uUw3Uoi+$p8G?0fr6JTNmT*6FCSR$i4B?QXL$d3# +zXQWnJQKJdlkuC`NI{BKSgLYO2W<)n)f0>sY?QCNaK!iqGm}fFz0q$}+JVTi867G}J +zdssuQG=v<0Qg*L4{lf0HyW7HrtQL8EB;nJox&{#t&NhlAx_X+fE+j$4-I*@kGdSMW+E9y9#^q$9+6=>- +z2F)Ca-4-Fnuu+V5!hj=pv!X@M+1108DyRSaefwW^{L9a%BJjc-nK&P}cO!O-xVqO-#>B&Q>tdGtx6w +zu(Z@SFx59OR7ft$EH0^Z$gM0c$xPNuE!ImZEy&L+(M!(H1pxGM5`k?PNh1IN05f`2 +zSaefqXKrD1b#i3@0C?IC-|f)j4C@p01w;L7=u6>pmmgtCv0uGhS~xhBbG4{m=OY+P#7c= +zY=UY)ot)j3W7qw@C;z2*nf=SiS_i>LV?UCROwjO@YSf{2e(K3je8hlJh2n +zdRUvaFXT2>NFho$qHy>j0*qus%FF*^Hv~QNO~Eta)H@D!cynTnhF6`NmScpGGTnS# +zVNmQQEh)M*8WQcxm)Hv3_Tki||Ca?em@~Fq4jz;3A;Ei(+E$M#+?y&7bCc)2=e6b$ +z=?Fb;RR6$H2WlO?+0lB5(!AiAaU-CMsgpIn=*}BkZj|xxzOrajv^s(zyDz#pD7)$G +z1Vr{@)MJNYIr{O%H@1R_To1Z!wXV8}vfXD#PWzODZSMALgW1?mk2ClF{PIcs>Y4a( +z^)e?E8`7T$Z5-W^mr&EBJyYnbkp}WK&JGOysB^GYbFJ_Q7?Ke=#pw;j*7he}LeOO| +z7l#>|-7UGndi`z)9Q5k>g4Dd^ym3X)*Sti81^Wl6qB!!~f(=kRze}Rq@KO$wcr?mX +zBH7AR7N*IKvb{uAL+FN)Q^J0eSA(AAS +zblIW!5=fk^YXjELJU_ +zG96=j%7MD6XR!ZHGixeCEsR~I!SZ2>3sxK?nY +zfloo?>H0c@1tfYk-ST4B=WM-YC$yKb<-MwT(2t+CnqPTPJk41+KjKS_pOOJ=AS%b8 +z94HAqpvr{Z+ODe{m;ROX?f#VlY2dCJ<-@Goe;*sN8w!LP8`8$CxKW`)nVW{yBwXb< +zQYeC+8&%z}Yvphf9DWcA6=cFqdf5PfU0Ga{P4ODTCxLa`4#20K`OW&Xw?w)+NQiWW +z%MFmf^3i;`P_R!D8K@74djJo_$6xQDnz>P@Rjil68q&a~kFXHw$Dxg9iRPdi$bYsN +zpQ>p#xW_&>EQfHrKJN(fNAH9}6a2p`#(*^S_7kK5`2{EEgq!`-qV?hSfI!z@5B>d< +zt3Y$E*8H#d$`Xr;wmt_XuN24 +zFFQOLw4P-CZ9;4;MX~+q3?=-aAWw-YzAQh2u~iQUQ9CSfj0I_7;>o1-n<#Okze(J+P+Bn)Se!;tw;sSKmmjBzw1kZAepzVBA={-0J7wohWHQ +zy|3Bh=90ii2}=@d&~8Botb^jSDcWcPdPTZz-b=v`V2HQYzS3L}y`|)9SM!syQBSy0 +zf14i7d~DjYo*py=6?3Cvn;hBTW)&uC^fG`tnmWMHr$H%b{)jTaU^ZfKe?QB^Wr)Vi +zpn%>KIdDJKj@RB&N4)B_5Q;9*>_tS9JR@AEu$Km#Ycjs9gq>`>HdVe-pfd>PhbY(p +ze|9P&sJ`rb0cN0ACUvbsY(Vzz>QoijM!0$!@~rtq&?1MI|93?ya2TB`MfYIH@U>i0+f6r!P<1G-(9{AHOGhY?%G#D=TTLw5-K=J~6 +zfE{m*y#ZgIq`>FT8&DjNwC`ADcT9CZ13Vo@2!mdf0ARh~F7mVdXv-^~gtE$B0M#JI +z=l5N1D3@`g1a`EVBE9)V0wbxqp}TxRRY29NxqnhpAAOqRr=!#XUvk*)&4XA~_K&GL +zP%Ng?1fqEV*+R;5nbuq$lt2ndiW%a=VgZDzottZXxV052fGn?MPF9|`gkpbodhv^_ +z-s2PI93Wm?0#?W`R92%R+-bna{XC8lejWpISuM%WYY>FdT{n~eB>YYfxPB#FOOEk* +zo)W0j(!d%Bs06qPZwR^Jx19(ugvh(9+|C{FGttbrvJ|1;;?)zwLQCbX@e8fu1DRaf +zV6Ks{6V}+61Kn~!jmT6;N14dSS&c*&ktN6>#a$7_tpluFw;xVJKfRDfJz~g|1%`8v +zX6v?8abhAQKOtmOu*Z8xs0zc+E3Gt}Y|pAAlG^N;wsZZxlfNfG;rZ7OyJtI$01L%C4f$E$6c#I~`pO{nw(6IuCCc{}xIlQt^Jo7j~ +zVHQ#W)WK;o0cwgA!!_RoVGu@b%NcMI1Jfm$ke$kl@WxgUYl-8J7v|nxzCBQm3Fu(63$oVT?Ua`Ymu6dCYWppDD-rI4&jykr_z +zDaMrCbm43n`ZNmA1dDjg{eM&Y|G5))XvB740~pJL1;gFv{T72j0}+i1iF8O>q|S>} +zTR>J6>`llcbir8pIdex{GLMACtoD_UDgXy7`Y3=6C`Oy<%VdqF=}_!hlfgE=9Q#=7XZ<63{;i$GOF*PmH@cA~hqU7jtPX(ZMFC{w3lJJ)B +z&QRqI!lkRLY$s;knjoWk#t65+8<*I54WtW+0;$SJA9;w~s=uoq55+z$?=B@6ow%ue +zXcOW1R;e?uNNB-K)d12oS7^RM_&7g6?ai61xAwCfv`rn%gaG$(G7m~m&@ol|(+i8H +zQioLhUaTh@Lb;J^rs%`N_M#Zt%N4YDGI6K_gvQy?dW2vo#^836nB@l}P4%I*futX^ +zD2>&r2de1mae8IA7cjgAikb?vBdqe#O6Z$RC9qny@x1${;74MJU6z7uB~ +zG8FS4`<ImEZ3aHS<8;ZcDrWJ +z-CMic1tY0Kw(ZCg#DebVXt`wD0`HYNHh`~DMOpCf4*iKUdUFT^wxK+krFYdU`Ka1= +za+#oP`W<|BC&0GNUBMJHXkF0P^_TU@CXs12P7_*UAz$Ytr>}Oj0-N~$Cn5JWj8VtL +zK_#IY$mN507zO2Q4n69e#vQz%QM|Hi$@Yg*;(gORZ2F&y$df!d8dXNZ-1nw$_v@He +za83^jjsn%``pZxr +zD`%#&US3jhT#C+-O{P2#WY|Cj%EvxtY)DgU?9^3iLy|m%Quz-di3V>Ej9gAVFFM{} +z`F+Y~SUz^O$nZ@@BImKT=n%}<%aO|ZDDkb`oABB(rgr*cXtw3%Q%`1$WV-gojlixQ +z4|s%kLe|0-DLTz9-=x+KgOT0UkAmo4aUVKM>n}G5;@GklB2D=$kyyX?&9$7b68UX! +z@A&Y@GT1}iKM5_e4@nH5VDS(!n-b;mrWRy6!AiMWGEr=X)4;2brJXF5;NxY`|G-lS3WvN=I& +z7P>1tr0>@)5``ks7ay1kEHiKDA`bnY$c}vuS@gDC`y23j!5VzTkyquYaE_s)#Be)4 +zD&^?RWhE2S1$7NsJz>aKs1JRM3wd^IOC(GWG4NFa>EfLu-k~`xG$!BK63HB>=UPXn +zcRNqqS%2d&N$xP5ocYmPKf!!(FE&oA&&oj+icNd)wM?~e_a}%tg%8=CDVvwKeB1nn +z5=qEH6l-!kM%=zomC%&J2Syu9LSN2|1CF^2Ic8TJqD}6pTL7aNIabHSgE_`9Usbd^GLAB!|@tJr)30>kR3g(Nve4tA4h+wIs-Ohti$UWw0FgZC-Kcke6=_fBfV< +z-;AT-Lvr3fKTT{ndOS=@pzTtE33?q0_CM?hD>7TQb!7ni3#!K9*HO+s17}bHPncA< +z@OrGl2tD(~?-z=D&Yq+^cgc>&aNPBr2Ag*Etwvj%P-3az42!FKuY>^JI&3&sj@7}; +z#-|7WbnW|Xv*KtM4L-zYY-{l(;PK}Jfvxl>Nnl$>pWa=>J)q(3?KG`QlEhX#PGYp+ +z1ZEZ!ejpkuj;z%Xf_JS%nIyFP_27T=l!%X%pYn`5lLI(De_RS~SJ56gJTK0uhbjzv +zP5#zXv{0{Nvfyh>VBhn$xk4D(pah=XeQ6T(#EJtm!HmGBg)id))@yHvG&_#8)8d#F +zC9EF&EX1Fh*7V-IDH5gk@)A6YfTi)Iv#nEJKh>@=8N0Us!_fCz0byLU^N}@rsmgk4 +zpJ>V1j(vg_I3MnXZ=0w&cSxU`p8M`DABt_!LxRw&y!t<@D~PNqm<#D$Ami=coh#zXhVi> +zGYzD5c1sbYh~7OCHxK@s_8!5nNBcJ6rJqby$3$*NTO2A1%je^o?^C=8BSE+G_)w9v +zQ!S3I|LVD5xYs)-u7OKMou(=cyT`L(`tc0$j&iZQcmL#G%|Gj?mOBp}xUc&4SA5)7 +zD{L|N^WuNcoDY6JFI!hQJ#RkLYSjAX6ls9!eA@zP!Sxhzn}^E@?ulO_S|=Wq5~)8d +z5`N|L2kBa@H%u>`ycilaq)^X0xL5Zksk8P(Ljzh9a1{5#&Vj595W{IX`LSc=D)-fq +zW|ymF`SDf?H}xi(M;GPFREY@%8JQxF%S-e +zysKxO?*cjXmczQDJWJed&|*_svl3x;Ez}=^wI8 +za4rQu_Sg66ZGH#CIbL%xqSC-3q8FnyAX)*W{eJ;zfHmp=P|HpbB)uypx?=zS!MUy! +XCj1SXu1eWOLk}=DvNEjK_k8$29Wh(^ + +literal 2138 +zcmV-g2&MOlP)#K|x7LNl{TzSy@?OVPR=$X>oCJd3kw;hK7!g +zj+T~|o}Qkjrlzj0uC}(ey}iA@zP`uD$Is8t*VotI-{0rw=kM?D|NsB8mOm>10004W +zQchC_(k}Hqr63TNTr{{C=O#FR>^a2U(@my1V5t3gJy|mks(m!JC +zPL&|zUZST7CkqPDVNq|pIWRw?b>eT{a`8k-s*uU)V{#L`)#R17Jk%of!dA40ur&`Ng7C>0Q5jkAg^eD2lT5VSSQ +zr`FiX$6`w@u)Fb@z-cITZ{bILaaH)272IG +zjQZfY1`_w7yj|u=fy0tXlrXb4-UV!Jsg!ij7tb2h=gtObD@b-5itrVW=?in(qZR0+ +zDlsfs;JtmcpjhLK0E}$Fi|AnxH}md5Vmu)fca*wdxUq4-YiunrZ@^=jvw-Ag#dVm> +za7r)ptbm3PQ=3DJ4ugCdnx`DZ%|w^k7{JP2Y)A-aqNv2>3{5hW+7?}X5bcbwk}}@0 +z*7=xwW47{ct<^J@;0$DIBY2HBW3H$3)C;~6X>o`T#ucoH^ktt1UN7k(_rqZS&_EtdgjPBG{B` +zXXZJ+sR%tQE$KEaP~!Yp;vJ4V1i!&a-t_%~oa`MzzO7X#w_3H_ry4_9UT)~q~=;25gt;=Po +z-e5628FCVM@32)pJcZAPpWRO>!RXBZ=Y6QP?5M{3sx5erqO3_n&w8*UZfn)(~=%i#%Wbe(2S%ZK;6_aO^C3 +z-Ue4CGWO3KTs1Ng(N+=Mu5VM9q-y~_D9IY=e&nnn0mJET`y#PxQCLz7{nzOkQu2v3 +z67nL8S{+>|qGc$n+3)w5a6Iikzf|?GD&JG9rw95}Gv%x$mmuDI$q;0z*6YfEg=Ure +zT0QDPYb75a=yNN<6G-c151i5-ZH~}rXfgEbHfmr|$jyH}(KI&%V^4^lL_%iWIxMb_ +zKU=w;iOSglYvWS)jyI!6aM!G9*=~W+IarsPH6W0|G?jF?X4Gcyhrt_ +z4eMJjFi0-Id!T3jk9ZRQN0tlaEH7MCvTsBj+4r1pDK+;SJ@s|{TR8uC)b`O+^iP_H +zEcd@0M&{?M-2A^5y$v)6(fvLB0i&Rmm@Aw&bdsAsY +zMFfF1PFeUysvP0bLC9?7-jihoKR@4pG@(b1oOz^Y2j@XETF^7Jmdd;N;d)&U53nKW +zqVsb4P=;Ysj<=G@v|;$_m-Z8I2zqY}x*<8iAfh-FJGxd*b!!vVC@t{I8+XV +zo4$5?+oDklG+>9)cAPhL>9~!NgFfSu)DEwz<2WZpb4)EF62X{Frys{{g%iV*=9fuy +ze`B}njeJ8Z$$>U9T)+vl;-rHz>En)fvyJaZj7Pmqz0npORWibp%sh_Y_d_Z5RxA9U +zx_PaQM_WBKirWDs(p*w8I&#AgsSA9IYHF0?HbRKb`TPfsbMgejbZ!6!%CkUe?fA?KWSXVmh#%ZO%p1roQb0jx=mWf{Q +zTV(G#I$Nm}+KSC^`paJ8<(&eUfdP|E#dC*4gKB&Q>tdGtx6wu(Z@S +zFx59OR7ft$EH0^Z$gM0c$xPNuE!ImZEy&L+(M!(H1pxGM5`k?PNh1IN05f`2Saefq +zXKrD1b#i3@0C?InH%KzEOg1%6G%`#~G)hfQGfc9uG_^=FFf>a`woI}B0Fg!r?!%X) +Q<^TWy07*qoM6N<$f^)ze9{>OV + +-- +2.5.0 + diff --git a/0003-Generate-and-install-the-default-sddm.conf-after-sdd.patch b/0003-Generate-and-install-the-default-sddm.conf-after-sdd.patch new file mode 100644 index 0000000..d5b0ca1 --- /dev/null +++ b/0003-Generate-and-install-the-default-sddm.conf-after-sdd.patch @@ -0,0 +1,31 @@ +From 7efe53000c49fb6ce808286b15283d2da05b0c52 Mon Sep 17 00:00:00 2001 +From: Jerome Leclanche +Date: Thu, 5 Nov 2015 18:55:02 +0200 +Subject: [PATCH 03/34] Generate and install the default sddm.conf after sddm + is built + +Fixes #463 +--- + src/daemon/CMakeLists.txt | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/daemon/CMakeLists.txt b/src/daemon/CMakeLists.txt +index 07a0a3d..1ae70e1 100644 +--- a/src/daemon/CMakeLists.txt ++++ b/src/daemon/CMakeLists.txt +@@ -45,3 +45,12 @@ if(JOURNALD_FOUND) + endif() + + install(TARGETS sddm DESTINATION "${CMAKE_INSTALL_BINDIR}") ++ ++# Generate and install the default config file ++add_custom_command(COMMAND sddm --example-config > "${CMAKE_BINARY_DIR}/sddm.conf" ++ OUTPUT "${CMAKE_BINARY_DIR}/sddm.conf" ++ COMMENT "Generate default sddm.conf file" ++ DEPENDS sddm ++) ++add_custom_target(generate_config_file ALL DEPENDS "${CMAKE_BINARY_DIR}/sddm.conf") ++install(FILES "${CMAKE_BINARY_DIR}/sddm.conf" DESTINATION "${CMAKE_INSTALL_FULL_SYSCONFDIR}") +-- +2.5.0 + diff --git a/0004-Add-a-config-option-to-enable-avatars.patch b/0004-Add-a-config-option-to-enable-avatars.patch new file mode 100644 index 0000000..4eaa162 --- /dev/null +++ b/0004-Add-a-config-option-to-enable-avatars.patch @@ -0,0 +1,82 @@ +From 17b3db31d9c75a197b3509f786bc646ab6dce17d Mon Sep 17 00:00:00 2001 +From: Jerome Leclanche +Date: Thu, 5 Nov 2015 17:18:46 +0200 +Subject: [PATCH 04/34] Add a config option to enable avatars + +Closes #281 +--- + ChangeLog | 1 + + data/man/sddm.conf.rst.in | 7 +++++++ + src/common/Configuration.h | 1 + + src/greeter/UserModel.cpp | 25 +++++++++++++++++-------- + 4 files changed, 26 insertions(+), 8 deletions(-) + +diff --git a/data/man/sddm.conf.rst.in b/data/man/sddm.conf.rst.in +index a916e27..18aedf4 100644 +--- a/data/man/sddm.conf.rst.in ++++ b/data/man/sddm.conf.rst.in +@@ -60,6 +60,13 @@ OPTIONS + Name of the cursor theme to be set before starting + the display server. + ++`EnableAvatars=` ++ When enabled, home directories are searched for ".face.icon" images to ++ display as their avatars. This can be slow on some file systems. ++ When disabled, all avatars will be default. Themes may choose to hide ++ them altogether. ++ Default value is true. ++ + [XDisplay] section: + + `ServerPath=` +diff --git a/src/common/Configuration.h b/src/common/Configuration.h +index 069fc16..763b74f 100644 +--- a/src/common/Configuration.h ++++ b/src/common/Configuration.h +@@ -49,6 +49,7 @@ namespace SDDM { + Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Face icon directory\n" + "The files should be in username.face.icon format")); + Entry(CursorTheme, QString, QString(), _S("Cursor theme")); ++ Entry(EnableAvatars, bool, true, _S("Enable display of custom user avatars")); + ); + // TODO: Not absolutely sure if everything belongs here. Xsessions, VT and probably some more seem universal + Section(XDisplay, +diff --git a/src/greeter/UserModel.cpp b/src/greeter/UserModel.cpp +index 5041fab..5c807bc 100644 +--- a/src/greeter/UserModel.cpp ++++ b/src/greeter/UserModel.cpp +@@ -81,14 +81,23 @@ namespace SDDM { + user->needsPassword = strcmp(current_pw->pw_passwd, "") != 0; + + // search for face icon +- QString userFace = QStringLiteral("%1/.face.icon").arg(user->homeDir); +- QString systemFace = QStringLiteral("%1/%2.face.icon").arg(mainConfig.Theme.FacesDir.get()).arg(user->name); +- if (QFile::exists(userFace)) +- user->icon = userFace; +- else if (QFile::exists(systemFace)) +- user->icon = systemFace; +- else +- user->icon = QStringLiteral("%1/default.face.icon").arg(mainConfig.Theme.FacesDir.get()); ++ QString facesDir = mainConfig.Theme.FacesDir.get(); ++ QString defaultFace = QStringLiteral("%1/default.face.icon").arg(facesDir); ++ bool avatarsEnabled = mainConfig.Theme.EnableAvatars.get(); ++ ++ if (avatarsEnabled) { ++ QString userFace = QStringLiteral("%1/.face.icon").arg(user->homeDir); ++ QString systemFace = QStringLiteral("%1/%2.face.icon").arg(facesDir).arg(user->name); ++ ++ if (QFile::exists(userFace)) ++ user->icon = userFace; ++ else if (QFile::exists(systemFace)) ++ user->icon = systemFace; ++ else ++ user->icon = defaultFace; ++ } else { ++ user->icon = defaultFace; ++ } + + // add user + d->users << user; +-- +2.5.0 + diff --git a/0005-Use-.face.icon-instead-of-default.face.icon-and-rena.patch b/0005-Use-.face.icon-instead-of-default.face.icon-and-rena.patch new file mode 100644 index 0000000..f685f5c --- /dev/null +++ b/0005-Use-.face.icon-instead-of-default.face.icon-and-rena.patch @@ -0,0 +1,486 @@ +From 58b794bb2a2fd407a08b6c4d9eb4f156823b34f1 Mon Sep 17 00:00:00 2001 +From: Jerome Leclanche +Date: Thu, 5 Nov 2015 17:37:35 +0200 +Subject: [PATCH 05/34] Use .face.icon instead of default.face.icon, and rename + the sources to .png + +Touches #174 +--- + data/CMakeLists.txt | 13 ++++++++++++- + data/faces/README | 3 ++- + data/faces/default.face.icon | Bin 4920 -> 0 bytes + data/faces/default.face.icon.png | Bin 0 -> 4920 bytes + data/faces/root.face.icon | Bin 5111 -> 0 bytes + data/faces/root.face.icon.png | Bin 0 -> 5111 bytes + src/greeter/UserModel.cpp | 2 +- + 7 files changed, 15 insertions(+), 3 deletions(-) + delete mode 100644 data/faces/default.face.icon + create mode 100644 data/faces/default.face.icon.png + delete mode 100644 data/faces/root.face.icon + create mode 100644 data/faces/root.face.icon.png + +diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt +index 51f37ab..f3b5781 100644 +--- a/data/CMakeLists.txt ++++ b/data/CMakeLists.txt +@@ -1,4 +1,3 @@ +-install(DIRECTORY "faces" DESTINATION "${DATA_INSTALL_DIR}") + install(DIRECTORY "flags" DESTINATION "${DATA_INSTALL_DIR}") + + install(FILES +@@ -8,6 +7,18 @@ install(FILES + ) + + install(FILES ++ "faces/root.face.icon.png" ++ DESTINATION "${DATA_INSTALL_DIR}/faces" ++ RENAME "root.face.icon" ++) ++ ++install(FILES ++ "faces/default.face.icon.png" ++ DESTINATION "${DATA_INSTALL_DIR}/faces" ++ RENAME ".face.icon" ++) ++ ++install(FILES + "scripts/Xsession" + "scripts/Xsetup" + "scripts/Xstop" +diff --git a/data/faces/README b/data/faces/README +index be871e1..85479ad 100644 +--- a/data/faces/README ++++ b/data/faces/README +@@ -1 +1,2 @@ +-This files are directly copied from a KDE installation. +\ No newline at end of file ++These are the default avatars. ++They are installed to `.face.icon` and `root.face.icon`. See ../CMakeLists.txt. +diff --git a/data/faces/default.face.icon b/data/faces/default.face.icon +deleted file mode 100644 +index cd7c4fdeecce8508d39ffd927de81cf89cb334cd..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 4920 +zcmcgw`8(8o)c$;Dj2KI3@DP=eUG|+&#+IyELnh)uvL+H{h89Z?N%k3gjIxxJMwXFe +zZ<4(%Lou{4GKIpt-v8mf-k;7nzuf0s=f2K;opVwh>@4|^;z$4hpS2an2>@u{g#Z`l +zzVV7A2LK?%w#J-tj{W$9w31C6i@sB`I%OHyqzV@jI;O_Sn*`K#GSnwk4DFn1jvxIQ +zQ|0uO)E{tv@+mj!Z2MuLAY+6bcEeQH#E{B|<$lTU#i;^`5>)YHJGiSq +zpM6sz?{VA@R)+?^oGwA|LpKP?)b^c!>%1zJE{kkgESdYr|0y3v)I%j-qNGgn&S`~) +zFxgT_d~Nn#eY>IPHX&Xla=313#0TG&H1~r^yA01(;C&n<$?B&28s|OdM}aAW7|1em +zShW(IWxShJ7?vosa L!t+oqsnzWk2-9&Ij42SVwfmdmg(aosPbN%U)JM!KGLJC- +zIPjiA0go<6dY{&hSG-AaZE3WI+4ma|6Ui)S@Pxv@`(+)4x91qLBjK}syx}5S_Vjo@ +zj2(23FLOJCwN_%s-izxJIi+-q&dV&iE2^xojl#=rZCVm6Q(4|4B715l(cyZ0tvs#J +z4#7%04d$REn@XMCrIIkHIjyO@o&$61wEa8_T|B^mz>^(BteUFb4*Fc4XM6Q-)ye(NP?9-)I~FV?9d)2)6mzR2p^%I7eW +zO4f;3qTc0j=-h3jskJ`L=m62m#5Jt~K5h2K(O9}st{gmg`(GS7X78lRUeNo^dOWdzpyU?i54`__~h7Oax>z`yYjlz^G{<(FBv4YS8m3UZlAi`l#cs51xfU1_#&{p(|PF~iwmlJZA~1j +z=npsDB!m!HRJ?S;-u$?y6Tbn~4s8}LxHT>12-3b-(=)xd9$p(Vzy#3clV4ma2O$ML +zsYV@Q**`~Q3Ug*{N4e!;NNR4ZKp;o)T9}s+ +zRwVYWo?$7_%KtZY;|tRC*|GowVW*YAr?ovWXM@=t+SJWj@-=lqHNLYE~M!$C0mct0D9Gw +zFeiF%!W`Dt;!Fg8{craB=epu +z1EZPO=~Ar}x6n0C2^oG~1)yD)^NI}(;V68Pft8X@9M+voxmd+d~(H7ClnEH3z3aC1t&16AvcB5l6nt; +zbCD&pw;_b+8YF3{QocKSLS)%ZdX33c3zvi&c(l^> +zqr0lQQTvZJgf#8evr7I-@vl7GcM(w<_g&6OuXrcBPJ>Tb9*p^Bir`V0JiWuE!1-p4 +zbI2}Ep`Y*NIf%@^@n+1v3Opohm-9GCU903;X4^Opj*UI6eT=|Z>&F3X2OUT^`T;ix*ssImmWE6k~GB+CP +zw?FVQg8@~>4*ax`>~NPnfq%STZg1nh?qDIWi1vQ2r7;&osrYp1?N0HjYdrME{eINL +zCy39S1a`#%q7?0A4XN=TGk@wlVf!#6{mc3DP!;SUSIekgz4OFBRAGcEvityXpRI2H +z;KJsdr75UB&}jle3*fTHAH*L>KlD|pmr +zIr@Z39sBOW2$Nq>)Cu^B9F~1#tnB;3PnlE~khf +z`r`6AXUnQ2@rCl>Bt3>ojPe{`(J8Kydicdw0I$M?w6Cljzon5S@_D-|e!hyMr(Qse +z5X5*n9q>$VrgErU0rmvhI*018(=q4Sl89}#_Gz(RdCG&iG|>VmVkZ}-*)oXIV&&?V +zIqF^f^z@l{N{~-W5JH1(Q^|4i=&`P|fNcg}dl2Y*YkHrDTJ_x<)P};X#Ugod^h2pu +z=5($;eJ(I?Ev0I_m#tZR@SfT(+Z1lMI};2Fdy#@%MizVx@ww5O+&d3AMN_q}i^j`% +z6RamrNf&S?+Em_g1cjCdVg>(l>O?cx|7<0U%;84Ted`Yi(r>I=%*zhbwo8Klm}+^0 +zILtP~7@Ie4Djg{JYp)~ne?<)0DMMH3sZe*FvtM75M_^NIFveR?%p7lAsC?^|pa6;( +z%Hdp-$vH{USAPYJtg+j=%0T?saeXrmj(>#-=i4T()3xb&{5^S3#a9Qs;Cqlg&v>d> +zdG}@*D*6Qe*OLdU)QWuZ+Ahu*u`N0DCutv*PBYby+4Z0wP4z4@hvc0(>=qeqX{HJV9EldJ1QY^$T%GU?!?zs~ +za@?tk)Nx=(iE{^qR}atVoR{LMd6B2%*!qhnCJ})p5^1S1@_z6DuD3L;;UR{3`3HLx +z{^?I^;~N_u>MCkF0jZ{QxcAK53rOnkpNL_v^8dt=A_{g6QJ6k&50?nzg`S+PF>{NApW4!+FW5ihXCFDolM9KO>3G)0#ANGZzsM9nLKiYi;wmq7>e=TJ6Rcw`_WXy)|;LwkwiHIXN--v~T??5{XBA4-F=950a}aQ`uA+* +z%NLQnCVdE|V`1+uu7kho=Poto=ikJ!mn`pRZiG3PF~vX^<|YYhhm5jR1O4Gi>zu>t +zFEVcF8KxXtm~FawZE?<)uZ=NlYwT&pj*m6InmRh2qcv|b#E9QZ@Yc7ISZ?tn`Re41 +zcMd3U47dn&Dsofp%B2`1m2eQlze2vRqr7R1u63XtyCE90BsDroBK=W3qm)=kE0mjti&042Xj;%}SyX#y0EAl@{DW~QzCD6RtwU>Kpcz_&q=$4KW=Bj65*V$05zdcO$S5LSP +z?Ikr0#$@aB?jRi7bl+*6N$;#N@;s}XY=~cDyfdl~aZoj95T--w=ZeNR-&}1Dhk&sDB&J)JR3eMSV;9f=1Vyd|k$XuiME2vQ`zpuEd +zpVKv`bIIt*J)MDt=Ua6QI%K>is${iz96#fAWya;`5zb;6WWTG88m%g7!?2mOO1*}p +z!k81hkB0kCtJdLf{9K&8)BY#^(3W(0NV8}8^>Nua^Y$(sVcsiwU{GLqPh+m$&{6`q +zUCY~E7!p@}vg8%6;QBqi>JLFlpedC#@a}%cgGBz#&L)`3{1p=y-=h&^#*u!UQ$tBc +zVv%}J@e4Ch%(?pbJ?3jwfev^4yKx%2cbUQBMh`Ws+I~|cUZ2Y9_*-DGFEA^aEs^v-h0l@^Y!7^=()D3%OXNLEEZ+ +z$4+{IY{E!nj{XXb^XPw~de$2qs#Ee+wxj61! +z`pwt-i0sEqH&>9sNWYBSwWe61u1Q!SHpOd))NQWf67Q4yiDe!Id6cUsR9##^u`~>C +zTVck*y(vU^WL}=xZjSlpS1A9_ja+iaWM|;V*DeGS)zbxqHylwd4%xa?e0J_RZky4g +zwRwiwP_Es??67{oJmMQ(eX3!8gYlX?-RFp;_OUJ=Uv9n?r`Wx&m>l}lmPG$Sq`!)6 +zW~*nptk8$Xx?u06GOFDyz*1C?CpB>Eylcwmx0#hbpTsr7+{86FpHY@G4~dnpRpyL# +zxb$?h7qvh7Ve;;0^c$Jvt4@wY=~mki)rbRqxa60%n_7Y_ibGdyr&gBCRCeNS7Aq_a +zdynOMHB$N{l}klhG6#I8d52DI#&|ZDcD&CNgt};{E|Jb&zbRZgT=`@WS*P^&gjNUeclQrhe_)`8)82vL3Zvt6latYXgm5ZvNvDg(;0u +zANn(c!G`5@E>^TjopaUMzefh2yTn1u2Vw`Wi^_3bPWDYW_vd)>jjyWy-|4=4+fnG~ +zrj`JyhTW;@FN}liSJ{;8wf=v@T4G;`X+?Qo6lnbx;{=0K&EFBcDKF0afHg%${?jc< +ztNbV9>GwfvjRJezrgtB1&B9p8jOT?RYxZMMz5U|rVr!ntlJvEz{969q=81`v+jlcu +z>+7P-TP7+5@bF1_Kf{FX#rU|(gPR3ql9kVwo^1-3=#K9wPZ_&LU3osB3=X}S3PF@g +z7{2{TqBNfxXAgP93HE5|GScN*7YpbZPJalOHB5nS9cc&?-5D5C1ZZht{OJkzVG*iUE=a$dwpaK1 +zfeVn0w?s?(mk+|;vsO=_E3QFjNSvrFWEn`22k3H;k^(!1M&ke90vKK3|1wvOApU~! +fev@uBG_c{q+VdEAc+S@TM+{h-+hOWYW0U>|lk^G) + +diff --git a/data/faces/default.face.icon.png b/data/faces/default.face.icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..cd7c4fdeecce8508d39ffd927de81cf89cb334cd +GIT binary patch +literal 4920 +zcmcgw`8(8o)c$;Dj2KI3@DP=eUG|+&#+IyELnh)uvL+H{h89Z?N%k3gjIxxJMwXFe +zZ<4(%Lou{4GKIpt-v8mf-k;7nzuf0s=f2K;opVwh>@4|^;z$4hpS2an2>@u{g#Z`l +zzVV7A2LK?%w#J-tj{W$9w31C6i@sB`I%OHyqzV@jI;O_Sn*`K#GSnwk4DFn1jvxIQ +zQ|0uO)E{tv@+mj!Z2MuLAY+6bcEeQH#E{B|<$lTU#i;^`5>)YHJGiSq +zpM6sz?{VA@R)+?^oGwA|LpKP?)b^c!>%1zJE{kkgESdYr|0y3v)I%j-qNGgn&S`~) +zFxgT_d~Nn#eY>IPHX&Xla=313#0TG&H1~r^yA01(;C&n<$?B&28s|OdM}aAW7|1em +zShW(IWxShJ7?vosa L!t+oqsnzWk2-9&Ij42SVwfmdmg(aosPbN%U)JM!KGLJC- +zIPjiA0go<6dY{&hSG-AaZE3WI+4ma|6Ui)S@Pxv@`(+)4x91qLBjK}syx}5S_Vjo@ +zj2(23FLOJCwN_%s-izxJIi+-q&dV&iE2^xojl#=rZCVm6Q(4|4B715l(cyZ0tvs#J +z4#7%04d$REn@XMCrIIkHIjyO@o&$61wEa8_T|B^mz>^(BteUFb4*Fc4XM6Q-)ye(NP?9-)I~FV?9d)2)6mzR2p^%I7eW +zO4f;3qTc0j=-h3jskJ`L=m62m#5Jt~K5h2K(O9}st{gmg`(GS7X78lRUeNo^dOWdzpyU?i54`__~h7Oax>z`yYjlz^G{<(FBv4YS8m3UZlAi`l#cs51xfU1_#&{p(|PF~iwmlJZA~1j +z=npsDB!m!HRJ?S;-u$?y6Tbn~4s8}LxHT>12-3b-(=)xd9$p(Vzy#3clV4ma2O$ML +zsYV@Q**`~Q3Ug*{N4e!;NNR4ZKp;o)T9}s+ +zRwVYWo?$7_%KtZY;|tRC*|GowVW*YAr?ovWXM@=t+SJWj@-=lqHNLYE~M!$C0mct0D9Gw +zFeiF%!W`Dt;!Fg8{craB=epu +z1EZPO=~Ar}x6n0C2^oG~1)yD)^NI}(;V68Pft8X@9M+voxmd+d~(H7ClnEH3z3aC1t&16AvcB5l6nt; +zbCD&pw;_b+8YF3{QocKSLS)%ZdX33c3zvi&c(l^> +zqr0lQQTvZJgf#8evr7I-@vl7GcM(w<_g&6OuXrcBPJ>Tb9*p^Bir`V0JiWuE!1-p4 +zbI2}Ep`Y*NIf%@^@n+1v3Opohm-9GCU903;X4^Opj*UI6eT=|Z>&F3X2OUT^`T;ix*ssImmWE6k~GB+CP +zw?FVQg8@~>4*ax`>~NPnfq%STZg1nh?qDIWi1vQ2r7;&osrYp1?N0HjYdrME{eINL +zCy39S1a`#%q7?0A4XN=TGk@wlVf!#6{mc3DP!;SUSIekgz4OFBRAGcEvityXpRI2H +z;KJsdr75UB&}jle3*fTHAH*L>KlD|pmr +zIr@Z39sBOW2$Nq>)Cu^B9F~1#tnB;3PnlE~khf +z`r`6AXUnQ2@rCl>Bt3>ojPe{`(J8Kydicdw0I$M?w6Cljzon5S@_D-|e!hyMr(Qse +z5X5*n9q>$VrgErU0rmvhI*018(=q4Sl89}#_Gz(RdCG&iG|>VmVkZ}-*)oXIV&&?V +zIqF^f^z@l{N{~-W5JH1(Q^|4i=&`P|fNcg}dl2Y*YkHrDTJ_x<)P};X#Ugod^h2pu +z=5($;eJ(I?Ev0I_m#tZR@SfT(+Z1lMI};2Fdy#@%MizVx@ww5O+&d3AMN_q}i^j`% +z6RamrNf&S?+Em_g1cjCdVg>(l>O?cx|7<0U%;84Ted`Yi(r>I=%*zhbwo8Klm}+^0 +zILtP~7@Ie4Djg{JYp)~ne?<)0DMMH3sZe*FvtM75M_^NIFveR?%p7lAsC?^|pa6;( +z%Hdp-$vH{USAPYJtg+j=%0T?saeXrmj(>#-=i4T()3xb&{5^S3#a9Qs;Cqlg&v>d> +zdG}@*D*6Qe*OLdU)QWuZ+Ahu*u`N0DCutv*PBYby+4Z0wP4z4@hvc0(>=qeqX{HJV9EldJ1QY^$T%GU?!?zs~ +za@?tk)Nx=(iE{^qR}atVoR{LMd6B2%*!qhnCJ})p5^1S1@_z6DuD3L;;UR{3`3HLx +z{^?I^;~N_u>MCkF0jZ{QxcAK53rOnkpNL_v^8dt=A_{g6QJ6k&50?nzg`S+PF>{NApW4!+FW5ihXCFDolM9KO>3G)0#ANGZzsM9nLKiYi;wmq7>e=TJ6Rcw`_WXy)|;LwkwiHIXN--v~T??5{XBA4-F=950a}aQ`uA+* +z%NLQnCVdE|V`1+uu7kho=Poto=ikJ!mn`pRZiG3PF~vX^<|YYhhm5jR1O4Gi>zu>t +zFEVcF8KxXtm~FawZE?<)uZ=NlYwT&pj*m6InmRh2qcv|b#E9QZ@Yc7ISZ?tn`Re41 +zcMd3U47dn&Dsofp%B2`1m2eQlze2vRqr7R1u63XtyCE90BsDroBK=W3qm)=kE0mjti&042Xj;%}SyX#y0EAl@{DW~QzCD6RtwU>Kpcz_&q=$4KW=Bj65*V$05zdcO$S5LSP +z?Ikr0#$@aB?jRi7bl+*6N$;#N@;s}XY=~cDyfdl~aZoj95T--w=ZeNR-&}1Dhk&sDB&J)JR3eMSV;9f=1Vyd|k$XuiME2vQ`zpuEd +zpVKv`bIIt*J)MDt=Ua6QI%K>is${iz96#fAWya;`5zb;6WWTG88m%g7!?2mOO1*}p +z!k81hkB0kCtJdLf{9K&8)BY#^(3W(0NV8}8^>Nua^Y$(sVcsiwU{GLqPh+m$&{6`q +zUCY~E7!p@}vg8%6;QBqi>JLFlpedC#@a}%cgGBz#&L)`3{1p=y-=h&^#*u!UQ$tBc +zVv%}J@e4Ch%(?pbJ?3jwfev^4yKx%2cbUQBMh`Ws+I~|cUZ2Y9_*-DGFEA^aEs^v-h0l@^Y!7^=()D3%OXNLEEZ+ +z$4+{IY{E!nj{XXb^XPw~de$2qs#Ee+wxj61! +z`pwt-i0sEqH&>9sNWYBSwWe61u1Q!SHpOd))NQWf67Q4yiDe!Id6cUsR9##^u`~>C +zTVck*y(vU^WL}=xZjSlpS1A9_ja+iaWM|;V*DeGS)zbxqHylwd4%xa?e0J_RZky4g +zwRwiwP_Es??67{oJmMQ(eX3!8gYlX?-RFp;_OUJ=Uv9n?r`Wx&m>l}lmPG$Sq`!)6 +zW~*nptk8$Xx?u06GOFDyz*1C?CpB>Eylcwmx0#hbpTsr7+{86FpHY@G4~dnpRpyL# +zxb$?h7qvh7Ve;;0^c$Jvt4@wY=~mki)rbRqxa60%n_7Y_ibGdyr&gBCRCeNS7Aq_a +zdynOMHB$N{l}klhG6#I8d52DI#&|ZDcD&CNgt};{E|Jb&zbRZgT=`@WS*P^&gjNUeclQrhe_)`8)82vL3Zvt6latYXgm5ZvNvDg(;0u +zANn(c!G`5@E>^TjopaUMzefh2yTn1u2Vw`Wi^_3bPWDYW_vd)>jjyWy-|4=4+fnG~ +zrj`JyhTW;@FN}liSJ{;8wf=v@T4G;`X+?Qo6lnbx;{=0K&EFBcDKF0afHg%${?jc< +ztNbV9>GwfvjRJezrgtB1&B9p8jOT?RYxZMMz5U|rVr!ntlJvEz{969q=81`v+jlcu +z>+7P-TP7+5@bF1_Kf{FX#rU|(gPR3ql9kVwo^1-3=#K9wPZ_&LU3osB3=X}S3PF@g +z7{2{TqBNfxXAgP93HE5|GScN*7YpbZPJalOHB5nS9cc&?-5D5C1ZZht{OJkzVG*iUE=a$dwpaK1 +zfeVn0w?s?(mk+|;vsO=_E3QFjNSvrFWEn`22k3H;k^(!1M&ke90vKK3|1wvOApU~! +fev@uBG_c{q+VdEAc+S@TM+{h-+hOWYW0U>|lk^G) + +literal 0 +HcmV?d00001 + +diff --git a/data/faces/root.face.icon b/data/faces/root.face.icon +deleted file mode 100644 +index 308496979d6665a8e87451d273ad14233f821a90..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 5111 +zcmcgw_fyl&*Zm|R^xlOCNC)XnczBS|rT3yzrHIrZEfgWBlpumgl@dY|MWjAL5F|mG +z5;}r_B~(Fap@Ts3<&Svh{bhI0&Y3;;&fVFwbI~?dCM=8si~sC-|f)j4C@p01w;L7=u6>pmmgtCv0uGhS~xhBbG4{m=OY+P#7c= +zY=UY)ot)j3W7qw@C;z2*nf=SiS_i>LV?UCROwjO@YSf{2e(K3je8hlJh2n +zdRUvaFXT2>NFho$qHy>j0*qus%FF*^Hv~QNO~Eta)H@D!cynTnhF6`NmScpGGTnS# +zVNmQQEh)M*8WQcxm)Hv3_Tki||Ca?em@~Fq4jz;3A;Ei(+E$M#+?y&7bCc)2=e6b$ +z=?Fb;RR6$H2WlO?+0lB5(!AiAaU-CMsgpIn=*}BkZj|xxzOrajv^s(zyDz#pD7)$G +z1Vr{@)MJNYIr{O%H@1R_To1Z!wXV8}vfXD#PWzODZSMALgW1?mk2ClF{PIcs>Y4a( +z^)e?E8`7T$Z5-W^mr&EBJyYnbkp}WK&JGOysB^GYbFJ_Q7?Ke=#pw;j*7he}LeOO| +z7l#>|-7UGndi`z)9Q5k>g4Dd^ym3X)*Sti81^Wl6qB!!~f(=kRze}Rq@KO$wcr?mX +zBH7AR7N*IKvb{uAL+FN)Q^J0eSA(AAS +zblIW!5=fk^YXjELJU_ +zG96=j%7MD6XR!ZHGixeCEsR~I!SZ2>3sxK?nY +zfloo?>H0c@1tfYk-ST4B=WM-YC$yKb<-MwT(2t+CnqPTPJk41+KjKS_pOOJ=AS%b8 +z94HAqpvr{Z+ODe{m;ROX?f#VlY2dCJ<-@Goe;*sN8w!LP8`8$CxKW`)nVW{yBwXb< +zQYeC+8&%z}Yvphf9DWcA6=cFqdf5PfU0Ga{P4ODTCxLa`4#20K`OW&Xw?w)+NQiWW +z%MFmf^3i;`P_R!D8K@74djJo_$6xQDnz>P@Rjil68q&a~kFXHw$Dxg9iRPdi$bYsN +zpQ>p#xW_&>EQfHrKJN(fNAH9}6a2p`#(*^S_7kK5`2{EEgq!`-qV?hSfI!z@5B>d< +zt3Y$E*8H#d$`Xr;wmt_XuN24 +zFFQOLw4P-CZ9;4;MX~+q3?=-aAWw-YzAQh2u~iQUQ9CSfj0I_7;>o1-n<#Okze(J+P+Bn)Se!;tw;sSKmmjBzw1kZAepzVBA={-0J7wohWHQ +zy|3Bh=90ii2}=@d&~8Botb^jSDcWcPdPTZz-b=v`V2HQYzS3L}y`|)9SM!syQBSy0 +zf14i7d~DjYo*py=6?3Cvn;hBTW)&uC^fG`tnmWMHr$H%b{)jTaU^ZfKe?QB^Wr)Vi +zpn%>KIdDJKj@RB&N4)B_5Q;9*>_tS9JR@AEu$Km#Ycjs9gq>`>HdVe-pfd>PhbY(p +ze|9P&sJ`rb0cN0ACUvbsY(Vzz>QoijM!0$!@~rtq&?1MI|93?ya2TB`MfYIH@U>i0+f6r!P<1G-(9{AHOGhY?%G#D=TTLw5-K=J~6 +zfE{m*y#ZgIq`>FT8&DjNwC`ADcT9CZ13Vo@2!mdf0ARh~F7mVdXv-^~gtE$B0M#JI +z=l5N1D3@`g1a`EVBE9)V0wbxqp}TxRRY29NxqnhpAAOqRr=!#XUvk*)&4XA~_K&GL +zP%Ng?1fqEV*+R;5nbuq$lt2ndiW%a=VgZDzottZXxV052fGn?MPF9|`gkpbodhv^_ +z-s2PI93Wm?0#?W`R92%R+-bna{XC8lejWpISuM%WYY>FdT{n~eB>YYfxPB#FOOEk* +zo)W0j(!d%Bs06qPZwR^Jx19(ugvh(9+|C{FGttbrvJ|1;;?)zwLQCbX@e8fu1DRaf +zV6Ks{6V}+61Kn~!jmT6;N14dSS&c*&ktN6>#a$7_tpluFw;xVJKfRDfJz~g|1%`8v +zX6v?8abhAQKOtmOu*Z8xs0zc+E3Gt}Y|pAAlG^N;wsZZxlfNfG;rZ7OyJtI$01L%C4f$E$6c#I~`pO{nw(6IuCCc{}xIlQt^Jo7j~ +zVHQ#W)WK;o0cwgA!!_RoVGu@b%NcMI1Jfm$ke$kl@WxgUYl-8J7v|nxzCBQm3Fu(63$oVT?Ua`Ymu6dCYWppDD-rI4&jykr_z +zDaMrCbm43n`ZNmA1dDjg{eM&Y|G5))XvB740~pJL1;gFv{T72j0}+i1iF8O>q|S>} +zTR>J6>`llcbir8pIdex{GLMACtoD_UDgXy7`Y3=6C`Oy<%VdqF=}_!hlfgE=9Q#=7XZ<63{;i$GOF*PmH@cA~hqU7jtPX(ZMFC{w3lJJ)B +z&QRqI!lkRLY$s;knjoWk#t65+8<*I54WtW+0;$SJA9;w~s=uoq55+z$?=B@6ow%ue +zXcOW1R;e?uNNB-K)d12oS7^RM_&7g6?ai61xAwCfv`rn%gaG$(G7m~m&@ol|(+i8H +zQioLhUaTh@Lb;J^rs%`N_M#Zt%N4YDGI6K_gvQy?dW2vo#^836nB@l}P4%I*futX^ +zD2>&r2de1mae8IA7cjgAikb?vBdqe#O6Z$RC9qny@x1${;74MJU6z7uB~ +zG8FS4`<ImEZ3aHS<8;ZcDrWJ +z-CMic1tY0Kw(ZCg#DebVXt`wD0`HYNHh`~DMOpCf4*iKUdUFT^wxK+krFYdU`Ka1= +za+#oP`W<|BC&0GNUBMJHXkF0P^_TU@CXs12P7_*UAz$Ytr>}Oj0-N~$Cn5JWj8VtL +zK_#IY$mN507zO2Q4n69e#vQz%QM|Hi$@Yg*;(gORZ2F&y$df!d8dXNZ-1nw$_v@He +za83^jjsn%``pZxr +zD`%#&US3jhT#C+-O{P2#WY|Cj%EvxtY)DgU?9^3iLy|m%Quz-di3V>Ej9gAVFFM{} +z`F+Y~SUz^O$nZ@@BImKT=n%}<%aO|ZDDkb`oABB(rgr*cXtw3%Q%`1$WV-gojlixQ +z4|s%kLe|0-DLTz9-=x+KgOT0UkAmo4aUVKM>n}G5;@GklB2D=$kyyX?&9$7b68UX! +z@A&Y@GT1}iKM5_e4@nH5VDS(!n-b;mrWRy6!AiMWGEr=X)4;2brJXF5;NxY`|G-lS3WvN=I& +z7P>1tr0>@)5``ks7ay1kEHiKDA`bnY$c}vuS@gDC`y23j!5VzTkyquYaE_s)#Be)4 +zD&^?RWhE2S1$7NsJz>aKs1JRM3wd^IOC(GWG4NFa>EfLu-k~`xG$!BK63HB>=UPXn +zcRNqqS%2d&N$xP5ocYmPKf!!(FE&oA&&oj+icNd)wM?~e_a}%tg%8=CDVvwKeB1nn +z5=qEH6l-!kM%=zomC%&J2Syu9LSN2|1CF^2Ic8TJqD}6pTL7aNIabHSgE_`9Usbd^GLAB!|@tJr)30>kR3g(Nve4tA4h+wIs-Ohti$UWw0FgZC-Kcke6=_fBfV< +z-;AT-Lvr3fKTT{ndOS=@pzTtE33?q0_CM?hD>7TQb!7ni3#!K9*HO+s17}bHPncA< +z@OrGl2tD(~?-z=D&Yq+^cgc>&aNPBr2Ag*Etwvj%P-3az42!FKuY>^JI&3&sj@7}; +z#-|7WbnW|Xv*KtM4L-zYY-{l(;PK}Jfvxl>Nnl$>pWa=>J)q(3?KG`QlEhX#PGYp+ +z1ZEZ!ejpkuj;z%Xf_JS%nIyFP_27T=l!%X%pYn`5lLI(De_RS~SJ56gJTK0uhbjzv +zP5#zXv{0{Nvfyh>VBhn$xk4D(pah=XeQ6T(#EJtm!HmGBg)id))@yHvG&_#8)8d#F +zC9EF&EX1Fh*7V-IDH5gk@)A6YfTi)Iv#nEJKh>@=8N0Us!_fCz0byLU^N}@rsmgk4 +zpJ>V1j(vg_I3MnXZ=0w&cSxU`p8M`DABt_!LxRw&y!t<@D~PNqm<#D$Ami=coh#zXhVi> +zGYzD5c1sbYh~7OCHxK@s_8!5nNBcJ6rJqby$3$*NTO2A1%je^o?^C=8BSE+G_)w9v +zQ!S3I|LVD5xYs)-u7OKMou(=cyT`L(`tc0$j&iZQcmL#G%|Gj?mOBp}xUc&4SA5)7 +zD{L|N^WuNcoDY6JFI!hQJ#RkLYSjAX6ls9!eA@zP!Sxhzn}^E@?ulO_S|=Wq5~)8d +z5`N|L2kBa@H%u>`ycilaq)^X0xL5Zksk8P(Ljzh9a1{5#&Vj595W{IX`LSc=D)-fq +zW|ymF`SDf?H}xi(M;GPFREY@%8JQxF%S-e +zysKxO?*cjXmczQDJWJed&|*_svl3x;Ez}=^wI8 +za4rQu_Sg66ZGH#CIbL%xqSC-3q8FnyAX)*W{eJ;zfHmp=P|HpbB)uypx?=zS!MUy! +XCj1SXu1eWOLk}=DvNEjK_k8$29Wh(^ + +diff --git a/data/faces/root.face.icon.png b/data/faces/root.face.icon.png +new file mode 100644 +index 0000000000000000000000000000000000000000..308496979d6665a8e87451d273ad14233f821a90 +GIT binary patch +literal 5111 +zcmcgw_fyl&*Zm|R^xlOCNC)XnczBS|rT3yzrHIrZEfgWBlpumgl@dY|MWjAL5F|mG +z5;}r_B~(Fap@Ts3<&Svh{bhI0&Y3;;&fVFwbI~?dCM=8si~sC-|f)j4C@p01w;L7=u6>pmmgtCv0uGhS~xhBbG4{m=OY+P#7c= +zY=UY)ot)j3W7qw@C;z2*nf=SiS_i>LV?UCROwjO@YSf{2e(K3je8hlJh2n +zdRUvaFXT2>NFho$qHy>j0*qus%FF*^Hv~QNO~Eta)H@D!cynTnhF6`NmScpGGTnS# +zVNmQQEh)M*8WQcxm)Hv3_Tki||Ca?em@~Fq4jz;3A;Ei(+E$M#+?y&7bCc)2=e6b$ +z=?Fb;RR6$H2WlO?+0lB5(!AiAaU-CMsgpIn=*}BkZj|xxzOrajv^s(zyDz#pD7)$G +z1Vr{@)MJNYIr{O%H@1R_To1Z!wXV8}vfXD#PWzODZSMALgW1?mk2ClF{PIcs>Y4a( +z^)e?E8`7T$Z5-W^mr&EBJyYnbkp}WK&JGOysB^GYbFJ_Q7?Ke=#pw;j*7he}LeOO| +z7l#>|-7UGndi`z)9Q5k>g4Dd^ym3X)*Sti81^Wl6qB!!~f(=kRze}Rq@KO$wcr?mX +zBH7AR7N*IKvb{uAL+FN)Q^J0eSA(AAS +zblIW!5=fk^YXjELJU_ +zG96=j%7MD6XR!ZHGixeCEsR~I!SZ2>3sxK?nY +zfloo?>H0c@1tfYk-ST4B=WM-YC$yKb<-MwT(2t+CnqPTPJk41+KjKS_pOOJ=AS%b8 +z94HAqpvr{Z+ODe{m;ROX?f#VlY2dCJ<-@Goe;*sN8w!LP8`8$CxKW`)nVW{yBwXb< +zQYeC+8&%z}Yvphf9DWcA6=cFqdf5PfU0Ga{P4ODTCxLa`4#20K`OW&Xw?w)+NQiWW +z%MFmf^3i;`P_R!D8K@74djJo_$6xQDnz>P@Rjil68q&a~kFXHw$Dxg9iRPdi$bYsN +zpQ>p#xW_&>EQfHrKJN(fNAH9}6a2p`#(*^S_7kK5`2{EEgq!`-qV?hSfI!z@5B>d< +zt3Y$E*8H#d$`Xr;wmt_XuN24 +zFFQOLw4P-CZ9;4;MX~+q3?=-aAWw-YzAQh2u~iQUQ9CSfj0I_7;>o1-n<#Okze(J+P+Bn)Se!;tw;sSKmmjBzw1kZAepzVBA={-0J7wohWHQ +zy|3Bh=90ii2}=@d&~8Botb^jSDcWcPdPTZz-b=v`V2HQYzS3L}y`|)9SM!syQBSy0 +zf14i7d~DjYo*py=6?3Cvn;hBTW)&uC^fG`tnmWMHr$H%b{)jTaU^ZfKe?QB^Wr)Vi +zpn%>KIdDJKj@RB&N4)B_5Q;9*>_tS9JR@AEu$Km#Ycjs9gq>`>HdVe-pfd>PhbY(p +ze|9P&sJ`rb0cN0ACUvbsY(Vzz>QoijM!0$!@~rtq&?1MI|93?ya2TB`MfYIH@U>i0+f6r!P<1G-(9{AHOGhY?%G#D=TTLw5-K=J~6 +zfE{m*y#ZgIq`>FT8&DjNwC`ADcT9CZ13Vo@2!mdf0ARh~F7mVdXv-^~gtE$B0M#JI +z=l5N1D3@`g1a`EVBE9)V0wbxqp}TxRRY29NxqnhpAAOqRr=!#XUvk*)&4XA~_K&GL +zP%Ng?1fqEV*+R;5nbuq$lt2ndiW%a=VgZDzottZXxV052fGn?MPF9|`gkpbodhv^_ +z-s2PI93Wm?0#?W`R92%R+-bna{XC8lejWpISuM%WYY>FdT{n~eB>YYfxPB#FOOEk* +zo)W0j(!d%Bs06qPZwR^Jx19(ugvh(9+|C{FGttbrvJ|1;;?)zwLQCbX@e8fu1DRaf +zV6Ks{6V}+61Kn~!jmT6;N14dSS&c*&ktN6>#a$7_tpluFw;xVJKfRDfJz~g|1%`8v +zX6v?8abhAQKOtmOu*Z8xs0zc+E3Gt}Y|pAAlG^N;wsZZxlfNfG;rZ7OyJtI$01L%C4f$E$6c#I~`pO{nw(6IuCCc{}xIlQt^Jo7j~ +zVHQ#W)WK;o0cwgA!!_RoVGu@b%NcMI1Jfm$ke$kl@WxgUYl-8J7v|nxzCBQm3Fu(63$oVT?Ua`Ymu6dCYWppDD-rI4&jykr_z +zDaMrCbm43n`ZNmA1dDjg{eM&Y|G5))XvB740~pJL1;gFv{T72j0}+i1iF8O>q|S>} +zTR>J6>`llcbir8pIdex{GLMACtoD_UDgXy7`Y3=6C`Oy<%VdqF=}_!hlfgE=9Q#=7XZ<63{;i$GOF*PmH@cA~hqU7jtPX(ZMFC{w3lJJ)B +z&QRqI!lkRLY$s;knjoWk#t65+8<*I54WtW+0;$SJA9;w~s=uoq55+z$?=B@6ow%ue +zXcOW1R;e?uNNB-K)d12oS7^RM_&7g6?ai61xAwCfv`rn%gaG$(G7m~m&@ol|(+i8H +zQioLhUaTh@Lb;J^rs%`N_M#Zt%N4YDGI6K_gvQy?dW2vo#^836nB@l}P4%I*futX^ +zD2>&r2de1mae8IA7cjgAikb?vBdqe#O6Z$RC9qny@x1${;74MJU6z7uB~ +zG8FS4`<ImEZ3aHS<8;ZcDrWJ +z-CMic1tY0Kw(ZCg#DebVXt`wD0`HYNHh`~DMOpCf4*iKUdUFT^wxK+krFYdU`Ka1= +za+#oP`W<|BC&0GNUBMJHXkF0P^_TU@CXs12P7_*UAz$Ytr>}Oj0-N~$Cn5JWj8VtL +zK_#IY$mN507zO2Q4n69e#vQz%QM|Hi$@Yg*;(gORZ2F&y$df!d8dXNZ-1nw$_v@He +za83^jjsn%``pZxr +zD`%#&US3jhT#C+-O{P2#WY|Cj%EvxtY)DgU?9^3iLy|m%Quz-di3V>Ej9gAVFFM{} +z`F+Y~SUz^O$nZ@@BImKT=n%}<%aO|ZDDkb`oABB(rgr*cXtw3%Q%`1$WV-gojlixQ +z4|s%kLe|0-DLTz9-=x+KgOT0UkAmo4aUVKM>n}G5;@GklB2D=$kyyX?&9$7b68UX! +z@A&Y@GT1}iKM5_e4@nH5VDS(!n-b;mrWRy6!AiMWGEr=X)4;2brJXF5;NxY`|G-lS3WvN=I& +z7P>1tr0>@)5``ks7ay1kEHiKDA`bnY$c}vuS@gDC`y23j!5VzTkyquYaE_s)#Be)4 +zD&^?RWhE2S1$7NsJz>aKs1JRM3wd^IOC(GWG4NFa>EfLu-k~`xG$!BK63HB>=UPXn +zcRNqqS%2d&N$xP5ocYmPKf!!(FE&oA&&oj+icNd)wM?~e_a}%tg%8=CDVvwKeB1nn +z5=qEH6l-!kM%=zomC%&J2Syu9LSN2|1CF^2Ic8TJqD}6pTL7aNIabHSgE_`9Usbd^GLAB!|@tJr)30>kR3g(Nve4tA4h+wIs-Ohti$UWw0FgZC-Kcke6=_fBfV< +z-;AT-Lvr3fKTT{ndOS=@pzTtE33?q0_CM?hD>7TQb!7ni3#!K9*HO+s17}bHPncA< +z@OrGl2tD(~?-z=D&Yq+^cgc>&aNPBr2Ag*Etwvj%P-3az42!FKuY>^JI&3&sj@7}; +z#-|7WbnW|Xv*KtM4L-zYY-{l(;PK}Jfvxl>Nnl$>pWa=>J)q(3?KG`QlEhX#PGYp+ +z1ZEZ!ejpkuj;z%Xf_JS%nIyFP_27T=l!%X%pYn`5lLI(De_RS~SJ56gJTK0uhbjzv +zP5#zXv{0{Nvfyh>VBhn$xk4D(pah=XeQ6T(#EJtm!HmGBg)id))@yHvG&_#8)8d#F +zC9EF&EX1Fh*7V-IDH5gk@)A6YfTi)Iv#nEJKh>@=8N0Us!_fCz0byLU^N}@rsmgk4 +zpJ>V1j(vg_I3MnXZ=0w&cSxU`p8M`DABt_!LxRw&y!t<@D~PNqm<#D$Ami=coh#zXhVi> +zGYzD5c1sbYh~7OCHxK@s_8!5nNBcJ6rJqby$3$*NTO2A1%je^o?^C=8BSE+G_)w9v +zQ!S3I|LVD5xYs)-u7OKMou(=cyT`L(`tc0$j&iZQcmL#G%|Gj?mOBp}xUc&4SA5)7 +zD{L|N^WuNcoDY6JFI!hQJ#RkLYSjAX6ls9!eA@zP!Sxhzn}^E@?ulO_S|=Wq5~)8d +z5`N|L2kBa@H%u>`ycilaq)^X0xL5Zksk8P(Ljzh9a1{5#&Vj595W{IX`LSc=D)-fq +zW|ymF`SDf?H}xi(M;GPFREY@%8JQxF%S-e +zysKxO?*cjXmczQDJWJed&|*_svl3x;Ez}=^wI8 +za4rQu_Sg66ZGH#CIbL%xqSC-3q8FnyAX)*W{eJ;zfHmp=P|HpbB)uypx?=zS!MUy! +XCj1SXu1eWOLk}=DvNEjK_k8$29Wh(^ + +literal 0 +HcmV?d00001 + +diff --git a/src/greeter/UserModel.cpp b/src/greeter/UserModel.cpp +index 5c807bc..66ab6fb 100644 +--- a/src/greeter/UserModel.cpp ++++ b/src/greeter/UserModel.cpp +@@ -82,7 +82,7 @@ namespace SDDM { + + // search for face icon + QString facesDir = mainConfig.Theme.FacesDir.get(); +- QString defaultFace = QStringLiteral("%1/default.face.icon").arg(facesDir); ++ QString defaultFace = QStringLiteral("%1/.face.icon").arg(facesDir); + bool avatarsEnabled = mainConfig.Theme.EnableAvatars.get(); + + if (avatarsEnabled) { +-- +2.5.0 + diff --git a/0006-Fix-mixed-indents.patch b/0006-Fix-mixed-indents.patch new file mode 100644 index 0000000..d685f73 --- /dev/null +++ b/0006-Fix-mixed-indents.patch @@ -0,0 +1,46 @@ +From e646bd39ba743e2540aaa7d22fd4633e5d9a6966 Mon Sep 17 00:00:00 2001 +From: Jerome Leclanche +Date: Thu, 5 Nov 2015 20:03:22 +0200 +Subject: [PATCH 06/34] Fix mixed indents + +--- + data/man/sddm.conf.rst.in | 4 ++-- + src/greeter/UserModel.cpp | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/data/man/sddm.conf.rst.in b/data/man/sddm.conf.rst.in +index 18aedf4..d5263e0 100644 +--- a/data/man/sddm.conf.rst.in ++++ b/data/man/sddm.conf.rst.in +@@ -74,8 +74,8 @@ OPTIONS + Default value is "/usr/bin/X". + + `ServerArguments=` +- Arguments to the X server. +- Default value is "-nolisten tcp". ++ Arguments to the X server. ++ Default value is "-nolisten tcp". + + `XephyrPath=` + Path of the Xephyr. +diff --git a/src/greeter/UserModel.cpp b/src/greeter/UserModel.cpp +index 66ab6fb..f56c67a 100644 +--- a/src/greeter/UserModel.cpp ++++ b/src/greeter/UserModel.cpp +@@ -55,11 +55,11 @@ namespace SDDM { + while ((current_pw = getpwent()) != nullptr) { + + // skip entries with uids smaller than minimum uid +- if ( int(current_pw->pw_uid) < mainConfig.Users.MinimumUid.get()) ++ if (int(current_pw->pw_uid) < mainConfig.Users.MinimumUid.get()) + continue; + + // skip entries with uids greater than maximum uid +- if ( int(current_pw->pw_uid) > mainConfig.Users.MaximumUid.get()) ++ if (int(current_pw->pw_uid) > mainConfig.Users.MaximumUid.get()) + continue; + // skip entries with user names in the hide users list + if (mainConfig.Users.HideUsers.get().contains(QString::fromLocal8Bit(current_pw->pw_name))) +-- +2.5.0 + diff --git a/0007-Fall-back-to-regular-login-when-autologin-fails.patch b/0007-Fall-back-to-regular-login-when-autologin-fails.patch new file mode 100644 index 0000000..e2527ec --- /dev/null +++ b/0007-Fall-back-to-regular-login-when-autologin-fails.patch @@ -0,0 +1,88 @@ +From cb768895c8e0d21c689d63f69d7ac668fe4e8fa6 Mon Sep 17 00:00:00 2001 +From: Jerome Leclanche +Date: Thu, 5 Nov 2015 21:28:22 +0200 +Subject: [PATCH 07/34] Fall back to regular login when autologin fails + +Fixes #316 +--- + src/daemon/Display.cpp | 42 +++++++++++++++++++++++++----------------- + src/daemon/Display.h | 1 + + 2 files changed, 26 insertions(+), 17 deletions(-) + +diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp +index 8de59e5..6bc9965 100644 +--- a/src/daemon/Display.cpp ++++ b/src/daemon/Display.cpp +@@ -103,6 +103,29 @@ namespace SDDM { + m_displayServer->start(); + } + ++ bool Display::attemptAutologin() { ++ Session::Type sessionType = Session::X11Session; ++ ++ // determine session type ++ const QString &autologinSession = mainConfig.Autologin.Session.get(); ++ if (findSessionEntry(mainConfig.XDisplay.SessionDir.get(), autologinSession)) { ++ sessionType = Session::X11Session; ++ } else if (findSessionEntry(mainConfig.WaylandDisplay.SessionDir.get(), autologinSession)) { ++ sessionType = Session::WaylandSession; ++ } else { ++ qCritical() << "Unable to find autologin session entry" << autologinSession; ++ return false; ++ } ++ ++ Session session; ++ session.setTo(sessionType, autologinSession); ++ ++ m_auth->setAutologin(true); ++ startAuth(mainConfig.Autologin.User.get(), QString(), session); ++ ++ return true; ++ } ++ + void Display::displayServerStarted() { + // check flag + if (m_started) +@@ -122,25 +145,10 @@ namespace SDDM { + // set flags + m_started = true; + +- // determine session type +- const QString &autologinSession = mainConfig.Autologin.Session.get(); +- Session session; +- if (findSessionEntry(mainConfig.XDisplay.SessionDir.get(), autologinSession)) { +- session.setTo(Session::X11Session, autologinSession); +- } else if (findSessionEntry(mainConfig.WaylandDisplay.SessionDir.get(), autologinSession)) { +- session.setTo(Session::WaylandSession, autologinSession); +- } else { +- qCritical() << "Unable to find autologin session entry" << autologinSession; +- emit loginFailed(m_socket); ++ bool success = attemptAutologin(); ++ if (success) { + return; + } +- +- // start session +- m_auth->setAutologin(true); +- startAuth(mainConfig.Autologin.User.get(), QString(), session); +- +- // return +- return; + } + + // start socket server +diff --git a/src/daemon/Display.h b/src/daemon/Display.h +index dc46463..3d6d6a5 100644 +--- a/src/daemon/Display.h ++++ b/src/daemon/Display.h +@@ -60,6 +60,7 @@ namespace SDDM { + void login(QLocalSocket *socket, + const QString &user, const QString &password, + const Session &session); ++ bool attemptAutologin(); + void displayServerStarted(); + + signals: +-- +2.5.0 + diff --git a/0008-Enable-PrivateTmp-again.patch b/0008-Enable-PrivateTmp-again.patch new file mode 100644 index 0000000..9a2ec46 --- /dev/null +++ b/0008-Enable-PrivateTmp-again.patch @@ -0,0 +1,26 @@ +From c7409687ad26b7f47a2cd73eddb8617ef7cd4701 Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Thu, 5 Nov 2015 23:29:59 +0100 +Subject: [PATCH 08/34] Enable PrivateTmp again + +Let's see if #225 is still happening. +--- + services/sddm.service.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/services/sddm.service.in b/services/sddm.service.in +index b0cea02..c476441 100644 +--- a/services/sddm.service.in ++++ b/services/sddm.service.in +@@ -7,7 +7,7 @@ After=systemd-user-sessions.service getty@tty1.service plymouth-quit.service + [Service] + ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/sddm + Restart=always +-#PrivateTmp=yes ++PrivateTmp=yes + + [Install] + Alias=display-manager.service +-- +2.5.0 + diff --git a/0009-Improve-config-file-comments.patch b/0009-Improve-config-file-comments.patch new file mode 100644 index 0000000..af9caba --- /dev/null +++ b/0009-Improve-config-file-comments.patch @@ -0,0 +1,115 @@ +From f64bd7a92728158a78653dd6e8373703168b11c6 Mon Sep 17 00:00:00 2001 +From: Jerome Leclanche +Date: Thu, 5 Nov 2015 20:44:58 +0200 +Subject: [PATCH 09/34] Improve config file comments + +--- + src/common/Configuration.h | 69 +++++++++++++++++++++++----------------------- + 1 file changed, 35 insertions(+), 34 deletions(-) + +diff --git a/src/common/Configuration.h b/src/common/Configuration.h +index 763b74f..1997fe0 100644 +--- a/src/common/Configuration.h ++++ b/src/common/Configuration.h +@@ -36,63 +36,64 @@ namespace SDDM { + Config(MainConfig, QStringLiteral(CONFIG_FILE), + enum NumState { NUM_NONE, NUM_SET_ON, NUM_SET_OFF }; + +- // Name Type Default value Description +- Entry(HaltCommand, QString, _S(HALT_COMMAND), _S("Halt command")); +- Entry(RebootCommand, QString, _S(REBOOT_COMMAND), _S("Reboot command")); +- Entry(Numlock, NumState, NUM_NONE, _S("Initial NumLock state\n" +- "Valid values: on|off|none\n" +- "If property is set to none, numlock won't be changed")); +- // Name Entries (but it's a regular class again) ++ // Name Type Default value Description ++ Entry(HaltCommand, QString, _S(HALT_COMMAND), _S("Halt command")); ++ Entry(RebootCommand, QString, _S(REBOOT_COMMAND), _S("Reboot command")); ++ Entry(Numlock, NumState, NUM_NONE, _S("Initial NumLock state. Can be on, off or none.\n" ++ "If property is set to none, numlock won't be changed\n" ++ "NOTE: Currently ignored if autologin is enabled.")); ++ // Name Entries (but it's a regular class again) + Section(Theme, + Entry(ThemeDir, QString, _S(DATA_INSTALL_DIR "/themes"), _S("Theme directory path")); + Entry(Current, QString, _S("maui"), _S("Current theme name")); +- Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Face icon directory\n" +- "The files should be in username.face.icon format")); +- Entry(CursorTheme, QString, QString(), _S("Cursor theme")); ++ Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Global directory for user avatars\n" ++ "The files should be named .face.icon")); ++ Entry(CursorTheme, QString, QString(), _S("Cursor theme used in the greeter")); + Entry(EnableAvatars, bool, true, _S("Enable display of custom user avatars")); + ); ++ + // TODO: Not absolutely sure if everything belongs here. Xsessions, VT and probably some more seem universal + Section(XDisplay, +- Entry(ServerPath, QString, _S("/usr/bin/X"), _S("X server path")); +- Entry(ServerArguments, QString, _S("-nolisten tcp"), _S("X server arguments")); +- Entry(XephyrPath, QString, _S("/usr/bin/Xephyr"), _S("Xephyr path")); +- Entry(XauthPath, QString, _S("/usr/bin/xauth"), _S("Xauth path")); +- Entry(SessionDir, QString, _S("/usr/share/xsessions"), _S("Session description directory")); +- Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Xsession script path\n" +- "A script to execute when starting the desktop session")); +- Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Xsetup script path\n" +- "A script to execute when starting the display server")); +- Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Xstop script path\n" +- "A script to execute when stopping the display server")); +- Entry(MinimumVT, int, MINIMUM_VT, _S("Minimum VT\n" +- "The lowest virtual terminal number that will be used.")); ++ Entry(ServerPath, QString, _S("/usr/bin/X"), _S("Path to X server binary")); ++ Entry(ServerArguments, QString, _S("-nolisten tcp"), _S("Arguments passed to the X server invocation")); ++ Entry(XephyrPath, QString, _S("/usr/bin/Xephyr"), _S("Path to Xephyr binary")); ++ Entry(XauthPath, QString, _S("/usr/bin/xauth"), _S("Path to xauth binary")); ++ Entry(SessionDir, QString, _S("/usr/share/xsessions"), _S("Directory containing available X sessions")); ++ Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); ++ Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Path to a script to execute when starting the display server")); ++ Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Path to a script to execute when stopping the display server")); ++ Entry(MinimumVT, int, MINIMUM_VT, _S("The lowest virtual terminal number that will be used.")); + ); ++ + Section(WaylandDisplay, +- Entry(SessionDir, QString, _S("/usr/share/wayland-sessions"), _S("Session description directory")); +- Entry(SessionCommand, QString, _S(WAYLAND_SESSION_COMMAND), _S("Wayland session script path\n" +- "A script to execute when starting the desktop session")); ++ Entry(SessionDir, QString, _S("/usr/share/wayland-sessions"), _S("Directory containing available Wayland sessions")); ++ Entry(SessionCommand, QString, _S(WAYLAND_SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); + ); ++ + Section(Users, +- Entry(DefaultPath, QString, _S("/bin:/usr/bin:/usr/local/bin"), _S("Default $PATH")); ++ Entry(DefaultPath, QString, _S("/bin:/usr/bin:/usr/local/bin"), _S("Default $PATH for logged in users")); + Entry(MinimumUid, int, UID_MIN, _S("Minimum user id for displayed users")); + Entry(MaximumUid, int, UID_MAX, _S("Maximum user id for displayed users")); +- Entry(HideUsers, QStringList, QStringList(), _S("Hidden users")); +- Entry(HideShells, QStringList, QStringList(), _S("Hidden shells\n" ++ Entry(HideUsers, QStringList, QStringList(), _S("Comma-separated list of users that should not be listed")); ++ Entry(HideShells, QStringList, QStringList(), _S("Comma-separated list of shells.\n" + "Users with these shells as their default won't be listed")); + Entry(RememberLastUser, bool, true, _S("Remember the last successfully logged in user")); + Entry(RememberLastSession, bool, true, _S("Remember the session of the last successfully logged in user")); + ); ++ + Section(Autologin, +- Entry(User, QString, QString(), _S("Autologin user")); +- Entry(Session, QString, QString(), _S("Autologin session")); +- Entry(Relogin, bool, false, _S("Autologin again on session exit")); ++ Entry(User, QString, QString(), _S("Username for autologin session")); ++ Entry(Session, QString, QString(), _S("Name of session file for autologin session")); ++ Entry(Relogin, bool, false, _S("Whether sddm should automatically log back into sessions when they exit")); + ); + ); + + Config(StateConfig, []()->QString{auto tmp = getpwnam("sddm"); return tmp ? QString::fromLocal8Bit(tmp->pw_dir) : QStringLiteral(STATE_DIR);}().append(QStringLiteral("/state.conf")), + Section(Last, +- Entry(Session, QString, QString(), _S("Name of the session file of the last session selected. This session will be preselected when the login screen shows up.")); +- Entry(User, QString, QString(), _S("Name of the last logged-in user. This username will be preselected/shown when the login screen shows up")); ++ Entry(Session, QString, QString(), _S("Name of the session for the last logged-in user.\n" ++ "This session will be preselected when the login screen appears.")); ++ Entry(User, QString, QString(), _S("Name of the last logged-in user.\n" ++ "This user will be preselected when the login screen appears")); + ); + ); + +-- +2.5.0 + diff --git a/0010-elarun-Remove-duplicate-session-selector.patch b/0010-elarun-Remove-duplicate-session-selector.patch new file mode 100644 index 0000000..39f6313 --- /dev/null +++ b/0010-elarun-Remove-duplicate-session-selector.patch @@ -0,0 +1,35 @@ +From f19e0f3ce5ba9b31c9bc9aa08ec8805b933e5468 Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Fri, 6 Nov 2015 08:16:28 +0100 +Subject: [PATCH 10/34] elarun: Remove duplicate session selector + +Closes #521 + +[ChangeLog][Themes] Remove duplicate session selector +from elarun. +--- + data/themes/elarun/Main.qml | 8 -------- + 1 file changed, 8 deletions(-) + +diff --git a/data/themes/elarun/Main.qml b/data/themes/elarun/Main.qml +index 28c0168..a83f0e7 100644 +--- a/data/themes/elarun/Main.qml ++++ b/data/themes/elarun/Main.qml +@@ -165,14 +165,6 @@ Rectangle { + spacing: 8 + + ImageButton { +- id: session_button +- source: "images/session_normal.png" +- onClicked: if (menu_session.state === "visible") menu_session.state = ""; else menu_session.state = "visible" +- +- KeyNavigation.backtab: login_button; KeyNavigation.tab: system_button +- } +- +- ImageButton { + id: system_button + source: "images/system_shutdown.png" + onClicked: sddm.powerOff() +-- +2.5.0 + diff --git a/0012-Configurable-user-session-log.patch b/0012-Configurable-user-session-log.patch new file mode 100644 index 0000000..8c3686f --- /dev/null +++ b/0012-Configurable-user-session-log.patch @@ -0,0 +1,98 @@ +From a935425e5f4af229680f0e5bda0a7898020a06c4 Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Sat, 17 Oct 2015 18:29:20 +0200 +Subject: [PATCH 12/34] Configurable user session log + +See issue #135. + +[ChangeLog][Configuration] Add SessionLogFile to the XDisplay and +WaylandDisplay sections in order to make user session log location +configurable. +--- + data/man/sddm.conf.rst.in | 8 ++++++++ + src/common/Configuration.h | 2 ++ + src/helper/UserSession.cpp | 15 +++++++++++---- + 3 files changed, 21 insertions(+), 4 deletions(-) + +diff --git a/data/man/sddm.conf.rst.in b/data/man/sddm.conf.rst.in +index d5263e0..edce9cf 100644 +--- a/data/man/sddm.conf.rst.in ++++ b/data/man/sddm.conf.rst.in +@@ -93,6 +93,10 @@ OPTIONS + Path of script to execute when starting the desktop session. + Default value is "@SESSION_COMMAND@". + ++`SessionLogFile=` ++ Path to the user session log file, relative to the home directory. ++ Default value is ".cache/xsession-errors". ++ + `DisplayCommand=` + Path of script to execute when starting the display server. + Default value is "@DATA_INSTALL_DIR@/scripts/Xsetup". +@@ -117,6 +121,10 @@ OPTIONS + Path of script to execute when starting the desktop session. + Default value is "@WAYLAND_SESSION_COMMAND@". + ++`SessionLogFile=` ++ Path to the user session log file, relative to the home directory. ++ Default value is ".cache/wayland-errors". ++ + [Users] section: + + `DefaultPath=` +diff --git a/src/common/Configuration.h b/src/common/Configuration.h +index 1997fe0..89a57db 100644 +--- a/src/common/Configuration.h ++++ b/src/common/Configuration.h +@@ -60,6 +60,7 @@ namespace SDDM { + Entry(XauthPath, QString, _S("/usr/bin/xauth"), _S("Path to xauth binary")); + Entry(SessionDir, QString, _S("/usr/share/xsessions"), _S("Directory containing available X sessions")); + Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); ++ Entry(SessionLogFile, QString, _S(".cache/xsession-errors"), _S("Path to the user session log file")); + Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Path to a script to execute when starting the display server")); + Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Path to a script to execute when stopping the display server")); + Entry(MinimumVT, int, MINIMUM_VT, _S("The lowest virtual terminal number that will be used.")); +@@ -68,6 +69,7 @@ namespace SDDM { + Section(WaylandDisplay, + Entry(SessionDir, QString, _S("/usr/share/wayland-sessions"), _S("Directory containing available Wayland sessions")); + Entry(SessionCommand, QString, _S(WAYLAND_SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); ++ Entry(SessionLogFile, QString, _S(".cache/wayland-errors"), _S("Path to the user session log file")); + ); + + Section(Users, +diff --git a/src/helper/UserSession.cpp b/src/helper/UserSession.cpp +index 0c0ab2b..bd6d1c5 100644 +--- a/src/helper/UserSession.cpp ++++ b/src/helper/UserSession.cpp +@@ -134,17 +134,24 @@ namespace SDDM { + //we want to redirect after we setuid so that the log file is owned by the user + + // determine stderr log file based on session type +- QString fileName = sessionType == QStringLiteral("x11") +- ? QStringLiteral(".xsession-errors") : QStringLiteral(".wayland-errors"); ++ QString sessionLog = QStringLiteral("%1/%2") ++ .arg(QString::fromLocal8Bit(pw->pw_dir)) ++ .arg(sessionType == QStringLiteral("x11") ++ ? mainConfig.XDisplay.SessionLogFile.get() ++ : mainConfig.WaylandDisplay.SessionLogFile.get()); ++ ++ // create the path ++ QFileInfo finfo(sessionLog); ++ QDir().mkpath(finfo.absolutePath()); + + //swap the stderr pipe of this subprcess into a file +- int fd = ::open(qPrintable(fileName), O_WRONLY | O_CREAT | O_TRUNC, 0600); ++ int fd = ::open(qPrintable(sessionLog), O_WRONLY | O_CREAT | O_TRUNC, 0600); + if (fd >= 0) + { + dup2 (fd, STDERR_FILENO); + ::close(fd); + } else { +- qWarning() << "Could not open stderr to" << fileName; ++ qWarning() << "Could not open stderr to" << sessionLog; + } + + //redirect any stdout to /dev/null +-- +2.5.0 + diff --git a/0013-Configurable-Xauthority-file.patch b/0013-Configurable-Xauthority-file.patch new file mode 100644 index 0000000..d2d54ac --- /dev/null +++ b/0013-Configurable-Xauthority-file.patch @@ -0,0 +1,89 @@ +From 467027b0168accd55e15303e5ba7348a6bfe95f5 Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Sat, 17 Oct 2015 18:49:09 +0200 +Subject: [PATCH 13/34] Configurable Xauthority file + +See issue #135. + +[ChangeLog][Configuration] Add UserAuthFile to the XDisplay section. +--- + data/man/sddm.conf.rst.in | 4 ++++ + src/common/Configuration.h | 1 + + src/helper/Backend.cpp | 10 ++++++++-- + src/helper/UserSession.cpp | 5 +++++ + 4 files changed, 18 insertions(+), 2 deletions(-) + +diff --git a/data/man/sddm.conf.rst.in b/data/man/sddm.conf.rst.in +index edce9cf..8d8a7d4 100644 +--- a/data/man/sddm.conf.rst.in ++++ b/data/man/sddm.conf.rst.in +@@ -97,6 +97,10 @@ OPTIONS + Path to the user session log file, relative to the home directory. + Default value is ".cache/xsession-errors". + ++`UserAuthFile=` ++ Path to the Xauthority file, relative to the home directory. ++ Default value is ".Xauthority". ++ + `DisplayCommand=` + Path of script to execute when starting the display server. + Default value is "@DATA_INSTALL_DIR@/scripts/Xsetup". +diff --git a/src/common/Configuration.h b/src/common/Configuration.h +index 89a57db..5bd5296 100644 +--- a/src/common/Configuration.h ++++ b/src/common/Configuration.h +@@ -61,6 +61,7 @@ namespace SDDM { + Entry(SessionDir, QString, _S("/usr/share/xsessions"), _S("Directory containing available X sessions")); + Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); + Entry(SessionLogFile, QString, _S(".cache/xsession-errors"), _S("Path to the user session log file")); ++ Entry(UserAuthFile, QString, _S(".Xauthority"), _S("Path to the Xauthority file")); + Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Path to a script to execute when starting the display server")); + Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Path to a script to execute when stopping the display server")); + Entry(MinimumVT, int, MINIMUM_VT, _S("The lowest virtual terminal number that will be used.")); +diff --git a/src/helper/Backend.cpp b/src/helper/Backend.cpp +index 12facb9..b19e6ed 100644 +--- a/src/helper/Backend.cpp ++++ b/src/helper/Backend.cpp +@@ -23,6 +23,7 @@ + + #include "backend/PamBackend.h" + #include "backend/PasswdBackend.h" ++#include "Configuration.h" + #include "UserSession.h" + + #include +@@ -62,8 +63,13 @@ namespace SDDM { + env.insert(QStringLiteral("SHELL"), QString::fromLocal8Bit(pw->pw_shell)); + env.insert(QStringLiteral("USER"), QString::fromLocal8Bit(pw->pw_name)); + env.insert(QStringLiteral("LOGNAME"), QString::fromLocal8Bit(pw->pw_name)); +- if (env.contains(QStringLiteral("DISPLAY")) && !env.contains(QStringLiteral("XAUTHORITY"))) +- env.insert(QStringLiteral("XAUTHORITY"), QStringLiteral("%1/.Xauthority").arg(QString::fromLocal8Bit(pw->pw_dir))); ++ if (env.contains(QStringLiteral("DISPLAY")) && !env.contains(QStringLiteral("XAUTHORITY"))) { ++ // determine Xauthority path ++ QString value = QStringLiteral("%1/%2") ++ .arg(QString::fromLocal8Bit(pw->pw_dir)) ++ .arg(mainConfig.XDisplay.UserAuthFile.get()); ++ env.insert(QStringLiteral("XAUTHORITY"), value); ++ } + // TODO: I'm fairly sure this shouldn't be done for PAM sessions, investigate! + m_app->session()->setProcessEnvironment(env); + } +diff --git a/src/helper/UserSession.cpp b/src/helper/UserSession.cpp +index bd6d1c5..0b16a9a 100644 +--- a/src/helper/UserSession.cpp ++++ b/src/helper/UserSession.cpp +@@ -173,6 +173,11 @@ namespace SDDM { + QString display = processEnvironment().value(QStringLiteral("DISPLAY")); + qDebug() << "Adding cookie to" << file; + ++ ++ // create the path ++ QFileInfo finfo(file); ++ QDir().mkpath(finfo.absolutePath()); ++ + QFile file_handler(file); + file_handler.open(QIODevice::WriteOnly); + file_handler.close(); +-- +2.5.0 + diff --git a/0015-Expose-arrow-background-color.patch b/0015-Expose-arrow-background-color.patch new file mode 100644 index 0000000..150e452 --- /dev/null +++ b/0015-Expose-arrow-background-color.patch @@ -0,0 +1,29 @@ +From 5447cc14400c913d385a4f3ed5a06ec3992023ad Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Mon, 9 Nov 2015 03:41:04 +0100 +Subject: [PATCH 15/34] Expose arrow background color + +Let themes change the arrow background color. +Closes #542. + +[ChangeLog][Components] ComboBox now exposes the arrow background color +as "arrowColor" property. +--- + components/2.0/ComboBox.qml | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/components/2.0/ComboBox.qml b/components/2.0/ComboBox.qml +index d9989ac..01c1248 100644 +--- a/components/2.0/ComboBox.qml ++++ b/components/2.0/ComboBox.qml +@@ -36,6 +36,7 @@ FocusScope { + property font font + property alias model: listView.model + property int index: 0 ++ property alias arrowColor: arrow.color + property alias arrowIcon: arrowIcon.source + + property Component rowDelegate: defaultRowDelegate +-- +2.5.0 + diff --git a/0020-Adds-a-count-property-to-UserModel.patch b/0020-Adds-a-count-property-to-UserModel.patch new file mode 100644 index 0000000..85b9344 --- /dev/null +++ b/0020-Adds-a-count-property-to-UserModel.patch @@ -0,0 +1,26 @@ +From 40c981a7b39611ffe6570e37e2e9419c95114cf0 Mon Sep 17 00:00:00 2001 +From: Antonio Larrosa +Date: Wed, 11 Nov 2015 19:04:29 +0100 +Subject: [PATCH 20/34] Adds a "count" property to UserModel + +Adds a count property to UserModel so sddm themes can access the number of users in the system. +The name "count" is to mimic the "count" property in QML's standard ListModel. +--- + src/greeter/UserModel.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/greeter/UserModel.h b/src/greeter/UserModel.h +index 99d2770..e089b4d 100644 +--- a/src/greeter/UserModel.h ++++ b/src/greeter/UserModel.h +@@ -32,6 +32,7 @@ namespace SDDM { + Q_DISABLE_COPY(UserModel) + Q_PROPERTY(int lastIndex READ lastIndex CONSTANT) + Q_PROPERTY(QString lastUser READ lastUser CONSTANT) ++ Q_PROPERTY(int count READ rowCount CONSTANT) + public: + enum UserRoles { + NameRole = Qt::UserRole + 1, +-- +2.5.0 + diff --git a/0021-Refactored-ConfigReader-is-matches-Default.patch b/0021-Refactored-ConfigReader-is-matches-Default.patch new file mode 100644 index 0000000..ef2ed84 --- /dev/null +++ b/0021-Refactored-ConfigReader-is-matches-Default.patch @@ -0,0 +1,104 @@ +From 9d16882177a832fa855416c69bc817cee2903622 Mon Sep 17 00:00:00 2001 +From: Antonio Larrosa +Date: Wed, 11 Nov 2015 19:05:08 +0100 +Subject: [PATCH 21/34] Refactored ConfigReader::(is|matches)Default() + +Previously, ConfigReader::isDefault didn't return if the value is +the default value but if it matches the default value. So I renamed the +method to matchesDefault() and created a new isDefault() method +that really returns if the value comes from the default value or +it was read from the config file or set. + +So if the user sets a variable in the config file with the same value +as the default value, then matchesDefault() returns true, but +isDefault() returns false +--- + src/common/ConfigReader.cpp | 6 +++--- + src/common/ConfigReader.h | 12 +++++++++++- + 2 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/src/common/ConfigReader.cpp b/src/common/ConfigReader.cpp +index bdfd22a..cfc9940 100644 +--- a/src/common/ConfigReader.cpp ++++ b/src/common/ConfigReader.cpp +@@ -186,17 +186,17 @@ namespace SDDM { + * Initialization of the map of nondefault values to be saved + */ + if (section) { +- if (entry && !entry->isDefault()) ++ if (entry && !entry->matchesDefault()) + remainingEntries.insert(section, entry); + else + for (const ConfigEntryBase *b : section->entries().values()) +- if (!b->isDefault()) ++ if (!b->matchesDefault()) + remainingEntries.insert(section, b); + } + else { + for (const ConfigSection *s : m_sections) + for (const ConfigEntryBase *b : s->entries().values()) +- if (!b->isDefault()) ++ if (!b->matchesDefault()) + remainingEntries.insert(s, b); + } + +diff --git a/src/common/ConfigReader.h b/src/common/ConfigReader.h +index 29782be..1fb7fd2 100644 +--- a/src/common/ConfigReader.h ++++ b/src/common/ConfigReader.h +@@ -77,6 +77,7 @@ namespace SDDM { + virtual void setValue(const QString &str) = 0; + virtual QString toConfigShort() const = 0; + virtual QString toConfigFull() const = 0; ++ virtual bool matchesDefault() const = 0; + virtual bool isDefault() const = 0; + }; + +@@ -107,6 +108,7 @@ namespace SDDM { + m_description(description), + m_default(value), + m_value(value), ++ m_isDefault(true), + m_parent(parent) { + m_parent->m_entries[name] = this; + } +@@ -117,13 +119,19 @@ namespace SDDM { + + void set(const T val) { + m_value = val; ++ m_isDefault = false; + } + +- bool isDefault() const { ++ bool matchesDefault() const { + return m_value == m_default; + } + ++ bool isDefault() const { ++ return m_isDefault; ++ } ++ + bool setDefault() { ++ m_isDefault = true; + if (m_value == m_default) + return false; + m_value = m_default; +@@ -147,6 +155,7 @@ namespace SDDM { + + // specialised for QString + void setValue(const QString &str) { ++ m_isDefault = false; + QTextStream in(qPrintable(str)); + in >> m_value; + } +@@ -167,6 +176,7 @@ namespace SDDM { + const QString m_description; + T m_default; + T m_value; ++ bool m_isDefault; + ConfigSection *m_parent; + }; + +-- +2.5.0 + diff --git a/0022-Defines-a-users-threshold-to-disable-avatars.patch b/0022-Defines-a-users-threshold-to-disable-avatars.patch new file mode 100644 index 0000000..cc1df18 --- /dev/null +++ b/0022-Defines-a-users-threshold-to-disable-avatars.patch @@ -0,0 +1,132 @@ +From 668f7c9c08ce4aeee7cc4d2d3386522bfae32cfb Mon Sep 17 00:00:00 2001 +From: Antonio Larrosa +Date: Wed, 11 Nov 2015 19:05:36 +0100 +Subject: [PATCH 22/34] Defines a users threshold to disable avatars + +Defines a new config setting DisableAvatarsThreshold. +If the number of users in the system is greater than +DisableAvatarsThreshold then avatars are disabled unless +explicitly enabled with EnableAvatars. Also, UserModel +adds a new disableAvatarsThreshold property so themes can +decide if using that config setting to do further optimizations +if there's a large number of users (like for example, +not show a user list, but username/password editlines). +--- + src/common/Configuration.h | 3 +++ + src/greeter/UserModel.cpp | 43 +++++++++++++++++++++++++------------------ + src/greeter/UserModel.h | 2 ++ + 3 files changed, 30 insertions(+), 18 deletions(-) + +diff --git a/src/common/Configuration.h b/src/common/Configuration.h +index 5bd5296..10310c3 100644 +--- a/src/common/Configuration.h ++++ b/src/common/Configuration.h +@@ -50,6 +50,9 @@ namespace SDDM { + "The files should be named .face.icon")); + Entry(CursorTheme, QString, QString(), _S("Cursor theme used in the greeter")); + Entry(EnableAvatars, bool, true, _S("Enable display of custom user avatars")); ++ Entry(DisableAvatarsThreshold,int, 7, _S("Number of users to use as threshold\n" ++ "above which avatars are disabled\n" ++ "unless explicitly enabled with EnableAvatars")); + ); + + // TODO: Not absolutely sure if everything belongs here. Xsessions, VT and probably some more seem universal +diff --git a/src/greeter/UserModel.cpp b/src/greeter/UserModel.cpp +index f56c67a..ba2a9db 100644 +--- a/src/greeter/UserModel.cpp ++++ b/src/greeter/UserModel.cpp +@@ -51,6 +51,9 @@ namespace SDDM { + }; + + UserModel::UserModel(QObject *parent) : QAbstractListModel(parent), d(new UserModelPrivate()) { ++ const QString facesDir = mainConfig.Theme.FacesDir.get(); ++ const QString defaultFace = QStringLiteral("%1/.face.icon").arg(facesDir); ++ + struct passwd *current_pw; + while ((current_pw = getpwent()) != nullptr) { + +@@ -81,23 +84,7 @@ namespace SDDM { + user->needsPassword = strcmp(current_pw->pw_passwd, "") != 0; + + // search for face icon +- QString facesDir = mainConfig.Theme.FacesDir.get(); +- QString defaultFace = QStringLiteral("%1/.face.icon").arg(facesDir); +- bool avatarsEnabled = mainConfig.Theme.EnableAvatars.get(); +- +- if (avatarsEnabled) { +- QString userFace = QStringLiteral("%1/.face.icon").arg(user->homeDir); +- QString systemFace = QStringLiteral("%1/%2.face.icon").arg(facesDir).arg(user->name); +- +- if (QFile::exists(userFace)) +- user->icon = userFace; +- else if (QFile::exists(systemFace)) +- user->icon = systemFace; +- else +- user->icon = defaultFace; +- } else { +- user->icon = defaultFace; +- } ++ user->icon = defaultFace; + + // add user + d->users << user; +@@ -108,10 +95,26 @@ namespace SDDM { + // sort users by username + std::sort(d->users.begin(), d->users.end(), [&](const UserPtr &u1, const UserPtr &u2) { return u1->name < u2->name; }); + ++ bool avatarsEnabled = mainConfig.Theme.EnableAvatars.get(); ++ if (avatarsEnabled && mainConfig.Theme.EnableAvatars.isDefault()) { ++ if (d->users.count() > mainConfig.Theme.DisableAvatarsThreshold.get()) avatarsEnabled=false; ++ } ++ + // find out index of the last user + for (int i = 0; i < d->users.size(); ++i) { +- if (d->users.at(i)->name == stateConfig.Last.User.get()) ++ UserPtr user { d->users.at(i) }; ++ if (user->name == stateConfig.Last.User.get()) + d->lastIndex = i; ++ ++ if (avatarsEnabled) { ++ const QString userFace = QStringLiteral("%1/.face.icon").arg(user->homeDir); ++ const QString systemFace = QStringLiteral("%1/%2.face.icon").arg(facesDir).arg(user->name); ++ ++ if (QFile::exists(userFace)) ++ user->icon = userFace; ++ else if (QFile::exists(systemFace)) ++ user->icon = systemFace; ++ } + } + } + +@@ -165,4 +168,8 @@ namespace SDDM { + // return empty value + return QVariant(); + } ++ ++ int UserModel::disableAvatarsThreshold() const { ++ return mainConfig.Theme.DisableAvatarsThreshold.get(); ++ } + } +diff --git a/src/greeter/UserModel.h b/src/greeter/UserModel.h +index e089b4d..1bbf77e 100644 +--- a/src/greeter/UserModel.h ++++ b/src/greeter/UserModel.h +@@ -33,6 +33,7 @@ namespace SDDM { + Q_PROPERTY(int lastIndex READ lastIndex CONSTANT) + Q_PROPERTY(QString lastUser READ lastUser CONSTANT) + Q_PROPERTY(int count READ rowCount CONSTANT) ++ Q_PROPERTY(int disableAvatarsThreshold READ disableAvatarsThreshold CONSTANT) + public: + enum UserRoles { + NameRole = Qt::UserRole + 1, +@@ -53,6 +54,7 @@ namespace SDDM { + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + ++ int disableAvatarsThreshold() const; + private: + UserModelPrivate *d { nullptr }; + }; +-- +2.5.0 + diff --git a/0024-Rename-XDisplay-and-WaylandDisplay-config-sections.patch b/0024-Rename-XDisplay-and-WaylandDisplay-config-sections.patch new file mode 100644 index 0000000..93ca2f0 --- /dev/null +++ b/0024-Rename-XDisplay-and-WaylandDisplay-config-sections.patch @@ -0,0 +1,246 @@ +From 98bcb147acb793bf642e8a7bc9f69facb80e469a Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Mon, 9 Nov 2015 20:22:07 +0100 +Subject: [PATCH 24/34] Rename XDisplay and WaylandDisplay config sections + +Closes #536 + +[ChangeLog][Configuration] Rename XDisplay section to X11 and +WaylandDisplay to Wayland because the "Display" part is unnecessary. +--- + data/man/sddm.conf.rst.in | 4 ++-- + src/common/Configuration.h | 4 ++-- + src/common/Session.cpp | 4 ++-- + src/daemon/Display.cpp | 4 ++-- + src/daemon/Seat.cpp | 2 +- + src/daemon/XorgDisplayServer.cpp | 14 +++++++------- + src/greeter/SessionModel.cpp | 4 ++-- + src/helper/Backend.cpp | 2 +- + src/helper/UserSession.cpp | 14 +++++++------- + 9 files changed, 26 insertions(+), 26 deletions(-) + +diff --git a/data/man/sddm.conf.rst.in b/data/man/sddm.conf.rst.in +index 8d8a7d4..9263788 100644 +--- a/data/man/sddm.conf.rst.in ++++ b/data/man/sddm.conf.rst.in +@@ -67,7 +67,7 @@ OPTIONS + them altogether. + Default value is true. + +-[XDisplay] section: ++[X11] section: + + `ServerPath=` + Path of the X server. +@@ -115,7 +115,7 @@ OPTIONS + increase as new displays added. + Default value is @MINIMUM_VT@. + +-[WaylandDisplay] section: ++[Wayland] section: + + `SessionDir=` + Path of the directory containing session files. +diff --git a/src/common/Configuration.h b/src/common/Configuration.h +index 10310c3..bc9ceb2 100644 +--- a/src/common/Configuration.h ++++ b/src/common/Configuration.h +@@ -56,7 +56,7 @@ namespace SDDM { + ); + + // TODO: Not absolutely sure if everything belongs here. Xsessions, VT and probably some more seem universal +- Section(XDisplay, ++ Section(X11, + Entry(ServerPath, QString, _S("/usr/bin/X"), _S("Path to X server binary")); + Entry(ServerArguments, QString, _S("-nolisten tcp"), _S("Arguments passed to the X server invocation")); + Entry(XephyrPath, QString, _S("/usr/bin/Xephyr"), _S("Path to Xephyr binary")); +@@ -70,7 +70,7 @@ namespace SDDM { + Entry(MinimumVT, int, MINIMUM_VT, _S("The lowest virtual terminal number that will be used.")); + ); + +- Section(WaylandDisplay, ++ Section(Wayland, + Entry(SessionDir, QString, _S("/usr/share/wayland-sessions"), _S("Directory containing available Wayland sessions")); + Entry(SessionCommand, QString, _S(WAYLAND_SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); + Entry(SessionLogFile, QString, _S(".cache/wayland-errors"), _S("Path to the user session log file")); +diff --git a/src/common/Session.cpp b/src/common/Session.cpp +index 66d73c9..017cff4 100644 +--- a/src/common/Session.cpp ++++ b/src/common/Session.cpp +@@ -108,11 +108,11 @@ namespace SDDM { + + switch (type) { + case X11Session: +- m_dir = QDir(mainConfig.XDisplay.SessionDir.get()); ++ m_dir = QDir(mainConfig.X11.SessionDir.get()); + m_xdgSessionType = QStringLiteral("x11"); + break; + case WaylandSession: +- m_dir = QDir(mainConfig.WaylandDisplay.SessionDir.get()); ++ m_dir = QDir(mainConfig.Wayland.SessionDir.get()); + m_xdgSessionType = QStringLiteral("wayland"); + break; + default: +diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp +index 6bc9965..7e35f3f 100644 +--- a/src/daemon/Display.cpp ++++ b/src/daemon/Display.cpp +@@ -108,9 +108,9 @@ namespace SDDM { + + // determine session type + const QString &autologinSession = mainConfig.Autologin.Session.get(); +- if (findSessionEntry(mainConfig.XDisplay.SessionDir.get(), autologinSession)) { ++ if (findSessionEntry(mainConfig.X11.SessionDir.get(), autologinSession)) { + sessionType = Session::X11Session; +- } else if (findSessionEntry(mainConfig.WaylandDisplay.SessionDir.get(), autologinSession)) { ++ } else if (findSessionEntry(mainConfig.Wayland.SessionDir.get(), autologinSession)) { + sessionType = Session::WaylandSession; + } else { + qCritical() << "Unable to find autologin session entry" << autologinSession; +diff --git a/src/daemon/Seat.cpp b/src/daemon/Seat.cpp +index 915d619..3ef1b2f 100644 +--- a/src/daemon/Seat.cpp ++++ b/src/daemon/Seat.cpp +@@ -57,7 +57,7 @@ namespace SDDM { + + if (terminalId == -1) { + // find unused terminal +- terminalId = findUnused(mainConfig.XDisplay.MinimumVT.get(), [&](const int number) { ++ terminalId = findUnused(mainConfig.X11.MinimumVT.get(), [&](const int number) { + return m_terminalIds.contains(number); + }); + } +diff --git a/src/daemon/XorgDisplayServer.cpp b/src/daemon/XorgDisplayServer.cpp +index a7e8436..d06d89a 100644 +--- a/src/daemon/XorgDisplayServer.cpp ++++ b/src/daemon/XorgDisplayServer.cpp +@@ -95,7 +95,7 @@ namespace SDDM { + file_handler.open(QIODevice::WriteOnly); + file_handler.close(); + +- QString cmd = QStringLiteral("%1 -f %2 -q").arg(mainConfig.XDisplay.XauthPath.get()).arg(file); ++ QString cmd = QStringLiteral("%1 -f %2 -q").arg(mainConfig.X11.XauthPath.get()).arg(file); + + // execute xauth + FILE *fp = popen(qPrintable(cmd), "w"); +@@ -128,7 +128,7 @@ namespace SDDM { + if (daemonApp->testing()) { + QStringList args; + args << m_display << QStringLiteral("-ac") << QStringLiteral("-br") << QStringLiteral("-noreset") << QStringLiteral("-screen") << QStringLiteral("800x600"); +- process->start(mainConfig.XDisplay.XephyrPath.get(), args); ++ process->start(mainConfig.X11.XephyrPath.get(), args); + + + // wait for display server to start +@@ -154,16 +154,16 @@ namespace SDDM { + } + + // start display server +- QStringList args = mainConfig.XDisplay.ServerArguments.get().split(QLatin1Char(' '), QString::SkipEmptyParts); ++ QStringList args = mainConfig.X11.ServerArguments.get().split(QLatin1Char(' '), QString::SkipEmptyParts); + args << QStringLiteral("-auth") << m_authPath + << QStringLiteral("-background") << QStringLiteral("none") + << QStringLiteral("-noreset") + << QStringLiteral("-displayfd") << QString::number(pipeFds[1]) + << QStringLiteral("vt%1").arg(displayPtr()->terminalId()); + qDebug() << "Running:" +- << qPrintable(mainConfig.XDisplay.ServerPath.get()) ++ << qPrintable(mainConfig.X11.ServerPath.get()) + << qPrintable(args.join(QLatin1Char(' '))); +- process->start(mainConfig.XDisplay.ServerPath.get(), args); ++ process->start(mainConfig.X11.ServerPath.get(), args); + + // wait for display server to start + if (!process->waitForStarted()) { +@@ -236,7 +236,7 @@ namespace SDDM { + // log message + qDebug() << "Display server stopped."; + +- QString displayStopCommand = mainConfig.XDisplay.DisplayStopCommand.get(); ++ QString displayStopCommand = mainConfig.X11.DisplayStopCommand.get(); + + // create display setup script process + QProcess *displayStopScript = new QProcess(); +@@ -273,7 +273,7 @@ namespace SDDM { + } + + void XorgDisplayServer::setupDisplay() { +- QString displayCommand = mainConfig.XDisplay.DisplayCommand.get(); ++ QString displayCommand = mainConfig.X11.DisplayCommand.get(); + + // create display setup script process + QProcess *displayScript = new QProcess(); +diff --git a/src/greeter/SessionModel.cpp b/src/greeter/SessionModel.cpp +index e34e922..9b33311 100644 +--- a/src/greeter/SessionModel.cpp ++++ b/src/greeter/SessionModel.cpp +@@ -38,8 +38,8 @@ namespace SDDM { + }; + + SessionModel::SessionModel(QObject *parent) : QAbstractListModel(parent), d(new SessionModelPrivate()) { +- populate(Session::X11Session, mainConfig.XDisplay.SessionDir.get()); +- populate(Session::WaylandSession, mainConfig.WaylandDisplay.SessionDir.get()); ++ populate(Session::X11Session, mainConfig.X11.SessionDir.get()); ++ populate(Session::WaylandSession, mainConfig.Wayland.SessionDir.get()); + } + + SessionModel::~SessionModel() { +diff --git a/src/helper/Backend.cpp b/src/helper/Backend.cpp +index b19e6ed..b24b62f 100644 +--- a/src/helper/Backend.cpp ++++ b/src/helper/Backend.cpp +@@ -67,7 +67,7 @@ namespace SDDM { + // determine Xauthority path + QString value = QStringLiteral("%1/%2") + .arg(QString::fromLocal8Bit(pw->pw_dir)) +- .arg(mainConfig.XDisplay.UserAuthFile.get()); ++ .arg(mainConfig.X11.UserAuthFile.get()); + env.insert(QStringLiteral("XAUTHORITY"), value); + } + // TODO: I'm fairly sure this shouldn't be done for PAM sessions, investigate! +diff --git a/src/helper/UserSession.cpp b/src/helper/UserSession.cpp +index 0b16a9a..d541d19 100644 +--- a/src/helper/UserSession.cpp ++++ b/src/helper/UserSession.cpp +@@ -46,14 +46,14 @@ namespace SDDM { + if (env.value(QStringLiteral("XDG_SESSION_CLASS")) == QStringLiteral("greeter")) { + QProcess::start(m_path); + } else if (env.value(QStringLiteral("XDG_SESSION_TYPE")) == QStringLiteral("x11")) { +- qDebug() << "Starting:" << mainConfig.XDisplay.SessionCommand.get() ++ qDebug() << "Starting:" << mainConfig.X11.SessionCommand.get() + << m_path; +- QProcess::start(mainConfig.XDisplay.SessionCommand.get(), ++ QProcess::start(mainConfig.X11.SessionCommand.get(), + QStringList() << m_path); + } else if (env.value(QStringLiteral("XDG_SESSION_TYPE")) == QStringLiteral("wayland")) { +- qDebug() << "Starting:" << mainConfig.WaylandDisplay.SessionCommand.get() ++ qDebug() << "Starting:" << mainConfig.Wayland.SessionCommand.get() + << m_path; +- QProcess::start(mainConfig.WaylandDisplay.SessionCommand.get(), ++ QProcess::start(mainConfig.Wayland.SessionCommand.get(), + QStringList() << m_path); + } else { + qCritical() << "Unable to run user session: unknown session type"; +@@ -137,8 +137,8 @@ namespace SDDM { + QString sessionLog = QStringLiteral("%1/%2") + .arg(QString::fromLocal8Bit(pw->pw_dir)) + .arg(sessionType == QStringLiteral("x11") +- ? mainConfig.XDisplay.SessionLogFile.get() +- : mainConfig.WaylandDisplay.SessionLogFile.get()); ++ ? mainConfig.X11.SessionLogFile.get() ++ : mainConfig.Wayland.SessionLogFile.get()); + + // create the path + QFileInfo finfo(sessionLog); +@@ -182,7 +182,7 @@ namespace SDDM { + file_handler.open(QIODevice::WriteOnly); + file_handler.close(); + +- QString cmd = QStringLiteral("%1 -f %2 -q").arg(mainConfig.XDisplay.XauthPath.get()).arg(file); ++ QString cmd = QStringLiteral("%1 -f %2 -q").arg(mainConfig.X11.XauthPath.get()).arg(file); + + // execute xauth + FILE *fp = popen(qPrintable(cmd), "w"); +-- +2.5.0 + diff --git a/0025-Fix-crash-reading-lists-from-configuration.patch b/0025-Fix-crash-reading-lists-from-configuration.patch new file mode 100644 index 0000000..afb8e5b --- /dev/null +++ b/0025-Fix-crash-reading-lists-from-configuration.patch @@ -0,0 +1,38 @@ +From 56f64173991204a1eea4bf6789d68555b94e3eae Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Wed, 9 Dec 2015 13:20:20 +0100 +Subject: [PATCH 25/34] Fix crash reading lists from configuration + +Check the end of line to avoid taking a string reference from a +null string resulting in a crash. +--- + src/common/ConfigReader.cpp | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/src/common/ConfigReader.cpp b/src/common/ConfigReader.cpp +index cfc9940..acf880f 100644 +--- a/src/common/ConfigReader.cpp ++++ b/src/common/ConfigReader.cpp +@@ -30,11 +30,14 @@ + + QTextStream &operator>>(QTextStream &str, QStringList &list) { + list.clear(); +- foreach(const QStringRef &s, str.readLine().splitRef(QLatin1Char(','))) +- { +- QStringRef trimmed = s.trimmed(); +- if (!trimmed.isEmpty()) +- list.append(trimmed.toString()); ++ QString line = str.readLine(); ++ while (!line.isNull()) { ++ Q_FOREACH (const QStringRef &s, line.splitRef(QLatin1Char(','))) { ++ QStringRef trimmed = s.trimmed(); ++ if (!trimmed.isEmpty()) ++ list.append(trimmed.toString()); ++ } ++ line = str.readLine(); + } + return str; + } +-- +2.5.0 + diff --git a/0026-Do-not-read-multiple-lines.patch b/0026-Do-not-read-multiple-lines.patch new file mode 100644 index 0000000..ea11301 --- /dev/null +++ b/0026-Do-not-read-multiple-lines.patch @@ -0,0 +1,41 @@ +From cdd6552bd8a839f29ecb84abd7b98f1c0fcd2b99 Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Sat, 16 Jan 2016 18:55:37 +0100 +Subject: [PATCH 26/34] Do not read multiple lines + +Reading multiple lines wouldn't help here as input comes from a previous +readLine(). +--- + src/common/ConfigReader.cpp | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/src/common/ConfigReader.cpp b/src/common/ConfigReader.cpp +index acf880f..07eb30c 100644 +--- a/src/common/ConfigReader.cpp ++++ b/src/common/ConfigReader.cpp +@@ -30,15 +30,15 @@ + + QTextStream &operator>>(QTextStream &str, QStringList &list) { + list.clear(); ++ + QString line = str.readLine(); +- while (!line.isNull()) { +- Q_FOREACH (const QStringRef &s, line.splitRef(QLatin1Char(','))) { +- QStringRef trimmed = s.trimmed(); +- if (!trimmed.isEmpty()) +- list.append(trimmed.toString()); +- } +- line = str.readLine(); ++ ++ Q_FOREACH (const QStringRef &s, line.splitRef(QLatin1Char(','))) { ++ QStringRef trimmed = s.trimmed(); ++ if (!trimmed.isEmpty()) ++ list.append(trimmed.toString()); + } ++ + return str; + } + +-- +2.5.0 + diff --git a/0027-Fix-moc-include-name.patch b/0027-Fix-moc-include-name.patch new file mode 100644 index 0000000..111fba7 --- /dev/null +++ b/0027-Fix-moc-include-name.patch @@ -0,0 +1,34 @@ +From 1231b5fce8b7f9d99b3a0b8fa17e10d797890c43 Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Sat, 16 Jan 2016 18:59:46 +0100 +Subject: [PATCH 27/34] Fix moc include name + +--- + src/greeter/KeyboardModel.cpp | 2 +- + test/ConfigurationTest.cpp | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/src/greeter/KeyboardModel.cpp b/src/greeter/KeyboardModel.cpp +index 3f87c9f..7d40441 100644 +--- a/src/greeter/KeyboardModel.cpp ++++ b/src/greeter/KeyboardModel.cpp +@@ -113,4 +113,4 @@ namespace SDDM { + } + } + +-#include "KeyboardModel.moc" ++#include "moc_KeyboardModel.cpp" +diff --git a/test/ConfigurationTest.cpp b/test/ConfigurationTest.cpp +index bd07d9f..72bf8c9 100644 +--- a/test/ConfigurationTest.cpp ++++ b/test/ConfigurationTest.cpp +@@ -177,5 +177,4 @@ void ConfigurationTest::FileChanged() + QVERIFY(config->String.get() == QStringLiteral("b")); + } + +- +-#include "ConfigurationTest.moc" ++#include "moc_ConfigurationTest.cpp" +-- +2.5.0 + diff --git a/0028-Allow-for-overriding-the-text-color-of-PasswordBox.patch b/0028-Allow-for-overriding-the-text-color-of-PasswordBox.patch new file mode 100644 index 0000000..4f00e36 --- /dev/null +++ b/0028-Allow-for-overriding-the-text-color-of-PasswordBox.patch @@ -0,0 +1,26 @@ +From 4e2ee766af16d13345cb4a39ff1859a436bfa0e7 Mon Sep 17 00:00:00 2001 +From: Steve Gerbino +Date: Mon, 25 Jan 2016 01:55:33 -0500 +Subject: [PATCH 28/34] Allow for overriding the text color of PasswordBox + +Fixes #590 +--- + components/2.0/PasswordBox.qml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/components/2.0/PasswordBox.qml b/components/2.0/PasswordBox.qml +index 249ed43..8973eb2 100644 +--- a/components/2.0/PasswordBox.qml ++++ b/components/2.0/PasswordBox.qml +@@ -34,7 +34,7 @@ FocusScope { + property alias hoverColor: txtMain.hoverColor + property alias radius: txtMain.radius + property alias font: txtMain.font +- property alias textColor: txtMain.color ++ property alias textColor: txtMain.textColor + property alias echoMode: txtMain.echoMode + property alias text: txtMain.text + +-- +2.5.0 + diff --git a/0031-Add-instructions-on-how-to-change-DPI.patch b/0031-Add-instructions-on-how-to-change-DPI.patch new file mode 100644 index 0000000..0603667 --- /dev/null +++ b/0031-Add-instructions-on-how-to-change-DPI.patch @@ -0,0 +1,37 @@ +From 4c1212e0d3aa17cded4db2dd394285365d44e7bc Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Thu, 28 Jan 2016 08:04:19 +0100 +Subject: [PATCH 31/34] Add instructions on how to change DPI + +Closes #402 +--- + README.md | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/README.md b/README.md +index 3961e18..9c23bab 100644 +--- a/README.md ++++ b/README.md +@@ -78,3 +78,19 @@ ACLs if your filesystem does support it. + setfacl -m u:sddm:x /home/username + setfacl -m u:sddm:r /home/username/.face.icon + ``` ++ ++### Custom DPI ++ ++In order to set custom DPI for high resolution screens you should configure ++Xorg yourself. An easy way is to pass an additional argument to Xorg. ++ ++Edit ``/etc/sddm.conf``, go to the ``X11`` section and change ``ServerArguments`` like this: ++ ++``` ++ServerArguments="-nolisten tcp -dpi 192" ++``` ++ ++to set DPI to 192. ++ ++As an alternative you can edit Xorg configuration ``xorg.conf``, please refer to the ++Xorg documentation. +-- +2.5.0 + diff --git a/0032-Honor-RememberLastUser-and-RememberLastSession-setti.patch b/0032-Honor-RememberLastUser-and-RememberLastSession-setti.patch new file mode 100644 index 0000000..12d6443 --- /dev/null +++ b/0032-Honor-RememberLastUser-and-RememberLastSession-setti.patch @@ -0,0 +1,38 @@ +From ef7b3177adb3673a482c68cb62281cd9a5ca8e8d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?P=C3=A9ter=20Radics?= +Date: Wed, 30 Dec 2015 16:58:15 +0100 +Subject: [PATCH 32/34] Honor RememberLastUser and RememberLastSession + settings. + +Revert to default if RememberLastUser or RememberLastSession is +set to false. + +Fix issue #527. +--- + src/daemon/Display.cpp | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp +index 7e35f3f..2e6e123 100644 +--- a/src/daemon/Display.cpp ++++ b/src/daemon/Display.cpp +@@ -304,8 +304,14 @@ namespace SDDM { + m_auth->setCookie(qobject_cast(m_displayServer)->cookie()); + + // save last user and last session +- stateConfig.Last.User.set(m_auth->user()); +- stateConfig.Last.Session.set(m_sessionName); ++ if (mainConfig.Users.RememberLastUser.get()) ++ stateConfig.Last.User.set(m_auth->user()); ++ else ++ stateConfig.Last.User.setDefault(); ++ if (mainConfig.Users.RememberLastSession.get()) ++ stateConfig.Last.Session.set(m_sessionName); ++ else ++ stateConfig.Last.Session.setDefault(); + stateConfig.save(); + + if (m_socket) +-- +2.5.0 + diff --git a/0033-Activate-window-for-the-primary-screen.patch b/0033-Activate-window-for-the-primary-screen.patch new file mode 100644 index 0000000..4fde305 --- /dev/null +++ b/0033-Activate-window-for-the-primary-screen.patch @@ -0,0 +1,112 @@ +From 6d5b36b28907b16280ff78995fef764bb0c573db Mon Sep 17 00:00:00 2001 +From: Pier Luigi Fiorini +Date: Sat, 16 Jan 2016 19:52:09 +0100 +Subject: [PATCH 33/34] Activate window for the primary screen + +Request activation for the view on the primary screen +otherwise text fields won't get focus. + +Closes #501 + +[ChangeLog][Greeter] Fix text field focus (issue #501) +--- + src/greeter/GreeterApp.cpp | 31 ++++++++++++++++++++++++++++++- + src/greeter/GreeterApp.h | 4 +++- + 2 files changed, 33 insertions(+), 2 deletions(-) + +diff --git a/src/greeter/GreeterApp.cpp b/src/greeter/GreeterApp.cpp +index 06d13c5..8201a4e 100644 +--- a/src/greeter/GreeterApp.cpp ++++ b/src/greeter/GreeterApp.cpp +@@ -1,5 +1,5 @@ + /*************************************************************************** +-* Copyright (c) 2015 Pier Luigi Fiorini ++* Copyright (c) 2015-2016 Pier Luigi Fiorini + * Copyright (c) 2013 Abdurrahman AVCI + * + * This program is free software; you can redistribute it and/or modify +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + + #include +@@ -135,6 +136,11 @@ namespace SDDM { + + // handle screens + connect(this, &GreeterApp::screenAdded, this, &GreeterApp::addViewForScreen); ++#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) ++ connect(this, &GreeterApp::primaryScreenChanged, this, [this](QScreen *) { ++ activatePrimary(); ++ }); ++#endif + } + + void GreeterApp::addViewForScreen(QScreen *screen) { +@@ -144,6 +150,7 @@ namespace SDDM { + view->setResizeMode(QQuickView::SizeRootObjectToView); + //view->setGeometry(QRect(QPoint(0, 0), screen->geometry().size())); + view->setGeometry(screen->geometry()); ++ m_views.append(view); + + // remove the view when the screen is removed, but we + // need to be careful here since Qt will move the view to +@@ -201,11 +208,33 @@ namespace SDDM { + // show + qDebug() << "Adding view for" << screen->name() << screen->geometry(); + view->show(); ++ ++ // activate windows for the primary screen to give focus to text fields ++ if (QGuiApplication::primaryScreen() == screen) ++ view->requestActivate(); + } + + void GreeterApp::removeViewForScreen(QQuickView *view) { ++ // screen is gone, remove the window + m_views.removeOne(view); + view->deleteLater(); ++ ++#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0) ++ // starting from Qt 5.6 we are notified when the primary screen is changed ++ // and we request activation for the view when we get the signal, with ++ // older version we iterate the views and request activation ++ activatePrimary(); ++#endif ++ } ++ ++ void GreeterApp::activatePrimary() { ++ // activate and give focus to the window assigned to the primary screen ++ Q_FOREACH (QQuickView *view, m_views) { ++ if (view->screen() == QGuiApplication::primaryScreen()) { ++ view->requestActivate(); ++ break; ++ } ++ } + } + } + +diff --git a/src/greeter/GreeterApp.h b/src/greeter/GreeterApp.h +index 91fc1a9..1ebd981 100644 +--- a/src/greeter/GreeterApp.h ++++ b/src/greeter/GreeterApp.h +@@ -1,5 +1,5 @@ + /*************************************************************************** +-* Copyright (c) 2015 Pier Luigi Fiorini ++* Copyright (c) 2015-2016 Pier Luigi Fiorini + * Copyright (c) 2013 Nikita Mikhaylov + * + * This program is free software; you can redistribute it and/or modify +@@ -65,6 +65,8 @@ namespace SDDM { + UserModel *m_userModel { nullptr }; + GreeterProxy *m_proxy { nullptr }; + KeyboardModel *m_keyboard { nullptr }; ++ ++ void activatePrimary(); + }; + } + +-- +2.5.0 + diff --git a/0034-Theme-Maui-Prevent-losing-focus.patch b/0034-Theme-Maui-Prevent-losing-focus.patch new file mode 100644 index 0000000..bfe2427 --- /dev/null +++ b/0034-Theme-Maui-Prevent-losing-focus.patch @@ -0,0 +1,44 @@ +From c3863ccb276469fd7da8b7397c65d96d57cf2759 Mon Sep 17 00:00:00 2001 +From: Benjamin Robin +Date: Sun, 13 Dec 2015 16:29:45 +0100 +Subject: [PATCH 34/34] Theme Maui: Prevent losing focus + +And word wrap the user text message +--- + data/themes/maui/Main.qml | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/data/themes/maui/Main.qml b/data/themes/maui/Main.qml +index 6d2092d..260ea9b 100644 +--- a/data/themes/maui/Main.qml ++++ b/data/themes/maui/Main.qml +@@ -58,6 +58,13 @@ Rectangle { + source = config.defaultBackground + } + } ++ ++ MouseArea { ++ anchors.fill: parent ++ onClicked: { ++ listView.focus = true; ++ } ++ } + } + + Rectangle { +@@ -164,9 +171,11 @@ Rectangle { + anchors.horizontalCenter: parent.horizontalCenter + color: "white" + text: textConstants.promptSelectUser +- ++ wrapMode: Text.WordWrap ++ width:parent.width - 60 + font.pixelSize: 20 + } ++ + } + } + +-- +2.5.0 + diff --git a/fedora-Main.qml b/fedora-Main.qml index fcd44c1..f1c365f 100644 --- a/fedora-Main.qml +++ b/fedora-Main.qml @@ -93,6 +93,8 @@ Rectangle { height: 24 font.pixelSize: 14 + arrowIcon: "angle-down.png" + model: sessionModel index: sessionModel.lastIndex @@ -103,6 +105,8 @@ Rectangle { id: layoutBox; height: 24 font.pixelSize: 14 + arrowIcon: "angle-down.png" + KeyNavigation.backtab: session; KeyNavigation.tab: loginButton } } diff --git a/sddm-0.13.0-fedora_config.patch b/sddm-0.13.0-fedora_config.patch index 84cba0f..6cbec34 100644 --- a/sddm-0.13.0-fedora_config.patch +++ b/sddm-0.13.0-fedora_config.patch @@ -1,33 +1,32 @@ -diff -up sddm-0.13.0/src/common/Configuration.h.orig sddm-0.13.0/src/common/Configuration.h ---- sddm-0.13.0/src/common/Configuration.h.orig 2015-11-04 14:41:36.000000000 -0600 -+++ sddm-0.13.0/src/common/Configuration.h 2015-11-15 08:04:54.585633353 -0600 +diff -up sddm-0.13.0/src/common/Configuration.h.fedora_config sddm-0.13.0/src/common/Configuration.h +--- sddm-0.13.0/src/common/Configuration.h.fedora_config 2016-03-11 17:00:26.664289307 -0600 ++++ sddm-0.13.0/src/common/Configuration.h 2016-03-11 17:01:03.501586928 -0600 @@ -45,7 +45,7 @@ namespace SDDM { - // Name Entries (but it's a regular class again) + // Name Entries (but it's a regular class again) Section(Theme, Entry(ThemeDir, QString, _S(DATA_INSTALL_DIR "/themes"), _S("Theme directory path")); - Entry(Current, QString, _S("maui"), _S("Current theme name")); + Entry(Current, QString, _S("01-breeze-fedora"), _S("Current theme name")); - Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Face icon directory\n" - "The files should be in username.face.icon format")); - Entry(CursorTheme, QString, QString(), _S("Cursor theme")); -@@ -59,9 +59,9 @@ namespace SDDM { - Entry(SessionDir, QString, _S("/usr/share/xsessions"), _S("Session description directory")); - Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Xsession script path\n" - "A script to execute when starting the desktop session")); -- Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Xsetup script path\n" -+ Entry(DisplayCommand, QString, _S("/etc/sddm/Xsetup"), _S("Xsetup script path\n" - "A script to execute when starting the display server")); -- Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Xstop script path\n" -+ Entry(DisplayStopCommand, QString, _S("/etc/sddm/Xstop"), _S("Xstop script path\n" - "A script to execute when stopping the display server")); - Entry(MinimumVT, int, MINIMUM_VT, _S("Minimum VT\n" - "The lowest virtual terminal number that will be used.")); -@@ -72,7 +72,7 @@ namespace SDDM { - "A script to execute when starting the desktop session")); + Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Global directory for user avatars\n" + "The files should be named .face.icon")); + Entry(CursorTheme, QString, QString(), _S("Cursor theme used in the greeter")); +@@ -65,8 +65,8 @@ namespace SDDM { + Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); + Entry(SessionLogFile, QString, _S(".cache/xsession-errors"), _S("Path to the user session log file")); + Entry(UserAuthFile, QString, _S(".Xauthority"), _S("Path to the Xauthority file")); +- Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Path to a script to execute when starting the display server")); +- Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Path to a script to execute when stopping the display server")); ++ Entry(DisplayCommand, QString, _S("/etc/sddm/Xsetup"), _S("Path to a script to execute when starting the display server")); ++ Entry(DisplayStopCommand, QString, _S("/etc/sddm/Xstop"), _S("Path to a script to execute when stopping the display server")); + Entry(MinimumVT, int, MINIMUM_VT, _S("The lowest virtual terminal number that will be used.")); ); + +@@ -77,7 +77,7 @@ namespace SDDM { + ); + Section(Users, -- Entry(DefaultPath, QString, _S("/bin:/usr/bin:/usr/local/bin"), _S("Default $PATH")); -+ Entry(DefaultPath, QString, _S("/usr/local/bin:/usr/bin:/bin"), _S("Default $PATH")); +- Entry(DefaultPath, QString, _S("/bin:/usr/bin:/usr/local/bin"), _S("Default $PATH for logged in users")); ++ Entry(DefaultPath, QString, _S("/usr/local/bin:/usr/bin:/bin"), _S("Default $PATH for logged in users")); Entry(MinimumUid, int, UID_MIN, _S("Minimum user id for displayed users")); Entry(MaximumUid, int, UID_MAX, _S("Maximum user id for displayed users")); - Entry(HideUsers, QStringList, QStringList(), _S("Hidden users")); + Entry(HideUsers, QStringList, QStringList(), _S("Comma-separated list of users that should not be listed")); diff --git a/sddm.conf b/sddm.conf index c4ec86a..90a7ee9 100644 --- a/sddm.conf +++ b/sddm.conf @@ -1,11 +1,11 @@ [Autologin] -# Autologin again on session exit +# Whether sddm should automatically log back into sessions when they exit #Relogin=false -# Autologin session +# Name of session file for autologin session #Session= -# Autologin user +# Username for autologin session #User= @@ -13,9 +13,9 @@ # Halt command #HaltCommand=/usr/bin/systemctl poweroff -# Initial NumLock state -# Valid values: on|off|none +# Initial NumLock state. Can be on, off or none. # If property is set to none, numlock won't be changed +# NOTE: Currently ignored if autologin is enabled. #Numlock=none # Reboot command @@ -26,11 +26,19 @@ # Current theme name #Current=01-breeze-fedora -# Cursor theme +# Cursor theme used in the greeter #CursorTheme= -# Face icon directory -# The files should be in username.face.icon format +# Number of users to use as threshold +# above which avatars are disabled +# unless explicitly enabled with EnableAvatars +#DisableAvatarsThreshold=7 + +# Enable display of custom user avatars +#EnableAvatars=true + +# Global directory for user avatars +# The files should be named .face.icon #FacesDir=/usr/share/sddm/faces # Theme directory path @@ -38,14 +46,14 @@ [Users] -# Default $PATH +# Default $PATH for logged in users #DefaultPath=/usr/local/bin:/usr/bin:/bin -# Hidden shells +# Comma-separated list of shells. # Users with these shells as their default won't be listed #HideShells= -# Hidden users +# Comma-separated list of users that should not be listed #HideUsers= # Maximum user id for displayed users @@ -61,45 +69,49 @@ #RememberLastUser=true -[WaylandDisplay] -# Wayland session script path -# A script to execute when starting the desktop session +[Wayland] +# Path to a script to execute when starting the desktop session #SessionCommand=/etc/sddm/wayland-session -# Session description directory +# Directory containing available Wayland sessions #SessionDir=/usr/share/wayland-sessions +# Path to the user session log file +#SessionLogFile=.cache/wayland-errors + -[XDisplay] -# Xsetup script path -# A script to execute when starting the display server +[X11] +# Path to a script to execute when starting the display server #DisplayCommand=/etc/sddm/Xsetup -# Xstop script path -# A script to execute when stopping the display server +# Path to a script to execute when stopping the display server #DisplayStopCommand=/etc/sddm/Xstop -# Minimum VT # The lowest virtual terminal number that will be used. #MinimumVT=1 -# X server arguments +# Arguments passed to the X server invocation #ServerArguments=-nolisten tcp -# X server path +# Path to X server binary #ServerPath=/usr/bin/X -# Xsession script path -# A script to execute when starting the desktop session +# Path to a script to execute when starting the desktop session #SessionCommand=/etc/X11/xinit/Xsession -# Session description directory +# Directory containing available X sessions #SessionDir=/usr/share/xsessions -# Xauth path +# Path to the user session log file +#SessionLogFile=.cache/xsession-errors + +# Path to the Xauthority file +#UserAuthFile=.Xauthority + +# Path to xauth binary #XauthPath=/usr/bin/xauth -# Xephyr path +# Path to Xephyr binary #XephyrPath=/usr/bin/Xephyr diff --git a/sddm.spec b/sddm.spec index 5f6b06b..6eb056a 100644 --- a/sddm.spec +++ b/sddm.spec @@ -2,7 +2,7 @@ Name: sddm Version: 0.13.0 -Release: 6%{?dist} +Release: 7%{?dist} # code GPLv2+, fedora theme CC-BY-SA License: GPLv2+ and CC-BY-SA Summary: QML based X11 desktop manager @@ -11,6 +11,33 @@ Url: https://github.com/sddm/sddm Source0: https://github.com/sddm/sddm/archive/v%{version}.tar.gz ## upstream patches +BuildRequires: git-core +Patch2: 0002-Use-higher-quality-neutral-images-for-default-faces.patch +Patch3: 0003-Generate-and-install-the-default-sddm.conf-after-sdd.patch +Patch4: 0004-Add-a-config-option-to-enable-avatars.patch +Patch5: 0005-Use-.face.icon-instead-of-default.face.icon-and-rena.patch +Patch6: 0006-Fix-mixed-indents.patch +Patch7: 0007-Fall-back-to-regular-login-when-autologin-fails.patch +# https://github.com/sddm/sddm/issues/225 +# continue to skip, for now +#Patch8: 0008-Enable-PrivateTmp-again.patch +Patch9: 0009-Improve-config-file-comments.patch +Patch10: 0010-elarun-Remove-duplicate-session-selector.patch +Patch12: 0012-Configurable-user-session-log.patch +Patch13: 0013-Configurable-Xauthority-file.patch +Patch15: 0015-Expose-arrow-background-color.patch +Patch20: 0020-Adds-a-count-property-to-UserModel.patch +Patch21: 0021-Refactored-ConfigReader-is-matches-Default.patch +Patch22: 0022-Defines-a-users-threshold-to-disable-avatars.patch +Patch24: 0024-Rename-XDisplay-and-WaylandDisplay-config-sections.patch +Patch25: 0025-Fix-crash-reading-lists-from-configuration.patch +Patch26: 0026-Do-not-read-multiple-lines.patch +Patch27: 0027-Fix-moc-include-name.patch +Patch28: 0028-Allow-for-overriding-the-text-color-of-PasswordBox.patch +Patch31: 0031-Add-instructions-on-how-to-change-DPI.patch +Patch32: 0032-Honor-RememberLastUser-and-RememberLastSession-setti.patch +Patch33: 0033-Activate-window-for-the-primary-screen.patch +Patch34: 0034-Theme-Maui-Prevent-losing-focus.patch ## downstream patches # downstream fedora-specific configuration @@ -31,6 +58,7 @@ Source15: README.scripts Source21: fedora-Main.qml Source22: fedora-metadata.desktop Source23: fedora-theme.conf +Source24: angle-down.png Provides: service(graphical-login) = sddm @@ -80,9 +108,7 @@ A collection of sddm themes, including: circles, elarun, maldives, maui. %prep -%setup -q - -%patch101 -p1 -b .fedora_config +%autosetup -Sgit %build @@ -90,9 +116,9 @@ mkdir %{_target_platform} pushd %{_target_platform} %{cmake} .. \ -DBUILD_MAN_PAGES:BOOL=ON \ + -DCMAKE_BUILD_TYPE:STRING="Release" \ -DENABLE_JOURNALD:BOOL=ON \ -DSESSION_COMMAND:PATH=/etc/X11/xinit/Xsession \ - -DUSE_QT5:BOOL=ON \ -DWAYLAND_SESSION_COMMAND:PATH=/etc/sddm/wayland-session popd @@ -117,6 +143,7 @@ cp -a %{buildroot}%{_datadir}/sddm/scripts/* \ install -Dpm 644 %{SOURCE21} %{buildroot}%{_datadir}/sddm/themes/02-fedora/Main.qml install -Dpm 644 %{SOURCE22} %{buildroot}%{_datadir}/sddm/themes/02-fedora/metadata.desktop install -Dpm 644 %{SOURCE23} %{buildroot}%{_datadir}/sddm/themes/02-fedora/theme.conf +install -Dpm 644 %{SOURCE24} %{buildroot}%{_datadir}/sddm/themes/02-fedora/angle-down.png %pre @@ -128,10 +155,17 @@ exit 0 %post %systemd_post sddm.service -# handle theme rename: fedora => 02-fedora -(grep '^Current=fedora$' %{_sysconfdir}/sddm.conf > /dev/null && \ - sed -i.rpmsave -e 's|^Current=fedora$|Current=02-fedora|' \ - %{_sysconfdir}/sddm.conf +# handle incompatible configuration changes +(grep \ + -e '^Current=fedora$' \ + -e '^\[XDisplay\]$' \ + -e '^\[WaylandDisplay\]$' \ + %{_sysconfdir}/sddm.conf > /dev/null && \ + sed -i.rpmsave \ + -e 's|^Current=fedora$|#Current=01-breeze-fedora|' \ + -e 's|^\[XDisplay\]$|\[X11\]|' \ + -e 's|^\[WaylandDisplay\]$|\[Wayland\]|' \ + %{_sysconfdir}/sddm.conf ) ||: @@ -183,6 +217,11 @@ exit 0 %changelog +* Fri Mar 11 2016 Rex Dieter - 0.13.0-7 +- pull in upstream fixes, some new features +- The desktop selection drop down list has an empty box (#1222228) +- sddm: RememberLastUser=false does not work (#1240749) + * Fri Mar 11 2016 Rex Dieter 0.13.0-6 - sddm: use pam_gnome_keyring (#1317066) diff --git a/sources b/sources index 2dbae4b..cebb6cb 100644 --- a/sources +++ b/sources @@ -1 +1,2 @@ ecfd285a463eb6490da1333bb2e304a7 v0.13.0.tar.gz +d8d1359a45fd11e05e1f13c8d175fd79 angle-down.png