From 5a3442bf9c470736c8846534607be5825c22410b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 6 Aug 2012 22:26:13 -0400 Subject: [PATCH] Improve GtkMenuButton menu positioning Take the menu halign/valign into consideration when positioning the menu. Also, document the various combinations. https://bugzilla.gnome.org/show_bug.cgi?id=680988 --- docs/reference/gtk/Makefile.am | 14 +- docs/reference/gtk/images/down-center.png | Bin 0 -> 2194 bytes docs/reference/gtk/images/down-end.png | Bin 0 -> 2170 bytes docs/reference/gtk/images/down-start.png | Bin 0 -> 2177 bytes docs/reference/gtk/images/left-center.png | Bin 0 -> 2234 bytes docs/reference/gtk/images/left-end.png | Bin 0 -> 2196 bytes docs/reference/gtk/images/left-start.png | Bin 0 -> 2099 bytes docs/reference/gtk/images/right-center.png | Bin 0 -> 2250 bytes docs/reference/gtk/images/right-end.png | Bin 0 -> 2241 bytes docs/reference/gtk/images/right-start.png | Bin 0 -> 2110 bytes docs/reference/gtk/images/up-center.png | Bin 0 -> 2171 bytes docs/reference/gtk/images/up-end.png | Bin 0 -> 2123 bytes docs/reference/gtk/images/up-start.png | Bin 0 -> 2148 bytes gtk/gtkmenubutton.c | 248 ++++++++++++++------- 14 files changed, 178 insertions(+), 84 deletions(-) create mode 100644 docs/reference/gtk/images/down-center.png create mode 100644 docs/reference/gtk/images/down-end.png create mode 100644 docs/reference/gtk/images/down-start.png create mode 100644 docs/reference/gtk/images/left-center.png create mode 100644 docs/reference/gtk/images/left-end.png create mode 100644 docs/reference/gtk/images/left-start.png create mode 100644 docs/reference/gtk/images/right-center.png create mode 100644 docs/reference/gtk/images/right-end.png create mode 100644 docs/reference/gtk/images/right-start.png create mode 100644 docs/reference/gtk/images/up-center.png create mode 100644 docs/reference/gtk/images/up-end.png create mode 100644 docs/reference/gtk/images/up-start.png diff --git a/docs/reference/gtk/Makefile.am b/docs/reference/gtk/Makefile.am index 0d86b6a2fd..34bcf02d1a 100644 --- a/docs/reference/gtk/Makefile.am +++ b/docs/reference/gtk/Makefile.am @@ -382,7 +382,19 @@ HTML_IMAGES = \ $(srcdir)/images/numerableicon2.png \ $(srcdir)/images/bloatpad-osx.png \ $(srcdir)/images/bloatpad-gnome.png \ - $(srcdir)/images/bloatpad-xfce.png + $(srcdir)/images/bloatpad-xfce.png \ + $(srcdir)/images/down-center.png \ + $(srcdir)/images/down-end.png \ + $(srcdir)/images/down-start.png \ + $(srcdir)/images/left-center.png \ + $(srcdir)/images/left-end.png \ + $(srcdir)/images/left-start.png \ + $(srcdir)/images/right-center.png \ + $(srcdir)/images/right-end.png \ + $(srcdir)/images/right-start.png \ + $(srcdir)/images/up-center.png \ + $(srcdir)/images/up-end.png \ + $(srcdir)/images/up-start.png # Extra options to supply to gtkdoc-fixref FIXXREF_OPTIONS=--extra-dir=../gdk/html \ diff --git a/docs/reference/gtk/images/down-center.png b/docs/reference/gtk/images/down-center.png new file mode 100644 index 0000000000000000000000000000000000000000..c42ccbe01fe4c0f6ecbcd92f73577b1edc9927ed GIT binary patch literal 2194 zcmZuzdpHw%ALk%*ccP1H9HbDnio#kX-vm+Eq$2G+qeVpIU;ZdjoT0p$kd%zEzj{S-8XzeuFDX&SC>By0 zw-6pNkchA_RCtUKiikj>P<}C}K&|*&F~4fr+FykS8lxmdL;wJL8!NZvft`T~__fKCl3YincHa>n!5;!1_zvFdaCI}h#O zcF*mu4@MJt7Zs!enmqt^;>yw$nrzWg2(B69Y=b%?$}vb z9n9+#3J_J14CDe;N;!7UAk>LU8?Cf0M;SQSbJW#A!b)+5vK0!0aDi)Mjsq0Lm=Y9< zs&uNZ|B#)Xoru94$T&a)msiqX)9Fhb4tcVnGEI}M-vsH?RZj)jw-$1YUKF{Q2Z13a z&Ik|X-_DOhofO4&%Q6kh;COX;8m=BGy)JWKI{QR5P2G5==lgd!mAvySk&X#10L<@iQZ z!}IT_%e)CNeSmdSGb5xmeO62+P3vil$;^Dzd+KddHONt%LqED~DClvFn9-Sy_EwBF zz-$mrRoB)nWTH!R8#;0zI-;>jfzHG55w%?SvBhxr@0;eMw&ZI6+RXOaic5HYp>@)H zcXo31f<*FR3mG=G(xtAU%&myjSuJS(+=EiicPp@J0?Gy~G?)|Q+0-+vyo+gC-%~z- zn-}`-(6)lDLBopar_EN=>mM2j)O#39xB8o~%;;F2J^5G+oZfDu{U3GBq_uMSL z0(*3*&xFI<0cl>t>bc9>7ot2Js!k00XJLpe0xTE?lNV*4R?U^Z_shB?!pIFf%xaxl ziPXT(gy+|tyc&>=DWOX+tUA0&wZKRtwpgboNgo=B@RF2G&=24FN#fso=oHTd<9jO@ zzve7?JsSF26_(~9)F7Rf`8lgaCQ6}alnUPNIwe}P^c_q<#e z8>3=QktJjg(519Z&Yw@&+-6Doe%v2uK3w!>H$zNPOfu!{>1Q|hc9~5*El=2~#p9;E z!?W+FJ1Q}P7lPhs%FKripaqV1F@YEX=8h{_kb~LW5FDE|wzRj_Booj?xZ*8u+=#hf))y6EskbqbOU=h#gjOT+Krlx~xjQ!xf=w3d zcsqjBDfxlt=d52_)LcUaqbf=HCLwKj#i+fz3ItdUeW8%P;CKYNj9GsQyF17KeDhkw zD%iw3)6X-XMn$XB(AWaCI13s&t4Gt$xyRw@oj@uiQB_sb134q$GOz{wuCBskd!HB6 zgE=?c+$f`y>%YG3A-=fh!ca1+WT#xP(GhOFfi~= z_ULeb_L0`sR#z97cT_9Ve=O+#TN2;?QQFU=YG%u}d2J+8^0Szc`9w}n#Oe!{hCFSh z<`PKD5$)`>Aq2^Ivgz`1GhXw@&g~MRmefLI;>2eAwfm;_M zb9+2lN6nRD@kiqi$>mUf&k+0Du>a-Jf8!tOJpf8DNhRRL$rfg_9?o#U;BdrrciT>V zQ^lo67jh}Uhn|rPpIk|K^{|k^fl+W*+pATc{d&c3kwtU^ipXmT{&jg;yoJN z3GOo7*@LTSWc$<%Bc*Ze+uX6)9(etT*4(u2Cnia)eH78yw8vYZTZD!x?YL3ShEH?* z1-+mTt zQ(j$x^eQ!_MEsdN$|jFjQe6DI%4wowi7^U=@|!*cQvVTQLU}4Rr;oE$(kqqAC&Y0N zp<}Q70umKEy^}YWJzFO%*Pz$Fto#Yc-z5tA0kJmWVe=1wrA}2Ne{uP>zW@(&jp$FF zJYjP&ZPzvChQV1=M7dUc$Eh&@Qs$+9NQeQw1)Yz%XZ@h8Or1I$u1CINOj^^@H=@4+ t39o$cCNMS6`0_om{|(mv25si>zNkQO;yxE`i~sRiu)hMcAz9x{`zPtMNYnrT literal 0 HcmV?d00001 diff --git a/docs/reference/gtk/images/down-end.png b/docs/reference/gtk/images/down-end.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a2f6f6532ad6072664b4b21f5d5884054eb688 GIT binary patch literal 2170 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 literal 0 HcmV?d00001 diff --git a/docs/reference/gtk/images/left-center.png b/docs/reference/gtk/images/left-center.png new file mode 100644 index 0000000000000000000000000000000000000000..0473d6523873aceb0fff806369e99ad2be06ad6b GIT binary patch literal 2234 zcmV;r2u1gaP)thwDaTn{l z3dNzFX{9YmlUqU_y-Du%Lo{|;Y;N0oo7ew0`H*Q(PBQ0r-sk@B#e;)`2#8Gx6amNs zKpp_{Kpp_{0FVcOJdg)O2eiO+JkN6+=lA z@;Hujxm;$m8S48;y1Tm-3I#<`QQd9&{eGv@3ARSzbUOWhf3%Nz9LIS)9IkOzP~kOzP~AU@^YuqdaiyIaz)u-R;Tn_gLd$BJqA zuEcG5eSQ5U>;EWvw#VB(X}4G^N;g8wlMwH)_y0fqAbPfIR~5h9P=EXKqPUbtN5hXe z{&Cx1{<&u%LM5 z%3+orxOj1zi!ZWAm2`C0sf$*t$Kxq^;K6ayXw>S^dzDHVRGv^RFS_If0)gPcrdp*! z2)%dYaGJ>k>$zy3ZECezgizb3pSfHvkH;gI%a`0*xb@M;+AWs;fr0Z~U0<9yF^Ozh zmSq@*VHkwaC8v{Nn0Oi&qeY%Zt$uL*{o8A6?^#=N_S`vyP)&7p*7bjQy!MGZR~A=o z-S&3tJCn$^?bFW+mlYK*D?$jZ|I?ofmlZW1I2bqbu)q*6x7*#*)03B%2c6YOPM$oO zmX?;3l$6jd4*+=}4*+=p$OAwg$OAwg0P+$Z8j4^la2(gu+v9XQhlhv7%2Otj>1XNF zOlbrYkS8Ji7yFYGNyEP3VXtWNd_G_BY%4u29pp)f-EQX*&m*1?(FUMEAmF;}8j=k` zw<#@t&hPX2WHOn!*$TY$2INh7%104Gi9PQVcG(ojn_?kjicl00Kdc!O4DuwFhcQK{ zNX4Xsys63~gb1Il%+$^#gxCgc;gj+pZyH)2CA8a|GkeZ;3$J5Y_VX`34{J`yMTL=+ zcf+Eb)|P`AQr;fq(k17chYo$z*4ESeQ*v^0;mrk=mq$zrxVVH1|wDYF-5E<_0Z zc>c$*=>=X68Z8&yN)%`k2>36%T${_wT3Zf2Rr9z1p8lq~W`~$9kN;)DGXBdr#~3ts zrt^%|Y7PGpVS{M2bej?dnrOA!s!bKY*8P;nwrwrlR4MM9FzlG8*Xc8_$wUZsp6j$) ztwIJ!p68>z+YBLHpvfpYI=;Pn{ycHl3KSKlq3CovjPbz0fNjtwuu1VeFXY}l2^473 z`tEyg9%`xGUM>DoVcZwPFg(v242Bd#ijY25_`)$tkAy@IGFn;3Di$^iiZH`6UK$E7|UO#g5=xh7->SoOneTRh* z61Jf@91em>dU|?>IRj&Cx7)+d4P$PdCqa zicF)?i1^FHPFO+=4Go?5pC^QbO)qd&7A^8ZfhKB|`k5zpWM^g7R9Dx(^wQ(CPuT7D z)YQ}rvw0Hon4zJsEMEs_E5FS-E$w11((weg$AWiG44Yn{JP0(I68oF?XJ%%K9%#bz zeE&dyc2;&wPFP|EOfbPj^dq4d>o#MT37sl{yl66qiI54%gqOKIH-nx5@}xznR62$n zzju%DPy@PROA4(AM*SCKY-j8Sg8}48i(aRnan+383%z5vBJr<`{LAnC9V3kJZ`U1Z z)EeU)qtE99dD8AGn2lzYN_EBSy~Y{3#vj!JfdI?0(DEdQWm&h|9hngqN-F~Z{#3VT&&@aG>vcNlHpN8hK$8t+6~*gH{&V{Dma3|FdO%G=1e!dz^Y43hzo6IY zD<9bs*=LYMtlON;>jPc+f%^avqEgl?lB z&)ud(Pc-p(JPgA)9F8+*&px_+`_jdW6$%9`6+}j&K$9a!-#O6oR$qU=R-;+EWO3O; z8{%n^K7l}!-rnBa+*|~V;MA#8CX)%CXaaydkOzP~0OSE6599$cC{N(sMiQ?02#MhK zCN2C|%H{H7$Bx--wy}rN!nf)Lrkvv5zrX?&UhZR4QWT}r>5N8W1naa=c{EKcl}e-0 zsMTr(K8{@6!`(l}aT|(=pKU6bgk*CY!{Ai_@%07*qo IM6N<$f={+Io&W#< literal 0 HcmV?d00001 diff --git a/docs/reference/gtk/images/left-end.png b/docs/reference/gtk/images/left-end.png new file mode 100644 index 0000000000000000000000000000000000000000..d5101be3e5d9ab6639f804a099de70b586a05faa GIT binary patch literal 2196 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 Rs_@6_0vu*;Sgr3I`(Jr%EeQYs literal 0 HcmV?d00001 diff --git a/docs/reference/gtk/images/left-start.png b/docs/reference/gtk/images/left-start.png new file mode 100644 index 0000000000000000000000000000000000000000..618f3dc9cde6a3ecfa9f33f80be0882130f7f278 GIT binary patch literal 2099 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 N%G~Bcm8oaS{{a8bh!6k( literal 0 HcmV?d00001 diff --git a/docs/reference/gtk/images/right-end.png b/docs/reference/gtk/images/right-end.png new file mode 100644 index 0000000000000000000000000000000000000000..8af0ac15cb71e15bc97d3f216e6e5e57f1e9a064 GIT binary patch literal 2241 zcmZ{mc{CLK8pp>Hll{iLQW&l&Bti>H4a3BsaEB~qd+oBk_G~jH5}{XPjFJ&D$~Kjy z-q0i=OEX!rW)ze4oxu#ln8h8Zd+s^+kNd~x_dLJnkKg&8=X{^@{IZ=c+sH~Ck^%q# zvItx2e+eU2ND@#~c#fsz0K&;(&^>2hO|UYZuJ zxS;ZWX6w9t!Q5p2=OdwN!=}?fXC2+4L;Hqgq?D>^T80MKunpl37|-$&=eX=KyKCG*qRoD1x%*Gfk`QqLr| zV9cQ$`F<3Chk@EcnXhuzf0UPNiaU4$RYlh%Z$bgQTS7#>%LCAR0Jg>6gZBUkZXW*f zG*udcH~=qLNOD$E+z#IX|DGHDtv*K~@1hkjn=>)ORfHQU0LR16ggBVY{$Uz-Rt@gF zL`5^rSGTy9<2pPPl)}RJ@)Y3(fgTEHq>2K6%IG}bQdZlw7#|<@BrnRb9Pfewdoq4W znLeI~E!s3wtwCk>%$a>zXYyyf@ENO*M(IQn`bqM%Jc!61St7+v(N7;XvEU+cPNo}6 znbJ9KtwDibJ4TBn8AJycm{Lw|>bnM7_=nUXeNAHR3q7lMv% z3}1TCK&}LqtEVL1Z%^@q?}IH?6^%M3r<9-?x!Btgk*^mx1m((1B6|ymEmB8qVqIP3 zUpFTL+rErWwlyTv8>UHenJ_~%hXi36<8^XMd#E>JR*KB;broVa`OBx#eD1@7#IXkN zz zCo{-#>)JrrhUc?EUkhM+8gJa87Bovj-0Tg20ZUP=H#7Vy=TBg%b=C;CH#@0z0%mbsCWp2Omp)q30#!`28)|ksKcNU)EWR;fI z`|Vs=Xezq{ELEd>!6@Oj*Cy8d%RAye~}5Q)wa0ExBsmu5^0Gli{Un zFMLHrBftMW(RebLJTNfum_d&U6BFziO=y5U{;wCyk|CPaw4L}}!EL%;E%+g6jmlNu zCX>A=vhwndNOX+=U5$+`n|zt(PambNs?ms$Vv=zV9)F+2$vfxELl)C$#JKiNHrRV5JoT+Q?|J?# zM~}qi{}7|AMd+uj>ge1QAma-^`z)DmEUznS%Qb_a1P|EuGAsmkv#C6yw4wvpclBa+SS`Cail9$4YQG zH{V9rLR`;P{aE^>BwM}`gCho)vl);*olkZDBpK`fcS?UvD&SWG=Fi7d&?CdB z#V^(E?d49-Xym^fMK{7hRY$S2oGfD|h;o#Ia+& zOPhIDZC*kcZrz0xf9j+spi%3w8BWfA&XJcRbBEl!PP;d=+|;LBkj*VS-~~!lZLNK; zTKp_{m-a)2`R1BIuF<7oBWdl}EbM2WB)=^po1UawLZqwCv_^H+vWm0~bj zhy$I5iZ(z*K3M1^qmoO~^EmqC#Eazun`!m?>2qZRqpChU3t&Nj1A9p&?p8fOb7WzW zW%MrFEdqF?mRw@}l}ij5o&aik)y>#dckqziea#c$EkCCeU^oLWCMVUXL>aE*x|v5K z7E(@VW#rO`Bazf%G?(7tyB3B$N@*@R2Yh8 zBGzmKhdcECmT!PUdVHGPT)vgfg3?LZG~IXCU^*3pA@4Jm1+Q{Fyu0m7mZCxV9|3a` zVh(q0)2NYYtA%(u5jAPQlZI{-iy&b zuTB}aA7|o%0*cyto7Erw!0>dgha++-LLRlaACC!2cwS~2a_UgKchpOFhohK*sXDz@ z>KV(3K8aT2>-P+XmN%2lhRe)()IdwiieSEJU1Ke(Euv{%Ip~njHi_{#*xhDL oMwyELXZilmSpQm#Pc?T%yy4qdFyHil1CP{cWdHyG literal 0 HcmV?d00001 diff --git a/docs/reference/gtk/images/right-start.png b/docs/reference/gtk/images/right-start.png new file mode 100644 index 0000000000000000000000000000000000000000..e08f3146210db2435788e6f9d6cd662d7cbe68fe GIT binary patch literal 2110 zcmV-E2*LM>P)X&7x(}T z3X+hlhLGoO`XjA6V9AE=W`&$@_>qB|o8*4E_nx!6hsCwEwFqd*5HJLw5CDY$CE}=f2 zOeTv~MaM+PbdK)~lj%t+Dk>BT1xb=ZDm30TG7p$~N4?7_m_m=o<8ryoW-};kfX!x; z$z%d6tTENN-ENQDLlA;(pDfEd9ZuHEg0luV91i|F3txp^*6Z2@3yX6~zQ1kPih| zpy?Qz<2Z}e5=6H^$Yvoy5CQktUOjuYY18KNmCIGtRXi28hzz~8C?o?9_l;XO5)%@8 zCicVxuD)Ll;Yt&Y=G97Kw_?=RaMm)lcx&a?eP=86d4Rz znX_8dEX0`Pjk(rbQ&WR6rfE80V^Kez)8)K;^{U|AP8gfEGdE|{$Pq0sFXS0|&@`>p zYJEN*!!S)}lVaqWkLSwIC*FE{sefrj2yNN$>A=)fkH@oVYxc3@Ke^rR)B*h$FI=FE ziYl+Dn3XlJNB3^$4Cm!?`IuKn*V*mg|L`Lwh`E`wUK{;Ni)itJQYx z(iI_8UQupktO48mL|aK;95(cD;eLcriJ_>(P&6<#6(O`aC->5oD;qyqziVfn$z=X) z<0gOOdsS8a`u5$sXV{%reeL>>ola+~2xl-R2qIv3qMA%xP$kL}T| zTiTd0F1P!BO-+cc1eIt7mlpPF}2pv6iu%lidet9A0l~&m8 zc89}3@J8&oK&@6Igif41<$q&xxqRs0K}(h`FESXa@87>wUjEzZ)6MAC?RGN^!!Qg& z=%LNVFpPxzWpGDl1Rrs+XQ4`|oHlvV%GIltQOb26tm&PUv}(nQobB7+UH!hrVu_23 z>l`1S+P{CW-JUpkYRNmx{f{S4e-j}zH*?nXsZ%6Th z79S-BPt6c~KA->h4gQKTwldb3=orut3WXiockuaqmG>&WUT@<_$4`UfPfz_lMi}A8 z2dLU9+O=)d7BqxHq1Wrx$LZrc#XmJDZ6ZByI&-(#Y&UP-1P!53=ud{+Znv;6FL;Mx z2n2+n5CDY$CM=p z|8e`+*yT%?WX_#0)n{zY3dJjnX+TNI#pk+qfxS?8LQ@uV_`9QDeOpg0h(Am&I&Y|IxNBn>Dm%{-VVa-bhpWg*24k zUt!B)qNCL*$^F)@Sv79rB$L@J;9eNim_S*~|3yP<5JC!mS6;(H8Z;u6#W)-ehGDE$ z>$TF-Wh++>8!|+pP(V^43L=%o96IvtzQO}l)zxa1YS_>rvuDnbawn3!ET*!uGC4UJ z0Z(xD>{-2D4`ngo0w@H904M}NAt(euArRIIdETfy?5qTHmt#uu_bQjmj~zQ^Hk%ut z_~w83pJ&Vec|L*Xu<{@M#w|&bq-k2G)A9diORSKhsL04jold7#t9jl&Uf9z*P4p)0 zDHNW)`M=YVk&zTdwU}9`P$*_NwIH@4&e*{3IR|E ofI?6RfI7D zG-6bXqT$wVqonDu=}q7Jp7Wmf{p0yP=lP!V`~C4fpYL;iX>eOh0bUtiHa0c^Yby%} zR*zuSeeM&i)1hn`z-m0Vt=z)d*aQcD6+2E{P?jZfp{-$HE*du%yD*Qw@*H1P=YV8U|SM}`U6aOI^^Qk6f* z>dTIxSs}u$XcV8F&CZ~xL&)~w=WKP9BOwY+r%iAjc0TS zdbf9VJ@);S*l7@TI3NkT==mvq^`VY1sCu1IS{8eR+d)c>YAv`sUh>1*=fSH^9&Rm{ zmEAd{2$aet2+!@&sg8WS#kT8#&s^n=j|=-3RogJb9gRbkA`~1RzxpH)H9|RdiEvR8 z86`#4PazL>bM17_5?#;t_-%P!*AVh~qJi{@oF0+R6yOpDjdoNaJ>O0yoJe||MJJTS z>>&=WykDTX2Wm@s%^nlhmx!C2xhk-^o$VsNbVgkrF@i*Uq33+%ibTl#wzr+#IL2fj z99CF>m`yQHExSrmhCR-v`tIbP-=`NjM*B%>c{~j57vNi$R7{f4DvtHRVws(hvBq*G zccYV@CJ!fN)%evLNPWgeQ8J&e08+7y@o$>_j3rqq5p?QqACX}!A1(dXPrKINi>6O%6EKEy{QcVeiNf@j zt5PWd{RloAH)Y)AW;A7OcsNQD=h1ctaMsEGdTG=*n4R@Hd|y8eQ4A#Em-4{v3LXiY3?O$nc5JJ2fr&RSwXBF92~fn zk3lLkMn&T|F|e8#Zze?4;fsJ-Vb!OV72iyVVm>vICZSZRM<&X<^1ws}(*#rdPt)MY z#;({VReL3zwcb;LFiJqMOXYJ;ZmvIJO&34t&3u)u*x%er>h+bv{gHmE_gffmuf-qG z+NprOgpI+0rdH#SJRPza_+(F7WOapz>XNdxLTUc*I^?vpH0y+VY>KIoh$4@8%7k7= zi-jlwNG?#gxo6qS$+5~Vt+u9a60as|BWxze+fTF;R23@z@#SYip?P0-bJpcyCwSh} zxfjrEE$w4l5T=NIWgQNlY22`xvhm5 z+)WkS_4;A5#4v|CizNpU-01OqTdrviYyC1)DY4)}kJCBjIlX_zJrK literal 0 HcmV?d00001 diff --git a/docs/reference/gtk/images/up-end.png b/docs/reference/gtk/images/up-end.png new file mode 100644 index 0000000000000000000000000000000000000000..e3882af13d20c1a41f1bf3e8027d95263bad7714 GIT binary patch literal 2123 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 literal 0 HcmV?d00001 diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c index 8a76361f21..a1aaa8c372 100644 --- a/gtk/gtkmenubutton.c +++ b/gtk/gtkmenubutton.c @@ -26,9 +26,118 @@ * The #GtkMenuButton widget is used to display a menu when clicked on. * This menu can be provided either as a #GtkMenu, or an abstract #GMenuModel. * - * The #GtkMenuButton widget can hold any valid child widget. That is, it can hold - * almost any other standard #GtkWidget. The most commonly used child is the - * provided #GtkArrow. + * The #GtkMenuButton widget can hold any valid child widget. That is, it + * can hold almost any other standard #GtkWidget. The most commonly used + * child is the provided #GtkArrow. + * + * The positioning of the menu is determined by the #GtkMenuButton:direction + * property of the menu button and the #GtkWidget:halign or #GtkWidget:valign + * properties of the menu. For example, when the direction is %GTK_ARROW_DOWN + * and the horizontal alignment is %GTK_ALIGN_START, the menu will be + * positioned below the button, with the starting edge (depending on the + * text direction) of the menu aligned with the starting edge of the button. + * If there is not enough space below the button, the menu is popped up above + * the button instead. If the alignment would move part of the menu offscreen, + * it is 'pushed in'. + * + * + * + * + * + * + * halign = start + * halign = center + * halign = end + * + * + * direction = down + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * direction = up + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * direction = left + * direction = right + * + * + * valign = start + * + * + * + * + * + * + * + * + * + * + * + * + * valign = center + * + * + * + * + * + * + * + * + * + * + * + * + * valign = end + * + * + * + * + * + * + * + * + * + * + * + * + * + * */ #include "config.h" @@ -132,11 +241,11 @@ gtk_menu_button_state_flags_changed (GtkWidget *widget, } static void -menu_position_down_func (GtkMenu *menu, - gint *x, - gint *y, - gboolean *push_in, - GtkMenuButton *menu_button) +menu_position_up_down_func (GtkMenu *menu, + gint *x, + gint *y, + gboolean *push_in, + GtkMenuButton *menu_button) { GtkMenuButtonPrivate *priv = menu_button->priv; GtkWidget *widget = GTK_WIDGET (menu_button); @@ -147,14 +256,12 @@ menu_position_down_func (GtkMenu *menu, GdkScreen *screen; GdkWindow *window; GtkAllocation allocation, arrow_allocation; - GtkWidget *toplevel; - - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (priv->menu)); - gtk_window_set_type_hint (GTK_WINDOW (toplevel), GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU); + GtkAlign align; gtk_widget_get_preferred_size (GTK_WIDGET (priv->menu), &menu_req, NULL); + align = gtk_widget_get_halign (GTK_WIDGET (priv->menu)); direction = gtk_widget_get_direction (widget); window = gtk_widget_get_window (priv->align_widget ? priv->align_widget : widget); @@ -171,71 +278,32 @@ menu_position_down_func (GtkMenu *menu, *x += allocation.x; *y += allocation.y; - if (direction == GTK_TEXT_DIR_LTR) + /* treat the default align value like START */ + if (align == GTK_ALIGN_FILL) + align = GTK_ALIGN_START; + + if (align == GTK_ALIGN_CENTER) + *x -= (menu_req.width - allocation.width) / 2; + else if ((align == GTK_ALIGN_START && direction == GTK_TEXT_DIR_LTR) || + (align == GTK_ALIGN_END && direction == GTK_TEXT_DIR_RTL)) *x += MAX (allocation.width - menu_req.width, 0); else if (menu_req.width > allocation.width) *x -= menu_req.width - allocation.width; - if ((*y + arrow_allocation.height + menu_req.height) <= monitor.y + monitor.height) - *y += arrow_allocation.height; - else if ((*y - menu_req.height) >= monitor.y) - *y -= menu_req.height; - else if (monitor.y + monitor.height - (*y + arrow_allocation.height) > *y) - *y += arrow_allocation.height; - else - *y -= menu_req.height; - - *push_in = FALSE; -} - -static void -menu_position_up_func (GtkMenu *menu, - gint *x, - gint *y, - gboolean *push_in, - GtkMenuButton *menu_button) -{ - GtkMenuButtonPrivate *priv = menu_button->priv; - GtkWidget *widget = GTK_WIDGET (menu_button); - GtkRequisition menu_req; - GtkTextDirection direction; - GdkRectangle monitor; - gint monitor_num; - GdkScreen *screen; - GdkWindow *window; - GtkAllocation allocation, arrow_allocation; - - gtk_widget_get_preferred_size (GTK_WIDGET (priv->menu), - &menu_req, NULL); - - direction = gtk_widget_get_direction (widget); - window = gtk_widget_get_window (priv->align_widget ? priv->align_widget : widget); - - screen = gtk_widget_get_screen (GTK_WIDGET (menu)); - monitor_num = gdk_screen_get_monitor_at_window (screen, window); - if (monitor_num < 0) - monitor_num = 0; - gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor); - - gtk_widget_get_allocation (priv->align_widget ? priv->align_widget : widget, &allocation); - gtk_widget_get_allocation (widget, &arrow_allocation); - - gdk_window_get_origin (window, x, y); - *x += allocation.x; - *y += allocation.y; - - if (direction == GTK_TEXT_DIR_LTR) - *x += MAX (allocation.width - menu_req.width, 0); - else if (menu_req.width > allocation.width) - *x -= menu_req.width - allocation.width; - - *y -= menu_req.height; - - /* If we're going to clip the top, pop down instead */ - if (*y < monitor.y) + if (priv->arrow_type == GTK_ARROW_UP && *y - menu_req.height >= monitor.y) { - menu_position_down_func (menu, x, y, push_in, menu_button); - return; + *y -= menu_req.height; + } + else + { + if ((*y + arrow_allocation.height + menu_req.height) <= monitor.y + monitor.height) + *y += arrow_allocation.height; + else if ((*y - menu_req.height) >= monitor.y) + *y -= menu_req.height; + else if (monitor.y + monitor.height - (*y + arrow_allocation.height) > *y) + *y += arrow_allocation.height; + else + *y -= menu_req.height; } *push_in = FALSE; @@ -249,19 +317,21 @@ menu_position_side_func (GtkMenu *menu, GtkMenuButton *menu_button) { GtkMenuButtonPrivate *priv = menu_button->priv; - GtkAllocation toggle_allocation; + GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (menu_button); GtkRequisition menu_req; GdkRectangle monitor; gint monitor_num; GdkScreen *screen; GdkWindow *window; + GtkAlign align; gtk_widget_get_preferred_size (GTK_WIDGET (priv->menu), &menu_req, NULL); window = gtk_widget_get_window (widget); + align = gtk_widget_get_valign (GTK_WIDGET (menu)); screen = gtk_widget_get_screen (GTK_WIDGET (menu)); monitor_num = gdk_screen_get_monitor_at_window (screen, window); if (monitor_num < 0) @@ -270,16 +340,31 @@ menu_position_side_func (GtkMenu *menu, gdk_window_get_origin (gtk_button_get_event_window (GTK_BUTTON (menu_button)), x, y); - gtk_widget_get_allocation (widget, &toggle_allocation); + gtk_widget_get_allocation (widget, &allocation); if (priv->arrow_type == GTK_ARROW_RIGHT) - *x += toggle_allocation.width; + { + if (*x + allocation.width + menu_req.width <= monitor.x + monitor.width) + *x += allocation.width; + else + *x -= menu_req.width; + } else - *x -= menu_req.width; + { + if (*x - menu_req.width >= monitor.x) + *x -= menu_req.width; + else + *x += allocation.width; + } - if (*y + menu_req.height > monitor.y + monitor.height && - *y + toggle_allocation.height - monitor.y > monitor.y + monitor.height - *y) - *y += toggle_allocation.height - menu_req.height; + /* treat the default align value like START */ + if (align == GTK_ALIGN_FILL) + align = GTK_ALIGN_START; + + if (align == GTK_ALIGN_CENTER) + *y -= (menu_req.height - allocation.height) / 2; + else if (align == GTK_ALIGN_END) + *y -= menu_req.height - allocation.height; *push_in = FALSE; } @@ -299,15 +384,12 @@ popup_menu (GtkMenuButton *menu_button, switch (priv->arrow_type) { - case GTK_ARROW_UP: - func = (GtkMenuPositionFunc) menu_position_up_func; - break; case GTK_ARROW_LEFT: case GTK_ARROW_RIGHT: func = (GtkMenuPositionFunc) menu_position_side_func; break; default: - func = (GtkMenuPositionFunc) menu_position_down_func; + func = (GtkMenuPositionFunc) menu_position_up_down_func; break; }