- 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)
epel9
Rex Dieter 9 years ago
parent cc88c4d4d5
commit 42d10ca8c8

1
.gitignore vendored

@ -1,2 +1,3 @@
/v0.12.0.tar.gz /v0.12.0.tar.gz
/v0.13.0.tar.gz /v0.13.0.tar.gz
/angle-down.png

@ -0,0 +1,297 @@
From 71a1925151e71d2ade4588f06a39402e87d10ee8 Mon Sep 17 00:00:00 2001
From: Jerome Leclanche <jerome@leclan.ch>
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!Z2<R8m!ez1y3}7wbB1(~aWz^~@Pl&LX6wL)bK96A)Wu3z+nsqf
z6Xj`@6SN3d%PJY6s$dU3IqVJs2>MuLAY+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&#9L!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&$6<dL4?x5d?RtqhB`b%Ek3aZJ&`%(d+e~PyD0o
z3>1wEa8_T|B^mz>^(BteUFb4*Fc4XM6Q-)ye(NP?9-)I~FV?9d)2)6mzR2p^%I7eW
zO4f;3qTc0j=-h3jskJ`L=m62m#5Jt~K5h2K(O9}st{gmg`(GS7X78lRUe<Z|ffVI_
zK3)MuAfvwR1CGdko%@fOIV-d*>No^dOWdzpyU?i54`__~h7Oax>z`yYj<HFvA0yO4
zMN(07N$EIGb2>lz^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!;NNR4ZK<w?_b(?5kSauM1e8^c-Xi_<yx+z)FuVJg@t#9kh
zp9Xsp`Wu+Ys?4f=^zpXA61ez_I}IQNmNdv%m`lD=``GRdd6Fo*DzBFE7)<9L71Z~S
zx%(%DI=^GY2$u)V3;N|vqoj_+RjM~{y-N0*<==SAlrts?dvQq9JUt3!WZnUcH)fJq
zMUnEsG<yk{H~wN(ipT{^rhCw#d|CcT(lvP$NbxO^WBons|7*4L%qed?>p;o)T9}s+
zRwVYWo?$7_%KtZY;|tRC*|GowVW*YAr?ovWXM@=t+SJW<Ss?cCBT5Te@!AWvF^H-Z
zzgeUy+?LI4wD9R_ZYpaHLX_%%huZ7sR4I@bB5@z>j@-=lqHNLYE~M!$C0mct0D9Gw
zFeiF%!W`Dt;!Fg8{c<PQKE!d?z#Pu;3sHO$a1^manBZ6oh|JjZI_pE5@d>raB=epu
z1EZPO=~Ar}x6n0C2^oG~1)yD)^NI}(;V68P<q^I6xi1hoa*1<|{JL0U^U^vnn%su@
zvkx%drNIPz`U;aAkY3H2>ft8X@9M+voxmd+d~(H7ClnEH3z3aC1t&16AvcB5l6nt;
zbCD&pw;_b+8Y<C)!hikHaoFyXrt%_ZIdDb|B>F3{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=|<wpX~%jctZG@CB#=
z`R?Jz&knz@pWmFCC*~v-aI89jN9*NUY=6{7upLCc-Jp}nXIi;+UAqD}Th=@Wm4N}|
z`T0hJ^FR}czl&E0o|GbIoH9k2rd8#QKZH3%p3jFp80Io95}!TdWeG8P@ppsk<bkjt
zB*<_{J^}o|LR=6T@qQe6Pp})H@M*2eCxF7o#@fZ!;EC|{nCIZq%_tj)OidRWZVVxV
zSbozcAg&0!7kn+V%KgBML8wYJ3h(a+G+>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;KJsdr<xGaWk2YNmA6VO%iget$O0uoHHT-w)T3>75UB&}jle3*fTHAH*L>KlD|pmr
zIr@Z<e0PS8v)`wG&9N(8;?no}FVTq7La#BtdneTRT0J&ZJvM_Wy5#v=85$z8gk}^z
zc%v#59}?*ukI{l0f#M)C97#j;zRmBO>39sBOW2$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`N0DCut<LWh;q`cQ&)8^U()%oXJiSc~caDHDeie
zO)ok)-{+5zdt=Cd3-&}T?u`e*18rE!cCVXZ%b=NZNNUwefD!hH`(QpEdL5|=-+7hp
z1Iasayc4MI$q>v*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+P<TgRr
zeVJPkLeVa@c$-KkC2(Hkq0T&V{|z@e{xMzuRQjSHoq@4DIt-JSnMkpb75P~(Dn9vP
zX%ziP700u~Q~Yj!SWQJ^RX@WG36d+X6gduSZn~vD_(qE|G8Zk490ZxbN7~?^suD*t
zDKneGoEx-6;rpMdn$w?3J#*z`-T3V-lfi6H7feKy-d-JtF^@CVl5MOD+nLoHG*v-9
zLrGCY>F>{NApW4<nX7d{jTE*)g!P@(EZBRi3A)&VagxZdgCZ|dSb?IkN4K=I^aT;6
z>!+FW5ihXCFDolM9KO>3G)0#ANGZzsM9nLKiYi;wmq7<o)xC{3j-Sox$0Dq)i}e0|
z|9EoJesL{9YJa;tAbjZgwf5xn(I)+n84he3xzA^?+oU9M3Flbn6{%F0bdpLEQ<^Nv
zW?EQxW0Sa+qtAugA6jX(;T5lS{f|L_V=NXT6H5-(47Vjk3*!ASmlAwbwrYs?+T!bl
z5Hc=C`Z~6iy#X6Hj?nTuF?Mg-qu+n5n!A#=oEa`_{@W{URA|gD#u#Dr?wHO<-_r{+
z?-E*zeM>>e=TJ6Rcw`_WXy)|;LwkwiHIXN--v~T?<m>?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`1m<Kz5WE0t9=wB?2A%i;IY(Jem!|OMeSC&SsFSgoYmW$l$
zUh>2eQlze2vRqr7R1u63XtyCE90BsDroBK=W3qm)=kE0mjti&042X<wi1|&Oi5ORo
zxVrrumE<HEm$R!y?__l!86uo`P5TP7{JBBgxbPuoM=(4FS{({L5AR9geJyh)zP@Y_
z#?)iZu!8O+pErM+Z!(fDU1ZC%Wy7g!B7Dl^Z<Er@_%#pRqDCaO1Ujg`ylwnQv?Cuk
zE)=->j;%}SyX#y0EAl@{DW~QzCD6RtwU>Kpcz_&q=$4KW=Bj65*V$05zdcO$S5LSP
z?Ikr0#$@aB?jRi7bl+*6N$;#N@;s}XY=~cDyfdl~aZoj95T--w<pDfHa3#-hvY6$S
z-Wlz~Sa%O5O&!>=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^aE<gHf
z{pl*`z^O1Usm1AECH?w3S!<6J<t}{M{+l_rC{Yatg%t8<gtZ?2oe5#2I)6}E;3aq@
zMQ#tzy|WF-`T8*8Z_M%UvIepZ<JRCK=1}Gx@->s^v-h0l@^Y!7^=()D3%OXNLEEZ+
z$<!7KMOnQnsVRb+%1@`&xXBf)pq`W5^_sk=;X5wKNbk2DW}^pM)iZu+s6bm#)@H*e
zw1-Tbh*56)CsAaldu<;{zq;MUF$#C`yX;rEqAIwP`th5=@2tz}ffj!p+M6zK%X3tC
zpbj1yt9V7WyNT1RUn*--ZgBPniKn*>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};{<TZ27i4eEv3Vml=4AU{DSKU@w
zb<;y3FB*+k$@jtFqUxt#ZC6sp%GN(+r7yMb{8gfQ&{2yWU37=lRm;c)yTw(LtSH}Z
zw>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{TqBNfxX<b~spa@O&l#Y2^G`u#P9opPp(re|_K4YF9F${Yzi|#@@8AX{lOrde^
z>AgP93HE5|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
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
UIPNoUo&W#<07*qoM6N<$f(uS#^Z)<=
diff --git a/data/faces/root.face.icon b/data/faces/root.face.icon
index f177d98e0702e4c190b3442e346b4ce6b9543c30..308496979d6665a8e87451d273ad14233f821a90 100644
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~s<znBFk70|3y)5(LoG
zUQDj{U-<z5SC^@wo&$1jvvfAcZ7MPq{~(ktfMGa5d5|;b>C-|f)j4C<Oo-y)6Z^b^
zv%r`e)o0IZ#U*+4IYjt_`stN&E)9v$=+l~FU)RL#HXc?N8|(l06TYp}bL3e1USmxD
z$AiPaoA0LG1GgW4$p>@p01<nuG>w;L7=u6>pmmgtCv0uGhS~xhBbG4{m=OY+P#7c=
zY=UY)ot)j3W7qw@C;z2*nf=SiS_i>LV?UCROwjO@YSf{2<UWlEd6CrM=f0m@p(vm;
zFHZh?1{*1BxvAzi@rS}}3-}}(lRT!{e8kE|MqdWa?48K)CRTlk?$|$yL^a7V@6Bqj
zJ?YLqgH3AN06v>e(K3je8h<Ts0+PFfT{h)fUxq6X?-hZY+}AD0?V)y{XL*9>lJh2n
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(<s^(aTn)3snFpCvs1v6k(`o1LsEiV&32!>AAS
zblIW!5=fk<X9Co<-+mlOwPX_!MgoCm-fW(4maI<sqhtj$+|^~c9(i%H9zQjb@B#VC
z$jE~&XO;`8(rv<u2HX7Fc+Z3L{p^zypkllX7P2095nshFv6oC9pT?bq>^YXjELJU_
zG96=j%7MD6<Ay6vi36{%@25R1FI)K`U<-^8j}>XR!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$`<gL&C)izk*;9lfJfJ`xcmlxP!3&V&djO$VS(y6v|d{OA`jYn3Lh5(
z+&NK;sOBYR%UchqWgPUDvmc%i+drb*j9{|0fSTd7z597hBy|NQ$4>Xr;wmt_XuN24
zFFQOLw4P-CZ9;4;MX~+q3?=-aAWw-YzAQh2u~iQUQ9CSfj0I_<epf&bM1$E;+e<q?
zn`0H{>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<vt+E16%@@)X0yqRuFs^
zSj5-fXWI_+N|T`t@Kpkjl_#~)U9$x?K+p7M)4?`e9PDB4?`9xMbRu)+<~pcMcNDWU
z9Txbq?E4#ZV;18pw(3}u)K8j(JOho$L$S1qW`?89)nHFy)EekN2Oze$FH_Wa6^ONT
zbuE$xT7CgO09fg3Z(lVUjJO4Q22v^$hGG{LO)vD6ikU&OqhJK%DX1!b^!`h<M;%&-
zzyO8QF5i>|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;rZ<pC^=Ol;bfWt
z{*cXoTqCO_M`j-VWuirF?v@yp|B&tmj#BoLH{x6dAnk*#*cpV^!E=^$$mUJRn3MZp
zIiWCW%uEthfZp_iVw2qoU@{&V;wgAZEb}kLKH%guG!7PD=+D<``^s&|Z%KFVFv<TN
z;B%0eGjmCa+kZH4b%}eRuN=@6%;b6pa+mqZYBjOjTLvZvb0CG0Oy-Zj5mZf^oPiNS
z3jq|w8z2e|8zE7?G>7OyJtI$01L%C4f$E$6c#I~`pO{nw(6IuCCc{}xIlQt^Jo7j~
zVHQ#W)WK;o0cwgA!!_RoVGu@b%NcMI1Jfm$ke$kl@WxgUYl-8J7v|<f)Hckv`T7i-
zKLk;HiJ%&RTn=`d;A+eterZnKKS)$ITD0ay?O}}edi6L$Ifun0vuj7io4(>n<t{Jm
z2DPL``4CbF)p4^8oMX6xH8`tE`p<<GJ8-N4ZN67*Xle)e$s|HY$dL^2h%+ho14{c|
z_tdz0QIF1@H`}AEsbD4MD>xzCBQm3Fu(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<?%
zjPY5=q*zE`ad9}|&1d%nDArFO!GnM-@Q5dSPHj=-$TH+Ot_O^8HzQBZ8KyH}1|#*Z
zX+3&$KzW{P{wYnUrZ^*<>#=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>&r2<Bt&(mA8>de1mae8IA7cjgAikb?vBdqe#O6Z$RC9qny@x1${<oN%FJlz8UK
z_MRT2mpvf6UlGOi;$U-jeqish+-~?oX)ztwo^1`ipzOEA#a5|R=Jzqln{jlN$O5jI
zI%_WZ_HAFW7a*$|fzW8)u)mX*a=-j|cU?vyWsrtyoZ~GJ|3Uzs4;S`%FsG|WLWkze
zxis)|i}_sHGwqhUjoNXH=gNhnWkw9!$lu#*eqolq{FFQ;6dRg&4M>;74MJU6z7uB~
zG8FS4`<<fgR<xj=n)N&4h|A*%+Wmuc2_-l#%Ihx#{SvSSyJ>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^jj<k&6yZ;J8gogI&GRQ9z7e<o)9ldT3I8p6FL@^A5S+D<YwkwJs>sn%``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<BSiZMS=D9!ioQi;mq`B0;}f?mK2Q7v9TQONkflK7GrB+Bnqh
zy`%2Pv&I>@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=qE<MUr?c#-KIH?lJOD#loWgpKk$kpA(OwlXR=zMN68+?5ztdA_{}mF&^GA*)d2L
zZJT>H6l-!kM%=zomC%&J2Syu9LSN2|1CF^2Ic8TJqD}6pTL7a<RS*C3Vjw^Xx)Yr_
zK9Xqr6rnbRzj%LQ4696sTHu)!Dp8=nT(pN1MTb64ERP8%uP-$SL$3!+ni_}+kXf6s
z`)x->NIabHSgE_`9Usbd^GLAB!|@tJr)30>kR3g(N<phnC0?Fd8B-M3*2hi$rgx2n
z#Q;b!D0w$c+m8;eiAJ^A=W-M0R>ve4tA4h+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_I3Mn<w;2rSl2Uk^!4x0{7}W(#x(IaK`pY6`KdaMK`03#&Us&3*Ud04C
zCtdJ7IVKV>XZ=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@%8JQ<Rw=c`e0d5t3w?VJ^)0^Ub6`Xz-NjV>xF%S-e
zysKxO?*cjXmczQDJ<KPqx$^zKOz_lC%ujBdSmXt_RG&AC=H7#dX?}C9l88XD7@^(a
zv;FV&jy!y@UW630Sm55yMm!Ymg8(-w<oSF1#sQHXWP>WJed&|*_svl3x;Ez}=^wI8
za4rQu_Sg66ZGH#CIbL%xqSC-3q8FnyAX)*W{eJ;zfHmp=P|HpbB)uypx?=zS!MUy!
XCj1SXu1eWOLk}=DvNEjK_k8$29Wh(^
literal 2138
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
Q<^TWy07*qoM6N<$f^)ze9{>OV
--
2.5.0

@ -0,0 +1,31 @@
From 7efe53000c49fb6ce808286b15283d2da05b0c52 Mon Sep 17 00:00:00 2001
From: Jerome Leclanche <jerome@leclan.ch>
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

@ -0,0 +1,82 @@
From 17b3db31d9c75a197b3509f786bc646ab6dce17d Mon Sep 17 00:00:00 2001
From: Jerome Leclanche <jerome@leclan.ch>
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

@ -0,0 +1,486 @@
From 58b794bb2a2fd407a08b6c4d9eb4f156823b34f1 Mon Sep 17 00:00:00 2001
From: Jerome Leclanche <jerome@leclan.ch>
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
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
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!Z2<R8m!ez1y3}7wbB1(~aWz^~@Pl&LX6wL)bK96A)Wu3z+nsqf
z6Xj`@6SN3d%PJY6s$dU3IqVJs2>MuLAY+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&#9L!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&$6<dL4?x5d?RtqhB`b%Ek3aZJ&`%(d+e~PyD0o
z3>1wEa8_T|B^mz>^(BteUFb4*Fc4XM6Q-)ye(NP?9-)I~FV?9d)2)6mzR2p^%I7eW
zO4f;3qTc0j=-h3jskJ`L=m62m#5Jt~K5h2K(O9}st{gmg`(GS7X78lRUe<Z|ffVI_
zK3)MuAfvwR1CGdko%@fOIV-d*>No^dOWdzpyU?i54`__~h7Oax>z`yYj<HFvA0yO4
zMN(07N$EIGb2>lz^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!;NNR4ZK<w?_b(?5kSauM1e8^c-Xi_<yx+z)FuVJg@t#9kh
zp9Xsp`Wu+Ys?4f=^zpXA61ez_I}IQNmNdv%m`lD=``GRdd6Fo*DzBFE7)<9L71Z~S
zx%(%DI=^GY2$u)V3;N|vqoj_+RjM~{y-N0*<==SAlrts?dvQq9JUt3!WZnUcH)fJq
zMUnEsG<yk{H~wN(ipT{^rhCw#d|CcT(lvP$NbxO^WBons|7*4L%qed?>p;o)T9}s+
zRwVYWo?$7_%KtZY;|tRC*|GowVW*YAr?ovWXM@=t+SJW<Ss?cCBT5Te@!AWvF^H-Z
zzgeUy+?LI4wD9R_ZYpaHLX_%%huZ7sR4I@bB5@z>j@-=lqHNLYE~M!$C0mct0D9Gw
zFeiF%!W`Dt;!Fg8{c<PQKE!d?z#Pu;3sHO$a1^manBZ6oh|JjZI_pE5@d>raB=epu
z1EZPO=~Ar}x6n0C2^oG~1)yD)^NI}(;V68P<q^I6xi1hoa*1<|{JL0U^U^vnn%su@
zvkx%drNIPz`U;aAkY3H2>ft8X@9M+voxmd+d~(H7ClnEH3z3aC1t&16AvcB5l6nt;
zbCD&pw;_b+8Y<C)!hikHaoFyXrt%_ZIdDb|B>F3{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=|<wpX~%jctZG@CB#=
z`R?Jz&knz@pWmFCC*~v-aI89jN9*NUY=6{7upLCc-Jp}nXIi;+UAqD}Th=@Wm4N}|
z`T0hJ^FR}czl&E0o|GbIoH9k2rd8#QKZH3%p3jFp80Io95}!TdWeG8P@ppsk<bkjt
zB*<_{J^}o|LR=6T@qQe6Pp})H@M*2eCxF7o#@fZ!;EC|{nCIZq%_tj)OidRWZVVxV
zSbozcAg&0!7kn+V%KgBML8wYJ3h(a+G+>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;KJsdr<xGaWk2YNmA6VO%iget$O0uoHHT-w)T3>75UB&}jle3*fTHAH*L>KlD|pmr
zIr@Z<e0PS8v)`wG&9N(8;?no}FVTq7La#BtdneTRT0J&ZJvM_Wy5#v=85$z8gk}^z
zc%v#59}?*ukI{l0f#M)C97#j;zRmBO>39sBOW2$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`N0DCut<LWh;q`cQ&)8^U()%oXJiSc~caDHDeie
zO)ok)-{+5zdt=Cd3-&}T?u`e*18rE!cCVXZ%b=NZNNUwefD!hH`(QpEdL5|=-+7hp
z1Iasayc4MI$q>v*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+P<TgRr
zeVJPkLeVa@c$-KkC2(Hkq0T&V{|z@e{xMzuRQjSHoq@4DIt-JSnMkpb75P~(Dn9vP
zX%ziP700u~Q~Yj!SWQJ^RX@WG36d+X6gduSZn~vD_(qE|G8Zk490ZxbN7~?^suD*t
zDKneGoEx-6;rpMdn$w?3J#*z`-T3V-lfi6H7feKy-d-JtF^@CVl5MOD+nLoHG*v-9
zLrGCY>F>{NApW4<nX7d{jTE*)g!P@(EZBRi3A)&VagxZdgCZ|dSb?IkN4K=I^aT;6
z>!+FW5ihXCFDolM9KO>3G)0#ANGZzsM9nLKiYi;wmq7<o)xC{3j-Sox$0Dq)i}e0|
z|9EoJesL{9YJa;tAbjZgwf5xn(I)+n84he3xzA^?+oU9M3Flbn6{%F0bdpLEQ<^Nv
zW?EQxW0Sa+qtAugA6jX(;T5lS{f|L_V=NXT6H5-(47Vjk3*!ASmlAwbwrYs?+T!bl
z5Hc=C`Z~6iy#X6Hj?nTuF?Mg-qu+n5n!A#=oEa`_{@W{URA|gD#u#Dr?wHO<-_r{+
z?-E*zeM>>e=TJ6Rcw`_WXy)|;LwkwiHIXN--v~T?<m>?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`1m<Kz5WE0t9=wB?2A%i;IY(Jem!|OMeSC&SsFSgoYmW$l$
zUh>2eQlze2vRqr7R1u63XtyCE90BsDroBK=W3qm)=kE0mjti&042X<wi1|&Oi5ORo
zxVrrumE<HEm$R!y?__l!86uo`P5TP7{JBBgxbPuoM=(4FS{({L5AR9geJyh)zP@Y_
z#?)iZu!8O+pErM+Z!(fDU1ZC%Wy7g!B7Dl^Z<Er@_%#pRqDCaO1Ujg`ylwnQv?Cuk
zE)=->j;%}SyX#y0EAl@{DW~QzCD6RtwU>Kpcz_&q=$4KW=Bj65*V$05zdcO$S5LSP
z?Ikr0#$@aB?jRi7bl+*6N$;#N@;s}XY=~cDyfdl~aZoj95T--w<pDfHa3#-hvY6$S
z-Wlz~Sa%O5O&!>=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^aE<gHf
z{pl*`z^O1Usm1AECH?w3S!<6J<t}{M{+l_rC{Yatg%t8<gtZ?2oe5#2I)6}E;3aq@
zMQ#tzy|WF-`T8*8Z_M%UvIepZ<JRCK=1}Gx@->s^v-h0l@^Y!7^=()D3%OXNLEEZ+
z$<!7KMOnQnsVRb+%1@`&xXBf)pq`W5^_sk=;X5wKNbk2DW}^pM)iZu+s6bm#)@H*e
zw1-Tbh*56)CsAaldu<;{zq;MUF$#C`yX;rEqAIwP`th5=@2tz}ffj!p+M6zK%X3tC
zpbj1yt9V7WyNT1RUn*--ZgBPniKn*>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};{<TZ27i4eEv3Vml=4AU{DSKU@w
zb<;y3FB*+k$@jtFqUxt#ZC6sp%GN(+r7yMb{8gfQ&{2yWU37=lRm;c)yTw(LtSH}Z
zw>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{TqBNfxX<b~spa@O&l#Y2^G`u#P9opPp(re|_K4YF9F${Yzi|#@@8AX{lOrde^
z>AgP93HE5|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
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
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
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
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

@ -0,0 +1,46 @@
From e646bd39ba743e2540aaa7d22fd4633e5d9a6966 Mon Sep 17 00:00:00 2001
From: Jerome Leclanche <jerome@leclan.ch>
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

@ -0,0 +1,88 @@
From cb768895c8e0d21c689d63f69d7ac668fe4e8fa6 Mon Sep 17 00:00:00 2001
From: Jerome Leclanche <jerome@leclan.ch>
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

@ -0,0 +1,26 @@
From c7409687ad26b7f47a2cd73eddb8617ef7cd4701 Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,115 @@
From f64bd7a92728158a78653dd6e8373703168b11c6 Mon Sep 17 00:00:00 2001
From: Jerome Leclanche <jerome@leclan.ch>
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 <username>.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

@ -0,0 +1,35 @@
From f19e0f3ce5ba9b31c9bc9aa08ec8805b933e5468 Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,98 @@
From a935425e5f4af229680f0e5bda0a7898020a06c4 Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,89 @@
From 467027b0168accd55e15303e5ba7348a6bfe95f5 Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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 <QtCore/QProcessEnvironment>
@@ -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

@ -0,0 +1,29 @@
From 5447cc14400c913d385a4f3ed5a06ec3992023ad Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,26 @@
From 40c981a7b39611ffe6570e37e2e9419c95114cf0 Mon Sep 17 00:00:00 2001
From: Antonio Larrosa <larrosa@kde.org>
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

@ -0,0 +1,104 @@
From 9d16882177a832fa855416c69bc817cee2903622 Mon Sep 17 00:00:00 2001
From: Antonio Larrosa <larrosa@kde.org>
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

@ -0,0 +1,132 @@
From 668f7c9c08ce4aeee7cc4d2d3386522bfae32cfb Mon Sep 17 00:00:00 2001
From: Antonio Larrosa <larrosa@kde.org>
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 <username>.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

@ -0,0 +1,246 @@
From 98bcb147acb793bf642e8a7bc9f69facb80e469a Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,38 @@
From 56f64173991204a1eea4bf6789d68555b94e3eae Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,41 @@
From cdd6552bd8a839f29ecb84abd7b98f1c0fcd2b99 Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,34 @@
From 1231b5fce8b7f9d99b3a0b8fa17e10d797890c43 Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,26 @@
From 4e2ee766af16d13345cb4a39ff1859a436bfa0e7 Mon Sep 17 00:00:00 2001
From: Steve Gerbino <steve@gerbino.co>
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

@ -0,0 +1,37 @@
From 4c1212e0d3aa17cded4db2dd394285365d44e7bc Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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

@ -0,0 +1,38 @@
From ef7b3177adb3673a482c68cb62281cd9a5ca8e8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Radics?= <mitchnull@gmail.com>
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<XorgDisplayServer *>(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

@ -0,0 +1,112 @@
From 6d5b36b28907b16280ff78995fef764bb0c573db Mon Sep 17 00:00:00 2001
From: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
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 <pierluigi.fiorini@gmail.com>
+* Copyright (c) 2015-2016 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Copyright (c) 2013 Abdurrahman AVCI <abdurrahmanavci@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -36,6 +36,7 @@
#include <QQmlContext>
#include <QQmlEngine>
#include <QDebug>
+#include <QTimer>
#include <QTranslator>
#include <iostream>
@@ -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 <pierluigi.fiorini@gmail.com>
+* Copyright (c) 2015-2016 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Copyright (c) 2013 Nikita Mikhaylov <nslqqq@gmail.com>
*
* 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

@ -0,0 +1,44 @@
From c3863ccb276469fd7da8b7397c65d96d57cf2759 Mon Sep 17 00:00:00 2001
From: Benjamin Robin <dev@benjarobin.fr>
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

@ -93,6 +93,8 @@ Rectangle {
height: 24 height: 24
font.pixelSize: 14 font.pixelSize: 14
arrowIcon: "angle-down.png"
model: sessionModel model: sessionModel
index: sessionModel.lastIndex index: sessionModel.lastIndex
@ -103,6 +105,8 @@ Rectangle {
id: layoutBox; height: 24 id: layoutBox; height: 24
font.pixelSize: 14 font.pixelSize: 14
arrowIcon: "angle-down.png"
KeyNavigation.backtab: session; KeyNavigation.tab: loginButton KeyNavigation.backtab: session; KeyNavigation.tab: loginButton
} }
} }

@ -1,33 +1,32 @@
diff -up sddm-0.13.0/src/common/Configuration.h.orig sddm-0.13.0/src/common/Configuration.h 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.orig 2015-11-04 14:41:36.000000000 -0600 --- 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 2015-11-15 08:04:54.585633353 -0600 +++ sddm-0.13.0/src/common/Configuration.h 2016-03-11 17:01:03.501586928 -0600
@@ -45,7 +45,7 @@ namespace SDDM { @@ -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, Section(Theme,
Entry(ThemeDir, QString, _S(DATA_INSTALL_DIR "/themes"), _S("Theme directory path")); 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("maui"), _S("Current theme name"));
+ Entry(Current, QString, _S("01-breeze-fedora"), _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" Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Global directory for user avatars\n"
"The files should be in username.face.icon format")); "The files should be named <username>.face.icon"));
Entry(CursorTheme, QString, QString(), _S("Cursor theme")); Entry(CursorTheme, QString, QString(), _S("Cursor theme used in the greeter"));
@@ -59,9 +59,9 @@ namespace SDDM { @@ -65,8 +65,8 @@ namespace SDDM {
Entry(SessionDir, QString, _S("/usr/share/xsessions"), _S("Session description directory")); Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session"));
Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Xsession script path\n" Entry(SessionLogFile, QString, _S(".cache/xsession-errors"), _S("Path to the user session log file"));
"A script to execute when starting the desktop session")); Entry(UserAuthFile, QString, _S(".Xauthority"), _S("Path to the Xauthority file"));
- Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Xsetup script path\n" - Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Path to a script to execute when starting the display server"));
+ Entry(DisplayCommand, QString, _S("/etc/sddm/Xsetup"), _S("Xsetup script path\n" - Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Path to a script to execute when stopping the display server"));
"A script to execute when starting 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(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Xstop script path\n" + Entry(DisplayStopCommand, QString, _S("/etc/sddm/Xstop"), _S("Path to a script to execute when stopping the display server"));
+ Entry(DisplayStopCommand, QString, _S("/etc/sddm/Xstop"), _S("Xstop script path\n" Entry(MinimumVT, int, MINIMUM_VT, _S("The lowest virtual terminal number that will be used."));
"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"));
); );
@@ -77,7 +77,7 @@ namespace SDDM {
);
Section(Users, 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(DefaultPath, QString, _S("/usr/local/bin:/usr/bin:/bin"), _S("Default $PATH")); + 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(MinimumUid, int, UID_MIN, _S("Minimum user id for displayed users"));
Entry(MaximumUid, int, UID_MAX, _S("Maximum 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"));

@ -1,11 +1,11 @@
[Autologin] [Autologin]
# Autologin again on session exit # Whether sddm should automatically log back into sessions when they exit
#Relogin=false #Relogin=false
# Autologin session # Name of session file for autologin session
#Session= #Session=
# Autologin user # Username for autologin session
#User= #User=
@ -13,9 +13,9 @@
# Halt command # Halt command
#HaltCommand=/usr/bin/systemctl poweroff #HaltCommand=/usr/bin/systemctl poweroff
# Initial NumLock state # Initial NumLock state. Can be on, off or none.
# Valid values: on|off|none
# If property is set to none, numlock won't be changed # If property is set to none, numlock won't be changed
# NOTE: Currently ignored if autologin is enabled.
#Numlock=none #Numlock=none
# Reboot command # Reboot command
@ -26,11 +26,19 @@
# Current theme name # Current theme name
#Current=01-breeze-fedora #Current=01-breeze-fedora
# Cursor theme # Cursor theme used in the greeter
#CursorTheme= #CursorTheme=
# Face icon directory # Number of users to use as threshold
# The files should be in username.face.icon format # 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 <username>.face.icon
#FacesDir=/usr/share/sddm/faces #FacesDir=/usr/share/sddm/faces
# Theme directory path # Theme directory path
@ -38,14 +46,14 @@
[Users] [Users]
# Default $PATH # Default $PATH for logged in users
#DefaultPath=/usr/local/bin:/usr/bin:/bin #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 # Users with these shells as their default won't be listed
#HideShells= #HideShells=
# Hidden users # Comma-separated list of users that should not be listed
#HideUsers= #HideUsers=
# Maximum user id for displayed users # Maximum user id for displayed users
@ -61,45 +69,49 @@
#RememberLastUser=true #RememberLastUser=true
[WaylandDisplay] [Wayland]
# Wayland session script path # Path to a script to execute when starting the desktop session
# A script to execute when starting the desktop session
#SessionCommand=/etc/sddm/wayland-session #SessionCommand=/etc/sddm/wayland-session
# Session description directory # Directory containing available Wayland sessions
#SessionDir=/usr/share/wayland-sessions #SessionDir=/usr/share/wayland-sessions
# Path to the user session log file
#SessionLogFile=.cache/wayland-errors
[XDisplay] [X11]
# Xsetup script path # Path to a script to execute when starting the display server
# A script to execute when starting the display server
#DisplayCommand=/etc/sddm/Xsetup #DisplayCommand=/etc/sddm/Xsetup
# Xstop script path # Path to a script to execute when stopping the display server
# A script to execute when stopping the display server
#DisplayStopCommand=/etc/sddm/Xstop #DisplayStopCommand=/etc/sddm/Xstop
# Minimum VT
# The lowest virtual terminal number that will be used. # The lowest virtual terminal number that will be used.
#MinimumVT=1 #MinimumVT=1
# X server arguments # Arguments passed to the X server invocation
#ServerArguments=-nolisten tcp #ServerArguments=-nolisten tcp
# X server path # Path to X server binary
#ServerPath=/usr/bin/X #ServerPath=/usr/bin/X
# Xsession script path # Path to a script to execute when starting the desktop session
# A script to execute when starting the desktop session
#SessionCommand=/etc/X11/xinit/Xsession #SessionCommand=/etc/X11/xinit/Xsession
# Session description directory # Directory containing available X sessions
#SessionDir=/usr/share/xsessions #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 #XauthPath=/usr/bin/xauth
# Xephyr path # Path to Xephyr binary
#XephyrPath=/usr/bin/Xephyr #XephyrPath=/usr/bin/Xephyr

@ -2,7 +2,7 @@
Name: sddm Name: sddm
Version: 0.13.0 Version: 0.13.0
Release: 6%{?dist} Release: 7%{?dist}
# code GPLv2+, fedora theme CC-BY-SA # code GPLv2+, fedora theme CC-BY-SA
License: GPLv2+ and CC-BY-SA License: GPLv2+ and CC-BY-SA
Summary: QML based X11 desktop manager 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 Source0: https://github.com/sddm/sddm/archive/v%{version}.tar.gz
## upstream patches ## 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 patches
# downstream fedora-specific configuration # downstream fedora-specific configuration
@ -31,6 +58,7 @@ Source15: README.scripts
Source21: fedora-Main.qml Source21: fedora-Main.qml
Source22: fedora-metadata.desktop Source22: fedora-metadata.desktop
Source23: fedora-theme.conf Source23: fedora-theme.conf
Source24: angle-down.png
Provides: service(graphical-login) = sddm Provides: service(graphical-login) = sddm
@ -80,9 +108,7 @@ A collection of sddm themes, including: circles, elarun, maldives, maui.
%prep %prep
%setup -q %autosetup -Sgit
%patch101 -p1 -b .fedora_config
%build %build
@ -90,9 +116,9 @@ mkdir %{_target_platform}
pushd %{_target_platform} pushd %{_target_platform}
%{cmake} .. \ %{cmake} .. \
-DBUILD_MAN_PAGES:BOOL=ON \ -DBUILD_MAN_PAGES:BOOL=ON \
-DCMAKE_BUILD_TYPE:STRING="Release" \
-DENABLE_JOURNALD:BOOL=ON \ -DENABLE_JOURNALD:BOOL=ON \
-DSESSION_COMMAND:PATH=/etc/X11/xinit/Xsession \ -DSESSION_COMMAND:PATH=/etc/X11/xinit/Xsession \
-DUSE_QT5:BOOL=ON \
-DWAYLAND_SESSION_COMMAND:PATH=/etc/sddm/wayland-session -DWAYLAND_SESSION_COMMAND:PATH=/etc/sddm/wayland-session
popd 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 %{SOURCE21} %{buildroot}%{_datadir}/sddm/themes/02-fedora/Main.qml
install -Dpm 644 %{SOURCE22} %{buildroot}%{_datadir}/sddm/themes/02-fedora/metadata.desktop 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 %{SOURCE23} %{buildroot}%{_datadir}/sddm/themes/02-fedora/theme.conf
install -Dpm 644 %{SOURCE24} %{buildroot}%{_datadir}/sddm/themes/02-fedora/angle-down.png
%pre %pre
@ -128,10 +155,17 @@ exit 0
%post %post
%systemd_post sddm.service %systemd_post sddm.service
# handle theme rename: fedora => 02-fedora # handle incompatible configuration changes
(grep '^Current=fedora$' %{_sysconfdir}/sddm.conf > /dev/null && \ (grep \
sed -i.rpmsave -e 's|^Current=fedora$|Current=02-fedora|' \ -e '^Current=fedora$' \
%{_sysconfdir}/sddm.conf -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 %changelog
* Fri Mar 11 2016 Rex Dieter <rdieter@fedoraproject.org> - 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 <rdieter@fedoraproject.org> 0.13.0-6 * Fri Mar 11 2016 Rex Dieter <rdieter@fedoraproject.org> 0.13.0-6
- sddm: use pam_gnome_keyring (#1317066) - sddm: use pam_gnome_keyring (#1317066)

@ -1 +1,2 @@
ecfd285a463eb6490da1333bb2e304a7 v0.13.0.tar.gz ecfd285a463eb6490da1333bb2e304a7 v0.13.0.tar.gz
d8d1359a45fd11e05e1f13c8d175fd79 angle-down.png

Loading…
Cancel
Save