[comp.sys.mac.programmer] Donating Center Dialog source code

dundas@sapphire.jpl.nasa.gov (John Dundas) (06/14/90)

There was quite a discussion some while back about how to center windows,
dialogs, alerts, and the like, on the screen.  I don't recall seeing any
adequate resolution of the issue, though.  Enclosed within this message
is a StuffIt/binhex file which contains two MPW C 3.x source files.  The
first file is simply an include (CenterDialog.h) file defining some constants
that are useful.  The second (CenterDialog.c) contains one function which
will load a 'WIND', 'ALRT', or 'DLOG' resource and modify the in-memory
template so that it is centered with respect to some user specified
criteria.  These criteria include:

	Center horizontally
	Center vertically
	Center in the top third
	Account for title height (or extra frame height)
	Account for menu bar height
	Determine best monitor based on another rectangle

Advantages:  (1) Works correctly with any number of monitors of any resolution
in any orientation.  (2) Presents a simple interface with a lot of flexibility.
(3) Uses no QuickDraw globals and may therefore be used in code which
doesn't necessarily have access to QuickDraw globals.  (4) It's free!

The source code is Copyright (c) 1990 by John Dundas, but may be freely
distributed under the terms of the "GNU General Public License."

The only documentation currently available is included within the source
files themselves.  There is also currently no example code; however, the
following sequence works well for me.

  GetPort (&prevPort);
  box = prevPort->portRect;
  LocalToGlobal ((Point *) &box.top);
  LocalToGlobal ((Point *) &box.bottom);
  CenterDialog ('DLOG', DLOG_ID, (CENTMIDWID|CENTTOPTHRD), 0, &box, menuHeight);
  dlog = GetNewDialog (DLOG_ID, NULL, (DialogPtr) -1);

Suggestions and contributions are very welcome.  One feature currently
missing (but easy to add) is centering within (around) another region.
This will certainly be added at a future date.  Flames, complaints, etc.,
without code to fix them should be directed to the nearest trash can.

Reply directly to:
dundas@sapphire.jpl.nasa.gov
John Dundas


(This file must be converted with BinHex 4.0)

:#N0PER4PFLjcDA3!8dP8)90*9#%!!!!!&,S!!!!!-LT6593K!!)!!"5kFNaKG3%
!!!!!!!!!!J)13f9ZG'9b4'PKE'pR,QKDKai!H)f'!&U(&J-@!(Kj2J$m!!m"(J!
a!&U(-J"AVN`!9kj-!3B!)3!"!!!!@SG-9%9B9%e38b!"!+*D@RkLR1[B!!!"IJ!
!!PJ!!!$b!!!"b)18'Z)!!!!!!!"1hJ!!"!JSN!!*3B-"C4"Fb(!K!aJ#'cCd-+5
-'cTPj""*%iE0Qc-Zd,333*!!5K%X9*T!Q3)LJ%X[!8fL9-R5C3![!3!&c$&!)N-
#M84TdH)RS!!X!3-8"@#!SG+!689PB@"-D"C+#b(Sp#Q4`,5)ADq"j3U!#4)V33`
`H41'6-Bb&U@8'82(44Lb$8N'(12@MKSbE0L!#!KNS%3N!"3-H90(6TU-!)S3D6$
#VCNdEXSN'&,%L8NT4*)%BI,Nb"HQ!"!!J!+JC6F"29Dh$[#kKbK1kl$K(@Zii%'
##TAd`TI!%8%1!"3#S#Q&S))"lIlpBlJ%(ai[9$3!3A")'6GdbXJKNLB-QcGRA+"
T-*!!B+SKEq$NNC2Q$"Sk)',Nb!%$K*Jm)*5m3H-'"*%kEXL%QG-J!45&EG,-QC2
Q68ZG)-l)#B1`$"N3G0k!D"0Q64N34)q5d8Q(SjJk#8(B85JQ$*ddE8#-bCLQc"`
3Em`J43286"SfC@V#NI2'6KSb4YGkAIYdV%D1(N'kHI0ec01SDi(#`DQ6Tdm3J`X
IP[0dVPQ&@mR8I1b3!)eBXQCG8%a!KHhC1@RTh!P$'B4LZREa(S@*9`jIT$M2TVd
YiSL6+L#1(&6S%!581Q,BT"N$JXRbJh2+Z""4%`VFQ8mTQe')9'NDN!"QhYJQM)B
li)pR%Bq0qEfRQcQL3DKi3A&%'M-abjK*-+5)%bT&5%&%%N%`mF34Ab$a"4&&'*'
%%d83dF!)H,RP4KRmq3HJJ!3DL+##$$S)SB369TM'K4Rqed354&c"BJ)S`)!($$6
'N!"#!J'"B&"4YU%KAKTkq%4(ChNNN!$!I#AUGb+'rIe(a403)&'J%6$+5#---Yb
Biii*fED9()84D555&#U*BT082!N&&8J)@1@-00+JT3SJ8*&4BR)Fp@@BE,"4j*(
d6AM39'Bd!!)#$N0PER4PFN4TB@a[CbjM@SFH!(L0KJ"DKaB$&J"iH6i!r!!2!4i
!-3"DKc)!9kj-!&HZ6!%'!#%!!3!!!&U(6&4&@&408&-J!3#KNa6RSTcVTJ!!!Ai
!!"`&!!!"*`!!$q2YIBj2!!!!!!!!ES%!!!3)+*!!#8'$!@@!D!%#"BSlEXM-5D-
(a!S3-9+!H!&#4SSG$4)N5'1Q)4Ni,4`-+H1'6KNj40+%BI2QM)Xa,333T&)%#j8
Q8+D!#%#d6N#H2S%+*4UJ$Y'!13B3R%U93+03NbLF#mLK3-!!IXkJS@-4"*SbDF6
5`91f"NL4CGM-+405j-N@2X5mU40aMT3bBqLiS2-'MX8HCY'UaI-f`GfmHr[q$Ha
#,ah#E8!JIUbAVm6*JJNE[JK4)X@&LG11C4bb6dJN"'%V',*A6TUA!0+i'F1Q$TN
b)(MmR90l6*Nj,Y$iD$!L$3!$!"!!8!&J3)"Z![S!i!'!a2AXSMLY-d@e[%##!lm
L","H"J!P[I!PF%53!!-!p`#85L'SB%#lIrp3YF3p%!![9)!B8XB0R6*bL+3*`qE
0'4GM3+Kid5!JL&4$hX$*)bI0'64d3-6)N3-'#$&j3#KjJmB0##*eh*!!#61R33)
S#0ZNQ6-Rc4ZA1d'FN42'B"Nb)1Lm!G%Qc*Sb))SL*E166NFaG3k#X)036"JkDGU
!'+-a6CNj)0kB5BSQU*NdE-VBK#2RMCddC)kbrFS@+YQ0(6q'G2-'l"LS8YN'KC0
cCmqI)!JE4L`(+Yfc#,Q5X3QC)CZaCFqkD'#65PZdFp65Z41Q-SM&GHrQ44ScVjb
q5A1L9BYEa"%R98!F+BL3!#%)+(A%X%N6N3RcJR2+Z""K%dTFQP!VQd'BG'QDN!"
QhY`ZM)ClB*!!D"16PIRGTjXjSbH5$YK!)SJJBmM+SHVQ6(F3dL"44e-Z*@'8('D
%FCK`GH"9aR*ZR+8$###B"P83F-!4edYRVD%8(#!BH"###TE"`M6e#35(#b$88!-
,!$EaaK`K8F@3!%04b449A(+%*-BEH*`&`KaS[&%('dL*i9G")qU9KNYdP!G#(4P
b&f8Dqk@BePT43MA('*89"1-GD(a9"PHhpD5(Pf#@89"IH96M'P9cD"K'(RVpa#+
&&S*3"Kk(`3(@6mQJD*m91pAK@4i`*J(#CG[GTY5ME*5)fiH+lEFPEMrLm4U88P,
*Q+4YDDU@PPf#3+HGHHaT@P""TCTAJNIk@%DCGiN(3RLNZKA6')1kX5F5Epaa*RF
SD9P(6rhKGN),5#'4a"&I6%'&&%N-3F8*D3RURUTeG03X@@h!!GGAlX'B+SdG!AY
IKR&T1HZ6l8&f"ebI+6PPG%Jp5@-CBC!!X@F3C&!9l+,U5MPV',@HG'XBZGjf,aY
XD0Q'A9"e+Q58I2ejN!#1F0!88UTaQ4%5EqZfqHDN6"4K""9&%(&%%BqQ%53ED#Q
&UT6RRFbPP#@(G03C82Pl8-"l6K(@ZA+``HK*3!SCaSpFADV4TQ()Za1V)+#Jkj1
iY9&3(5HePKDS8$8&pUU9jT%##"2R#e9$aPD'e%q6GUPeR@f2*K&&$Bc`j"KXe*%
A#$a3N3GMm+(K3q#$&hii$e+FCD3FKcAqZ1"Z%'ii9$a%dH!BDa""e"dZ1!jjjj+
$IX@6C"5VqHUH6rl%&&@!KA2UQdIq1H)+hAM'l*cA$RS6C9`X4kZU&pmk##)3G'$
`$6f%"RAdfIFU@N'&-53FKB'JaV)M,j9UcjZ5A)E*IT*"G2T5IKQQ5lb#))3*9i$
3K))efIH6ddPcdkl#eDAEa1i13%(EN!!ZYk$kI3FYbj*1LLJbJRP&+!%YHeR-CTB
!&-`J"494JCB8BSC)-3N%Di$GEYBbP$$!S5eM3%YHlT+jX46&BDSk#jM5S+3NT54
961U)N!$!TMIlY2#&c*(KQCi$JZA3D%pAS!a8rTH5*cATArebLB,!`K8BbFp08&V
F@EaS[[*S+6`8+pD6r,-H'K8P*1[KLK[-BK#Rq3N2Pq(*aU5dQU@)iB&l%9VRhP!
ZQZ5X20(4dPHX`X1XL)C2Ti%E[R!B3D53!1P0AbV+(*X9TEV8i51iQ5%6R8L(!-V
&2NPS!JLXd))Bb)!'Zp+9'3KB(J1@J3jKJ!Ym*KJi#jBK!8(39K+X8)3T$%%+45L
#%cU)JKJJMJG$8TNEL,$%`lb0$eec*JqJqF@#i)H,C8J"#!0(Pc#FS5N*L-ijQC5
!r6eT2J,4%K2H%$$Fe+N-BdM$@r4LSqVP##Q(19"8mL-Hr[JREr'6jPM#9CNkjN&
,B)ZJhe53!!!kL$%")1J"##UAQR!Yb++-kCTd(J+M%e`K#8iJ`JP+5J3Q21%)+`A
"#B,!"#PX#dDh()-,8M$4"1!&SaVP+!1,KK3h$%K*FZLT'5Se2+$DlcZlBLTD82!
%+Ca!,dSK@J(I4T0BT[%1Fp""LK,Je#%SN`T05!)46NS%#V9J,%cL6T%kSJHm,DU
RC6dV&Ci!"563e!JJH'Y!4l39K"MQVQ20Ua1SX&FS8!%*8QMV@c&e*8fKkE!85iR
Ad054[+$&V)YYV&qCB!5HMV8m(J%*(TaD"$aBaAZS&8aN`UFJXX6N)%KaS%Yq9*X
9UQSKrZa8BLR8Y65i3$VUqXk'[#)('*Q"+',$+4edbP-+6D&)4dV5&-@!bbITjEQ
%(#k&lL@6BZA`,A--eU2UFKJbK%Z#%NR!*5[Me-S"UbKRf""[V)L3!,1%"!9Jbqm
E[2)CXK6d5@DD3`TfS"LdM1''be*8CX@,``&h0d+jVBYB8M8'KTl3DlHj6+k@pEB
@QJ%+9QQ"$m$A)rZ@FUa0%!)5bT!!fT!!D(6'0Gk8f)aDYYX!f#AQZTQ#*`Si1l`
",`1*Dd+!Lb-8J04%Vb'$Fk8+SpLUGNbeK(+-F5`B%,Ba*"a9('2)qZ3G01$,3jS
V(FL+PbQEF`jQ4V-9b@TP1Z!KcMqKd8EaZHB%U'#qC6$cR-QkC4S,aXalX-N4L(*
LUj!!p3jY')UC%d!pKca@*Qa)3*PN-ZP+Ri%++*C$!XJ!KdN2@RjU'T0-8VfV,BT
RdP2)`ab+i!Blf,HLjEQ#H*!!01NM%!%*8SP,!MiLP8QlQ+cGG)1kNJF(&dpk$'8
5G6TaHC!!5FHN*fI!F"0rFSB%0!823DK-''$8'S#C1AX#BF)Y6i!@p0iY+e(KlFL
NG)GGNb%%[%a!V'GGDbcPZ@XGPX1qD@d(+b"N$M!b3CGdh63b,$L%@VTIrN6(R0+
GlM9S!GJFmX$J!KCY0fk`idrB0,pr`Xe,BG&35LbF5e"p48Z9Z@pr0J6H$8XT#$@
!Qlf*E"0pGLd%I@%iNP*(Ni`d4!j4)-,E%Nh@iG$K#NdB#K6%mem63(SS$dHf3M9
kG6QSQ-9dF,C0qZ!RR%%PdHJHb"Z1M['S02%lG0L3!2+J3T85-UGK1QM"fi!1JLK
'aNe)Q44Vf,!'YRJ5P#5VbTDdG%3BjT!!KN*Ub"Y5f+ckH5rC))Jj,QF1&6)a"`f
I'P&dJ(A)l2!C[r(bheVi@jNR8ZJ+jA'*XAB&Zl0"Q9a`F#4ZbZfpr4jSp-&bPC4
1S-m6S-UrfjjmZh9&XYB36Fqmha6VJIqY0q5(5QEaBBj@rM15Ja(QTqFmI#L8NBf
mKJjSd6cUS9+rbqd,[[)K+l&eT&'RZh1DeB3+#V)qE60P&!4)i(463'hkK`,!KQR
K*"5EjR#6PJ")-%qNdc8'''`*1(m-D"2TY(9GS`)UB)%mG3CN)(CNK346F%X$k(m
S-)%)@'),k%8%b(rI&Qi!mhm`d)$eJ`)@5#(eGd[8"(R1S@IlY`0NC4(d!KB-N3C
ViQF839E%45%j'!)D08GX))4$+"#H&aFZN!#&5SL"6DL!LI&r6ZF%(Y1$6)5$#bK
1),!(#@!4B@!bh!%`d*D&,K"rb%D!raH!*QL(+AL!C"!A,#J9r1H!%&KiHdL"IbJ
6JHKc+!"d+FL"(ZJ#)'J%8J8#*R!I`N4-aS4-bS5'6%G@$PL#G(##@P')+qL&-Z'
#CK+)#E!HB'&8JBD"#G!(X+L)*3JX,YBeJ*C`+1#)C`L*)FKR#AF3jH*LR!L,#4"
p'Z9Nc1CL,S!qJC8E`mKR,K!dEb0#RSK4AGJe`YKXd[JMG+!8BM&CbbL0(k++LKK
p2X!8B3"ZiVCdaTL"*CH-[!L)[LL#eaL$i[Cr[0H!C#@,RZL2)`L+SPL!I1L(TLK
P3r+#$5L,DCF%2a-8Q"Fl3L)CS'%3,BFE"VBI#(B3D,%&--!#-0!&Ri)ESX)G33-
DFK!KcE8c+a0*Q2GJEN#4Z!)9UE*MC-0F)rNGHq+3!!h@GKb'(6"#*`q@*IC4Nf2
6Bb"3Cir5'Q%J0L2#Fi*M"JN!!aLSL)bBE#k!+6fJ85CK!T@)P5HjP5!!!q)81!q
55'bf&LKJ%Q+T!LM3%-fL!QpM!PKCMQE*(QB!Li@@Be`jD3`T3[B4"0r)E18M&,H
%'kdh90"S*eT42qGM14ie4DYh)2keNkX(4d9a!R5J*ITb"SAa-6"b"QP3096#FjU
@'-RSDCI@KfrMG%)9QGSS4M##&eQRL!ZB89%)&qj)9[XQ"'i#)Kl%Ij9""q(L"Rj
T%r-8-+q*134TL%N*L*2fJ0C(L#VBK`PiKZF'Q!+4%E9Q@*N(QFcjR!Mi(pi$2U`
A5lF44`9"4iGKQU6fIbLJQU(f0VZ)R4!AQ'a!@)mTFrR&IVSb@!La4T*d*3Sd9dK
S9jp"&6[f'-+5EiUi9'p'L30a9QQe9QUeQr#S*[q(PHMc9Q#j2R63J!K%"KUU8D5
QBVbeDXcBSDS#"bKU*#SUM8(6J#IU!bP+SX`BPK+)!UL'K##`!L,a0Qq&!L1US8!
D!fMi!L!J!fqc!XDBM4pU-YQT*903&0q4%Y#'6i4)4Dqa&K)(!NPAA5(5IGr*RaX
5&,MR5)(R4rUR(jVR0#"N(`"U0`XN0S$f(qV$2LL6822MA1+a)&!e2RSf"mXK'(D
%80P4BeUbTh-$SZhc2NB$-!)$54#*A8Lb)h5$N3d4(9$M+3#f&NAK0[p")rM#Q9"
a&cfK(2#R*IZ6"rTb*DKKUB'(I1E8FRU@Td,M2T+*N4jQ%&"6'`+UIT`(8Hpa0%L
4'28Q"i8(0Q6"GKGc1&eP,"6c!rMf0j!!)j98QCCG8k-h1JFjkUJmS&&45JFJj)R
F#U-i+U11+Ul50)f1#U3C"$-b8`4Q0J)&8AFBH+kpYD*mfD)[ZUrUbMj!@U4)H*`
qTCB31M`5LJ+Ja9Km09U!K8d0feL2&9R&U+dSN!#`D&'*%mYA&DYdX*JJ`+)V'M8
$$AL@FZ'*)UX8Yk&4-Y#!&T'Q@J%aZ93TU[UGaZ&IrNH(2DS(m)Q9hJL1ceLA'L'
NqL0MKJB5-#X3-JX9%A)8HL&ZRk'c@N'("1ZcbDL[-3SX,K#dK25-@TZZA&Z12jU
85@YRpDT2Xq+!de)Yej)Y9*!!VbjUSqMUVH4i0FQBJMeEYNJ+!NUkXZ*KY#PiYAc
l0NV+T%hkT%e)Y#!#T(XT@d"DChGQPQBRYrqkYD@NP6ZkYdFUZ)6EZBEEDL-V"iP
lM9h)Z'AlZ#"4YT*EVrHU6e@TPN#hF$YA*R0JG1+4G*4BL@&VYf0l0H&kY&bfZT&
lYRK3VQ69ZmbSZDSE%X9EBj1E[(2EVFcSY@*KSY0EYmYl031lDMlk9UdlGMD""&8
3FY-TJ39jRG"jR`*4[Va#R'jJ*Nk6-(lK'A,99B3"0hHb+F-T4(I"5C'dJ"[5KS6
eB"5c4PS5KQ9`"jlf!JT4*c2LD@NK-@9b%'K#EL!6,U)*`&-8'!Mf'BNCQ6YCV*,
+!PSbHce4,RB81fj3$5(4&-Tk+@h4,)5"((,`2SQ4+K&d'dSbQ1NTEPSK+daf"K$
9"Q*M)`GK4`6-(3B-)3F95Cl8LS'@&J9d,jc+B8SQS0#'Ae*6'9Ub(%paU'`D9FY
5([fb&ZAK3Nb421+4%VEV-'q#HeYd&%3'!MCK%8MJ"'pJ`qq$!YKTVE*)'V%%!!!: