From 7de95ede1bc542c329bf1d23633615693a04d14e Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 2 Jul 2014 17:52:06 +0200 Subject: [PATCH] Windows: Add non-standard mouse cursors Windows does not provide SplitVCursor, SplitHCursor, OpenHandCursor, ClosedHandCursor, DragCopyCursor, DragMoveCursor, DragLinkCursor. This change adds those mouse cursors mimicking the look of the standard Aero cursors. 32px, 48px and 64px for each one. For WinCE or if Qt is configured without png support, the behavior should not be changed by this patch. Task-number: QTBUG-38993 Change-Id: Ic0f739d7c5031168b7d105b4d41271a9359d0728 Reviewed-by: Friedemann Kleint --- src/plugins/platforms/windows/cursors.qrc | 25 ++++ .../windows/images/closedhandcursor_32.png | Bin 0 -> 278 bytes .../windows/images/closedhandcursor_48.png | Bin 0 -> 350 bytes .../windows/images/closedhandcursor_64.png | Bin 0 -> 418 bytes .../windows/images/dragcopycursor_32.png | Bin 0 -> 300 bytes .../windows/images/dragcopycursor_48.png | Bin 0 -> 376 bytes .../windows/images/dragcopycursor_64.png | Bin 0 -> 444 bytes .../windows/images/draglinkcursor_32.png | Bin 0 -> 345 bytes .../windows/images/draglinkcursor_48.png | Bin 0 -> 394 bytes .../windows/images/draglinkcursor_64.png | Bin 0 -> 470 bytes .../windows/images/dragmovecursor_32.png | Bin 0 -> 322 bytes .../windows/images/dragmovecursor_48.png | Bin 0 -> 390 bytes .../windows/images/dragmovecursor_64.png | Bin 0 -> 463 bytes .../windows/images/openhandcursor_32.png | Bin 0 -> 315 bytes .../windows/images/openhandcursor_48.png | Bin 0 -> 363 bytes .../windows/images/openhandcursor_64.png | Bin 0 -> 452 bytes .../windows/images/splithcursor_32.png | Bin 0 -> 178 bytes .../windows/images/splithcursor_48.png | Bin 0 -> 210 bytes .../windows/images/splithcursor_64.png | Bin 0 -> 243 bytes .../windows/images/splitvcursor_32.png | Bin 0 -> 187 bytes .../windows/images/splitvcursor_48.png | Bin 0 -> 212 bytes .../windows/images/splitvcursor_64.png | Bin 0 -> 211 bytes .../platforms/windows/qwindowscursor.cpp | 136 ++++++++++++++---- .../platforms/windows/qwindowscursor.h | 1 + src/plugins/platforms/windows/windows.pri | 4 + 25 files changed, 136 insertions(+), 30 deletions(-) create mode 100644 src/plugins/platforms/windows/cursors.qrc create mode 100644 src/plugins/platforms/windows/images/closedhandcursor_32.png create mode 100644 src/plugins/platforms/windows/images/closedhandcursor_48.png create mode 100644 src/plugins/platforms/windows/images/closedhandcursor_64.png create mode 100644 src/plugins/platforms/windows/images/dragcopycursor_32.png create mode 100644 src/plugins/platforms/windows/images/dragcopycursor_48.png create mode 100644 src/plugins/platforms/windows/images/dragcopycursor_64.png create mode 100644 src/plugins/platforms/windows/images/draglinkcursor_32.png create mode 100644 src/plugins/platforms/windows/images/draglinkcursor_48.png create mode 100644 src/plugins/platforms/windows/images/draglinkcursor_64.png create mode 100644 src/plugins/platforms/windows/images/dragmovecursor_32.png create mode 100644 src/plugins/platforms/windows/images/dragmovecursor_48.png create mode 100644 src/plugins/platforms/windows/images/dragmovecursor_64.png create mode 100644 src/plugins/platforms/windows/images/openhandcursor_32.png create mode 100644 src/plugins/platforms/windows/images/openhandcursor_48.png create mode 100644 src/plugins/platforms/windows/images/openhandcursor_64.png create mode 100644 src/plugins/platforms/windows/images/splithcursor_32.png create mode 100644 src/plugins/platforms/windows/images/splithcursor_48.png create mode 100644 src/plugins/platforms/windows/images/splithcursor_64.png create mode 100644 src/plugins/platforms/windows/images/splitvcursor_32.png create mode 100644 src/plugins/platforms/windows/images/splitvcursor_48.png create mode 100644 src/plugins/platforms/windows/images/splitvcursor_64.png diff --git a/src/plugins/platforms/windows/cursors.qrc b/src/plugins/platforms/windows/cursors.qrc new file mode 100644 index 0000000000..fded527aac --- /dev/null +++ b/src/plugins/platforms/windows/cursors.qrc @@ -0,0 +1,25 @@ + + + images/closedhandcursor_32.png + images/closedhandcursor_48.png + images/closedhandcursor_64.png + images/dragcopycursor_32.png + images/dragcopycursor_48.png + images/dragcopycursor_64.png + images/draglinkcursor_32.png + images/draglinkcursor_48.png + images/draglinkcursor_64.png + images/dragmovecursor_32.png + images/dragmovecursor_48.png + images/dragmovecursor_64.png + images/openhandcursor_32.png + images/openhandcursor_48.png + images/openhandcursor_64.png + images/splithcursor_32.png + images/splithcursor_48.png + images/splithcursor_64.png + images/splitvcursor_32.png + images/splitvcursor_48.png + images/splitvcursor_64.png + + diff --git a/src/plugins/platforms/windows/images/closedhandcursor_32.png b/src/plugins/platforms/windows/images/closedhandcursor_32.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3cba19657edf5ee220dc05c9746acd28074abd GIT binary patch literal 278 zcmV+x0qOpUP)kdg0002pNkl#a?o3pF4PFWLL$WmWT!KFk@Ep#aU z53~KBj|BcKTilFs#)Fb^uOrC{fQkw$gz?MKQ5tiz&jcLCnNE#Su^O08ud~}D@>?oQ zKyJ53P+qXnrMEdecm8pIN+mM9uSQglz#C|Nt((9(WJ(32c-#UtluqG+| cDqFTZ0sRh9IXE7X0{{R307*qoM6N<$f_gG>t^fc4 literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/closedhandcursor_48.png b/src/plugins/platforms/windows/images/closedhandcursor_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e63031605eb0c7f801dba276fe7c848a521bb859 GIT binary patch literal 350 zcmV-k0iphhP)rI_w+lj+lZk)9&JtzulhG)2S&SC77G}Lp(mvf}_L@$Ct(T w7hcf0W*e(c=x)lh5!Hn07*qoM6N<$f&xgJ;Q#;t literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/closedhandcursor_64.png b/src/plugins/platforms/windows/images/closedhandcursor_64.png new file mode 100644 index 0000000000000000000000000000000000000000..438680ed4e758e5422e444b0e562fbc88f4bf12c GIT binary patch literal 418 zcmV;T0bTxyP)sWEEj3h??CpODTMU~aJa4-_z0!*8q|!z0WU2rG*h z5sV!Xp2-rKbOTJuPHf4Rs60Giq=nbhimZ_v!;_GzAS0WC%;XNZV0ojMtcsVn0sg}3*ldzMgZk9U%=>GMC{JypxwVoy#T)fyX zZ?Zc)a@1&1;PBYplWu(_Nt0QLZIDH!-v|{}K_<2&>Azu&F~%5U9|0nv?0Vycg#Z8m M07*qoM6N<$f|m8a6aWAK literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/dragcopycursor_32.png b/src/plugins/platforms/windows/images/dragcopycursor_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f40ac6a600dfb4000a82017b3fecadb78e196664 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy9sxcfu0WcBON4<{lz~;8nOQ_o zP?m{Fh>=l{kx_t=k)HvC_!t=Yc=@FM|NsBx%XgsiYu9c(eE9gqi&q~$eBQie&ySzK z4;?yrZBsVLOumvJzhDL_Lv!Emd0X~gxc>ah=jESXfoy5@ba4!+h}(PNtk59?4u(XN zYnPJDa{pHUH#hBzYjk%1e#$(hBVwY(WfzG~1EEBfLmn*?IUZ{ZeYhaRoEMdJAk>@Z z#uZlHEzg_Eb}m-`-&Lk5eEUh0-Sm$qU#z`gH{EEnpOERgBM%Jb_ix(2uujS*K$>Cg rE{2E(+l0#F{PPOdb^Lp{e=mcF7}x44thLL44r1_h^>bP0l+XkKgDZ1S literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/dragcopycursor_48.png b/src/plugins/platforms/windows/images/dragcopycursor_48.png new file mode 100644 index 0000000000000000000000000000000000000000..21ee467f468a20ee61b490cca9a8b8a4dd9b1c82 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-r0X`wFK$?L|gn?CzffYy!Gq8v; zFpDrS3yF#Ji`0wH7|FKQ|+)=*Io5Eku(|mHpT2C}c!(*XB zYm*2U5~Hq(CD4X>(*p*xk1_`|<}u$mYOKJ`b)=$$)rZsL9MiJjlMY<{wd3VGYliA{ z=9l+OwHuC^Ec{sgzJ~vSfp16HNz?Z>iSMp3-@as7{q|SQo^vcKZrwgQHA1#6W<{<- x&xziHY-|iOCQF=REbfcbU=XNRu#5HkZzo?aS<%|WnF{m(gQu&X%Q~loCIDt5i%I|h literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/dragcopycursor_64.png b/src/plugins/platforms/windows/images/dragcopycursor_64.png new file mode 100644 index 0000000000000000000000000000000000000000..c49bcf33aa6b27bb4a4b52d9844fb62ca33c2759 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!5(0ceT!Az$z{VzwOA08?$1g1+ zs`&r^|4*Mjty#0?!i5V?PEHva8QtC8wY9ZBe*8Fe_}HUIkJf1HjRL9`EeY}qX5bVM zQ`XYA@$@g9ymtGIhaZ0a`*P3RGGi`K!8cDA$B>G+x0lc69WoGbO=Mo!q7qO%cXIrK z_y4D@OqC*2U;#fz zo0e`@AO+>yw;p1sV1Y_muzuWKV8A$eU$=H+G`qrQ!`eN^r48hG9PWvK<@wUfc;a_} z3d7rL%$4$oR#z5JilYo#07$y<5XnLW%e$+;X=l{kx_t=k)HvC_!t=Yc=@FG1!VsJ|NrI7cL_<=hYufLyLQ9S$nNFKSD!w8 zF)?*Gbm)Yxo~50=robl&>Oi3!_+<*#V!6Y#K|L7*{M~lAO0-^1f!Cjm|Ga0^TpY zdm&4I#XaXYhGhp=$tE^C*W0z-&%PA5xKU+=<0P(Av$8KRo_f;o^i_lVK3}yR&)2SD mn@~P4P({)@=9}!l+wAY|aqn9dG4~}Xj67ZaT-G@yGywpnXNL#? literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/draglinkcursor_48.png b/src/plugins/platforms/windows/images/draglinkcursor_48.png new file mode 100644 index 0000000000000000000000000000000000000000..51205101b1b2bd4df61d9faccf4c62e76883568e GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-r0X`wFK$?L=lz~;4fmuXURFQ#^ zkAVS*c##n=pA^4HuvyUD>d-dw|hYz2= zeEI(K=kNdj|KGlS_u|E?2M!$h|CY57Xa!$MkY6x^ig{4gmTh}4U4Q=N^ShfL9jt*e zr#)R9Ln`9lUh(B?HsEo2c*TL4Ehy^W$t`#OPZRybYO`DK*R`Kdj(TuvHF_&+iYy73 z;N-}~ieT`}P;l%!#2_qlK(3Yf#-aj-Y!S8@3mne9f5CX1bC>m=l#D}%kNy1l)5F8Nf5OBI7cSK5ewzx^ zDO3{V7tFvTrmSV;>0df|?e_a0e*XJ>&r0&NDFXweu&0Y-NJZS+%ct`W8Hl(BIxDbr z>^xa^Z_mH~`rRE1g06bLn;D{2T{kV|G~YJfsAXJcx7?ToSe-?90u5XaA~7CETU4^Z zg&!}UV9DT$P*EpdByMnX_YQ#_Jq*wO`8Z4JJ8Umya-R8C_=3F5fj#_@%n8}-AMUgl zylLE4!0_4bNq9of>Z1qt)Q8+_Tp7W$=i9;=4b?kEEcUF=6?K0wi@p4}bbi z>ZsqX$@h=div4-IF@k+%=nv_)uU>`j{mk%nX87}4%pntIS!$^}1TjwH+M;C8>26`} zdtIGz#;m-CB@CPjI~%v{{J5rQ-;vW>rJqe-@xS%|#pV9-eX%+!QpOe$pkViO^>bP0 Hl+XkKOwF(f literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/dragmovecursor_32.png b/src/plugins/platforms/windows/images/dragmovecursor_32.png new file mode 100644 index 0000000000000000000000000000000000000000..32781a15ff9b62978227904338a49cd1cd4fb10c GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyApt%iu0WcBON4<{lz~;8nOQ_o zP?m{Fh>=l{kx_t=k)HvC_!t=Yc=@FM|NsBx%XbM$)srXBT)TGT;lsyz`j&kBGEbg7 zeevSehYz0*9Xk2#`;X0A_RLwk;}XzVzLFrnUBPqLS^KiU5=&p)$2rGeR@-*$yM6m^ zQfkr4)f*)wRs90u9zS_@=+H?9|F-vtaz*93Pn=u0+h7R6L4E=GvDyWfd!wtui4#bJfkJB;1J)u{W^m88ul~(Q{BP7=cV!U Z`TBbrBqo_1o)!%XP)}Dsmvv4FO#sr>meT+L literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/dragmovecursor_64.png b/src/plugins/platforms/windows/images/dragmovecursor_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e4ece29f33a4eba4ba356a8baaf07f57390a6e GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!5(0ceT!AziU}F=9Cr>gmGV~2B-QC@_b1evkFb+s!( zxSne!V*m?W#fNf5b4KlbT-J?g2|UlvZwXnbSZOcSxb)Pye3j*wn3n84op$U2ufr|t z@|hlet&BhJ?EZ5wqxJ8B<94B6RjwzQZ+IKKanhSrdmUbypK5P>qFny$l5g2kS&K7I z4C402?(j*rNIw@R$Myc7%kp2_Lg(u^+$~zYR`-Bz?sSzqXB_^&F=+@E5mDewTQD>D z`!TK!om4q`mC+{o&5B+~}b#?g;EzLYvYbH=cF?hQAxvXkdg00033NklikRwE*Pa5bQC9;%gJ!@7V3m~%N zI6BYQjj1f12kA=T2Q2Gs!d)sSdD9-)&D3N?wV0OZlgAB zj}U?F5%+-to8V*;aNt&u(?hxiA3xY)yE;N@1h2RS3w0qynPxIjkQCp)WH?aV2MHj> zwzL}u2w=YdY-kX56FAn`bu_?<@C;5kp0j}yX4<@v2Pu>9Z}8R4_r4!mdwR0~lfc1` z*>>HO4}y}`&1?%6w}Q!Cms3p_%1!x&vh{u8OOX_D&ty_8g>U(Zi9cJ_`S7*r@K^u< N002ovPDHLkV1ky4f<^!U literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/openhandcursor_48.png b/src/plugins/platforms/windows/images/openhandcursor_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e8beb8d29d3abd0f329ad3160137a23c2ea5bf49 GIT binary patch literal 363 zcmV-x0hIoUP)dlIb4g8I zM+Ip%)luyeP)D^>K+XRXFaZ-NXLEhPro_5ZpaNg44e%}=&rdGAniA~+_5XaK02kJE zhk%=3gxs!0IPMUj!0Ag!1I|x<0VN5?7Zm*gIzG|~%P@cmS|#9Jfn^PNM=M2KG+0u? zt7$Fk8jb^gODC4mdTt&seC%-C_NuUtk6+jH_Lgsoof0LSo=&ux?N{;G%&zC{?ex0d zr#8!&xQGHR1~e#f5lpzb++LS}Wq#%KOz_UHSVjSDU>JsB7=O?umK8>J0mT3S002ov JPDHLkV1fc*nN0uy literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/openhandcursor_64.png b/src/plugins/platforms/windows/images/openhandcursor_64.png new file mode 100644 index 0000000000000000000000000000000000000000..d12e3a7283b76d22f4001c30c0e71d95fcefca73 GIT binary patch literal 452 zcmV;#0XzPQP)410P>>KB!Ku4L7wmf265ER*r52c_Z>qfHsi<6NI2-i`lG}Tb;x?qX15G- zt)mPZSm+w$dfDvfurNJHj)X%5T1AAnxK=4Nz5sQQ=ambfH;6&MpjeaegUJ*W@Ev}> zy$)|4pUtd>@9}ebt0cbAVluHBzHG<(Wa^#*2FzwULJB7MIpN7viWV<8;8B($n+XpJ uFe(iS)_a1EVM7mou6Os2<2a7vILEakt5tppMXP~LMkki64Q0>497O{k&7ETV!X4V;V zSr%}GEMU?LP<7Jt^YZcoVjx>f&*8xnCMGTktqW%lY+$`BD^ks8e58$$fnlws(Ed+a RIp!eCJzf1=);T3K0RZX%Fem^3 literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/splithcursor_48.png b/src/plugins/platforms/windows/images/splithcursor_48.png new file mode 100644 index 0000000000000000000000000000000000000000..bf59b9cdcae5747399466d9bad4b462f25f854ef GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)I_yc@GT!AzLt2iU008ruo|Npms zSl$E_VJ->s3uZ9idw=2T+dyuTP>KuLvoBngKxvuE^ zk>7No|HA3Vt8+6xC+@P@R$0a9XN385P3|jvWv!V`b!UY=~pD7y7GqM`O#?4;wBN9&T(@Zg1blRKxqv b-qh53T2gi9N43}4Ag6n}`njxgN@xNAnpRb` literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/splitvcursor_32.png b/src/plugins/platforms/windows/images/splitvcursor_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb55ae2e13b31139fba4ed2ad669fe3eb8e5642 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4S0K&6D$d9#095$@|NpHY zmNx-Km`j5Ef*H*B-e0)-Hjo?P>Eakt5tq!stjNeFa$v=x4lRWzk5n2~9XQJB$~n2a zyIZ)cVPn@OL1wOizyt+X2TqO<2Ns`zqpVyBOkM^JE13@S6y0fjDeiMWsf|6YBe6|W d=L)+m1A|bR;AEZ)2E8Cxc)I$ztaD0e0szr>He&z) literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/splitvcursor_48.png b/src/plugins/platforms/windows/images/splitvcursor_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5408920652838004b073009b07d62f9771a05ddb GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s`~f~8u0WcBRh*Gg0I2Z)|NmP* zEN=peFqZ`R1v8lMy}xkvZ6LSM)5S5QBJS-JN3H`3JS>yf{;w~-{Y7YrE*}SDi64_S z!ciiDvr)lJX?F%S{^^zHm|vNp~;?r0Hu~Qzpv!0an|49 zxe{2K`H$~wJ?DGodlvgHA8@ceJiDh{H81(j_q^^+H|NM&u=)y|biNOAo~Nsy%Q~lo FCIDAtO~?QM literal 0 HcmV?d00001 diff --git a/src/plugins/platforms/windows/images/splitvcursor_64.png b/src/plugins/platforms/windows/images/splitvcursor_64.png new file mode 100644 index 0000000000000000000000000000000000000000..7f09a40c01d8d8e21f4d4296571f6d7aa29abb73 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_7US)MMAAr*0NXI$iLFc4wh9LD}C zsqazJM*B}+R*Q78Pdd$D=`uxJ_o1M`d}X5udkxkl`$Q&Gxh#Ao*t*JHWR+at3J}M! z)w%AO+k2T`ZPO3bRWx$AEI7USPR6`-se6PYPrEEQDSg?c*`D!_YzMgetPixmapCursor(cursorShape), 0, 0); + } + + return QCursor(); +} +#else // Q_OS_WINCE || QT_NO_IMAGEFORMAT_PNG +struct QWindowsCustomPngCursor { + Qt::CursorShape shape; + int size; + const char *fileName; + int hotSpotX; + int hotSpotY; +}; + +QCursor QWindowsCursor::customCursor(Qt::CursorShape cursorShape) +{ + static const QWindowsCustomPngCursor pngCursors[] = { + { Qt::SplitVCursor, 32, "splitvcursor_32.png", 11, 11 }, + { Qt::SplitVCursor, 48, "splitvcursor_48.png", 16, 17 }, + { Qt::SplitVCursor, 64, "splitvcursor_64.png", 22, 22 }, + { Qt::SplitHCursor, 32, "splithcursor_32.png", 11, 11 }, + { Qt::SplitHCursor, 48, "splithcursor_48.png", 16, 17 }, + { Qt::SplitHCursor, 64, "splithcursor_64.png", 22, 22 }, + { Qt::OpenHandCursor, 32, "openhandcursor_32.png", 10, 12 }, + { Qt::OpenHandCursor, 48, "openhandcursor_48.png", 15, 16 }, + { Qt::OpenHandCursor, 64, "openhandcursor_64.png", 20, 24 }, + { Qt::ClosedHandCursor, 32, "closedhandcursor_32.png", 10, 12 }, + { Qt::ClosedHandCursor, 48, "closedhandcursor_48.png", 15, 16 }, + { Qt::ClosedHandCursor, 64, "closedhandcursor_64.png", 20, 24 }, + { Qt::DragCopyCursor, 32, "dragcopycursor_32.png", 0, 0 }, + { Qt::DragCopyCursor, 48, "dragcopycursor_48.png", 0, 0 }, + { Qt::DragCopyCursor, 64, "dragcopycursor_64.png", 0, 0 }, + { Qt::DragMoveCursor, 32, "dragmovecursor_32.png", 0, 0 }, + { Qt::DragMoveCursor, 48, "dragmovecursor_48.png", 0, 0 }, + { Qt::DragMoveCursor, 64, "dragmovecursor_64.png", 0, 0 }, + { Qt::DragLinkCursor, 32, "draglinkcursor_32.png", 0, 0 }, + { Qt::DragLinkCursor, 48, "draglinkcursor_48.png", 0, 0 }, + { Qt::DragLinkCursor, 64, "draglinkcursor_64.png", 0, 0 } + }; + + const int cursorSize = GetSystemMetrics(SM_CXCURSOR); + const QWindowsCustomPngCursor *sEnd = pngCursors + sizeof(pngCursors) / sizeof(pngCursors[0]); + const QWindowsCustomPngCursor *bestFit = 0; + int sizeDelta = INT_MAX; + for (const QWindowsCustomPngCursor *s = pngCursors; s < sEnd; ++s) { + if (s->shape != cursorShape) + continue; + const int currentSizeDelta = qMax(s->size, cursorSize) - qMin(s->size, cursorSize); + if (currentSizeDelta < sizeDelta) { + bestFit = s; + if (currentSizeDelta == 0) + break; // Perfect match found + sizeDelta = currentSizeDelta; + } + } + + if (!bestFit) + return QCursor(); + + const QPixmap rawImage(QStringLiteral(":/qt-project.org/windows/cursors/images/") + + QString::fromLatin1(bestFit->fileName)); + return QCursor(rawImage, bestFit->hotSpotX, bestFit->hotSpotY); +} +#endif // Q_OS_WINCE || QT_NO_IMAGEFORMAT_PNG + +struct QWindowsStandardCursorMapping { + Qt::CursorShape shape; + LPCWSTR resource; +}; + +HCURSOR QWindowsCursor::createSystemCursor(const QCursor &c) +{ + static const QWindowsStandardCursorMapping standardCursors[] = { + { Qt::ArrowCursor, IDC_ARROW}, + { Qt::UpArrowCursor, IDC_UPARROW }, + { Qt::CrossCursor, IDC_CROSS }, + { Qt::WaitCursor, IDC_WAIT }, + { Qt::IBeamCursor, IDC_IBEAM }, + { Qt::SizeVerCursor, IDC_SIZENS }, + { Qt::SizeHorCursor, IDC_SIZEWE }, + { Qt::SizeBDiagCursor, IDC_SIZENESW }, + { Qt::SizeFDiagCursor, IDC_SIZENWSE }, + { Qt::SizeAllCursor, IDC_SIZEALL }, + { Qt::ForbiddenCursor, IDC_NO }, + { Qt::WhatsThisCursor, IDC_HELP }, + { Qt::BusyCursor, IDC_APPSTARTING }, + { Qt::PointingHandCursor, IDC_HAND } + }; + const Qt::CursorShape cursorShape = c.shape(); switch (cursorShape) { case Qt::BitmapCursor: { @@ -342,17 +422,13 @@ HCURSOR QWindowsCursor::createSystemCursor(const QCursor &c) return createBitmapCursor(blank, blank); } case Qt::SplitVCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 32, vsplit_bits, vsplitm_bits); case Qt::SplitHCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 32, hsplit_bits, hsplitm_bits); case Qt::OpenHandCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 16, openhand_bits, openhandm_bits); case Qt::ClosedHandCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 16, closedhand_bits, closedhandm_bits); case Qt::DragCopyCursor: case Qt::DragMoveCursor: case Qt::DragLinkCursor: - return createPixmapCursor(QGuiApplicationPrivate::instance()->getPixmapCursor(cursorShape), c.hotSpot()); + return createSystemCursor(customCursor(cursorShape)); default: break; } diff --git a/src/plugins/platforms/windows/qwindowscursor.h b/src/plugins/platforms/windows/qwindowscursor.h index 81ae051824..bf2021cd9d 100644 --- a/src/plugins/platforms/windows/qwindowscursor.h +++ b/src/plugins/platforms/windows/qwindowscursor.h @@ -107,6 +107,7 @@ public: static HCURSOR createPixmapCursor(const QPixmap &pixmap, const QPoint &hotSpot); static HCURSOR createSystemCursor(const QCursor &c); + static QCursor customCursor(Qt::CursorShape cursorShape); static QPoint mousePosition(); static CursorState cursorState(); diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri index fec9af2645..104d882fba 100644 --- a/src/plugins/platforms/windows/windows.pri +++ b/src/plugins/platforms/windows/windows.pri @@ -113,6 +113,10 @@ contains(QT_CONFIG,dynamicgl) { HEADERS += $$PWD/qwindowssessionmanager.h } +!wince*:!contains( DEFINES, QT_NO_IMAGEFORMAT_PNG ) { + RESOURCES += $$PWD/cursors.qrc +} + contains(QT_CONFIG, freetype) { DEFINES *= QT_NO_FONTCONFIG QT_FREETYPE_DIR = $$QT_SOURCE_TREE/src/3rdparty/freetype