From a9d903d18f668a6827149f82816caf96ac6365a2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 5 Apr 2018 21:29:53 -0700 Subject: [PATCH 01/17] QSemaphore: Fix 64-bit Linux QSemaphores initialized to non-zero MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original design for the 64-bit futex had the token count replicated in the high part. But the constructor wasn't setting it. This is one of the issues I had noticed when investigating QTBUG-66875, but didn't need to address since the the fix I ended up applying in commit 081c001deb75fa38385d3ff8cbbdb4f788529133 made that unnecessary: the high part only had the number of waiters. Unfortunately, when commit f502270c0f06daba75c1da381bd1658d81aa7bba brought back the token count in the high part, I failed to correct that problem. As a consequence, every QSemaphore that was initialized in the constructor to a non-zero value would eventually deadlock. This commit fixes that oversight. Task-number: QTBUG-67481 Change-Id: I662b8f168c74440ab1a8fffd1522be6b85adb4d0 Reviewed-by: Lars Knoll Reviewed-by: Mårten Nordheim Reviewed-by: Svenn-Arne Dragly --- src/corelib/thread/qsemaphore.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/corelib/thread/qsemaphore.cpp b/src/corelib/thread/qsemaphore.cpp index c440d6db39f..e91e859975e 100644 --- a/src/corelib/thread/qsemaphore.cpp +++ b/src/corelib/thread/qsemaphore.cpp @@ -291,10 +291,14 @@ public: QSemaphore::QSemaphore(int n) { Q_ASSERT_X(n >= 0, "QSemaphore", "parameter 'n' must be non-negative"); - if (futexAvailable()) - u.store(n); - else + if (futexAvailable()) { + quintptr nn = unsigned(n); + if (futexHasWaiterCount) + nn |= quint64(nn) << 32; // token count replicated in high word + u.store(nn); + } else { d = new QSemaphorePrivate(n); + } } /*! From b49a2e671a6c01bec0f0140a81f5501074ec8856 Mon Sep 17 00:00:00 2001 From: Kari Oikarinen Date: Tue, 3 Apr 2018 13:41:41 +0300 Subject: [PATCH 02/17] tst_QPrinter: Use qWaitForWindowActive() to wait for dialog Instead of an unconditional wait. The QSKIP is necessary because the PDF format is non-native and the Windows implementation of QPrintDialog doesn't work then. The macOS implementation has the same warning, so add the check for that OS as well. The test has previously passed, since it hasn't seen not actually opening the dialog as an issue. Change-Id: Ib53e378b232580358f13e0c5206404412f9e6ee2 Reviewed-by: Friedemann Kleint --- tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp index 88bae686ab3..f68cf5c59c7 100644 --- a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp +++ b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp @@ -592,10 +592,14 @@ void tst_QPrinter::printDialogCompleter() { QPrintDialog dialog; dialog.printer()->setOutputFileName(testPdfFileName(QLatin1String("file"))); +#if defined(Q_OS_WIN) || defined(Q_OS_DARWIN) + if (dialog.printer()->outputFormat() != QPrinter::NativeFormat) + QSKIP("Dialog cannot be used with non-native formats"); +#endif dialog.setEnabledOptions(QAbstractPrintDialog::PrintToFile); dialog.show(); - QTest::qWait(100); + QVERIFY(QTest::qWaitForWindowActive(&dialog)); QTest::keyClick(&dialog, Qt::Key_Tab); QTest::keyClick(&dialog, 'P'); From 335754d0a329bc2ad845b68b40833bbd8428084a Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 6 Apr 2018 14:53:38 +0200 Subject: [PATCH 03/17] Fix license header for tst_toolingsupport.cpp Change-Id: Id355afc8eb57a40a0f8d06fa2920f03d94ef9337 Reviewed-by: Joerg Bornemann Reviewed-by: hjk --- .../other/toolsupport/tst_toolsupport.cpp | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/tests/auto/other/toolsupport/tst_toolsupport.cpp b/tests/auto/other/toolsupport/tst_toolsupport.cpp index a78bdc34f18..f31a755f9ec 100644 --- a/tests/auto/other/toolsupport/tst_toolsupport.cpp +++ b/tests/auto/other/toolsupport/tst_toolsupport.cpp @@ -3,27 +3,26 @@ ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** -** This file is part of Qt Creator. +** This file is part of the test suite of the Qt Toolkit. ** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. ** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** $QT_END_LICENSE$ ** ****************************************************************************/ From 23b2d2ada5b1b66ad65eda10d70b5b48d32ef9c5 Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Mon, 5 Mar 2018 16:19:40 +0100 Subject: [PATCH 04/17] Doc: Update Event Transitions Example - added screenshot - some modifications to the text Task-number QTBUG-60635 Change-Id: I57b269f93cdba696b424b5ba008d0f46ac612cda Reviewed-by: Martin Smith --- doc/src/images/transitions.png | Bin 0 -> 4314 bytes .../widgets/doc/src/eventtransitions.qdoc | 27 +++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 doc/src/images/transitions.png diff --git a/doc/src/images/transitions.png b/doc/src/images/transitions.png new file mode 100644 index 0000000000000000000000000000000000000000..b29466f5ab18de8ac71086294625348005b3a3a3 GIT binary patch literal 4314 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 Date: Thu, 8 Mar 2018 14:29:06 +0100 Subject: [PATCH 05/17] Doc: Update Find Files example - review text - update screenshot Task-number: QTBUG-60635 Change-Id: I596ce0e08be9ed9aea7834eeda1c3c2c19c28d7a Reviewed-by: Paul Wicking Reviewed-by: Venugopal Shivashankar --- doc/src/images/findfiles-example.png | Bin 11219 -> 11174 bytes examples/widgets/doc/src/findfiles.qdoc | 103 +++++++++++++++--------- 2 files changed, 65 insertions(+), 38 deletions(-) diff --git a/doc/src/images/findfiles-example.png b/doc/src/images/findfiles-example.png index acb5ea1abf1c5a82aa7ce1c4aefef894cd831ed2..cf3885c015348cdaf886fa186a9b9b2db4535375 100644 GIT binary patch literal 11174 zcmbVybyQSe^zRT#iTI@yP(oqongNj%0R?2}l2&1cmhKekjvE_M%_ul%w-+FJYw|?vWbIz{2@44rG_T6{yb;8tCHXJM!6B2@#cJ`u2cJA&DcGrj6H~-?(!59hfXiRFa z?(T-R_A8h72_?Q;JtLsE?d|ho6^rbqyDvrzAOIyy+?@^nl)ksW|L0(L0`ESH3k$)) zdKZILTU2cP_Q3(=$BtJ0M^uD(S{18D)5+b=%=kP2^4~rJ z&YWC1Uw{`~2kWbk#I}3`j-zE_G6X zkYVofZtU<(v+;0iwD_5j?p%@Pe7eZiV0?aTTpI@atrn{iT(;BWuP4g#)(M%OozoDh z+kASPgc?8G#R_V97r|pW?s2{Uz9jHD`ME}9`WLyhcVy-xS5-ZO=R=;Ke;xm9=-isB z>T0dr848^%cPnn2`ViOk?49Mx@tN%xJES!qRDtzsWt#gN#$f!qh_sm2Wzf-fke`8`?+!$Oc9=-BjPAO2I|LpF#JXK|8aFih3#)9c<4303PT+Q*O6i%}KX8Oz(h zzxo85*=TTSd~CW;6pr5mYJsx;+Qv-QP8UadZ?9>e46_#!%8>wr@gtSpx}A{lUiwRP;chf?fu%x z`tr`W_2%w~=_fNln)oNH+A_i5JAAeRKChI`4?M)#QJtSHQSuea)#|Ag(Z1yVfZJ%n z5%XHQ1Id>J^ZjA~JTWhV7^bTokTNPa;h}V>%56823*|HTgWysA^Kq$cg!WE~KSxFf zQZ>TM8IbF~EXCWkO2G_SPcb3e0tAv=3d<5PN2q-zTH}$K^Yfi)v!AhU5>9k#^mEfm5TT%d$-MSnr zo>}JsCt}wbX=w*oGriTBW&!oYP<%>tAoD-}y=e;SipLyjge3A8fRiZ5A^he3Uz4pN zY}SIPZJdRp5aX^-gpU8mKD4_NZfPOy0m4@aP65qW;wW#GT@ES>(_&0p3w^m7R4Bw=EeDaSPS2HO3uL@yiha-;>HOK))qU7 zPD`-9NM$%pUPsOeXrSL%@?;^Y-fimq&C$cXL4VL;A2j;1%FI0nGn%8k!p`(`?#Ep) z*~qv=LyN=UP$;{L#Y*`o=anha-81LIbovUEaMr<70;Zir|(Ff_%E$Dfb*3za|V<@+)wM|s5 z%cYlyw1``2=$??5l{B4TQ>T#9r`skBi-CM}Mc?enrM3GiG^0y^4qvi;kD^{v?K{?@a2I<)Uu5iBHS}Sy1mm#je5v!msUI zoIG66f92J!1o)@*=X8{yQiM(E&vETs?XWnrA8!J`!)1d0JYk)9X&w7wCEP)USTK6l z>`#mEAJ4C!dVH8xE?*D8dZ)2_`iwLCBaw;&FN}BGPN(K}DB2D|oY(=wll-~_@%Iyj)6uLl|d=f^0~Ttrt{+OVLb z(xh(&f&ggztq;;CuRVa1YMTVGpyl|e-xD7|?C3xYz`6D#fZ`MXgC>0R{9mW;V}#OA z%0xfcT$1FkWC!PC({e4y2Y=S-=^;22+K#r2J3?)Jl)v z?W0G@p{6p&;sc9j40K>^J_WC!yE1SRXqaN!2>mx4{f4etzUO=q*By02Njx< zs_(&R9iLiOe6Xq?7l?kb1pa<4UhJkZ$#A6 zEhoT_OZAeaB*MeisMZH+O+eg2(6QK;VJsR~m@aPip$V;CH=n zJ)wMZtEf9UHZ)-xYx$6)*Oc|GJphQs$nI3_&x>pZG#;iS*_iIhXMxHyOq>Rn z!7e~v<1l^pXjca6<?u6E!g5h)XFR#xVx6uzEyXQY4 zu6iYQ<`ehX(D{^|PuZDj286Xi2A&AKHzWEYOd;Kfk4KQ%^oI{gK!f8lp;6dD@7Y$z6MMG6(;bj=5M-cP;a~c$BwB^OvW} zBJRQrPye{AKrGBX1Y(&uU=aiOGvh^MOm zhJwp`W!(+@Vd_GJ3~{|K;arhntj z``^G;1NuM8!CfnZ0LTP_@B)d;QUNI~4{f6u%71-af`?%(A4$E~9{j1VEy#d#SyKH_ zIRq1owFFr68cipPFr9+`mD$Q?rQLkRNoUP-A?3os6FEf~Qoq<O5;c688v@>9I7iwlg+vNJIv`xcOYFdt zW%`TQx@6UUX-UC52QyS@!QTEvC^tL0*%_`>eb2pz;Yb)5u!7!?+`3#mL#I& z^W-L+dX-<(l`)L$3jgk|g?EPiCCHa2#O5J1h6%ytw1Rtlws*K*o(dw=>9X&Rc$3WDW9!j=s@c5-s z_ohbChMmf}6qvm1#P;Q;t=-n=zMREgWGk3-YV>Kf7JE3P@b~pb8dfiV$gP1uRjT_K z{}H^X#Z0~wgDwu4>dURp1VCPVEcfz zv;co7IGdM3HIV<&jZ6_V8a9Hfu7n zFtDZ4jY&W`@Y9p-vM^oqjC$_?gSLA=$vElt+l_QPgF;_~lhM$0($L(?>uNp=?V^hU z@BMV3NLP303KOSafe5uMXmhzZ*cN17UZ+ZLW+?F7c~6M{x#w0WE1qOIz2;`Nl1eY} zMm;jpm_7W5cvR|ij=^k|GQU?Bn{KhBaPJ3gR>isH-y{kByG|9D4AiByf*N2>RTn7P z7TQ9C{aKx?xE=d0GmUfq%{KJz0Cvjjy(RTq>r{O*NzQ9KaliL^3_b_hd7 zR7r^#@M%6-u%$`tm1Qkxge;lIwbt=uDO-J|k+sA=)Od2(7VzX%Q+q55a#6Tg>bP9Jw`0% zXC>E*wYbK3R%u%z;8V5GE-|=X;Wd?=-TtClORyMxsi0g`Gh=aFQs41fNmo@(Zxl&PcwgIuEy*I+8A!)6Ap~0okAoul_ zyHhdd0GJo>4E>-?TXOPctt*VL9<$YH$?o}!;ZdLOx=Xzu^HaI!}J<;>|;6aNijXd>(C!kc%* z?QEAo%l#XWzadz-&W-bcwSa7K{=qcQ@MC??48+-nTwl)GYVLPTIOp|)N2>Pb&fT}v zR^2-BRU0D(&l38Q;p^p0Me2Xsf(5MdFNP~t@`ccSe;&)911xY`MnpNDJQ`@1{-!WU zIHGiGB1E_W6b$pHnK+RA69lKI)%F|<4 z-3mwM{{SABT77StD|gl-Ona@+GW^+SWZfD;a{XEL`$vV;PZ@MVLl8fber$&wPeR-$ zk$`GPgof$u&x^>tl4y~j!L2D&FzYV8(n2Z)t0kk4_-jccLADCBB7Lp35*o=)--kq?YXJY(YmcF@dw@M19SRNw)Wx|LwK_GMA}*;HbAiSAHLvB5p;+8&yHfVmz7YTQO1?fNdt zt+U`ErKaB4R?cZuF_7O>ZiMh=X<8lL*M*sDAgF=8-$2@5(bv*1y-T3GF(7S4Jwz{O z$(2g+7<9fsy#yVcGk_g_SSb2<_H<6u1M&R3@@Z)C|_h=kETw!e9?7RLg6& zDYW<5@#X_s@lfRKLnUDb)87wrAY&C7c$KHB+)mTLZOi?)LoIU#D7@t@cWyr&hPgen zs5lXoT%s47D*QSVSFYYR=Ko0eqqRPsyaSuEGai7h4nEbCv}hH()oRX@@l+Syj)STf zNov5-zdqBufpo}o*WRDN(m4asqc5$#@0ZQFBub6PkdcOx=2*TYs4nn4D;bJ)7=OZR zCdH}t1G3WBXOWZ7UYxJvwh;dWX=DX6TwR`y6uqA1L0=zjSkwe3;R4(9g=(h6On@y^ zBkp$mj5~D_J*tkt+CupXGx&lm-{4UsD$*-|K3N65Acz#y=R(bpdS<$cOu%@un0nLh zLvI}xlBV2WrS)d@bXY=91=w8+&!VA8rg;I?+5X+=2dy6O3uhPy?jL}-k>#?-Johg& zvq&#EjlnL9ByY5k(FdT-9@qU&R&ZL@rSnsMO>+bA3ID>oNiZfh(aR!nesK;_;0o$@Qd{Ve$-GS@%C{?ckZb64=K+AyabqQ|_L?C`JxePHp`CK!(*H=ge+` zkOLmsW_JugK7jTm7cYKL@xfW#ncz~T-djvUSs$R$86s|bo4fdeo zO^hhub*^qE{1p(rBBPW>XUeV;B4&ilG2B@y&nI(Q1^pnz&;Z)*1wTv@PI!hkq?a62 z;xK|KE)IoMXr}X_6lPMT0&@HxqY3Sm&a0pE;&RXL)`l2nc&UiiqvG=cml}-KizkH( z=sx)4d2}b2O?r;WLieEc@$XPm)IES&R}NVqjI}&U3wdLaB$eHg;90t* z-O>yI@FmuZH1M?YxAxEe6%z)I-hhUY&rNxokk4KAa-}V5v8AKG$KX%cU~njK=EI()LSnie|MUD?@WMyjEdpXn3z)@Vz2%K(1=#J>q$K9 zgSjW0U3z=)Zu=0AKh=Yk)=2HDWKOyJLML$pSRl{-w=4^ybIkm+CLy|Rho>gj9Auot z*wH61@@3Unz7oE$a`!kG5@@JOQwk?0OmuXj*v=oM%&8B_$%}X&Yuv!I6-yx_?oyOM zYvh@opdfemW?&`3+BkpR!`_EtKUu(=Z+_l8)4c8`KNlkX98Jjj|1;&rLS0Ry2Bu{F zS6Y*%j!Nvx;n@)BNxhFRUQdrtL8KS;KF(tC@dxl5L81rSoxAP(MsXXBg+4K5xbEZ< zPr2#euW?xs{2|vq#`wd%*#CG=l)*K9Tp8&dq1DJq5R>fHdpjctLU5)OP>>v zd5s5Gbke)hPO8^pG+WR+e$E+d2!}%2C%dd19GMX!pZgmUw%BH;8u3)53KMBbE2R%7A>?r?w%`sqO5Z$3UQA*15yn1h;#CwU-fqnVKJJhIfTIwdpNk!a%=x0C~BWkWZf00%oR1l_qXdZF5 z+FnuIl}Sa-VTD#u75;n~TNu#X{qdelD(LGX6n6O5s}{4P!!-&kw)s2*DSe_}V9|)^6ybxz8-4fc{$ETXjuTR8JK5ARpq$TutsN5o-Bb6w; zAxF*5IKX7!TIJ?Az`VxY?gj^o z{~{au->jCo`Tfgt@)NR_oErRtWHE3Zkbc1|4w5akHm*I?Vg&!S!uXlP$;&EeHKNY2 zbi1}BReWS8(|2O&c?QX7H{=~f=>;F6ksbRIUN+P3t7~jNK0b@cV1IB3!s5Fy+~yyB zw@VN$>z20Te0h{edOE3LZ65r1vy>cbd0l7jd>y3gB2_CfO*z!N)5=A;uh(pBwE>FMmb*6j5;{PrIy7 zKWH5qJ?iNlc*~8LKDo6utD#9V6lCw2V@M&4Lj^+E7P>}v)UfhY3BP#Ev*aFSy=@5U2)MPuueh%Z@J+*zC0rK_ z^!uz$@s}YD7TjRGy^-Vw^gE&x^#g{j_MthgPJG&5!snXZIuwz1RZ4yKtt8i$sdJh1 zriq198lj|NCN8ku-kl>`5ZG0g4N=d@FYdZC*{cTd&BBO~=XeVvltT_(Two<0A3ai^ zjftygz!(~UI>Co3pfupK8fyR7>?6canLg^qTLNV-8pKdOl@q1UC>XDzG~@EvXTH>^ zBKuqYyza_r7!2JnFEqLyN{~u6I-LSH34I;CtXfwh+-CpkWSQS5GMO`M8IYhI%G%n5 za9@{?Rqs|V2)ONs@eQgfGxE7r+X%pYLqTFvw+TPLFwJaOi4F*nUH2Gna)qgu0X2nB zo-VoErWuvH0ryh@8h=Yk{u6Nj1zi8)@4v;W-!!(pQX%{v-$M4l|F_Xc0P7w;0ki4j z$%d|&{-PvUO*TdSs0qQNax%=yp3${;(S#*9ZEC89UnUX%x$9St*%#zK9usN1se=a8 z!#4EztULHl@s=+ir0BgzqFws90e8NSKd>QI(7nfT5b581<%dGz9(vH!XKnQE(j9yP zF^$$0yBZvJuo3YSm2$lu00GW}!MgF_wDpWqAEwJ7kC&l=1Ay=PRdl2TmW0#;$jl3~ zApC)UjHu#Cv<4AvcQIgcK-jAhKx}9~E?40~eFGQjVz}7*uj~=G*V+EG+*4`1CfU!= z@8!v6Kcsmo$8w*Lq=EXGvm=etkh1QOvRLT1Z?d#R?RRe;iI0xGQM0#qu(xP*-q07T zflnMaIu|r6sgMt5iR%xP6QiQsgeW-U8+_FKktOf{ewg;d zg3}?hJsAYV;_yF*5SgHFU83dWPD z8+?o>3Hx`5`%kLg;G^`CG1aR+XCUh^B38j%2KONd`)@KTPGlt$2u8f&nl@G{{F=5e z&0g+$AQszyS7wh>aqg?|xYbBGoBQ6SdtaTkm~|Y~w$Ymy&o*Awoo#h@WTo-@@!qDn z^CBLV-_z-b{SZO+ML15LFfg(G>+Uo`^wrMQ#92HE-v3&!ZkYn`kL}l}*B)ZxegcRX z#uCglOTZ_)ugX}LR$E4ewew-Ki|2soihD1&jH!CS|1su)S%wO%J3A%gN$9%xgy^GS zD7~_YncW&Qncz9I%(8e76%b3HnauOvKsh!B4Dau8_&nWhlFIggk7w@LRCxPAh-rs1S1zT2%gU-v!AQL&F%RFkwh5u zk0lg(%6i#fPcb*1L2(*VeKf;#wl{yZ>-)HWKYc$F++iP>qR9L}J`_RtU&+BC_ulki zT~fgWX?s$7><9MTp+{g6Li0u8@gnzs{-u~1R<+E2L-5;0VbL!0Avh3O!WC_S{t zckX?4!p8&{_~miV{?N03>aXV5WS*va*qf91Y-ErKSM56YuS%B=&2i>vYl|^3ya&f$ zG}i@w@Etg)3hbXC$6yWvWq<)lOKtPCph{U|TKeHEghy7OCi*}@R9Foiv$-_%VLgQt z_=zL6IGeaM2xAmJmuC6!FSZg7;MV9Aq{Shv1~TI9+-ab_?gv`8QL{J3NS%jlHsssKykA19xOC`jC0T;*b1 zTw$g9Ez$H6v4j%g_^zi=O~MJ8H7WgoxwOWnuQx-ImO9;W2o1qu7{22uMz>VBlWj*> z9bXCD=1=~0+;nY7({kBY%#Na}zvHV8ia8<7dKhArzb&b=uyr)-yJ>cc#cCL8>jIBP1zVXGthUPD;eRs^WKKeEX|5 z%7NQ873=eXMWqs5{Ej_zC-9hVjCwck_h=zIt|ctwHO+4k%lAfPrlrcUO^|9M3Xx^Z z11Zg1v71O$iqoiFmnn>ey~#x&PEyh3PiPTE^Z4wKZODFqF6}pQybTKy8Bv2zt?_!@#~V`o zE7s!W|G>ab4-P(TWS2xQKFqulZK+RW7=e?0ad(Fw!i*<%9a@KpVs5vFSIgLmNQYi^ zpF(LuxPN^~sZ8Z+N;7bxkzw5Yq^(5X;Xo1-Pt13?oq}0z30~CbnY|PNyNXoZiCNrz zacB{Cp&@qj_(bMYa0L_Wd7*`3_W&ztx|}zIJcUOC9l{K;eblSZ=g!@J z7T~?1{!mvtfw3(&q9bVtAs*woCAR_k5zH`aVLL7!JOhFGSkn6Nd-@DR_IlEKm8IUa zg(f{HWfIJ8R4b6OMAKQT@h6NIM(c!**)W;|(fCY{iuD9jw+Ue=dsZpJm>G{g(jW=7 zll~HaLQ(KVw{-m@LsEIzu(Sp7OQ%ylkyZ3haoP*cSy#CSQxF$*j&;T_RyD8=8?MjA zw5?M`Wt$Wk0xYU+pV}e!Dg7JxIlIu9jf3hgL^%!C20_IUjer)3%`n>l;gyy>;o2~I zVg=fTO*wEoupgtMT_Vu_E%@DC;0K$vdkVz=co!~)%n$TKRv`5M{33;g56yb(2yc-l zvCBT(Ffe1xBJwQ@&i{!$4q>4Dca5%5XQz9UY$+a;5-B7zIcdFBM6)XlQuOP8YG8cf zWlD;Q2pjwn$l~ZXku`du)ArSyG{ooxhPN43Y{01hG!?P#MEJ!si$-2*2qV#sSs`$Rk6GiL#$h#c z4{Ch}%w`C-vM$PON+zxw$V?eW8_^4|2eR-qBf;jVW|(7ws4ojdPTEISHN^r+0@Lk( z+4dmzJnz~QHp%FEZ%Y3{d~lW0a$Y7%=82xve(A> zB4R_L5Q7GzUPPZ!|31;kR|L`+tlR@pExq}M(0FxSh!-Uderfk!OWTc;8+`Li+ez<( zu(}H^nzO3Z@t^?_EKKwyzPQL3T;wEP&qlhca)T^hHU|Ht?9>&|tb^ZCs0EGl5o0i4 zg=1Fqxz7LbQ6l4JbMEKv_f-Js2&nNf-!qmK4b)YRb z_jjAMWkDb6*F-;CVEw(cxq`uk8!>7;i8SMuT|^fWHdrm%?IRbA^C3I4uBkmN`uDD% z0PG=S8lp$TV*MMTR?LMt?V7sq4F90p4VXgid}RJvp3oyXhbIG6<{y$pf~@b?Dln9j z6IL7$;?DOGe6aqs+UZE<#X#|KACD(pLE&*v2lbtDi;3_q?E>vl3PK;+70#7de}3sP z#izRsvU+NDYIN!^znl#+v3p{kN#6?+$?KTgnhS39@p7+pc$JSCYq&15*B9zDyq=$V z?dRQsT7ofUy`(I_m|i{|bz~f2oG`HT@9DM7)n21R@P6e=a;mlR z?pGf4U)&~9GFAnQsspn_L3nTBBpkTr49+^7gGvo|JPX&Yp~k7c!>1Skf2Ke zv#Q-HIGy8RX(K*!&bGv=y&wro_aEQ;(*9oIqJgksxR4Ve^K-inn_B=azAdEmYONc0 Q{uZG4RzLkVcU1ZWN@uyF&$O>6AlvDBX>ObR6Oyzx&m5 zpZjZ`J+o)en)R-jcg>E_R9C`%M)?c?09>fD{3`%J?g0QKElgxY5A7GBE&$-jgv!h4 zco`iodwWs$X7K)Pj6KeMS(GukR}VI>)$*faV>O`~*+AiOcB0RM#qSQv%F_Em>2F;m zq*JLwIjc3yuX4%{*+<sdPDkRJthqn#Mv^wov~@>qwrBW}6+rS|r`vnNpmYD$>he~bQOe-?kEI(s{u6ELP&FBoR&jl}GJ?)y~) zjj%H`t8Y!wJ9MveuS^W$yYqq!6eLr+AK#R>hsiY%B8^~M>W!r>=3hq#T8 zOq*BuNkJG-glD@R|8i~*;1*! zU9;S7##iOB3)@qdO6ItgP#Gc%*TYJpDG6SHMOj1I_3XhB)n7z=B< zpzi(T+ZvoJ!Nq9oftCva>{6b9^RHqquC7#6RDW_?P7YkZ*)w5U^E_TjX|)|CX3>pC zOU_C7!G}HDsDBj1>CR+7hXu9~1U!0j6ls-5M&bKD-IzaB#0>MTfB8*jK_k&N_fmSi z#x98wrzowEbx61hYfT<=pR$HRh^tR{R~C7!8An%C`C2}@Xgz)L2G@an)e5DO^T$<@{GseO8~&64Xgxh9C}>*ww$ z=%Rl}WpU^b-Yvatl&C5Fj`wAx{hCh_@UrtC7vam{JIC7Ia4NsuqKXhir|?$jdp#X< zYD66~XX}{(%u`(ZM+f5&Dw34=Pz}m_vE!bp4gdB**&Vo!IKIr$! zhF5BerxfdW;)Gr7@GdT!53+4BYg2o607ToeI5p^m^n^JrkUroOL>(f?Kh&(O*RZ6m zf?0E}+?0T3()F!jc5-owbW;^`KyYa{(}LXiX}7gg-2FhuaQ0gKlhW zN^&m7i96K>ZTxY*=x50g0wnTOnTLhdABJZoemT+$pS;J+SO}2`6i7?@+$DTF8g1LM zOyb6!hpEd#%^9zK26uOf;%kK*c0^rTT>_3fQ3>jZ+;Iy`tk(}CVh0~5u8pUJ`-aKA z#yqccMW?8F*zrcP*Fd)X%lF^L)p(<+Gp?=A3~s`$O%3UzO_E=cC|IAw-nDa&Xc2MB z6}h~}3<081kxfDt*JORiDNZFYz%mDJMJAOhmF)nZOz%B)Yu z)p`Bp=mI_J?F#(l97W-+yZD1sx0#+I&{Zb&wAs$aq$z1JEs@9A0ZF*Dy;L|i-I|-W zGjxePtzo=d=pd=JlNA7!AdKc+D{?)jV`I3h;cd#JTbgiMn<@(Z3uby!I9twm}szSN+Tsj9}iTjH_&aiRCDeA;MP^JBln$0GgH*&ho2^BDM$j(jQwoTeuAK&V%OAkvD`y- zrz+x}lQ+wM6#7l7HTGrqzk3;yCUBxc1G{-Z_!8+kIi@G1;_UH>ErB1dK7 z4vMJLhYDB3su(OvetkyVV!kr+UB8ib-f6U~<6QX__D^3+Co)#hed+zS0%OwR8R5XPrb>^*+NF#O8+lignPwkE;)jkXMB*vd}H`eYW%PhZoiM zro^#?8<QW~#X<{^lBeD1zj2#k)5+drYgl^ZsA#EkrVCxpRNf7|1InhBgrTd0zOE9Ui6gD}$J6S1VP3DC6Ft#pXw&%K zhe(-)HfqWO`5jUB%u8nr&=Hv?X2Nd)zRG!=vclY3wSHKj{qo}jv6_H(zmaH_&pOFd z;rSANWqHZ_D3h)53|Vw;8a*6Vlx~xHM9kQa?Q158#vT#bjCLL&_z6%0APY#yg|x7lEpe!O(eeK(9gcd+lM9JXIr5W}e3}z<|*^&u3*`(|1WMahM%D*Tz!LGd`KPI%E+A@V15Y|F^V1OvFA z3$Ydn1j&O-@CyU)CW?BX!Eurk6Rt$glwPeJ&EIOp>vUc2<-b%+U|8E1acPbu=HOc8$50*h@Cr7yl8%P;&{^e zr6B3%;ax6zP3)aM-OYQe`?Bk^Y;2U+Fewi8^d#iw6o9~fr9&dMqFNXYl}SFAYB(PP zvybJ96%L+M(IR1ljhEnE{9L%0;M9Aj56= zgW)=8_g-}hNyfAb#Xp(+*5jAJC6zy~TQ~--OPbxhUf}W8iyWfi5722F8~nJz@uNr> z1v#d4QM&6~ZMkFua$MH~w@d!7#1vQsWTAr$yLNPE?L$u8MQ}nSd;gZg3%@*x+q$ZU zojwlo-0LBZs>8q!+a;@&kqP2axLV0w8F`~2Uo@g{^y7LR{7Tnb&W9|My=2w;X?^^z zuR9t^rfS8G-`kq0S)BN_l$yy(#(Zuy_PV@mrCpd&?t7bj6L95rW2LbBDPy}tGEoKA z(DCD(rQE3NI0OCp3upNWw#;|MgZZ};>S>+f&fxSQt$)gyN&=8V)kVm+KT8VdJm7NC z`}n>>7bLb6YcJu5BxJwvHRrWGOMl!C&X-gDsr@uJ>q%$ubl2T0kb?Qqo^QHVUyLc^ zB+`sih&r}UsKe+F7pOm?XjNfF*nunOxXq-EI}o4aj|M8Y$%CBKz$`JTv7bEcb=}%R z9=|>OwX190>WS3F2!2#$o8ua;!JTw}x8+G{HwcN&tsyX7xtQ$xf_CFE4{)+0SWgyk z{;0-c@Y(0=kuFl ziBi571y;UA_Vej2)M$16V{OVGVo1&wc||{8Vk9-#L+AxfV5a}#Lj>#M;WDf9UV==6RITzfHbVu6Jlm$1rG5Hky|3WafQEwHo0R9P>e<43oE6cD z;=(y&cZ~}x-g4-m&9xBrceiYyK9W!C-P?~4NtexoiI4t{Vkjju3BkOf|Io6SJuf%v zc%ou`$Yw+(ROMBqNH)ny^qNx5NF^{^x#VD(H8>uk6Y`rX=?q}jK%cJk_xd7&1-(vb z>KlEyrEBbHDGwNn#;SXs7Rxavwy@A%Rba81^&_kC#F-M$aZ-MR%M7+geK)U}m6#H8 z|M6HTHseSOZ{Afm3#o+91T(2`OXH5D7%RwBvZu{wyNlK?bqQ*TyO*)?8%*?59>2`)S`I_`bBP8JA($F>IRFT>V94Nvy{ zFR}OrDNH!sqO)6eMsY>YhYZk2VWj5BJwZ_w%X!&`-$wJy@7=7AM+2WJBvGSlCci8b zuB`MJTr2w{TEhX%j7k$z1E|rj5M;Sy%6hu0g?LOlwm;|AI>N*O#-v58xbftjK)r}VR^M1hz17c(y&A(0O{Ag4yJT1!CVrq| z{L@_6{p%xMa5qJx_LAyAySQSyiH*rJ+x6KEN+5Wxp;zSfb_-7KYF09jiJ*JmT9Fz< zi|yFWN=nrWsf6{{aUMsD4U?G32O?-NCni;sdTkPgb&sJ~cUKN9xu2QAEf49GJ?#GH zYPT8J;Fa%S?mKVnY_(74RmO+Qugt1 zi{0T#9J%((nPA5AVP#LNS;xA>d^}&5G7Rk?(;Q6 z|En}TZ#xV?-6f$kz(nd2@gre9lBj@~H-^mDv@DNA6EE-M#4?3a{oz)1mj->jp}RUZ zYP9FTLHV0NU8L7uDt#V?V~9PtZXP{5+!H?cdib* zSlxcNGf9lJ^1U{*Y>*rL2Y6WJHKWA1GpyIGDrN} z5y~rl4gkh}@b~k_W!wPp4U7cPLjfQW^}m`RM2|8N@ShE^JC$u_YisN4EA|5&2<|o! zrdAnaJ?Qo@}v3*+hE2z`xP#(Sh3ocKt=^nQHg#1 zk@crhkWR`b30&)Za834aJ-yTtsF);lH*Hr4T2WE4wb;`mhXeq9o6ec_B?0W&f5f4I z`Fuj{Mki8_FOle>oILKTM6ca+tCtY6hKO-sE_~Y zwY}r(>+P2~#olhLeDd$*xiHe0hRwXcd@FDEyaFnq1|41uXucR#AL7B01e(OpBP(kS z6~lx}tzattl&s^lK2aX>=hSq3GP>P)428hzf@>$R+g~qi}@@1REV_mE* z(X@W5a-E_frLHot!g4x2Z8=*Rkmz`R2lwo^XtOBz<|fn~3+c z5ZXk*Bg%{gNGA&aCpNqw9L1u^gM&+cE%><6?qcw+1$3H{&Cg!?%9j)8x z&BP@L2nu?X#AtVtC(4I`PFFNW5I$gTJr%1lb-Nu87KMf1C0G_I ziYu>#qYRnNV;a7O(AGVYEcf+~YrE1c_&w@YeZ4qiM!~iJo)a^t;Z+vl6 zDyy|j`n_TXk2B=`!Z1GIl?T(%$TMucgLaJmIe(IjXc5B_O$Y)09`+?I2Ww^rgCVnV z4)3giE;#rbsaMhl{~OMo+h-{BP#7W>xbVZ14mIfYe24w;wA^r0LRiy|3s_XXfyk_*DCPki0BjQ z(1qDnrl$p2X<%o+OJZV+m;$sK^YkPaFKhFPlKm7P10R6d0 zKjkDm(sa(!=Sk+f4eKpnmJjgPfrzz{<#iWY-Fka8Os^Bh+w#Vtnm^Vpy$B? z09&D^z-&oz2_=0byNd62l~sM>7J8-0pS%|d_0aBA6qlA(6nv2`mV2)P-Ig9^+PW^CY7JvGF%1 z@z?#%zT`i^fF{u>>ENn15kR7F8pXr)0isQ$QfLaKCk^mzz)=do051#S(R+1d;GX3) zG;#0JhfwSFYma%Fei3p+VfmUUXhgU({PdJyd2+DI z7uHvrG7<8k@*2VN!Dj->B+@j>X8q7Zps-j)j{ZYQiU+4u&B@^@jc1v6ZQ=a8 z{(Rw;jhs-@Wv!q<#K_g-wKP?1OUi-nqq>lJiI6U3LJDD)72&Y)eP+7->LNS$rN@Y`qw$Q8jCORz`KFjiOZj9Zd@f@=EaI z{eU{UJdv=hruH69PdKU`{Tc(r+73B)IwFaq;SOujR3qlK*;x2an2xc+mZktA(XL=VUFyGnt7k7_+B;B*o6z2V#f( zMG>ddQBIogt~}(6h;SYNU)+XN%uhvI(B`T;h$q^6A?=YG>h46aT^J3~IEu#{Cv~^* ztx{=W#0F8qFd^>3IaZHq zI|)wkJMXW>C>&TzRvu%&%Oq%o2k|dwGD0{H#C(nAW)DZ$lzd|y(UJH+snw&zhDRN0 z(YX7gti~v_s$OF`%`!}3ua$~3B3r@AI2G<2apcVt!YlUt+Xo8J_t}|Y(rfA^5kCoi zCJ6J{<>X@pFMGmi!>IH>uaa~Q`Y7FbPxee4-TFCrAg@lg8yecML{=+@Y1m#z!Shvl zrXwz$sgI7NwK*^LWz*6Nxi6}(q2SNmL7pWEG_g}s0+Ao0h&m;V?c>-2Z0ggpi% zQI5&2?Ru$0gsAWZ(@oCP@eB8=_n?>>^;A_Ufvr{p{rNfVe z1HH_a#DSH&%ocOn`F~;rd6kS=YTE0hq{OyUJ(TisT;e0t9EUP`CHPLbw}@qQg-1SH z5c!Gl9E-6Z1{Bh(H#=MU5_#0r*{4T?D?!s!@^~ArUoAJw17YP zUS#9|c0v@q(uP@ojW2^8`#yo7pqZ_szpGq^M#Z)Mqq}*NemOs=nHkMn6Pz}fv!QVM zOcO2qx;qT}^+iwk?@)LsK_`EJfT93$q&E~h)Zr(7-q0L|#r?aLIR_gM+=cI$jDz8zf>TIbxo^+?WlH1HuA~;)}u3CZ+7aoAoDnR7!1EB-p6pd#C^P zE>?I#;@it}Q_h_q=Ql^Bm!Y=Tv{g&(xtdvYOiDUDzc$LdP!zh3=Nf0c~gC0 z+meEA?QnfWY@5Z4@lz^JrujLWlB`kP=cYl=q763jeLbfcl?eNg+C2I`S7V%Ry(}Db zSm9wD;!F=-QxLylfF<#eOGR4ppfg}H(#j)8Qc6jmA&tPFL$u=8xWcMObj`OQTNJ)x zi>9r0a5!P;v5LD|3Dwop;mn6}o{1(x#V1XO5Pq=A&yL+lizn1LoYqL8G^QN%S6|dD zE$Zu8IIw_2_R5i?0R3afRR3WOV`ikaUUid|P68Lw0YU&k*IB=+RxxGLBM`n1-r7AYh??=x#wEhiU zpPMLG4?583xaw1Z7+A;}8?yR3-9c41g%9jWH8*wYU2!44bhr462DsDU?kjQ-^BVQ> zr3WSgU24R+Q+~zZ0o5%sJb6$cXdJ9VR1)(mnCJIwOjcm&Gy`%MVhw!GmMRC>QNUL) zmC%!N&a}1uDL2Hoq&%ULQA+!=FjY4<6Nwf>40#69@K!|F-A zc;jN-4|@B9slq}2CEV8Y@jFs=i?f$|pnrRVGt0XJXMAfj_o5o++}|HDH1@6vb0-GPluS~Y8)r&i>kT=0qFwSJNH9K3AOpIin_}KTzWkReF;C({`~p%r?cOB z^iX(oC&#t%HV87ngwm%U($waWZcO`D;pNu_HJ2M;z?1}O(hqtOK@vWh>!kPvys`7< zZRPSpZKANxO^Wxp59QlmeWL0TRspNR1O47zd+~6X7`L6Z)ZjV_eVJUyTlLCp9uXyT z`ETHs`3&Z~< zCF&ovi?f8CHJuyfqo4yl8r;4g@yG!jspdm8Q72$Rq8Z@`L0e~VFaVTO0VeKp%+A-x z#@ENo90+UW;NUn)8g5@GP%%Sz-_vrV#T-CyR^HK|!F_#z;Pdp2?o^m4)vSZkc*(_Z zK*B^w!E>2JLh<;O+xeIY$OD&@ULa_!Usrb(kh0aVz|O+otu-nwlf#)9G>HoXpv@bsT!0rVQ^CCNh+ z$MRt>^vIuw2IQT9fv$*bh+@4bh_+UvP*oII>oyCCeF+dSEl_#hU$O)AiZF;hUF-Ws zav;BzQBbQ7Vt*~u*OyZ=y}dk;l(v)Q{79*;n(edK z>pnjpPqVJQT@-)uAFtFQ1@Q!=UVeY$*LvZ_f|FZ5ygM!wuyKDqo1w#pm>#`&5p0J6 z*ty!RvSb(i}bVe#}p9C*U&$l%S)CyHn@s)j=H~$dS}>mRIX}K`Yo> zfZq|D`4oE1;?0ajti~mb==o=y6)Zykom?WQzle+Y^t%5?+I0gvX{OT)Gv9JsP zpt~RbL;w(0Ac}};(UK`t-+(Ueu_OQh|0Apbg1#cy#XlDN-wk4*iy{q>W@DB}@TL`s zixAqhGhOgU5M275pslZY7EvIYA#=lYVdIt#@vUQYfWTGSFxu+G>+Vc4;)V77A2>!3 zNbBj(5$=PehY%p0Cr`_?AckX{1ttq+0_gb_!MM24XyvJhbMO@=V3s6bJKSkEx2>3A zmjNCsKC4~AJP(5xi0Zdj3tQICd`;F70sscp8N9K}#m<(Dku>MB-Gi%u3c*_?n8lEOepgpdE?k3Q;Z^Uy8cm}1JewSK0z+3PPge*jhgoJP*ZlTR zpsO)*w>@dpRoc!`RWLr4t3vg7oPxV&Rppy6I6DYD;(z(32$*=H0Be4FSqN>%mi<8J-DFQL4|Rcw3^}OB#B=ir6>u{^ z{x7!wKlP;lDl7d@z3E>WAe+ZF2^Hu%trtW*;5;lKN>EOqTw%n6C^yo7f%=~?|9{ao zIVAJ-_kXy*_X~U~SY!g$(((fDZf^F-{y}@+4?exR^5D9ET&!BAMFM6)5Q$^ge(h_Q z^hB8P;X(~AK#z&q6*mTZEYHxLeB~tqf3od^lf&+r^7m9n<3Dp;Yl(<>0N%wpX{6_0lV|2 z*$JKtCAt{^R5pBvrC2)c%CrSH{-y2cp^^EFCUI-RP*e=f(8Aa2wY?>?t(%XvAn}*u z>Lvd!eQFhFTGXbFq*uwn{R-;be!Wc%cs+qU%LsQ;JH!UCd^MKRU49{-wI~neog5PY z)H@cuj+^JbaL4zgK-az#1$Egj7Xa>5H4rrd zTOS1aV!268N6Tta)C$xXYX`ZUup|r~#Ta;^fGw&cADxW27a0!&s(c&V{enL6<$xA) zWH_D4bp=#akgBM!9E0$84x4SmyxCkNpIhq1T*fX#*tdfWhl9YuxP#0Egvh_q`B=1( zx{i;JS5}O4AwBC({FI+ReX5t-Bmy8C3zr%{BX19e$F&iazh{ildO$jo@NJd9!EA7~ zndJT6!S^hoNN@o?7sBUY?@fD0GHO57za&DqIcFI?!Z8y=zzooT$t38LxPBrK1mf!9 zETaDn2L5{VEaD4`{#`F zKwEFUyT@32b83gGZdp9BWz;JT4o(~^PiT#jinmFO;^SLMka-YabpTA%7{h}49v=F) z>poPKCY08+yF&u$e+-vP=qByaLrIonXG?ygj|)HnX?6VA38!3C;5WF%c-+`apze9i z79yHK_MwT@8ij|I3*JP)4XIW3G?$`TRUn$r$z%8SQOxk-pRa@;io17gqHIR?xjp}> z;P5yUGWKUDp;e0Rur1{ge?>WFM(s#4SM{|zc%0dNxNIb^D(UMxpi44B?3%X2-uGQx$?duxX240ZT+j7R;r0}}xl930TnYP=P^@oF+hY6@qkT!LL$B!NRr|NM{k zn5U`pnOEF36fntyrR2PPqT!*vFrg^T`m`ku(WmZ2M(bLPp*vY}41C(wXoi1E9)H&i zMhc=ydnT(+1n9zjnb#* z5PkqacMpfCZt#O)GwieA$9vx?PT6d!x4&Kw0KmaF%6?&rGBDw$_Nv3ZJLnHPPT%x) z)L98SApHzWDakrL9mWWyj?ID*;>XFp?(H6FK?S6VaUUuAopDatpc||^<1|t0h`!g` u@$n?kjXxU3SX@Ye&fCgB!dygp=#)X7O=d22@J0Nr3qTdr Date: Mon, 12 Mar 2018 16:51:01 +0100 Subject: [PATCH 06/17] Doc: Add brief statements to Address Book Example chapters Task-number: QTBUG-60635 Change-Id: Ice6d2b6a475ba4352a87bb46366826334aed2af2 Reviewed-by: Paul Wicking Reviewed-by: Venugopal Shivashankar --- examples/widgets/doc/src/addressbook-tutorial.qdoc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/widgets/doc/src/addressbook-tutorial.qdoc b/examples/widgets/doc/src/addressbook-tutorial.qdoc index 31d1d64daca..1f6966e8aeb 100644 --- a/examples/widgets/doc/src/addressbook-tutorial.qdoc +++ b/examples/widgets/doc/src/addressbook-tutorial.qdoc @@ -80,7 +80,7 @@ /*! \example tutorials/addressbook/part1 \title Part 1 - Designing the User Interface - + \brief Describes how to code the user interface of the Address Book Example. This first part covers the design of the basic graphical user interface (GUI) for our address book application. @@ -232,6 +232,7 @@ /*! \example tutorials/addressbook/part2 \title Part 2 - Adding Addresses + \brief Describes the code for inserting records in the Address Book Example. The next step in creating the address book is to implement some user interactions. @@ -381,9 +382,10 @@ /*! \example tutorials/addressbook/part3 \title Part 3 - Navigating between Entries + \brief Explains the code that enables navigating the contacts. The address book is now about half complete. We should add the - capability to navigate among the contacts, but first we must + capability to navigate the contacts, but first we must decide what sort of a data structure we need for containing these contacts. @@ -496,6 +498,7 @@ /*! \example tutorials/addressbook/part4 \title Part 4 - Editing and Removing Addresses + \brief Explains how to add edit and remove functionality. Now we look at ways to modify the contents of contacts stored in the address book. @@ -628,6 +631,7 @@ /*! \example tutorials/addressbook/part5 \title Part 5 - Adding a Find Function + \brief Describes how to add a find function. Here we look at ways to locate contacts and addresses in the address book. @@ -770,6 +774,7 @@ /*! \example tutorials/addressbook/part6 \title Part 6 - Loading and Saving + \brief Describes how to add save and load functionality. This part covers the Qt file handling features we use to write loading and saving routines for the address book. @@ -890,6 +895,7 @@ /*! \example tutorials/addressbook/part7 \title Part 7 - Additional Features + \brief Describes how to export data in VCard format. This part covers some additional features that make the address book more convenient for the frequent user. From 5ffd47b76418eb4ef3369a78471cd6567c4659d0 Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Tue, 20 Mar 2018 10:41:04 +0100 Subject: [PATCH 07/17] Doc: Update connect syntax in I18n Widgets Example Task-number: QTBUG-60635 Change-Id: Icfa0d09ac6c9ad4396fbe1138277bb1dd866a803 Reviewed-by: Paul Wicking Reviewed-by: Venugopal Shivashankar --- examples/widgets/tools/i18n/languagechooser.cpp | 9 ++++++--- examples/widgets/tools/i18n/mainwindow.cpp | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/widgets/tools/i18n/languagechooser.cpp b/examples/widgets/tools/i18n/languagechooser.cpp index 83aafe6b8a0..58cf9d4047f 100644 --- a/examples/widgets/tools/i18n/languagechooser.cpp +++ b/examples/widgets/tools/i18n/languagechooser.cpp @@ -70,7 +70,10 @@ LanguageChooser::LanguageChooser(const QString& defaultLang, QWidget *parent) for (int i = 0; i < qmFiles.size(); ++i) { QCheckBox *checkBox = new QCheckBox(languageName(qmFiles[i])); qmFileForCheckBoxMap.insert(checkBox, qmFiles[i]); - connect(checkBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxToggled())); + connect(checkBox, + QOverload::of(&QCheckBox::toggled), + this, + &LanguageChooser::checkBoxToggled); if (languageMatch(defaultLang, qmFiles[i])) checkBox->setCheckState(Qt::Checked); groupBoxLayout->addWidget(checkBox, i / 2, i % 2); @@ -84,8 +87,8 @@ LanguageChooser::LanguageChooser(const QString& defaultLang, QWidget *parent) hideAllButton = buttonBox->addButton("Hide All", QDialogButtonBox::ActionRole); - connect(showAllButton, SIGNAL(clicked()), this, SLOT(showAll())); - connect(hideAllButton, SIGNAL(clicked()), this, SLOT(hideAll())); + connect(showAllButton, &QAbstractButton::clicked, this, &LanguageChooser::showAll); + connect(hideAllButton, &QAbstractButton::clicked, this, &LanguageChooser::hideAll); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(groupBox); diff --git a/examples/widgets/tools/i18n/mainwindow.cpp b/examples/widgets/tools/i18n/mainwindow.cpp index d5de81cab74..6ebfddfa98b 100644 --- a/examples/widgets/tools/i18n/mainwindow.cpp +++ b/examples/widgets/tools/i18n/mainwindow.cpp @@ -76,7 +76,7 @@ MainWindow::MainWindow() centralWidget->setLayout(mainLayout); exitAction = new QAction(tr("E&xit"), this); - connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + connect(exitAction, &QAction::triggered, qApp, QApplication::quit); fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->setPalette(QPalette(Qt::red)); From b451c9dfdc1421e202b5ce9c2e06931fc0c4c215 Mon Sep 17 00:00:00 2001 From: Johan Klokkhammer Helsing Date: Fri, 6 Apr 2018 14:37:22 +0200 Subject: [PATCH 08/17] tst_QTouchEvent: Wait for window exposed instead of active MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes the tests pass on Wayland compositors that don't automatically give focus to newly created windows. Such as a headless Weston, which is very useful for testing. Task-number: QTBUG-66846 Change-Id: I502504b333499c89be193a3ebc19d41264a13580 Reviewed-by: Shawn Rutledge Reviewed-by: Jan Arve Sæther --- tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp index d16d95500b6..db5e83e2c7c 100644 --- a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp +++ b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp @@ -608,7 +608,7 @@ void tst_QTouchEvent::basicRawEventTranslation() touchWidget.setAttribute(Qt::WA_AcceptTouchEvents); touchWidget.setGeometry(100, 100, 400, 300); touchWidget.show(); - QVERIFY(QTest::qWaitForWindowActive(&touchWidget)); + QVERIFY(QTest::qWaitForWindowExposed(&touchWidget)); QPointF pos = touchWidget.rect().center(); QPointF screenPos = touchWidget.mapToGlobal(pos.toPoint()); @@ -741,7 +741,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen() rightWidget.setGeometry(300, 100, 100, 100); touchWidget.show(); - QVERIFY(QTest::qWaitForWindowActive(&touchWidget)); + QVERIFY(QTest::qWaitForWindowExposed(&touchWidget)); QPointF leftPos = leftWidget.rect().center(); QPointF rightPos = rightWidget.rect().center(); @@ -968,7 +968,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad() rightWidget.setGeometry(300, 100, 100, 100); touchWidget.show(); - QVERIFY(QTest::qWaitForWindowActive(&touchWidget)); + QVERIFY(QTest::qWaitForWindowExposed(&touchWidget)); QPointF leftPos = leftWidget.rect().center(); QPointF rightPos = rightWidget.rect().center(); @@ -1184,7 +1184,7 @@ void tst_QTouchEvent::basicRawEventTranslationOfIds() touchWidget.setAttribute(Qt::WA_AcceptTouchEvents); touchWidget.setGeometry(100, 100, 400, 300); touchWidget.show(); - QVERIFY(QTest::qWaitForWindowActive(&touchWidget)); + QVERIFY(QTest::qWaitForWindowExposed(&touchWidget)); QVarLengthArray pos; QVarLengthArray screenPos; From 1b109dbd917e7e4627177f375f17e60257486520 Mon Sep 17 00:00:00 2001 From: Johan Klokkhammer Helsing Date: Fri, 6 Apr 2018 12:50:02 +0200 Subject: [PATCH 09/17] tst_QClipboard: Skip on Wayland, as it requires real input events On Wayland, manipulating the clipboard requires an input event serial, which is not possible to get unless the compositor sends us input events. Change-Id: If5231a5db85f8d6ad988ea93f240cee0c3466f9f Reviewed-by: Friedemann Kleint --- .../gui/kernel/qclipboard/tst_qclipboard.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp index 87fd5c0dc68..993ebbaac61 100644 --- a/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp +++ b/tests/auto/gui/kernel/qclipboard/tst_qclipboard.cpp @@ -41,10 +41,8 @@ class tst_QClipboard : public QObject { Q_OBJECT private slots: -#ifdef QT_NO_CLIPBOARD void initTestCase(); - void cleanupTestCase(); -#else +#if QT_CONFIG(clipboard) void init(); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(Q_OS_QNX) void copy_exit_paste(); @@ -58,19 +56,16 @@ private slots: #endif }; -#ifdef QT_NO_CLIPBOARD void tst_QClipboard::initTestCase() { +#if !QT_CONFIG(clipboard) QSKIP("This test requires clipboard support"); +#endif + if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) + QSKIP("Wayland: Manipulating the clipboard requires real input events. Can't auto test."); } -void tst_QClipboard::cleanupTestCase() -{ - QSKIP("This test requires clipboard support"); -} - -#else - +#if QT_CONFIG(clipboard) void tst_QClipboard::init() { #if QT_CONFIG(process) @@ -436,7 +431,7 @@ void tst_QClipboard::clearBeforeSetText() QCOMPARE(QGuiApplication::clipboard()->text(), text); } -#endif +#endif // QT_CONFIG(clipboard) QTEST_MAIN(tst_QClipboard) From 1c92bb87fe4d32265b3c6d33b6e548bd41635c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Tue, 20 Mar 2018 12:01:48 +0100 Subject: [PATCH 10/17] Fix TlsV1SslV3 case in the WinRT SSL backend It would previously only enable TLS v1.0, but it should also enable SSL v3. According to Microsoft's documentation[0] that is exactly what "SocketProtectionLevel_Ssl" does. [0]: https://docs.microsoft.com/en-us/uwp/api/windows.networking.sockets.socketprotectionlevel Change-Id: Id48f1ad310d994b8379116c9fa2102db858d7f69 Reviewed-by: Timur Pocheptsov --- src/network/ssl/qsslsocket_winrt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/ssl/qsslsocket_winrt.cpp b/src/network/ssl/qsslsocket_winrt.cpp index ff9dccc7349..53a8a8b61bc 100644 --- a/src/network/ssl/qsslsocket_winrt.cpp +++ b/src/network/ssl/qsslsocket_winrt.cpp @@ -236,9 +236,9 @@ void QSslSocketBackendPrivate::startClientEncryption() switch (q->protocol()) { case QSsl::AnyProtocol: case QSsl::SslV3: + case QSsl::TlsV1SslV3: protectionLevel = SocketProtectionLevel_Ssl; // Only use this value if weak cipher support is required break; - case QSsl::TlsV1SslV3: case QSsl::TlsV1_0: protectionLevel = SocketProtectionLevel_Tls10; break; From f5a624c9b94455bebd7eb8fabbb300c4793fe6df Mon Sep 17 00:00:00 2001 From: Mikhail Svetkin Date: Thu, 5 Apr 2018 15:08:15 +0200 Subject: [PATCH 11/17] Fix integer overflow (1 << 31) On platforms where integer by default is int32(max is 2147483647) and (1 << 31) will be 2147483648 Change-Id: I59ccb5344d5ad7d085f01bbc7cebdf6152ff7755 Reviewed-by: Jesus Fernandez Reviewed-by: Edward Welbourne Reviewed-by: Thiago Macieira --- src/gui/text/qfontdatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index 404a722e295..a4e51309374 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -2889,7 +2889,7 @@ Q_GUI_EXPORT QStringList qt_sort_families_by_writing_system(QChar::Script script uint order = i; if (testFamily == nullptr || (testFamily->writingSystems[writingSystem] & QtFontFamily::Supported) == 0) { - order |= 1 << 31; + order |= 1u << 31; } supported.insert(order, family); From 5c4e5032b5162341168c1cec09f0247c7f2283e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Mon, 26 Mar 2018 15:19:17 +0200 Subject: [PATCH 12/17] Unblacklist qsslkey for Linux Except RHEL-6.6 and 7.4 It was blacklisted in f3939d943ed132eaf3daead797d961c3ffbc31a5, along with a lot of other entries. No specifics are known about why it was blacklisted originally, but now it only fails on RHEL because they use OpenSSL 1.0.1. Change-Id: I6d1d1b7b7bf5386b2115b8780163550cf03bbad7 Reviewed-by: Gatis Paeglis Reviewed-by: Timur Pocheptsov --- tests/auto/network/ssl/qsslkey/BLACKLIST | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/auto/network/ssl/qsslkey/BLACKLIST b/tests/auto/network/ssl/qsslkey/BLACKLIST index a08e1f35eb7..c0dfe5eb861 100644 --- a/tests/auto/network/ssl/qsslkey/BLACKLIST +++ b/tests/auto/network/ssl/qsslkey/BLACKLIST @@ -1 +1,2 @@ -linux +redhatenterpriselinuxworkstation-6.6 +rhel-7.4 From 37161d038061584227fe29b9c808acfcc8e865ee Mon Sep 17 00:00:00 2001 From: Paul Wicking Date: Wed, 21 Mar 2018 15:10:33 +0100 Subject: [PATCH 13/17] Doc: Update QVariant::toString description, update see also links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change the toString description to reflect that the listed types are not exclusive, and update see also link to link to the canConvert method that includes conversion table. Task-number: QTBUG-67174 Change-Id: I3ad2889c98a235995b94a2d0496a6fb8c024b7bb Reviewed-by: Topi Reiniö --- src/corelib/kernel/qvariant.cpp | 91 +++++++++++++++++---------------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index b3a86576aff..6192b664871 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -2379,7 +2379,7 @@ inline T qVariantToHelper(const QVariant::Private &d, const HandlersManager &han \l QMetaType::QVariantList of a type that can be converted to QString; otherwise returns an empty list. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QStringList QVariant::toStringList() const { @@ -2387,14 +2387,19 @@ QStringList QVariant::toStringList() const } /*! - Returns the variant as a QString if the variant has userType() \l - QMetaType::QString, \l QMetaType::Bool, \l QMetaType::QByteArray, + Returns the variant as a QString if the variant has a userType() + including, but not limited to: + + \l QMetaType::QString, \l QMetaType::Bool, \l QMetaType::QByteArray, \l QMetaType::QChar, \l QMetaType::QDate, \l QMetaType::QDateTime, \l QMetaType::Double, \l QMetaType::Int, \l QMetaType::LongLong, \l QMetaType::QStringList, \l QMetaType::QTime, \l QMetaType::UInt, or - \l QMetaType::ULongLong; otherwise returns an empty string. + \l QMetaType::ULongLong. - \sa canConvert(), convert() + Calling QVariant::toString() on an unsupported variant returns an empty + string. + + \sa canConvert(int targetTypeId), convert() */ QString QVariant::toString() const { @@ -2405,7 +2410,7 @@ QString QVariant::toString() const Returns the variant as a QMap if the variant has type() \l QMetaType::QVariantMap; otherwise returns an empty map. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QVariantMap QVariant::toMap() const { @@ -2416,7 +2421,7 @@ QVariantMap QVariant::toMap() const Returns the variant as a QHash if the variant has type() \l QMetaType::QVariantHash; otherwise returns an empty map. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QVariantHash QVariant::toHash() const { @@ -2433,7 +2438,7 @@ QVariantHash QVariant::toHash() const If the type() is \l QMetaType::QString, an invalid date will be returned if the string cannot be parsed as a Qt::ISODate format date. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QDate QVariant::toDate() const { @@ -2450,7 +2455,7 @@ QDate QVariant::toDate() const If the type() is \l QMetaType::QString, an invalid time will be returned if the string cannot be parsed as a Qt::ISODate format time. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QTime QVariant::toTime() const { @@ -2467,7 +2472,7 @@ QTime QVariant::toTime() const If the type() is \l QMetaType::QString, an invalid date/time will be returned if the string cannot be parsed as a Qt::ISODate format date/time. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QDateTime QVariant::toDateTime() const { @@ -2481,7 +2486,7 @@ QDateTime QVariant::toDateTime() const Returns the variant as a QEasingCurve if the variant has userType() \l QMetaType::QEasingCurve; otherwise returns a default easing curve. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ #ifndef QT_BOOTSTRAPPED QEasingCurve QVariant::toEasingCurve() const @@ -2497,7 +2502,7 @@ QEasingCurve QVariant::toEasingCurve() const \l QMetaType::QByteArray or \l QMetaType::QString (converted using QString::fromUtf8()); otherwise returns an empty byte array. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QByteArray QVariant::toByteArray() const { @@ -2512,7 +2517,7 @@ QByteArray QVariant::toByteArray() const \l QMetaType::QPoint or \l QMetaType::QPointF; otherwise returns a null QPoint. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QPoint QVariant::toPoint() const { @@ -2525,7 +2530,7 @@ QPoint QVariant::toPoint() const Returns the variant as a QRect if the variant has userType() \l QMetaType::QRect; otherwise returns an invalid QRect. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QRect QVariant::toRect() const { @@ -2538,7 +2543,7 @@ QRect QVariant::toRect() const Returns the variant as a QSize if the variant has userType() \l QMetaType::QSize; otherwise returns an invalid QSize. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QSize QVariant::toSize() const { @@ -2551,7 +2556,7 @@ QSize QVariant::toSize() const Returns the variant as a QSizeF if the variant has userType() \l QMetaType::QSizeF; otherwise returns an invalid QSizeF. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QSizeF QVariant::toSizeF() const { @@ -2565,7 +2570,7 @@ QSizeF QVariant::toSizeF() const \l QMetaType::QRect or \l QMetaType::QRectF; otherwise returns an invalid QRectF. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QRectF QVariant::toRectF() const { @@ -2578,7 +2583,7 @@ QRectF QVariant::toRectF() const Returns the variant as a QLineF if the variant has userType() \l QMetaType::QLineF; otherwise returns an invalid QLineF. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QLineF QVariant::toLineF() const { @@ -2591,7 +2596,7 @@ QLineF QVariant::toLineF() const Returns the variant as a QLine if the variant has userType() \l QMetaType::QLine; otherwise returns an invalid QLine. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QLine QVariant::toLine() const { @@ -2605,7 +2610,7 @@ QLine QVariant::toLine() const QMetaType::QPoint or \l QMetaType::QPointF; otherwise returns a null QPointF. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QPointF QVariant::toPointF() const { @@ -2621,7 +2626,7 @@ QPointF QVariant::toPointF() const Returns the variant as a QUrl if the variant has userType() \l QMetaType::QUrl; otherwise returns an invalid QUrl. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QUrl QVariant::toUrl() const { @@ -2635,7 +2640,7 @@ QUrl QVariant::toUrl() const Returns the variant as a QLocale if the variant has userType() \l QMetaType::QLocale; otherwise returns an invalid QLocale. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QLocale QVariant::toLocale() const { @@ -2649,7 +2654,7 @@ QLocale QVariant::toLocale() const Returns the variant as a QRegExp if the variant has userType() \l QMetaType::QRegExp; otherwise returns an empty QRegExp. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ #ifndef QT_NO_REGEXP QRegExp QVariant::toRegExp() const @@ -2666,7 +2671,7 @@ QRegExp QVariant::toRegExp() const Returns the variant as a QRegularExpression if the variant has userType() \l QRegularExpression; otherwise returns an empty QRegularExpression. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QRegularExpression QVariant::toRegularExpression() const { @@ -2681,7 +2686,7 @@ QRegularExpression QVariant::toRegularExpression() const Returns the variant as a QModelIndex if the variant has userType() \l QModelIndex; otherwise returns a default constructed QModelIndex. - \sa canConvert(), convert(), toPersistentModelIndex() + \sa canConvert(int targetTypeId), convert(), toPersistentModelIndex() */ QModelIndex QVariant::toModelIndex() const { @@ -2694,7 +2699,7 @@ QModelIndex QVariant::toModelIndex() const Returns the variant as a QPersistentModelIndex if the variant has userType() \l QPersistentModelIndex; otherwise returns a default constructed QPersistentModelIndex. - \sa canConvert(), convert(), toModelIndex() + \sa canConvert(int targetTypeId), convert(), toModelIndex() */ QPersistentModelIndex QVariant::toPersistentModelIndex() const { @@ -2710,7 +2715,7 @@ QPersistentModelIndex QVariant::toPersistentModelIndex() const \l QMetaType::QUuid, \l QMetaType::QByteArray or \l QMetaType::QString; otherwise returns a default-constructed QUuid. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QUuid QVariant::toUuid() const { @@ -2723,7 +2728,7 @@ QUuid QVariant::toUuid() const Returns the variant as a QJsonValue if the variant has userType() \l QJsonValue; otherwise returns a default constructed QJsonValue. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QJsonValue QVariant::toJsonValue() const { @@ -2736,7 +2741,7 @@ QJsonValue QVariant::toJsonValue() const Returns the variant as a QJsonObject if the variant has userType() \l QJsonObject; otherwise returns a default constructed QJsonObject. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QJsonObject QVariant::toJsonObject() const { @@ -2749,7 +2754,7 @@ QJsonObject QVariant::toJsonObject() const Returns the variant as a QJsonArray if the variant has userType() \l QJsonArray; otherwise returns a default constructed QJsonArray. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QJsonArray QVariant::toJsonArray() const { @@ -2762,7 +2767,7 @@ QJsonArray QVariant::toJsonArray() const Returns the variant as a QJsonDocument if the variant has userType() \l QJsonDocument; otherwise returns a default constructed QJsonDocument. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QJsonDocument QVariant::toJsonDocument() const { @@ -2777,7 +2782,7 @@ QJsonDocument QVariant::toJsonDocument() const \l QMetaType::QChar, \l QMetaType::Int, or \l QMetaType::UInt; otherwise returns an invalid QChar. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QChar QVariant::toChar() const { @@ -2788,7 +2793,7 @@ QChar QVariant::toChar() const Returns the variant as a QBitArray if the variant has userType() \l QMetaType::QBitArray; otherwise returns an empty bit array. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QBitArray QVariant::toBitArray() const { @@ -2831,7 +2836,7 @@ inline T qNumVariantToHelper(const QVariant::Private &d, will not be reflected in \a ok. A simple workaround is to use QString::toInt(). - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ int QVariant::toInt(bool *ok) const { @@ -2853,7 +2858,7 @@ int QVariant::toInt(bool *ok) const overflow will not be reflected in \a ok. A simple workaround is to use QString::toUInt(). - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ uint QVariant::toUInt(bool *ok) const { @@ -2870,7 +2875,7 @@ uint QVariant::toUInt(bool *ok) const If \a ok is non-null: \c{*}\c{ok} is set to true if the value could be converted to an int; otherwise \c{*}\c{ok} is set to false. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ qlonglong QVariant::toLongLong(bool *ok) const { @@ -2887,7 +2892,7 @@ qlonglong QVariant::toLongLong(bool *ok) const If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be converted to an int; otherwise \c{*}\a{ok} is set to false. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ qulonglong QVariant::toULongLong(bool *ok) const { @@ -2904,7 +2909,7 @@ qulonglong QVariant::toULongLong(bool *ok) const \l QMetaType::QByteArray and its lower-case content is not one of the following: empty, "0" or "false"; otherwise returns \c false. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ bool QVariant::toBool() const { @@ -2927,7 +2932,7 @@ bool QVariant::toBool() const If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be converted to a double; otherwise \c{*}\a{ok} is set to false. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ double QVariant::toDouble(bool *ok) const { @@ -2946,7 +2951,7 @@ double QVariant::toDouble(bool *ok) const If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be converted to a double; otherwise \c{*}\a{ok} is set to false. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ float QVariant::toFloat(bool *ok) const { @@ -2965,7 +2970,7 @@ float QVariant::toFloat(bool *ok) const If \a ok is non-null: \c{*}\a{ok} is set to true if the value could be converted to a double; otherwise \c{*}\a{ok} is set to false. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ qreal QVariant::toReal(bool *ok) const { @@ -2977,7 +2982,7 @@ qreal QVariant::toReal(bool *ok) const \l QMetaType::QVariantList or \l QMetaType::QStringList; otherwise returns an empty list. - \sa canConvert(), convert() + \sa canConvert(int targetTypeId), convert() */ QVariantList QVariant::toList() const { @@ -3359,7 +3364,7 @@ bool QVariant::canConvert(int targetTypeId) const failed a previous conversion will always fail, changing the type, remaining null, and returning \c false. - \sa canConvert(), clear() + \sa canConvert(int targetTypeId), clear() */ bool QVariant::convert(int targetTypeId) From fe19527a4347dfbf39bc9073ff26a9f5a28930c0 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 1 Nov 2017 14:21:21 +0200 Subject: [PATCH 14/17] Configure: Restore default prefix on Windows The configure unification accidentally changed it to /usr/local as used on unix. Use C:/Qt again. Task-number: QTBUG-61373 Change-Id: I758c639bdb07c97b55f990821e73a5135038f4a0 Reviewed-by: Oswald Buddenhagen --- configure.pri | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/configure.pri b/configure.pri index 7185647e44a..0512ef01447 100644 --- a/configure.pri +++ b/configure.pri @@ -694,10 +694,14 @@ defineReplace(printHostPaths) { defineTest(qtConfOutput_preparePaths) { isEmpty(config.input.prefix) { - $$qtConfEvaluate("features.developer-build"): \ + $$qtConfEvaluate("features.developer-build") { config.input.prefix = $$QT_BUILD_TREE # In Development, we use sandboxed builds by default - else: \ - config.input.prefix = /usr/local/Qt-$$[QT_VERSION] + } else { + win32: \ + config.input.prefix = C:/Qt/Qt-$$[QT_VERSION] + else: \ + config.input.prefix = /usr/local/Qt-$$[QT_VERSION] + } have_prefix = false } else { config.input.prefix = $$absolute_path($$config.input.prefix, $$OUT_PWD) From 315327f3d6419d2689d3414d62012d65fe441f27 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Thu, 15 Mar 2018 16:33:20 +0100 Subject: [PATCH 15/17] xcb: rename two classes in qxcbbackingstore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QXcbShmImage to QXcbBackingStoreImage as it is an image that might or might not have SHM capability. The current name implies that it always uses SHM. QXcbShmGraphicsBuffer to QXcbGraphicsBuffer as it has nothing to do with SHM. Change-Id: I57ced75891e8b10515142769278a7f3f40da91ef Reviewed-by: Alexander Volkov Reviewed-by: Błażej Szczygieł Reviewed-by: Laszlo Agocs --- .../platforms/xcb/qxcbbackingstore.cpp | 42 +++++++++---------- src/plugins/platforms/xcb/qxcbbackingstore.h | 4 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp index 70d1757af46..6efdb2d8344 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp +++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp @@ -70,11 +70,11 @@ QT_BEGIN_NAMESPACE -class QXcbShmImage : public QXcbObject +class QXcbBackingStoreImage : public QXcbObject { public: - QXcbShmImage(QXcbScreen *connection, const QSize &size, uint depth, QImage::Format format); - ~QXcbShmImage() { destroy(true); } + QXcbBackingStoreImage(QXcbScreen *connection, const QSize &size, uint depth, QImage::Format format); + ~QXcbBackingStoreImage() { destroy(true); } void resize(const QSize &size); @@ -140,10 +140,10 @@ private: bool m_clientSideScroll; }; -class QXcbShmGraphicsBuffer : public QPlatformGraphicsBuffer +class QXcbGraphicsBuffer : public QPlatformGraphicsBuffer { public: - QXcbShmGraphicsBuffer(QImage *image) + QXcbGraphicsBuffer(QImage *image) : QPlatformGraphicsBuffer(image->size(), QImage::toPixelFormat(image->format())) , m_access_lock(QPlatformGraphicsBuffer::None) , m_image(image) @@ -175,7 +175,7 @@ static inline size_t imageDataSize(const xcb_image_t *image) return static_cast(image->stride) * image->height; } -QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QImage::Format format) +QXcbBackingStoreImage::QXcbBackingStoreImage(QXcbScreen *screen, const QSize &size, uint depth, QImage::Format format) : QXcbObject(screen->connection()) , m_screen_root(screen->screen()->root) , m_segmentSize(0) @@ -196,7 +196,7 @@ QXcbShmImage::QXcbShmImage(QXcbScreen *screen, const QSize &size, uint depth, QI create(size, fmt, format); } -void QXcbShmImage::resize(const QSize &size) +void QXcbBackingStoreImage::resize(const QSize &size) { xcb_format_t fmt; fmt.depth = m_xcb_image->depth; @@ -207,7 +207,7 @@ void QXcbShmImage::resize(const QSize &size) create(size, &fmt, m_qimage.format()); } -void QXcbShmImage::create(const QSize &size, const xcb_format_t *fmt, QImage::Format format) +void QXcbBackingStoreImage::create(const QSize &size, const xcb_format_t *fmt, QImage::Format format) { m_xcb_image = xcb_image_create(size.width(), size.height(), XCB_IMAGE_FORMAT_Z_PIXMAP, @@ -232,7 +232,7 @@ void QXcbShmImage::create(const QSize &size, const xcb_format_t *fmt, QImage::Fo m_xcb_image->data = m_shm_info.shmaddr ? m_shm_info.shmaddr : (uint8_t *)malloc(segmentSize); m_qimage = QImage( (uchar*) m_xcb_image->data, m_xcb_image->width, m_xcb_image->height, m_xcb_image->stride, format); - m_graphics_buffer = new QXcbShmGraphicsBuffer(&m_qimage); + m_graphics_buffer = new QXcbGraphicsBuffer(&m_qimage); m_xcb_pixmap = xcb_generate_id(xcb_connection()); xcb_create_pixmap(xcb_connection(), @@ -242,7 +242,7 @@ void QXcbShmImage::create(const QSize &size, const xcb_format_t *fmt, QImage::Fo m_xcb_image->width, m_xcb_image->height); } -void QXcbShmImage::destroy(bool destroyShm) +void QXcbBackingStoreImage::destroy(bool destroyShm) { if (m_xcb_image->data) { if (m_shm_info.shmaddr) { @@ -268,7 +268,7 @@ void QXcbShmImage::destroy(bool destroyShm) m_xcb_pixmap = 0; } -void QXcbShmImage::flushScrolledRegion(bool clientSideScroll) +void QXcbBackingStoreImage::flushScrolledRegion(bool clientSideScroll) { if (m_clientSideScroll == clientSideScroll) return; @@ -316,7 +316,7 @@ void QXcbShmImage::flushScrolledRegion(bool clientSideScroll) } } -void QXcbShmImage::createShmSegment(size_t segmentSize) +void QXcbBackingStoreImage::createShmSegment(size_t segmentSize) { Q_ASSERT(connection()->hasShm()); Q_ASSERT(m_segmentSize == 0); @@ -400,7 +400,7 @@ void QXcbShmImage::createShmSegment(size_t segmentSize) } } -void QXcbShmImage::destroyShmSegment(size_t segmentSize) +void QXcbBackingStoreImage::destroyShmSegment(size_t segmentSize) { #ifndef XCB_USE_SHM_FD Q_UNUSED(segmentSize) @@ -433,7 +433,7 @@ void QXcbShmImage::destroyShmSegment(size_t segmentSize) extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset); -bool QXcbShmImage::scroll(const QRegion &area, int dx, int dy) +bool QXcbBackingStoreImage::scroll(const QRegion &area, int dx, int dy) { const QRect bounds(QPoint(), size()); const QRegion scrollArea(area & bounds); @@ -477,7 +477,7 @@ bool QXcbShmImage::scroll(const QRegion &area, int dx, int dy) return true; } -void QXcbShmImage::ensureGC(xcb_drawable_t dst) +void QXcbBackingStoreImage::ensureGC(xcb_drawable_t dst) { if (m_gc_drawable != dst) { if (m_gc) @@ -557,7 +557,7 @@ static inline quint32 round_up_scanline(quint32 base, quint32 pad) return (base + pad - 1) & -pad; } -void QXcbShmImage::shmPutImage(xcb_drawable_t drawable, const QRegion ®ion, const QPoint &offset) +void QXcbBackingStoreImage::shmPutImage(xcb_drawable_t drawable, const QRegion ®ion, const QPoint &offset) { for (const QRect &rect : region) { const QPoint source = rect.translated(offset).topLeft(); @@ -578,7 +578,7 @@ void QXcbShmImage::shmPutImage(xcb_drawable_t drawable, const QRegion ®ion, c m_dirtyShm |= region.translated(offset); } -void QXcbShmImage::flushPixmap(const QRegion ®ion, bool fullRegion) +void QXcbBackingStoreImage::flushPixmap(const QRegion ®ion, bool fullRegion) { if (!fullRegion) { auto actualRegion = m_pendingFlush.intersected(region); @@ -647,7 +647,7 @@ void QXcbShmImage::flushPixmap(const QRegion ®ion, bool fullRegion) } } -void QXcbShmImage::setClip(const QRegion ®ion) +void QXcbBackingStoreImage::setClip(const QRegion ®ion) { if (region.isEmpty()) { static const uint32_t mask = XCB_GC_CLIP_MASK; @@ -663,7 +663,7 @@ void QXcbShmImage::setClip(const QRegion ®ion) } } -void QXcbShmImage::put(xcb_drawable_t dst, const QRegion ®ion, const QPoint &offset) +void QXcbBackingStoreImage::put(xcb_drawable_t dst, const QRegion ®ion, const QPoint &offset) { Q_ASSERT(!m_clientSideScroll); @@ -704,7 +704,7 @@ void QXcbShmImage::put(xcb_drawable_t dst, const QRegion ®ion, const QPoint & setClip(QRegion()); } -void QXcbShmImage::preparePaint(const QRegion ®ion) +void QXcbBackingStoreImage::preparePaint(const QRegion ®ion) { if (hasShm()) { // to prevent X from reading from the image region while we're writing to it @@ -860,7 +860,7 @@ void QXcbBackingStore::resize(const QSize &size, const QRegion &) m_image->resize(size); } else { QXcbScreen *screen = static_cast(window()->screen()->handle()); - m_image = new QXcbShmImage(screen, size, win->depth(), win->imageFormat()); + m_image = new QXcbBackingStoreImage(screen, size, win->depth(), win->imageFormat()); } // Slow path for bgr888 VNC: Create an additional image, paint into that and diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.h b/src/plugins/platforms/xcb/qxcbbackingstore.h index 2e8fbfb7faf..f40030001b5 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.h +++ b/src/plugins/platforms/xcb/qxcbbackingstore.h @@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE -class QXcbShmImage; +class QXcbBackingStoreImage; class QXcbBackingStore : public QXcbObject, public QPlatformBackingStore { @@ -75,7 +75,7 @@ public: void endPaint() override; private: - QXcbShmImage *m_image; + QXcbBackingStoreImage *m_image; QStack m_paintRegions; QImage m_rgbImage; }; From 89ab15ac913de09ca46b123776dfb2cdbf84a13b Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Thu, 15 Mar 2018 17:45:02 +0100 Subject: [PATCH 16/17] xcb: various coding style cleanups in qxcbbackingstore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Pass QXcbBackingStoreImage a pointer to QXcbBackingStore. This allow for simpler QXcbBackingStoreImage ctor. - Use member initializers. Change-Id: Ia992390060bb30e1184813cd0d115a8bf0fbc237 Reviewed-by: Błażej Szczygieł Reviewed-by: Laszlo Agocs --- .../platforms/xcb/qxcbbackingstore.cpp | 66 +++++++++---------- src/plugins/platforms/xcb/qxcbbackingstore.h | 2 +- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp index 6efdb2d8344..659d1c53cb0 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp +++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp @@ -70,10 +70,12 @@ QT_BEGIN_NAMESPACE +class QXcbBackingStore; + class QXcbBackingStoreImage : public QXcbObject { public: - QXcbBackingStoreImage(QXcbScreen *connection, const QSize &size, uint depth, QImage::Format format); + QXcbBackingStoreImage(QXcbBackingStore *backingStore, const QSize &size); ~QXcbBackingStoreImage() { destroy(true); } void resize(const QSize &size); @@ -105,25 +107,24 @@ private: void flushPixmap(const QRegion ®ion, bool fullRegion = false); void setClip(const QRegion ®ion); - xcb_window_t m_screen_root; - xcb_shm_segment_info_t m_shm_info; - size_t m_segmentSize; + QXcbBackingStore *m_backingStore = nullptr; + size_t m_segmentSize = 0; - xcb_image_t *m_xcb_image; + xcb_image_t *m_xcb_image = nullptr; QImage m_qimage; - QPlatformGraphicsBuffer *m_graphics_buffer; + QPlatformGraphicsBuffer *m_graphics_buffer = nullptr; - xcb_gcontext_t m_gc; - xcb_drawable_t m_gc_drawable; + xcb_gcontext_t m_gc = 0; + xcb_drawable_t m_gc_drawable = 0; // When using shared memory these variables are used only for server-side scrolling. // When not using shared memory, we maintain a server-side pixmap with the backing // store as well as repainted content not yet flushed to the pixmap. We only flush // the regions we need and only when these are marked dirty. This way we can just // do a server-side copy on expose instead of sending the pixels every time - xcb_pixmap_t m_xcb_pixmap; + xcb_pixmap_t m_xcb_pixmap = 0; QRegion m_pendingFlush; // This is the scrolled region which is stored in server-side pixmap @@ -136,8 +137,8 @@ private: // as a pixmap region to server QByteArray m_flushBuffer; - bool m_hasAlpha; - bool m_clientSideScroll; + bool m_hasAlpha = false; + bool m_clientSideScroll = false; }; class QXcbGraphicsBuffer : public QPlatformGraphicsBuffer @@ -145,7 +146,6 @@ class QXcbGraphicsBuffer : public QPlatformGraphicsBuffer public: QXcbGraphicsBuffer(QImage *image) : QPlatformGraphicsBuffer(image->size(), QImage::toPixelFormat(image->format())) - , m_access_lock(QPlatformGraphicsBuffer::None) , m_image(image) { } @@ -165,9 +165,10 @@ public: int bytesPerLine() const override { return m_image->bytesPerLine(); } Origin origin() const override { return QPlatformGraphicsBuffer::OriginTopLeft; } + private: - AccessTypes m_access_lock; - QImage *m_image; + AccessTypes m_access_lock = QPlatformGraphicsBuffer::None; + QImage *m_image = nullptr; }; static inline size_t imageDataSize(const xcb_image_t *image) @@ -175,25 +176,22 @@ static inline size_t imageDataSize(const xcb_image_t *image) return static_cast(image->stride) * image->height; } -QXcbBackingStoreImage::QXcbBackingStoreImage(QXcbScreen *screen, const QSize &size, uint depth, QImage::Format format) - : QXcbObject(screen->connection()) - , m_screen_root(screen->screen()->root) - , m_segmentSize(0) - , m_graphics_buffer(nullptr) - , m_gc(0) - , m_gc_drawable(0) - , m_xcb_pixmap(0) - , m_clientSideScroll(false) +QXcbBackingStoreImage::QXcbBackingStoreImage(QXcbBackingStore *backingStore, const QSize &size) + : QXcbObject(backingStore->connection()) + , m_backingStore(backingStore) { - const xcb_format_t *fmt = connection()->formatForDepth(depth); + QXcbWindow *window = static_cast(backingStore->window()->handle()); + const xcb_format_t *fmt = connection()->formatForDepth(window->depth()); Q_ASSERT(fmt); + memset(&m_shm_info, 0, sizeof m_shm_info); + + QImage::Format format = window->imageFormat(); m_hasAlpha = QImage::toPixelFormat(format).alphaUsage() == QPixelFormat::UsesAlpha; if (!m_hasAlpha) - format = qt_maybeAlphaVersionWithSameDepth(format); - - memset(&m_shm_info, 0, sizeof m_shm_info); - create(size, fmt, format); + create(size, fmt, qt_maybeAlphaVersionWithSameDepth(format)); + else + create(size, fmt, format); } void QXcbBackingStoreImage::resize(const QSize &size) @@ -235,10 +233,11 @@ void QXcbBackingStoreImage::create(const QSize &size, const xcb_format_t *fmt, Q m_graphics_buffer = new QXcbGraphicsBuffer(&m_qimage); m_xcb_pixmap = xcb_generate_id(xcb_connection()); + auto xcbScreen = static_cast(m_backingStore->window()->screen()->handle()); xcb_create_pixmap(xcb_connection(), m_xcb_image->depth, m_xcb_pixmap, - m_screen_root, + xcbScreen->root(), m_xcb_image->width, m_xcb_image->height); } @@ -719,7 +718,6 @@ void QXcbBackingStoreImage::preparePaint(const QRegion ®ion) QXcbBackingStore::QXcbBackingStore(QWindow *window) : QPlatformBackingStore(window) - , m_image(0) { QXcbScreen *screen = static_cast(window->screen()->handle()); setConnection(screen->connection()); @@ -856,12 +854,10 @@ void QXcbBackingStore::resize(const QSize &size, const QRegion &) } QXcbWindow* win = static_cast(pw); - if (m_image) { + if (m_image) m_image->resize(size); - } else { - QXcbScreen *screen = static_cast(window()->screen()->handle()); - m_image = new QXcbBackingStoreImage(screen, size, win->depth(), win->imageFormat()); - } + else + m_image = new QXcbBackingStoreImage(this, size); // Slow path for bgr888 VNC: Create an additional image, paint into that and // swap R and B while copying to m_image after each paint. diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.h b/src/plugins/platforms/xcb/qxcbbackingstore.h index f40030001b5..747626c2130 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.h +++ b/src/plugins/platforms/xcb/qxcbbackingstore.h @@ -75,7 +75,7 @@ public: void endPaint() override; private: - QXcbBackingStoreImage *m_image; + QXcbBackingStoreImage *m_image = nullptr; QStack m_paintRegions; QImage m_rgbImage; }; From 3b85d53913741660473dbc242a48c2ee65d51421 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Thu, 29 Mar 2018 17:12:36 -0700 Subject: [PATCH 17/17] macx-clang: Update informal documentation for xcb build Remove references to XKB and explain what to do if pkg-config is missing or unwanted. Change-Id: I099bf01ff49e1b8f6e822a50f0fe4904965a7a9f Reviewed-by: Gatis Paeglis Reviewed-by: Oswald Buddenhagen --- mkspecs/macx-clang/qmake.conf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mkspecs/macx-clang/qmake.conf b/mkspecs/macx-clang/qmake.conf index 170464d08fc..14c885fd785 100644 --- a/mkspecs/macx-clang/qmake.conf +++ b/mkspecs/macx-clang/qmake.conf @@ -11,13 +11,16 @@ QMAKE_APPLE_DEVICE_ARCHS = x86_64 # configure \ # -pkg-config \ # -fontconfig -system-freetype \ -# -system-xcb -xkb -no-opengl \ -# -qt-xkbcommon -qt-xkbcommon-x11 +# -system-xcb -no-opengl # # Ensure that pkg-config is properly configured, or that # PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig:/opt/X11/share/pkgconfig # is set in your build environment. # +# If you don't want to use pkg-config, you can add: +# -L/opt/X11/lib -I/opt/X11/include +# to the configure options. +# # Due to irreconcilable differences between Cocoa # and X11, OpenGL is currently not supported.