From cc9b4723ecdcb4ccc612a166c34433b7c0aa1764 Mon Sep 17 00:00:00 2001 From: Ben Byer Date: Fri, 26 Oct 2007 15:40:35 -0700 Subject: [PATCH] added missing file from Apple version of 7.2 --- .../apple/English.lproj/InfoPlist.strings | Bin 0 -> 276 bytes .../apple/English.lproj/Localizable.strings | Bin 0 -> 1094 bytes .../apple/English.lproj/main.nib/classes.nib | 318 +++++ .../apple/English.lproj/main.nib/info.nib | 18 + .../English.lproj/main.nib/keyedobjects.nib | Bin 0 -> 30865 bytes hw/darwin/apple/Info.plist | 35 + hw/darwin/apple/X11.icns | Bin 0 -> 65908 bytes hw/darwin/apple/X11.xcodeproj/project.pbxproj | 344 +++++ hw/darwin/apple/X11Application.h | 104 ++ hw/darwin/apple/X11Application.m | 1131 +++++++++++++++++ hw/darwin/apple/X11Controller.h | 86 ++ hw/darwin/apple/X11Controller.m | 748 +++++++++++ hw/darwin/apple/Xquartz.man | 158 +++ hw/darwin/apple/bundle-main.c | 914 +++++++++++++ .../bundle/Dutch.lproj/Localizable.strings | Bin 1426 -> 1422 bytes hw/darwin/bundle/Dutch.lproj/Makefile.am | 39 + .../bundle/English.lproj/Localizable.strings | Bin 711 -> 1424 bytes hw/darwin/bundle/English.lproj/Makefile.am | 39 + hw/darwin/bundle/French.lproj/Makefile.am | 41 + hw/darwin/bundle/German.lproj/Makefile.am | 39 + hw/darwin/bundle/Info.plist | 66 + hw/darwin/bundle/Japanese.lproj/Makefile.am | 40 + hw/darwin/bundle/Makefile.am | 38 + hw/darwin/bundle/Portuguese.lproj/Makefile.am | 39 + hw/darwin/bundle/Spanish.lproj/Makefile.am | 39 + hw/darwin/bundle/Swedish.lproj/Makefile.am | 39 + hw/darwin/bundle/ko.lproj/Makefile.am | 40 + hw/darwin/iokit/Makefile.am | 17 + hw/darwin/launcher/Info.plist | 30 + hw/darwin/launcher/X11.icns | Bin 0 -> 65908 bytes .../launcher/X11.xcodeproj/project.pbxproj | 297 +++++ hw/darwin/launcher/bundle-main.c | 79 ++ hw/darwin/quartz/Makefile.am | 57 + hw/darwin/quartz/cr/Makefile.am | 21 + hw/darwin/quartz/fullscreen/Makefile.am | 9 + hw/darwin/quartz/xpr/Makefile.am | 30 + hw/darwin/quartz/xpr/appledri.h | 107 ++ hw/darwin/quartz/xpr/appledristr.h | 176 +++ hw/darwin/utils/Makefile.am | 12 + hw/darwin/utils/event_status_driver.h | 133 ++ 40 files changed, 5283 insertions(+) create mode 100644 hw/darwin/apple/English.lproj/InfoPlist.strings create mode 100644 hw/darwin/apple/English.lproj/Localizable.strings create mode 100644 hw/darwin/apple/English.lproj/main.nib/classes.nib create mode 100644 hw/darwin/apple/English.lproj/main.nib/info.nib create mode 100644 hw/darwin/apple/English.lproj/main.nib/keyedobjects.nib create mode 100644 hw/darwin/apple/Info.plist create mode 100644 hw/darwin/apple/X11.icns create mode 100644 hw/darwin/apple/X11.xcodeproj/project.pbxproj create mode 100644 hw/darwin/apple/X11Application.h create mode 100644 hw/darwin/apple/X11Application.m create mode 100644 hw/darwin/apple/X11Controller.h create mode 100644 hw/darwin/apple/X11Controller.m create mode 100644 hw/darwin/apple/Xquartz.man create mode 100644 hw/darwin/apple/bundle-main.c create mode 100644 hw/darwin/bundle/Dutch.lproj/Makefile.am create mode 100644 hw/darwin/bundle/English.lproj/Makefile.am create mode 100644 hw/darwin/bundle/French.lproj/Makefile.am create mode 100644 hw/darwin/bundle/German.lproj/Makefile.am create mode 100644 hw/darwin/bundle/Info.plist create mode 100644 hw/darwin/bundle/Japanese.lproj/Makefile.am create mode 100644 hw/darwin/bundle/Makefile.am create mode 100644 hw/darwin/bundle/Portuguese.lproj/Makefile.am create mode 100644 hw/darwin/bundle/Spanish.lproj/Makefile.am create mode 100644 hw/darwin/bundle/Swedish.lproj/Makefile.am create mode 100644 hw/darwin/bundle/ko.lproj/Makefile.am create mode 100644 hw/darwin/iokit/Makefile.am create mode 100644 hw/darwin/launcher/Info.plist create mode 100644 hw/darwin/launcher/X11.icns create mode 100644 hw/darwin/launcher/X11.xcodeproj/project.pbxproj create mode 100644 hw/darwin/launcher/bundle-main.c create mode 100644 hw/darwin/quartz/Makefile.am create mode 100644 hw/darwin/quartz/cr/Makefile.am create mode 100644 hw/darwin/quartz/fullscreen/Makefile.am create mode 100644 hw/darwin/quartz/xpr/Makefile.am create mode 100644 hw/darwin/quartz/xpr/appledri.h create mode 100644 hw/darwin/quartz/xpr/appledristr.h create mode 100644 hw/darwin/utils/Makefile.am create mode 100644 hw/darwin/utils/event_status_driver.h diff --git a/hw/darwin/apple/English.lproj/InfoPlist.strings b/hw/darwin/apple/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..88e1f04ac78e9f0b14a2b6fa57a4a02ae91d8edd GIT binary patch literal 276 zcmZvXy9&ZU5Jhk8S1c)mn3%>wEHt19Vq;?~c`2F)Nfh+s)w5ez1X*_P?983nv+s`r z`7+w6R-%(`y6B}$DY*yQsv}dYLJgX8Zn@>e6E)7?sV95I{d6v$nIl%LwN|?0PVr^h zGrvTQ7Hm&POYH~HO3di*uZ2v3!NQhL@m^e>XMq} Mw>ec5d~OW%}uNjLkA_dG8|a-XSfl3Up%^@aVHF%fx04FOQ7;2ecM3 z#>T5dYqUZtm1vf&!fw^9YMJGnVy#ns{Qi+yLC;LDL3194end}CjCG?=NT~&VbUNq! z_w%p%dB%3m(pKNoamR*)G~eAec5FsqCJnQ-nL9nlY1_uvpdPfsXMtth_NzGC0=&&; hwvQgB@*R~6nB2tLT~__K + + + + IBClasses + + + CLASS + IBLibraryObjectTemplate + LANGUAGE + ObjC + OUTLETS + + draggedView + NSView + representedObject + NSObject + + SUPERCLASS + NSView + + + CLASS + IBInspector + LANGUAGE + ObjC + OUTLETS + + inspectorView + NSView + + SUPERCLASS + NSObject + + + CLASS + NSDateFormatter + LANGUAGE + ObjC + SUPERCLASS + NSFormatter + + + ACTIONS + + apps_table_cancel + id + apps_table_delete + id + apps_table_done + id + apps_table_duplicate + id + apps_table_new + id + apps_table_show + id + bring_to_front + id + close_window + id + enable_fullscreen_changed + id + minimize_window + id + next_window + id + prefs_changed + id + prefs_show + id + previous_window + id + toggle_fullscreen + id + x11_help + id + zoom_window + id + + CLASS + X11Controller + LANGUAGE + ObjC + OUTLETS + + apps_separator + id + apps_table + id + depth + id + dock_apps_menu + id + dock_menu + id + dock_window_separator + id + enable_auth + id + enable_fullscreen + id + enable_keyequivs + id + enable_tcp + id + fake_buttons + id + prefs_panel + id + sync_keymap + id + toggle_fullscreen_item + id + use_sysbeep + id + window_separator + id + x11_about_item + id + + SUPERCLASS + NSObject + + + CLASS + NSNumberFormatter + LANGUAGE + ObjC + SUPERCLASS + NSFormatter + + + CLASS + NSFormatter + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + ACTIONS + + alignCenter: + id + alignJustified: + id + alignLeft: + id + alignRight: + id + arrangeInFront: + id + centerSelectionInVisibleArea: + id + changeFont: + id + checkSpelling: + id + clear: + id + clearRecentDocuments: + id + complete: + id + copy: + id + copyFont: + id + copyRuler: + id + cut: + id + delete: + id + deminiaturize: + id + fax: + id + hide: + id + hideOtherApplications: + id + loosenKerning: + id + lowerBaseline: + id + makeKeyAndOrderFront: + id + miniaturize: + id + newDocument: + id + openDocument: + id + orderBack: + id + orderFront: + id + orderFrontColorPanel: + id + orderFrontHelpPanel: + id + orderOut: + id + outline: + id + paste: + id + pasteAsPlainText: + id + pasteAsRichText: + id + pasteFont: + id + pasteRuler: + id + pause: + id + performClose: + id + performFindPanelAction: + id + performMiniaturize: + id + performZoom: + id + play: + id + print: + id + printDocument: + id + raiseBaseline: + id + record: + id + redo: + id + resume: + id + revertDocumentToSaved: + id + run: + id + runPageLayout: + id + runToolbarCustomizationPalette: + id + saveAllDocuments: + id + saveDocument: + id + saveDocumentAs: + id + saveDocumentTo: + id + selectAll: + id + selectText: + id + showGuessPanel: + id + showHelp: + id + start: + id + startSpeaking: + id + stop: + id + stopSpeaking: + id + subscript: + id + superscript: + id + terminate: + id + tightenKerning: + id + toggleContinuousSpellChecking: + id + toggleRuler: + id + toggleToolbarShown: + id + turnOffKerning: + id + turnOffLigatures: + id + underline: + id + undo: + id + unhideAllApplications: + id + unscript: + id + useAllLigatures: + id + useStandardKerning: + id + useStandardLigatures: + id + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + IBVersion + 1 + + diff --git a/hw/darwin/apple/English.lproj/main.nib/info.nib b/hw/darwin/apple/English.lproj/main.nib/info.nib new file mode 100644 index 000000000..88bc6260d --- /dev/null +++ b/hw/darwin/apple/English.lproj/main.nib/info.nib @@ -0,0 +1,18 @@ + + + + + IBFramework Version + 588 + IBOpenObjects + + 244 + 29 + 423 + + IBSystem Version + 9A356 + targetFramework + IBCocoaFramework + + diff --git a/hw/darwin/apple/English.lproj/main.nib/keyedobjects.nib b/hw/darwin/apple/English.lproj/main.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..8b31450ff5c9a6357f70baf56268899dee194109 GIT binary patch literal 30865 zcmd?R34BvU_cwlLZf=sB+a>9~H+0|kQlMMfv?UE;DJ@WvmQvb43*Bg1R?$1iD#)TD zBB1PufQpEMD6*-DEFvI+3ZmkQI|!)2|IAI7&eiaNdbm{{);wms zwWiJH#-KTCPB98bSy`N)V82;g-BvB4Dz)pN(gD_~*4n&|hhEg+pBaI1Vv?D3rZ1yo z^h^O`U`)&$W)brYvys`vY-YAG+nE=b9n3D~Rb~(K2J(HmT9yj53JPA+6Q}7Ht3(v-n!revqacJ>0UWeD?4R{NF3Gcu!L7pR(a> z44cBHvT1BO+mFp;b?hj%k!@nz*$3H&*qQ8Hb``stUBhl-ceDH11MEBO`|Jt!BlaBo zG5ZO7iT#@Wj{S-Knf;Z$#@?2(GMP*zbC>zb{A9s0tt?6wCrg&4$kJu~WSO!YnNF4` zE0PVA4U!F(mB~iR%(5!kcv+jQT{cNJT{cTLTlR=-fozFvx$G&~3fVKV&9djvr?Ty` zmt}ioZ_4(`-jW@by)8Q`J0<&2c0u-u>@(RV+2^t=vL9tX$^MYtklmEsmfhhn$8#!9 z;G8%$=gs+WzMLQWlndsL-~361^FlPPvw{8U&z0a|04fY{)haAqEazd zF+tIwn68+mcvP`S@wj4{;wi-n#X7}S#Vd+kihYW=6h{@O6(1`uE529!&h%0Ip}3>O zN>(XXx+>L5jnYFIpbS*@Qido)l@ZDmWvVhw*;|<_pQh9)^OOb3A<7cvP~~uCm2$MQ zPN`Q;RJJPHlo$9s{yBaN|2)5y-^Op}U*KQlU*dOgHT=u`PW}~s7yl~%8o!(0!@th& z<=^1nASf98MT zf8~GUf9J39*ZDvA8~jcF7XK&z7ymbZo4>=~RWT~0!YWoJQ*kP}N}*D!c$JgNRkd9h zAee-K!XRO=FhnR3h6<%ZnJ`QkE{qV$g^_|;um}}Gr7%jU5=INv!Wf}Os1>ZjSYez{ zC)5k$g$Y7~&?qzs%|eSXQD_xxLYvSoOcEvwQ-rC)G-0~%fG|UNP_{m+-3any_2g zBfKu`72Xiu6!r;k3HyZu!a?DXa9DU-ct?0wI3m0!92MRdjtR$w6T(U11L2hLp>SF_ zgIM9L@R4v%_*ghETo67HJ{3L_E((`~&xOmv7s8jq*TQ$g)nQ>x?F|i=)NYJ3k2-i#09%lI+=OaK$e1Tn#kmg&WWFriEs6V601kxUd5&BQRVOdJ!> zBru6g((pm0Lz|o1hKJQORNHKogGvY6w;kA5Y|;j!r}wS4;nfZ8R{FcXxv2^ECD^fS zmO-V1svE5~+7_;hTH(v&=GF%R_3+t{D4u+wS(B4UDnB4{hY14W*oZ$&x5CV~eM^c}%Jh>WNp=o^BsYH$I; zKN39nLzs>fCY4D8K}gI~Mnz6!=?}e`45klIkzi|Ut#2A9%7DGR7H|n_s;MA9Wco3g zOcs+}Zl49K&1}DDfzI5dcN7rP zZfk39wEqY)EY82M` zn3>GO%q(WMs1p6eU@=UL7W<01;z+SZ951$tZQ>O1A#s-Yh`2;tCO$1bD{c_Ch+D;% z#ogkY;#=Y`;x+LuL5LuZASFR6f?NsG5adfxFhRWtiXbSKpm>5(2fF=vjg`5VVP)EoVS@bD4R}eC82m0ke>K6y~(RYHO=+lIE1oPIG%}jdjGJ zQd9L9YlG-3dWnMQ^D#WPm|4OsWgcT5XP#h|F;6nfnWvZ)%+t(DW)-s<9w@7CYp_BP;|@i5nbFKx_kGo=qkF4PLzYi%(KiIW-YUhSLajgXu%XZPrGc zIEOhmPc7!==0>f3`3*S@&!#ZXF#Q{s8mn6;*!Am0=B0JaOH{F8ZQB*KvlGY8UlD0<9#ShxmBd?VTXmb&-py;w?sd#= zCKn{rNp$B@+zZRkyRtkv8O%ysYjZ<`wY6dz@K7~bG9mr!9lXWtU(f7k4p2%wK>+n* zI+}MGBVf;dm)gDNR!W_H+7B~t!>sy?LHC=}BMx(V3??8@bdkg!K%ZYM3H>DV0hR9? z1id-Dz}jGKvyP~hKKgZ!ahCZA#?XqP_Z#CpjB%kuZ|E4k#1Q)!Wy8QomP{Mg4j=vQ z)zq(;E0QXPi&6LM@>>V8uR@oR9b`vzll?REi#SaDQ~Y~8#24+-qHTs{Tn`J@s*Qk| zs%~kqRY{hr%2wArxd#D%FgGLuV#Ge@m|Gx>KbgOnznR<29p)}#5JDKSNXFci6o=Yv zP>Yu4rdn$&sFY;8Ku`77h6Y$-lZqOu$Js#n3!A86tOeCAZEvx*PO7&~7GuQ>F;0xv zpm<)4J!>BdDPX7=#3L0FkP|3PY5N%3*aij$jUeb_g3f6WQ>FHvK0P%fB~F{%x6h0? z?eyfNq&RJA%8VJGAy>u)sgVY`A$R0~JdqdjMn1?F`5}K4fC5nv3PxJg3x%Li<_{E( zB2XmV6M$fe*ebO<82^SgYbzKEE7dh?QyXk&Zi7mPSX=9xYwK%@;a=;c>IP7}{PwoC z<|gUE6lo1~J=wjuIxRwV1M~zeb@mBj0b#T>x3+<;=uqn6z^f$K&apu6s;7d@=%OzL z8as^YCPQ}^vA39}_EjS>MNAhH#6&SheZ)=Khhf~onB1K+Q+IdxP%uT4te|QrhItmn zqBsO&cRcZY+D@@f`i3u?|R2RcYf5aq>%%j58UQ=IN-M_UOCRkdKC`Vse3Eduxzlr|hT?Vx0_=*`<*%Z4S!bv3T!UZ)gBAN$TED z%(>5cLxY*8&=C6)My0Ucvczm@31`w?I;=Aqjz*wzYARkJ=yif#95tlXI@a21Z35pZ zAt9k8&e8%mZ1-7hs0xjihS!PZA3Lr#G={l@YEUh*qOr&c$xt1t0iNyVUCa|li1}gx zFY3j-jzvmWj`Yw3SUruX2_C9L6A02t>t;AX`Jx`aRjIwEPtQn;)21Z#l@?A)AGq#4 zW5y-5yR>v{4vWW&*$s=Q4Yi|5bO|xbU=dA5Q_xgcLetQ6`2PcF1`0(F0UHEpl%ZK@ zHkyOxBAKMbd9AI@lZQ0h>ZuoHS8GWyt=8JY+HtUh!lD`m&MV!@idvf+=?($vEv+G& zw24%y{kk^}I;~*h^BU^MH8sLolC*nP-W{DdTr5%#5DUfrp!)_OOx(VN4pmYO8O~UDow3}3xFO&kE18hSmsIO;0gevtI%o`4AW9p-8#r;Eh_64`WNcA0Fn2CW5?Z4w7oP%&r=>TNBs?7_pR zYH4m6)f+vwdwW+2)kmTiF9*owBH?I4Ij;t+A@C;z|? znndg1Zd%n!b4q$|t-iUTxz+aXdU~TrPY0!*N*sD}9a&b_+-?Iy@^3qO zw?{|ErH)D+I`SzWSl`e<101_y_yC<+k4~WvC6~Ix69&zzo(dBnecGFyVV11}Z!XvV z?IUz<6FP@J?zBFVH#dX|yW0qXeed*Hy3No9^vNdlNw*;aeRX(jlzpMs)Kxc)v(|R+ ztmq=T#4JFU#WA88{LJe6t#t-nL0@;Sby(sVqD8EbmNu-RQh*I~18QDbowNVF1`i&@RM8L~=XJNJgAsI^VCfwE~~ zuWD`6TE~us^#;m?ZlYW0Pq3`gt|mE=qs1!F_tMGrZ8ddvk={mk*1={3ej4ncb}35D z?S8hU-Da(V-p5$2EmC`oFra?Q2YO87KVwlD(I0T1ETf+o# zVh@I?BZeb!l-&`N9H|De5xl5wzbGYD;^;s1i*SP7FTzPU88`~D`$eEC&EQkCh)uxJ zgpmd9_K+AHfi7$5a0y!KxY>3#zGo3s0be;VjXIb{+pt<|OIzK&OzUxh#B{qj`99k* z?%!=4nAKobCw15bC)i8!Y3!~Ap=;ZkwO~h^+F;8WLvL2KHCKV?o7%c*ktAG#hf0G@ z6(8&&VO$0h9*##yDpe*<1C^RCKER99da6_<9@V8%^#oOPsZ>gG#(%d~u@xquq=!n) zfC+&8z^|~ey#d@(ZChQd)v6sMd7s)wFsszH>xy@SaRY7y&afzo58qFWEzDDRqJvjM z#F=)lro5!RzD)};S;<5*IJu29TDJC(+I0MYB(>S%{QF4_pcx0L%@OB<)VidSoRs!o zO63ud%Jd#mnFmstU8UCAqYLc>>r}0kM&pvFZPP+@Wo@O*bjbz`$r8}O$3O!YfCet^ zNk26tPvYechGe1mC>WCeA*$#$wD?&db4d>}7Xg_Is?Xq@bJebCRf+icj2c8n?nUZtKJ)U^P4@J}ylotOi$bK_}INVssz^)i*H2C$Kw7 zH#FtFob12#L+Zz&Gp>65|i?X-Nue#P#><@}q8>fG>a))^*r~wO#%d z^E19kLt=v7s<1;D5c7azey^~<#9v9nY!sin-!R_*<=;98dy}}?E^G@8g1f}bRy4ua zP66LL0*8N>MyM5^zxRh5_@?y3HgQJ}m6S~V-}pAZLt}2q)NdDG(4a)g+Jjq=+K296 zDRfo!0k{5th=Exa1xVToF)*uOm7uLR?6%(SOxuG=7clxSi7$fMZYwKjZgRBu_reFY z@Z-JKfpufuC02Hduk~Ps+Emt?^>MHcuZX+uu@32}|DAPUd!bO)t;e!^73kktr4B3t zXbJY=4$lUR#F*yl)>G^8uox`c;h}Qz{auhY=T_{q+sxM zHvse*aj&EYnXmNsEZnw9cdP2b$#NJPm%z|{ zVd$wa^uCI*)f22$cH?eyXvJnjt6XTcA6oqk0UHe%**rF%)w2a`AzQ@uXAR8XY%z12 zHL?SkJFJNv$PQu$vqRVtb|_nluCZn8FeGDPUt`PR(~N@Q*9x?nt%Nwb%nsK;>}{}C zgXy$`5rA^$SJzA!*V+vBR0;&D)WLwIwpNcD2YajCyQAP|QFH5{<|Y6;t7-VIZ*Fbs z?7|xyM~a!$Krmn0Qe6X&ji|3}tCIpi$xE`8O>ME30=QNKo3_utHaA%7$JMog11bSb z6taNp{;l<$1o_ed8`>M2z{WPWT5a{yC~0j|8?4~Omr?A={xbkM0sla|L^uTxnkU;w z6Ay?#xee7pGU1T;vG{JNPH6{5_)wkwf)Nk$;t$a5{ZL)9{niD049`~4aGV{@R>LHW zVQbi0*2<1$$FX&6Hai}^XM?zFy3nzL<{Bz%xR>8wk}w1n)TjV*MDL472!g-ws$~Sd zqv08t|8K=3;(qh=)YMc8fo072NE(+;{T;TMZDA+E1h>LxHZUZyFZFX+d`Em+JS^`2 zXELV%nNxwxp%R%xJBI#%ppzg4I_ja39iwK2L*lvDcA*4!-XKVN140qVs;6;lzj};wuN2B zKFKbJdn-U?2LoRQSYZ-s3~`991G@vP+CH+rp}vLk44PjII8M-q1f5c+i0_Jr33_|5TAin580p_r@CpAkC{=`(@4=iOs8V}?^-TqvYxlH! z!%Sq%=n%>??6Vu#XYE3%ta4lp)M18Don0rEt!LM>8`zEFG4V6;@&$G?EavCfE$s8` zR(2b^oqd6Ah9&wEyMuk1-H8bM3cCxwXM;i)+W-oIH9+;cYqio46(U|~VFAim05vG| z7BrU{!+Pk*PzTEQydWv)jofO*&YwIOYm=`}4kB90?_cQd5crH{|AYCz`y2U!_ ziWm2vqhJxMm+)0zb`SeHyO(`~eUse>Hs&p=bfCVHD!a)D0F)nzABZQ!lj4VEG}mE4dlqPuex!6z9RM*kG>?-) z+Ee0LwOl+So*rH*MZw@j)k%i1iy23{E{Lb{lR8HJl>KZY`x$%Dj%4;+1#}uD^o#aW zRBvslrFS|dNbzYZ!Oz*tV4*|VY&4s_;^vVIu+}GFcM@T>pLZPhTNpQ)`B&bqvS&r$ zK)fKHhD{pWOPW*ZqTDW_U)YNqI;phZ`HlU39s4_z3!-o^lmD!YH`tr(Etr)*?aD}X zIoZ~|sRDD~ir0TX^-rciAlY{ce(xi3M+y1BTy;>y8 zfDZde9sVd@6;F>G*SWts_K+=}Do9F5w=2FZmu=n%W~u{}H+RSXU2Y4+F~PC|Ss^%u zSo~G|{XTw`%+T$@OMcaF9Ugq9#ZX^s)k-)g?A%^;@J;%X*PWcVb^D*_q73{fSt)o( z*TF-&Luu%M=w-v16*7S6#Xq3y8)X#M>oCN!3bAaRtWq{gyeZzgAU&}}Hkw%~t9D2L zuYfFo4E$!9-T9N1z;Y?Jm0DY>TdTp}kjy85wo;A@A`lmz{-sIW>(HZY0#I=enhYuB ztIW^cOv_4SG)V@zE`YUZHaG&(clLDTb@8tXM{Y;i?2R1YVAxG$Qz#QtnXkm#V)%c^ z1Vht@-IPX*tZlBDP(=yonmcq6Qs=?4`5;g)8rC!AG=(w_!q=`Q()2EpEvC~;5d4*$ zlVs?SK9@b#nLMYHOAy;RyCd_)fCo+kbnw!fTfyU$P#XZvn`*&Bmwp{m-DGXJXNp(C z6t5P?5F{792vYoq+)9yQH@9m?Nvdk=oIyu^7NASAZBh(lCWvMZx^R^RvX^8#=r05b z1i9Q#m0xj~)!md^XFIomiNGoXMOeeEmF<r_qIoueIetO`oDml%YFymzPLBKBq)$_<_A+EMSJ$R4xqSNS{TwXOWgrqmlgp( zi-4cMDLp zPQb7s)qvucOd8%oKf9qB&V_TOT}BcVbH6U#pi6hhE~5yFws%>kZ*G}dQZuXuKDsqj z0;!g8LDFhjKu}y4pY#_lgp&|#f)WTyzTbcmFkocIfB@$b1R_n626U>>H#9>&!k+Lf znOs>zzjneZ-9k#@k|{^21f}0^fHdZ*&WN3ngp}41tp}Lx(I&-<%{D3UgsX1Oq`f4V zqtW(tYS}W%sd=RPMi-0dBBuu?3+Yt$rBgZgGp;}5!Wp+9`h$kwI{`8y_h@PM6MO)pp9!s*SJY2l$!$Pq7KQpQusH+ z4ieD8sga_t2F*ePYE;(R-bCTrTB$}1et;4ryW&`D!C&rtLK4kG1dSw62LL*pC+eXp zF$exZ@q!fZaUvxUY*Xj=Sz_5{bcvgTs$ZK3;n!oN7S+*-S1OOQc4UD4s!O5Us# zws0G{P4KtV@9c;-rO@jBB72_O+CyXm2r_kxEI9+@WJgicsmPN4S!6pwdFDBYY#^O* zqja&PpYU@$>Lx_2l#Y038dZfake-%a~x5)Q+x&37Q7gwEO^I$>#L zb@euFa|eN)2y2|mUh??G@WL1jG% zPL_&DBsEJ-{%3;E0>KL$2p&cW9!d$WwdZbZlD1ItTA|t*l#Lb0 zhWiv1uJ6RJXrdh&+H-g5v|Zo6w4Hqse-5AxcbS{PeMu0k)&_!_KLTrW1r>5%1M)DR z`-b}#VD1U9vaZsgpq8e4#@1U~!J>AU3qq}wMVuy8=D>;@Px}U!i2GTTl_Yl#^qW|= z372r!xa)X2cY}2krxH|2P_+n_*DCJp;o9LcunK>3x9NOg$W}@=VH81C61Yy21fX2K zC7%ALsglcJs;)Uq)o40Zm2|4cj-V=JcWr9pv@}xCj;U__m$X}B^;B5?FeP-6!&J7_ zNqPq!US~lyo$czjE^9K-+Ez_HCrMHX_u)pnBEDnelFU_tws@>0aC;&u(xxpQqOGp2g=~dQ+c7(Fv;o*WYTjVqt!Zww!W=?A zyS|nxVojZvE-sqI?VPcDR+Us|Y+1cD~%5CjnG&*v1HY+G6h%-Se znV#AXgeA@~d2X+%X@&Aun1OqwQ4Jk6!DdoT9XV_5eZ^5PAAgTHz;sUU6o=#!bkqd_ z%Kz_H;zSTfp@TRcpyHTH#Q_^KolyIZ466^eXG!H*jCu zcPR7pE|*$TYS^nf(hq&$GC7Gld*V>~ueK1YiF_7F55@_GM~>g*1w zXmj}j`9eEF0ny^3`$TN=#mrOkC5|ECLV_N(hlCJ9Kv+`W2yskjT-XTlHx#Kz_d0{a zF8a_#)(wVS2{GJG8lNq(*rqnsRN0MOS1U@E>F!r+XMA3b@F(%C~i=?g?5((34%6`y{GW|7qr)R9G`g+z)JVtck9XTHZ5B!SVz0gTNI;y{ia%<~$hid-2Q1 znJ49McjH{BRDP7k?yEa-J#`EP&L`8*8g#V1iNdyUo#)^H^ce61`6>H=YY19@{{hc{ zUYxb-MdyHP30fy?&HznQjt?mt8pr8=~3WD#m_)OPo^>R-`CKou%skn2FrO*+Q&5Kv0=^n60v{^U31 zw+Q6pabE%~Jr&K7xpMQ-L(D?iZVY%6zM;^et++&?R}|psxQzJL1Z5Bf z0BWg^5h4PWpF;&TINmQ2sHUC`MS$Vr1QBLrkN7!7e1I7sANp&DiV=VtH%p!gbe%wR z#9u<*?wptjiQW5W08l9!-o1tt1u`4J@tN=nK__0kUHpsMsE!1NqE1n-7*A2-%LH8^ z=!;U&_6{dW(Il2_lPy966napRyI_*<$Ul%3$PXxtxPiiqz&`K*GJj3nBME+u_^Y(I z_lV+usO3^#rd!K1|A8yTV8z^Su23oEN|MpboyI}@3wAen0SNpfNA{K|mMR{j?7c$J zs|4-pa2pkm+TR+19EW1LShfbX0LZ3yc0l2{|DJwo)&8eU&wbebZyu`vqN(|_c2IoZ zl+ZEeWVh%#6ap0g4F`oNqdEG{SwA3_J;$8IhZNp;7a+R~bC^pKwc<)x8+3t0QY8kp zO#KffMDbCFd{98=FlT9MX(j%UCS2D1r+v}d+-_}g`Uh>n7aX%-9W1Zy%ze>S_t$?p zASE7N_f=dMIf4#%vT_rG2`C;}0c9mEY?*ifDmkF+0}5i^?P#H70HtHI#r^h*d)S`s zL33xBjU6yh%9Pv&CD-AQK@CAitqI^LXekW*C%lRC7;{IdfO?l2rAi5JvMHhFMd<=4 z0KC^#1HL=dzkrDX3v`sA_r)Wjxj%n2UW7ESJy4-VCH9e%0gR&cJu@n*YMVPtSL|;_ zD&3Us82OI)(K`eerVQVp47Upo@DV$~G^YGF z$T@SDD^o@*W0bKJIakJ0d4etwbXJ0*&j1vyR!Ly=M|Lne4YEC{ zX~|ONrw_m&smVYM)b3EM$-yJh(v?ZIfI=~VM0YAg9}2|Wz#*_V*2p)>j)>b}4~U_Y z2OF82R09OU>d}4q6q?cj7o(#?rCyW`w>#9G{T7L3TjY=-VHPR^@t1hBLWTA6ucWOn zfo?(vVOxXkZ@<_M8_Os#ANI#>l*}@kFYN574CX@y)?N6AH746F+uPHuz#a$LM+du7 zJ`ixgP6>dmRgQs`BL7?Ar(hN33Z1lN!)nS~;QTNFogMmBT<5;G}yj zDB4ll(1+^~yt^auBfqJfWcPT$v$(4$fK8JAR|DUUDGIn5Pyu;N;l~^UUu89_fqxTF zjjRNGp;CB#sg%>hy<^NVXwNGOnANgT&|(f4nP7N+HFFm<33_9K?R_%AigM;I?HOOd zJew`sjV8c}3|CPVyAjZgIm~K>4)f3-rDG1DdhjFwZI{8HyelgKe`W&{%zcR_$ZrFJ zQA%l&K36Lu6$P;H*USF~Lo$u(=yq@e=zn?e6%6`z>ecM0R|muZ@JXED2N07EKCV+w zC=Z&M&?puhp-gbXpr2+5hS>p4Goi7Q^a;9Fh7f*&ClWI z^7Hul{3HAVej)#;qK;q8FX5N+kMWQ5Pw>n5C;8?4Q~V14X?`WYieJq?!#~Tf;n(u( z`1Sk-ej~q$2bcVNf_@q9|YYX=q5qn-2X|? zUj+S4&~1Y55OkMdhG0Z695})fEF+jB7!Dgz5UeDaCs;+WK(G_R&IG#<>`JhjU=6`; z1iKULL9i#mUIcp+>_f0G!G0oK`V$;La3H}!1P2qWCAb&CAq0mK97b?B!4U*U5*$Tv zG{G?h#}XVza6G{Y1Sb-lL~t^}DKr+qsRXAHoKA3Wf-?y2LvUY$`w^T;a2CPY1m_T( zOR$dMJc9EH))RUpN+H2T1otP{KyWd^MuG=asRz(%L9LWU(?d=z*ERum2#$-c{;}j?yWVUQGPoo0{uEE0hN~zO@ux2?Ekm z2T@X*Ds>RNYpWgBqV3i#C>iT|Vfvq0>pPN4yhCdD=v)U-1&=!3?tH@-Zab=CSHW6z zh2CB~E)fTG-J^XyD}taGN6m+qrv91Iv?_I*<0Mc&_5VNy9teuKhlhWH?xCTNgK{}4 zWe=ttUWEOVxvowQ$UiQ zjvRNEB1Bv4VMB-FJD6nqc_2V@>^-yoZ{L-I){bV4R)oPVM{RI?xek8HbEN6NNrXTj z?)REVS^))j9oH&dAv7X_+peARlgveYN_jy?(bm0WI_OPu(n#s`eG?r22{zV&U|ORe z4~M$+VB&whyaMQQl+nL2SPmyRMbiURS~}(}?VdT3cIJOgf%SN;97feRsH0R7NF~&* zb@a_XxZ^mb9b$CcR=SUWfVNTh5c1D2BSTY1ZFP`02sGi|PNYrdUy2C2-rbEJPR)OO za1Piem0_$PohscsOv{`7S!#_Hz)5gUPT({~L3ZN;Rw7 zH=>$hhMj7xO{!nB69|m;(7xo#PKTyr8aFxg5%vGrG%3i)(T@G=D~-^=%|VE8LJ^#d z1vmd;#`{#MUvp&q|2_G0;K|X>bmo}gw&QwstW%91<>(erjdGNf-4;ii?G}xy^?fW( zvQ!aH9LlGgwvtM+Z*t zN<0l?{$MPQ$tPwsW9>{p!6AebnOZ3cH4P5(n+%ASD;#Jz9!$Z5%q&I(-(?%0i>@B9wo}_|95Y04E#Sl0dZ4Bi8D&%^m_1=_K2OuCq zstT|;0Q|N|M-xKewF6Eb6d#e!B$V=4*Lr5Mqyr37#qof}ylhWsQ8;g?J)s5X8Lk3g z<)%1PY!&-ThZ_RwvZVvKrx`B5hTt$maU%eMQl1MA@`;8+6GswyK%$%`yr3HF5CsS0 z#SM>08R;w(s$Ne4GVo=p5)e6u@O zRs%;tO8K&taO&f;G}#J;vlFGG9((4_x^W5Bi*_AWy`Q&Wis@KvrMjZ}TJ??UTh(`}?^Qpj zuBv`i{iOO?^^59P)o-fbRo7J4Rez{%sBWrmss2>`rTSZSTXjcuS6~DrV1X560w>4? zg`gC8K_v)+li)142(E%!&Lj5{1U-C2!5I1odmx^@GgR1CHOUh zcN4sa;MWP>OYj>6ze(^ug5M%|KfwnGK1lE(f)5k?Ho@-@{4T*q2!4;?qXfTC@G*jq z6MTZ;lLUW2@F@a0G<=%iGX$R{_#=YP5&SX1=Lx<*@FxU+O7Ld{UnKYv!JiX+ncy!7 z{*vIY2);t_*93n<@V5kiNAUL=G*N@YH8@m*V%2>#=u!1f^~36;8uYMwmj?GzFVUcF z8f4R;M)fo5^%^uvgJRU%HE5F>ZYODwiv}%Fduy+aG(Y`YtRcC?5nQOpf(Mfq(KjG8ni=$)Eexn zK@FY9o84A(>f;*huR*;vs6stYgW&l{^$GP-4Gz&!8z6LGTpqUyZYS8oQV;ZzrgEnYzuKJJ$ zDKtoNfXp9DDYtUQ`s#L>BQ#FuOI;p{0^#%8p;n4HlioJ?A75fzj6>lq!DBf3`P<){HP;nLxLH|T?Q920y55-Nz zpKu7eGaP~*2*;i$D*M4<=cURDrB&Iav?*sQmnol7Zc%PkZd2}3zM*_ic~bc?9C|(g z0O7#^2A2X5JOV&q3jn}X0RGkh@H-Ab-w6QtHUrpeuowQDoPKi!gPB~6Gr+lXxC#%yqr+TLePK{2@ zPHj$;oE~s`)M>HPQm4nAmN~uZwA<-*r#GDTIqi2k=ycNQl+$UavrgYT-F9|yRy(^n zdpLVJr#crp4|Fbbu5=#fY;$gRp6oo;dAjq1&JQ^g=O>-lIXOb zQMqVc(p?H%M!3|ww7ER!ve4xjm#r>)T=u!_cRA>C*ySCUBQ8f>j=7w0`M~8vmvb(k zyL{tv)8($K(pBZ^?&|64;~MUo;F{{%&vk(7K-a;pC9W3NTGz3z&8`z&r@21ty2N$0 z>n7J7uCKcuc75OVoaOtyCct>%9 z`T_NWYEeB?Jxje&{Q?+~m%+5Ws(wwqN4;15vHBDBMfGL%SL(0T-)XR>L{p<_*F2(m zO0!F|PqSZhP;*%Gj^>EwsOFgFgysXyDb0tPvzm`J7c`eNpKE^A{I0pKx#PyT@os`! zmRq6QAh$BN3b#>iqus{1)w+#!t8*Lg*5KCeHq&jE+Z?xfZp+-ZxV`N5irZUmN8FCO zopw9xcFyg*+b8Zyca^)7yNkQp-Ob&@-OJs_-OoMTeW-hx`*8Pice8ti`zZI(?ql3* z-J9H3y03PB)_tw}diRa)o87m#Z*|}9{;K<1?(evtb^px$Yxf`AuX!L3PmeHcr=KYIM^@vF!09@jl?c-->% z%j32u_6+b0_e}Oo^-TB7@$Bzu@*LyY?TMeBN`L=L??idmi^Z>3PcY zwC5Smk34_y{L%9l&)+@&@N)Gk@G9~$cp1G+UW2@bcn$TM?ls42xz`G>m0qj8p7nae zYoFJCuY+EPz25eE*Xy#km$#3%pLc+Fkhj)5#5>G8!8^mduXnz8fp>*>qj$6SL~omS zyZ3bOh2D$2mv}$s{e<@}@7KKdc<=Ro)B7#&1KuBbf9rkA`!Da?-gkYFPmqt+C&VYr zC&DMvC)y{+N9UvWDe@`y8RN6uXNAv7pVdCk`mFU?@3Yb8pwDTavp(m1&ij1g^S93( zU&a^v%6#R%N?(nyyKj(hqHnTqs&Be)hHshgaNlxYvu}lOrEit*6yNQ>FZ%BA-RZl_ z_ch-=zI%Ny`u^c_0Vx4#0lfqI1oR8Y3NQo= z2q+Jz510_p7|0( zf$o8xf!=|>fkA=f)993MP5xFUE`@Pgn?!7m5z3%(HiomQ#!(0XZow1L`S zZ7*%8HV%?5y|sO`eYKg|Y;CUApq;3luAQx2tX-{rR=ZBSQM+0Dymq_xMePplPVFx3 ze(ibf740|L@3cQ?f7Jfm%cqxLufSf~UZK6hdqwt&?iJfBy;n}J{=F={T6(qiYU?$r z*OXp6dcE1}onGgAeckJ~5GDkNa3RVNA;dYvHAEBQ5fT{^6A~Aa7?K>48e$A74XFqj zA7Tq>4|yQu!4NTIX2{l%*F)Y7IT>;x}c4ruoGdI!@dvuJ?!sr6z&?{C%kWXW_WgZQMe(zBz$OiS@^_oTX=i;5vNjr=L{_sG8^??katT$CazDJmywK-9pf!BIn^hDMb} z4T~BPH8N^u)WWDmQA?s8i+UpJ$*8BIo{m}-wIynI)Pbl&QAeVVMjeZ~9(5z?R@9$S ze@ESpx*Lt6*=XnJplEG$NOV|qWOPz=UbH^CFxn73Ai6Gkd~{=UbM(Y$TXcK$L($Jh zzZCs)^seaFqF;~xGWtsNH__ile;@rr^pDX$NB)2W2$1RV`^h2#@J#e#Y~Nv8M82EbL?vb2R2y%!!y&F=t|a zjrl$1dd$t3zheH5xfAOXJ1}-|?9kY<*b%Yj*oxSy*t*z>v9{O;VjqlM61z5bee9;# z=VG_U9*aE@`$6pK*pFh*#h#D-B=%ZdbX;s)d|YB&a$H(m@3_8krnu2@6XR@glj5et zO^?z6b>_VulR`gsQ85V-1xkBeSBfOA%0}MCB8C#bbL+xtoS+c^WzuBFN$9h|5*I9@oVE> zjDI73U;Kgi!|_+*zlr}o{%ZVB@xR3X7JoZInc$n?pAeW3oDh-_n~;@|laQC7Pbf;5 zo-i+AS;E$YJqd>rP9!W7;;V^!5)URGPJB1d!udlvuQC~yfulk{WY(IHFzMoS+=YFpJBKsNo z8T$?FH>BUte#82W=(nif@_uXjZRz()zvKNr?svW4-ArYsbEY;kE;BnbH#09&pIMY? z$!y4M%52HBWlqXmp1C4(RpzsqYctnpZp?fwb5G{6%+E3}WnRwwGV|-q-?G>&E=!T6 z%5u(%$;!;i&dSZo&nnCslU18FHmg3XA*(T~Icsj#8(I6Z4rCq5dME3>toO4{WSz~r znDu$qcUeDVGufJK_iWE>pKSkZU3PwUVRrxQ;_Lz01G5KbmuFARo|!!>drtQJ?1kAo zvUg^`n!P7`Z}ywnZ)G3JKAQbO_T}s^v#(@-ll^`6tsGU3Q;utnCdVTuJ0~|MFDE~z zAg3^=e@=1EfSge|%{dcuY&q>YQ*xH%tjJlFYt608osip#;uVeaDG$8wkDF3){BcUA5)xodLQ=Wfh>E_ZA03%M`l?#z8PcX#gI+&6RI z$~~BSIQQM$qq)a(Pv)M=J(GJb_k8ZBxfgRk&;2s@O71tg-{t<0`%~^OxxeRL&%K%Z zSMKfHyE>#}b#k3jr_wp=Ty<_b51qHpSLd$_()H4X>cVxAx@cXjE4xY^b;EQcbR%^Z-7MW4-8|g_-J@`1*izjSx+is;bz5}XbT8^& z*1f8GOLstbLHC*NlI{!L72UVG?{z=we$oA=yRN&b`!g>zFFY?YFDfr4FE%eeFEKAU z&zx70SCuy=uQqRNUR~b!yoS8?yg7OE@)qPR%3GTEbl$4Gjd`2%p38eZ@5{U^dEexH zoA-U*4|zZ4{haq}zF&Soeo%gJey{wH{IL9p{HXkr{L=hk`NQ+e^GD`e@++(0|Z_eMAzbpT>{3H2C^N;19%s-WXCjVUi`TS4yoL-^l^(wuS z-dXRe*XZ5#0s0_)s6Ij;r7zK!>WArv>&x{c^%i}lzDhq&|A>B}evy8O{xSU%`sMl+ z`h)tz`gip2>fh5J)gRNJ(0`ymum41UQU8tpJN-5NANpJRzx8(tm;$~)C~zrI7eo~# z7xXJAEErqRQqWq^Rxr6>TEUEhhYIEutSxw<;I)E-1;-11E4WthN5QRvzYFdbqC!<+ zNMUSYd|^^yN}-{!x^R4xFL??k_x4_)g(_g~tj{6rL(PQ}}a{yvVgk zQ{-0^P!wGhTNGcESd?6pR+LdRsAxpd=%O)2^+l~kZAEj79w~aXXmQbFMNbqxS+t^P zWzjQ5+lyW<+FSHy(f*=CMOTY{D*CnPTG1axH;eu(x?Oa)zp}rkzkC0n{=NE#^^fcy z(?7od@c!lf&HXF;SM{&%U(!;^-m3{M+Y8J;n$HLN#m zG;B6(F>Ez#H@s-rVc2QdW!P|zrwtz&&Ko{4 zd}g?0xNP{+aK-SA;d{eX!%v1^48I$$8*UhG8U8ZdE@p~xv8-5LtSnX)I~BVYyA^vD zdl&l_`xgfm2N(A$4lRx-jxLTZjxSCsPASeT&N1>vC!?#;&FE?LG5Q+=jap-fG29qw zj5fv^b3L7?&GY7*`peHLf+TH*Pd;Ha>6M zW_-c8!?@GLSex^W^))Z=rFh!fNwjCYx!JX{zY~(?h12rrD->rUj-&rlqDQOv_DA zn^v3FnAV#%nYNg=nO-!#Y}#eoZQ5(vXF6ayY0A$FHBcV z-Im8@pjxxuZ z6U@oxG;?orUvri@*PLh8n~Tf_^8oWe^I&s{xy(GmJko42SDHtgYs^-2oq2+}(cElq zHMf~3nWvbinIAAeWS(iBZJuX-#QdmviTQE!ljf()E6vZC*O=FtH<&k>pEGYYzhHjJ zywm)udAE75`AzeF^C9!w<|F2#=40j)=2PY~=8w$h&7YV*GhZ@aHh*cpV*b|rz4=G; z&*tCE*UW#IZ<+rx-!|X1AdAc*x9}Fh;$l%-+$~-fAB&$Qz!Gc;v4mTqEU}gZOOhqk zl5WYc^tEJJaxHlly`|97-%@NDU>Rr`Vi{@~W+}H=ER~ijOSPreGR`vI(qL(_v{+g# z?Uu=wsg?&U4_b(2mSwKx5z9i$V#`v?ssr0DyuJo%6tkhP9Rz_4tSN>l$ocT`=033$N)=X<_ zYin|~G%c%@h$xYWMAICtR`2_MLKI_>Len(SvMh_-_kG`IlVvSu)3V$x%W~z))ih1> z-J17@=lLt1HvmBxis2ZEaE!q?Ou!_>A`bDGfdnKW1;T8kAsq{`7)!7W%aMybhMshqSax$lK8mDs>6PZjh zm2)|t3%H1x%wi5#auru|4cD=V#Vlbd%eaj@xrh6Ch(~#Xr+JPSd4<<`gEx7LRjlS6 z-e(PKS;u-l~>MLDadddXF8a+imCtB?B2OWyL4 zuLdhXK?+ugLKUXb8mlNpD@Ic^Qwd5`vZz$e(L80yaaN~HWhq-Ll&d`Dt3ZV+Qn5-@ zsxocW4(--H9n=vW*D0OV1zpxPm8(LPs#3M?>VY1rPW5`C=W5U^z1ADOSBpOBtG?@( ze(R6^S~u%q&eqdh%+=h?-8{_G`q}{VHXrjfKl8Uh8)Cz3gpIOri?B$GvS^F3Sc|iG jOR{83u{2A!3|ng1mSd}Jt)sMY%*m + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + X11 + CFBundleGetInfoString + X11 + CFBundleIconFile + X11.icns + CFBundleIdentifier + org.x.X11 + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + X11 + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.0 + CFBundleSignature + x11a + CSResourcesFileMapped + + NSHumanReadableCopyright + Copyright © 2003-2007, Apple Inc. +Copyright © 2003, XFree86 Project, Inc. + NSMainNibFile + main + NSPrincipalClass + X11Application + + diff --git a/hw/darwin/apple/X11.icns b/hw/darwin/apple/X11.icns new file mode 100644 index 0000000000000000000000000000000000000000..d770e617ddb455d8a499550e712f93a06a69f871 GIT binary patch literal 65908 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 E014<25dZ)H literal 0 HcmV?d00001 diff --git a/hw/darwin/apple/X11.xcodeproj/project.pbxproj b/hw/darwin/apple/X11.xcodeproj/project.pbxproj new file mode 100644 index 000000000..a47e4d157 --- /dev/null +++ b/hw/darwin/apple/X11.xcodeproj/project.pbxproj @@ -0,0 +1,344 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 527F24190B5D938C007840A7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */; }; + 527F241A0B5D938C007840A7 /* main.nib in Resources */ = {isa = PBXBuildFile; fileRef = 02345980000FD03B11CA0E72 /* main.nib */; }; + 527F241B0B5D938C007840A7 /* X11.icns in Resources */ = {isa = PBXBuildFile; fileRef = 50459C5F038587C60ECA21EC /* X11.icns */; }; + 527F241D0B5D938C007840A7 /* bundle-main.c in Sources */ = {isa = PBXBuildFile; fileRef = 50EE2AB703849F0B0ECA21EC /* bundle-main.c */; }; + 527F241F0B5D938C007840A7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50F4F0A7039D6ACA0E82C0CB /* CoreFoundation.framework */; }; + 527F24200B5D938C007840A7 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 570C5748047186C400ACF82F /* SystemConfiguration.framework */; }; + 527F24370B5D9D89007840A7 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 527F24260B5D938C007840A7 /* Info.plist */; }; + 52D9C0ED0BCDDF6B00CD2AFC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 52D9C0EB0BCDDF6B00CD2AFC /* Localizable.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0867D6ABFE840B52C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1870340FFE93FCAF11CA0CD7 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/main.nib; sourceTree = ""; }; + 50459C5F038587C60ECA21EC /* X11.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = X11.icns; sourceTree = ""; }; + 50EE2AB703849F0B0ECA21EC /* bundle-main.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = "bundle-main.c"; sourceTree = ""; }; + 50F4F0A7039D6ACA0E82C0CB /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + 527F24260B5D938C007840A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Info.plist; sourceTree = ""; }; + 527F24270B5D938C007840A7 /* X11.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = X11.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 52D9C0EC0BCDDF6B00CD2AFC /* English */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = ""; }; + 570C5748047186C400ACF82F /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 527F241E0B5D938C007840A7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 527F241F0B5D938C007840A7 /* CoreFoundation.framework in Frameworks */, + 527F24200B5D938C007840A7 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 195DF8CFFE9D517E11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 527F24270B5D938C007840A7 /* X11.app */, + ); + name = Products; + sourceTree = ""; + }; + 20286C29FDCF999611CA2CEA /* X11 */ = { + isa = PBXGroup; + children = ( + 20286C2AFDCF999611CA2CEA /* Sources */, + 20286C2CFDCF999611CA2CEA /* Resources */, + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, + 195DF8CFFE9D517E11CA2CBB /* Products */, + 527F24260B5D938C007840A7 /* Info.plist */, + ); + name = X11; + sourceTree = ""; + }; + 20286C2AFDCF999611CA2CEA /* Sources */ = { + isa = PBXGroup; + children = ( + 50EE2AB703849F0B0ECA21EC /* bundle-main.c */, + ); + name = Sources; + sourceTree = ""; + }; + 20286C2CFDCF999611CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 52D9C0EB0BCDDF6B00CD2AFC /* Localizable.strings */, + 50459C5F038587C60ECA21EC /* X11.icns */, + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */, + 02345980000FD03B11CA0E72 /* main.nib */, + ); + name = Resources; + sourceTree = ""; + }; + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 50F4F0A7039D6ACA0E82C0CB /* CoreFoundation.framework */, + 570C5748047186C400ACF82F /* SystemConfiguration.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 527F24170B5D938C007840A7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 527F24160B5D938C007840A7 /* X11 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 527F24220B5D938C007840A7 /* Build configuration list for PBXNativeTarget "X11" */; + buildPhases = ( + 527F24170B5D938C007840A7 /* Headers */, + 527F24180B5D938C007840A7 /* Resources */, + 527F241C0B5D938C007840A7 /* Sources */, + 527F241E0B5D938C007840A7 /* Frameworks */, + 527F24210B5D938C007840A7 /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = X11; + productName = X11; + productReference = 527F24270B5D938C007840A7 /* X11.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 20286C28FDCF999611CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 527F24080B5D8FFC007840A7 /* Build configuration list for PBXProject "X11" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 20286C29FDCF999611CA2CEA /* X11 */; + projectDirPath = ""; + projectRoot = ""; + shouldCheckCompatibility = 1; + targets = ( + 527F24160B5D938C007840A7 /* X11 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 527F24180B5D938C007840A7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 527F24370B5D9D89007840A7 /* Info.plist in Resources */, + 527F24190B5D938C007840A7 /* InfoPlist.strings in Resources */, + 527F241A0B5D938C007840A7 /* main.nib in Resources */, + 527F241B0B5D938C007840A7 /* X11.icns in Resources */, + 52D9C0ED0BCDDF6B00CD2AFC /* Localizable.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 527F24210B5D938C007840A7 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 527F241C0B5D938C007840A7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 527F241D0B5D938C007840A7 /* bundle-main.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 02345980000FD03B11CA0E72 /* main.nib */ = { + isa = PBXVariantGroup; + children = ( + 1870340FFE93FCAF11CA0CD7 /* English */, + ); + name = main.nib; + sourceTree = ""; + }; + 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0867D6ABFE840B52C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 52D9C0EB0BCDDF6B00CD2AFC /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 52D9C0EC0BCDDF6B00CD2AFC /* English */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 527F24090B5D8FFC007840A7 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + SKIP_INSTALL = YES; + }; + name = Development; + }; + 527F240A0B5D8FFC007840A7 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + SKIP_INSTALL = YES; + }; + name = Deployment; + }; + 527F240B0B5D8FFC007840A7 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + SKIP_INSTALL = YES; + }; + name = Default; + }; + 527F24230B5D938C007840A7 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(NATIVE_ARCH_32_BIT)"; + COPY_PHASE_STRIP = NO; + DSTROOT = "$(DSTROOT)"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = /usr/X11/include; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = $DSTROOT/Applications/Utilties; + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-lXau", + "-lxcb", + "-lX11", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = X11; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = Development; + }; + 527F24240B5D938C007840A7 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DSTROOT = "$(DSTROOT)"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = /usr/X11/include; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = $DSTROOT/Applications/Utilties; + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-lXau", + "-lxcb", + "-lX11", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = X11; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = Deployment; + }; + 527F24250B5D938C007840A7 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = /usr/X11/include; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = $DSTROOT/Applications/Utilties; + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-lXau", + "-lxcb", + "-lX11", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = X11; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = Default; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 527F24080B5D8FFC007840A7 /* Build configuration list for PBXProject "X11" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 527F24090B5D8FFC007840A7 /* Development */, + 527F240A0B5D8FFC007840A7 /* Deployment */, + 527F240B0B5D8FFC007840A7 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; + 527F24220B5D938C007840A7 /* Build configuration list for PBXNativeTarget "X11" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 527F24230B5D938C007840A7 /* Development */, + 527F24240B5D938C007840A7 /* Deployment */, + 527F24250B5D938C007840A7 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; +/* End XCConfigurationList section */ + }; + rootObject = 20286C28FDCF999611CA2CEA /* Project object */; +} diff --git a/hw/darwin/apple/X11Application.h b/hw/darwin/apple/X11Application.h new file mode 100644 index 000000000..fb153e750 --- /dev/null +++ b/hw/darwin/apple/X11Application.h @@ -0,0 +1,104 @@ +/* X11Application.h -- subclass of NSApplication to multiplex events + $Id: X11Application.h,v 1.26 2003/08/08 19:16:13 jharper Exp $ + + Copyright (c) 2002-2007 Apple Inc. All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization. */ + +#ifndef X11APPLICATION_H +#define X11APPLICATION_H 1 + +#if __OBJC__ + +#import +#import "X11Controller.h" + +@interface X11Application : NSApplication { + X11Controller *_controller; + + unsigned int _x_active :1; +} + +- (void) set_controller:controller; +- (void) set_window_menu:(NSArray *)list; + +- (int) prefs_get_integer:(NSString *)key default:(int)def; +- (const char *) prefs_get_string:(NSString *)key default:(const char *)def; +- (float) prefs_get_float:(NSString *)key default:(float)def; +- (int) prefs_get_boolean:(NSString *)key default:(int)def; +- (NSArray *) prefs_get_array:(NSString *)key; +- (void) prefs_set_integer:(NSString *)key value:(int)value; +- (void) prefs_set_float:(NSString *)key value:(float)value; +- (void) prefs_set_boolean:(NSString *)key value:(int)value; +- (void) prefs_set_array:(NSString *)key value:(NSArray *)value; +- (void) prefs_set_string:(NSString *)key value:(NSString *)value; +- (void) prefs_synchronize; + +- (BOOL) x_active; + +@end + +extern X11Application *X11App; + +#endif /* __OBJC__ */ + +extern void X11ApplicationSetWindowMenu (int nitems, const char **items, + const char *shortcuts); +extern void X11ApplicationSetWindowMenuCheck (int idx); +extern void X11ApplicationSetFrontProcess (void); +extern void X11ApplicationSetCanQuit (int state); +extern void X11ApplicationServerReady (void); +extern void X11ApplicationShowHideMenubar (int state); + +extern void X11ApplicationMain (int argc, const char *argv[], + void (*server_thread) (void *), + void *server_arg); + +extern int X11EnableKeyEquivalents; +extern int quartzHasRoot, quartzEnableRootless; + +#define APP_PREFS "org.x.X11" + +#define PREFS_APPSMENU "apps_menu" +#define PREFS_FAKEBUTTONS "enable_fake_buttons" +#define PREFS_SYSBEEP "enable_system_beep" +#define PREFS_KEYEQUIVS "enable_key_equivalents" +#define PREFS_KEYMAP_FILE "keymap_file" +#define PREFS_SYNC_KEYMAP "sync_keymap" +#define PREFS_DEPTH "depth" +#define PREFS_NO_AUTH "no_auth" +#define PREFS_NO_TCP "nolisten_tcp" +#define PREFS_DONE_XINIT_CHECK "done_xinit_check" +#define PREFS_NO_QUIT_ALERT "no_quit_alert" +#define PREFS_FAKE_BUTTON2 "fake_button2" +#define PREFS_FAKE_BUTTON3 "fake_button3" +#define PREFS_ROOTLESS "rootless" +#define PREFS_FULLSCREEN_HOTKEYS "fullscreen_hotkeys" +#define PREFS_SWAP_ALT_META "swap_alt_meta" +#define PREFS_XP_OPTIONS "xp_options" +#define PREFS_ENABLE_STEREO "enable_stereo" + +#endif /* X11APPLICATION_H */ diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m new file mode 100644 index 000000000..9ae470e46 --- /dev/null +++ b/hw/darwin/apple/X11Application.m @@ -0,0 +1,1131 @@ +/* X11Application.m -- subclass of NSApplication to multiplex events + + Copyright (c) 2002-2007 Apple Inc. All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization. */ + +#include "../quartz/quartzCommon.h" + +#import "X11Application.h" +#include + +/* ouch! */ +#define BOOL X_BOOL +//# include "Xproto.h" +# include "darwin.h" +# include "../quartz/quartz.h" +# define _APPLEWM_SERVER_ +# include "X11/extensions/applewm.h" +//# include "X.h" +# include "micmap.h" +#undef BOOL + +#include "xf86Version.h" + +#include +#include +#include + +#define DEFAULTS_FILE "/usr/X11/lib/X11/xserver/Xquartz.plist" + +int X11EnableKeyEquivalents = TRUE; +int quartzHasRoot = FALSE, quartzEnableRootless = TRUE; + +extern int darwinFakeButtons; +extern Bool enable_stereo; + +X11Application *X11App; + +#define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask \ +| NSAlternateKeyMask | NSCommandKeyMask) + +@implementation X11Application + +typedef struct message_struct message; +struct message_struct { + mach_msg_header_t hdr; + SEL selector; + NSObject *arg; +}; + +static mach_port_t _port; + +static void send_nsevent (NSEventType type, NSEvent *e); + +/* Quartz mode initialization routine. This is often dynamically loaded + but is statically linked into this X server. */ +extern Bool QuartzModeBundleInit(void); + +static void +init_ports (void) +{ + kern_return_t r; + NSPort *p; + + if (_port != MACH_PORT_NULL) + return; + + r = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE, &_port); + if (r != KERN_SUCCESS) + return; + + p = [NSMachPort portWithMachPort:_port]; + [p setDelegate:NSApp]; + [p scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; +} + +static void +message_kit_thread (SEL selector, NSObject *arg) +{ + message msg; + kern_return_t r; + + msg.hdr.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, 0); + msg.hdr.msgh_size = sizeof (msg); + msg.hdr.msgh_remote_port = _port; + msg.hdr.msgh_local_port = MACH_PORT_NULL; + msg.hdr.msgh_reserved = 0; + msg.hdr.msgh_id = 0; + + msg.selector = selector; + msg.arg = [arg retain]; + + r = mach_msg (&msg.hdr, MACH_SEND_MSG, msg.hdr.msgh_size, + 0, MACH_PORT_NULL, 0, MACH_PORT_NULL); + if (r != KERN_SUCCESS) + fprintf (stderr, "%s: mach_msg failed: %x\n", __FUNCTION__, r); +} + +- (void) handleMachMessage:(void *)_msg +{ + message *msg = _msg; + + [self performSelector:msg->selector withObject:msg->arg]; + [msg->arg release]; +} + +- (void) set_controller:obj +{ + if (_controller == nil) + _controller = [obj retain]; +} + +- (void) dealloc +{ + if (_controller != nil) + [_controller release]; + + if (_port != MACH_PORT_NULL) + mach_port_deallocate (mach_task_self (), _port); + + [super dealloc]; +} + +- (void) orderFrontStandardAboutPanel: (id) sender +{ + NSMutableDictionary *dict; + NSDictionary *infoDict; + NSString *tem; + + dict = [NSMutableDictionary dictionaryWithCapacity:2]; + infoDict = [[NSBundle mainBundle] infoDictionary]; + + [dict setObject: NSLocalizedString (@"The X Window System", @"About panel") + forKey:@"ApplicationName"]; + + tem = [infoDict objectForKey:@"CFBundleShortVersionString"]; + + [dict setObject:[NSString stringWithFormat:@"X11.app %@ - X.org X11R7.2", + tem] forKey:@"ApplicationVersion"]; + + [self orderFrontStandardAboutPanelWithOptions: dict]; +} + +- (void) activateX:(BOOL)state +{ + /* Create a TSM document that supports full Unicode input, and + have it activated while X is active (unless using the old + keymapping files) */ + static TSMDocumentID x11_document; + + if (state) + { + QuartzMessageServerThread (kXDarwinActivate, 0); + + if (!_x_active) + { + if (x11_document == 0 && darwinKeymapFile == NULL) + { + OSType types[1]; + types[0] = kUnicodeDocument; + NewTSMDocument (1, types, &x11_document, 0); + } + + if (x11_document != 0) + ActivateTSMDocument (x11_document); + } + } + else + { + QuartzMessageServerThread (kXDarwinDeactivate, 0); + + if (_x_active) + { + if (x11_document != 0) + DeactivateTSMDocument (x11_document); + } + } + + _x_active = state; +} + +- (void) became_key:(NSWindow *)win +{ + [self activateX:NO]; +} + +- (void) sendEvent:(NSEvent *)e +{ + NSEventType type; + BOOL for_appkit, for_x; + + type = [e type]; + + /* By default pass down the responder chain and to X. */ + for_appkit = YES; + for_x = YES; + + switch (type) + { + case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown: + case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp: + if ([e window] != nil) + { + /* Pointer event has a window. Probably something for the kit. */ + + for_x = NO; + + if (_x_active) + [self activateX:NO]; + } + else if ([self modalWindow] == nil) + { + /* Must be an X window. Tell appkit it doesn't have focus. */ + + for_appkit = NO; + + if ([self isActive]) + { + [self deactivate]; + + if (!_x_active && quartzProcs->IsX11Window([e window], + [e windowNumber])) + [self activateX:YES]; + } + } + break; + + case NSKeyDown: case NSKeyUp: + if (_x_active) + { + static int swallow_up; + + /* No kit window is focused, so send it to X. */ + + for_appkit = NO; + + if (type == NSKeyDown) + { + /* Before that though, see if there are any global + shortcuts bound to it. */ + + if (X11EnableKeyEquivalents + && [[self mainMenu] performKeyEquivalent:e]) + { + swallow_up = [e keyCode]; + for_x = NO; + } + else if (!quartzEnableRootless + && ([e modifierFlags] & ALL_KEY_MASKS) + == (NSCommandKeyMask | NSAlternateKeyMask) + && ([e keyCode] == 0 /*a*/ + || [e keyCode] == 53 /*Esc*/)) + { + swallow_up = 0; + for_x = NO; +#ifdef DARWIN_DDX_MISSING + QuartzMessageServerThread (kXDarwinToggleFullscreen, 0); +#endif + } + } + else + { + /* If we saw a key equivalent on the down, don't pass + the up through to X. */ + + if (swallow_up != 0 && [e keyCode] == swallow_up) + { + swallow_up = 0; + for_x = NO; + } + } + } + else + { + for_x = NO; + } + break; + + case NSFlagsChanged: + /* For the l33t X users who remap modifier keys to normal keysyms. */ + if (!_x_active) + for_x = NO; + break; + + case NSAppKitDefined: + switch ([e subtype]) + { + case NSApplicationActivatedEventType: + for_x = NO; + if ([self modalWindow] == nil) + { + for_appkit = NO; + + /* FIXME: hack to avoid having to pass the event to appkit, + which would cause it to raise one of its windows. */ + _appFlags._active = YES; + + [self activateX:YES]; + if ([e data2] & 0x10) X11ApplicationSetFrontProcess(); + } + break; + + case 18: /* ApplicationDidReactivate */ + if (quartzHasRoot) + for_appkit = NO; + break; + + case NSApplicationDeactivatedEventType: + for_x = NO; + [self activateX:NO]; + break; + } + break; + + default: break; /* for gcc */ + } + + if (for_appkit) + [super sendEvent:e]; + + if (for_x) + send_nsevent (type, e); +} + +- (void) set_window_menu:(NSArray *)list +{ + [_controller set_window_menu:list]; +} + +- (void) set_window_menu_check:(NSNumber *)n +{ + [_controller set_window_menu_check:n]; +} + +- (void) set_apps_menu:(NSArray *)list +{ + [_controller set_apps_menu:list]; +} + +- (void) set_front_process:unused +{ + [NSApp activateIgnoringOtherApps:YES]; + + if ([self modalWindow] == nil) + [self activateX:YES]; +} + +- (void) set_can_quit:(NSNumber *)state +{ + [_controller set_can_quit:[state boolValue]]; +} + +- (void) server_ready:unused +{ + [_controller server_ready]; +} + +- (void) show_hide_menubar:(NSNumber *)state +{ + if ([state boolValue]) + ShowMenuBar (); + else + HideMenuBar (); +} + + +/* user preferences */ + +/* Note that these functions only work for arrays whose elements + can be toll-free-bridged between NS and CF worlds. */ + +static const void *cfretain (CFAllocatorRef a, const void *b) { + return CFRetain (b); +} + +static void cfrelease (CFAllocatorRef a, const void *b) { + CFRelease (b); +} + +static CFMutableArrayRef +nsarray_to_cfarray (NSArray *in) +{ + CFMutableArrayRef out; + CFArrayCallBacks cb; + NSObject *ns; + const CFTypeRef *cf; + int i, count; + + memset (&cb, 0, sizeof (cb)); + cb.version = 0; + cb.retain = cfretain; + cb.release = cfrelease; + + count = [in count]; + out = CFArrayCreateMutable (NULL, count, &cb); + + for (i = 0; i < count; i++) + { + ns = [in objectAtIndex:i]; + + if ([ns isKindOfClass:[NSArray class]]) + cf = (CFTypeRef) nsarray_to_cfarray ((NSArray *) ns); + else + cf = CFRetain ((CFTypeRef) ns); + + CFArrayAppendValue (out, cf); + CFRelease (cf); + } + + return out; +} +static NSMutableArray * +cfarray_to_nsarray (CFArrayRef in) +{ + NSMutableArray *out; + const CFTypeRef *cf; + NSObject *ns; + int i, count; + + count = CFArrayGetCount (in); + out = [[NSMutableArray alloc] initWithCapacity:count]; + + for (i = 0; i < count; i++) + { + cf = CFArrayGetValueAtIndex (in, i); + + if (CFGetTypeID (cf) == CFArrayGetTypeID ()) + ns = cfarray_to_nsarray ((CFArrayRef) cf); + else + ns = [(id)cf retain]; + + [out addObject:ns]; + [ns release]; + } + + return out; +} + +- (CFPropertyListRef) prefs_get:(NSString *)key +{ + CFPropertyListRef value; + + value = CFPreferencesCopyAppValue ((CFStringRef) key, CFSTR (APP_PREFS)); + + if (value == NULL) + { + static CFDictionaryRef defaults; + + if (defaults == NULL) + { + CFStringRef error = NULL; + CFDataRef data; + CFURLRef url; + SInt32 error_code; + + url = (CFURLCreateFromFileSystemRepresentation + (NULL, (unsigned char *)DEFAULTS_FILE, strlen (DEFAULTS_FILE), false)); + if (CFURLCreateDataAndPropertiesFromResource (NULL, url, &data, + NULL, NULL, + &error_code)) + { + defaults = (CFPropertyListCreateFromXMLData + (NULL, data, kCFPropertyListMutableContainersAndLeaves, &error)); + if (error != NULL) + CFRelease (error); + CFRelease (data); + } + CFRelease (url); + + if (defaults != NULL) + { + NSMutableArray *apps, *elt; + int count, i; + NSString *name, *nname; + + /* Localize the names in the default apps menu. */ + + apps = [(NSDictionary *)defaults objectForKey:@PREFS_APPSMENU]; + if (apps != nil) + { + count = [apps count]; + for (i = 0; i < count; i++) + { + elt = [apps objectAtIndex:i]; + if (elt != nil && [elt isKindOfClass:[NSArray class]]) + { + name = [elt objectAtIndex:0]; + if (name != nil) + { + nname = NSLocalizedString (name, nil); + if (nname != nil && nname != name) + [elt replaceObjectAtIndex:0 withObject:nname]; + } + } + } + } + } + } + + if (defaults != NULL) + value = CFDictionaryGetValue (defaults, key); + + if (value != NULL) + CFRetain (value); + } + + return value; +} + +- (int) prefs_get_integer:(NSString *)key default:(int)def +{ + CFPropertyListRef value; + int ret; + + value = [self prefs_get:key]; + + if (value != NULL && CFGetTypeID (value) == CFNumberGetTypeID ()) + CFNumberGetValue (value, kCFNumberIntType, &ret); + else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) + ret = CFStringGetIntValue (value); + else + ret = def; + + if (value != NULL) + CFRelease (value); + + return ret; +} + +- (const char *) prefs_get_string:(NSString *)key default:(const char *)def +{ + CFPropertyListRef value; + const char *ret = NULL; + + value = [self prefs_get:key]; + + if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) + { + NSString *s = (NSString *) value; + + ret = [s UTF8String]; + } + + if (value != NULL) + CFRelease (value); + + return ret != NULL ? ret : def; +} + +- (float) prefs_get_float:(NSString *)key default:(float)def +{ + CFPropertyListRef value; + float ret = def; + + value = [self prefs_get:key]; + + if (value != NULL + && CFGetTypeID (value) == CFNumberGetTypeID () + && CFNumberIsFloatType (value)) + { + CFNumberGetValue (value, kCFNumberFloatType, &ret); + } + else if (value != NULL && CFGetTypeID (value) == CFStringGetTypeID ()) + { + ret = CFStringGetDoubleValue (value); + } + + if (value != NULL) + CFRelease (value); + + return ret; +} + +- (int) prefs_get_boolean:(NSString *)key default:(int)def +{ + CFPropertyListRef value; + int ret = def; + + value = [self prefs_get:key]; + + if (value != NULL) + { + if (CFGetTypeID (value) == CFNumberGetTypeID ()) + CFNumberGetValue (value, kCFNumberIntType, &ret); + else if (CFGetTypeID (value) == CFBooleanGetTypeID ()) + ret = CFBooleanGetValue (value); + else if (CFGetTypeID (value) == CFStringGetTypeID ()) + { + const char *tem = [(NSString *) value lossyCString]; + if (strcasecmp (tem, "true") == 0 || strcasecmp (tem, "yes") == 0) + ret = YES; + else + ret = NO; + } + + CFRelease (value); + } + + return ret; +} + +- (NSArray *) prefs_get_array:(NSString *)key +{ + NSArray *ret = nil; + CFPropertyListRef value; + + value = [self prefs_get:key]; + + if (value != NULL) + { + if (CFGetTypeID (value) == CFArrayGetTypeID ()) + ret = [cfarray_to_nsarray (value) autorelease]; + + CFRelease (value); + } + + return ret; +} + +- (void) prefs_set_integer:(NSString *)key value:(int)value +{ + CFNumberRef x; + + x = CFNumberCreate (NULL, kCFNumberIntType, &value); + + CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, CFSTR (APP_PREFS), + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + + CFRelease (x); +} + +- (void) prefs_set_float:(NSString *)key value:(float)value +{ + CFNumberRef x; + + x = CFNumberCreate (NULL, kCFNumberFloatType, &value); + + CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) x, CFSTR (APP_PREFS), + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + + CFRelease (x); +} + +- (void) prefs_set_boolean:(NSString *)key value:(int)value +{ + CFPreferencesSetValue ((CFStringRef) key, + (CFTypeRef) value ? kCFBooleanTrue + : kCFBooleanFalse, CFSTR (APP_PREFS), + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + +} + +- (void) prefs_set_array:(NSString *)key value:(NSArray *)value +{ + CFArrayRef cfarray; + + cfarray = nsarray_to_cfarray (value); + CFPreferencesSetValue ((CFStringRef) key, + (CFTypeRef) cfarray, + CFSTR (APP_PREFS), + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + CFRelease (cfarray); +} + +- (void) prefs_set_string:(NSString *)key value:(NSString *)value +{ + CFPreferencesSetValue ((CFStringRef) key, (CFTypeRef) value, + CFSTR (APP_PREFS), kCFPreferencesCurrentUser, + kCFPreferencesAnyHost); +} + +- (void) prefs_synchronize +{ + CFPreferencesAppSynchronize (kCFPreferencesCurrentApplication); +} + +- (void) read_defaults +{ + const char *tem; + + quartzUseSysBeep = [self prefs_get_boolean:@PREFS_SYSBEEP + default:quartzUseSysBeep]; + quartzEnableRootless = [self prefs_get_boolean:@PREFS_ROOTLESS + default:quartzEnableRootless]; +#ifdef DARWIN_DDX_MISSING + quartzFullscreenDisableHotkeys = ![self prefs_get_boolean: + @PREFS_FULLSCREEN_HOTKEYS default: + !quartzFullscreenDisableHotkeys]; + quartzXpluginOptions = [self prefs_get_integer:@PREFS_XP_OPTIONS + default:quartzXpluginOptions]; +#endif + + darwinSwapAltMeta = [self prefs_get_boolean:@PREFS_SWAP_ALT_META + default:darwinSwapAltMeta]; + darwinFakeButtons = [self prefs_get_boolean:@PREFS_FAKEBUTTONS + default:darwinFakeButtons]; + if (darwinFakeButtons) + { + const char *fake2, *fake3; + + fake2 = [self prefs_get_string:@PREFS_FAKE_BUTTON2 default:NULL]; + fake3 = [self prefs_get_string:@PREFS_FAKE_BUTTON3 default:NULL]; + + if (fake2 != NULL) darwinFakeMouse2Mask = DarwinParseModifierList(fake2); + if (fake3 != NULL) darwinFakeMouse3Mask = DarwinParseModifierList(fake3); + + } + + X11EnableKeyEquivalents = [self prefs_get_boolean:@PREFS_KEYEQUIVS + default:X11EnableKeyEquivalents]; + + darwinSyncKeymap = [self prefs_get_boolean:@PREFS_SYNC_KEYMAP + default:darwinSyncKeymap]; + + tem = [self prefs_get_string:@PREFS_KEYMAP_FILE default:NULL]; + if (tem != NULL) + darwinKeymapFile = strdup (tem); + else + darwinKeymapFile = NULL; + + darwinDesiredDepth = [self prefs_get_integer:@PREFS_DEPTH + default:darwinDesiredDepth]; + + enable_stereo = [self prefs_get_boolean:@PREFS_ENABLE_STEREO + default:false]; +} + +/* This will end up at the end of the responder chain. */ +- (void) copy:sender +{ + QuartzMessageServerThread (kXDarwinPasteboardNotify, 1, + AppleWMCopyToPasteboard); +} + +- (BOOL) x_active +{ + return _x_active; +} + +@end + +static NSArray * +array_with_strings_and_numbers (int nitems, const char **items, + const char *numbers) +{ + NSMutableArray *array, *subarray; + NSString *string; + NSString *number; + int i; + + /* (Can't autorelease on the X server thread) */ + + array = [[NSMutableArray alloc] initWithCapacity:nitems]; + + for (i = 0; i < nitems; i++) + { + subarray = [[NSMutableArray alloc] initWithCapacity:2]; + + string = [[NSString alloc] initWithUTF8String:items[i]]; + [subarray addObject:string]; + [string release]; + + if (numbers[i] != 0) + { + number = [[NSString alloc] initWithFormat:@"%d", numbers[i]]; + [subarray addObject:number]; + [number release]; + } + else + [subarray addObject:@""]; + + [array addObject:subarray]; + [subarray release]; + } + + return array; +} + +void +X11ApplicationSetWindowMenu (int nitems, const char **items, + const char *shortcuts) +{ + NSArray *array; + array = array_with_strings_and_numbers (nitems, items, shortcuts); + + /* Send the array of strings over to the appkit thread */ + + message_kit_thread (@selector (set_window_menu:), array); + [array release]; +} + +void +X11ApplicationSetWindowMenuCheck (int idx) +{ + NSNumber *n; + + n = [[NSNumber alloc] initWithInt:idx]; + + message_kit_thread (@selector (set_window_menu_check:), n); + + [n release]; +} + +void +X11ApplicationSetFrontProcess (void) +{ + message_kit_thread (@selector (set_front_process:), nil); +} + +void +X11ApplicationSetCanQuit (int state) +{ + NSNumber *n; + + n = [[NSNumber alloc] initWithBool:state]; + + message_kit_thread (@selector (set_can_quit:), n); + + [n release]; +} + +void +X11ApplicationServerReady (void) +{ + message_kit_thread (@selector (server_ready:), nil); +} + +void +X11ApplicationShowHideMenubar (int state) +{ + NSNumber *n; + + n = [[NSNumber alloc] initWithBool:state]; + + message_kit_thread (@selector (show_hide_menubar:), n); + + [n release]; +} + +static void * +create_thread (void *func, void *arg) +{ + pthread_attr_t attr; + pthread_t tid; + + pthread_attr_init (&attr); + + pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); + pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + + pthread_create (&tid, &attr, func, arg); + + pthread_attr_destroy (&attr); + + return (void *) tid; +} + +static void +check_xinitrc (void) +{ + char *tem, buf[1024]; + NSString *msg; + + if ([X11App prefs_get_boolean:@PREFS_DONE_XINIT_CHECK default:NO]) + return; + + tem = getenv ("HOME"); + if (tem == NULL) + goto done; + + snprintf (buf, sizeof (buf), "%s/.xinitrc", tem); + if (access (buf, F_OK) != 0) + goto done; + + /* FIXME: put localized strings into Resources/English.lproj */ + + msg = NSLocalizedString ( + @"You have an existing ~/.xinitrc file.\n\n\ + Windows displayed by X11 applications may not have titlebars, or may look \ + different to windows displayed by native applications.\n\n\ + Would you like to move aside the existing file and use the standard X11 \ + environment?", @"Startup xinitrc dialog"); + + if (NSRunAlertPanel (nil, msg, NSLocalizedString (@"Yes", @""), + NSLocalizedString (@"No", @""), nil) + == NSAlertDefaultReturn) + { + char buf2[1024]; + int i = -1; + + snprintf (buf2, sizeof (buf2), "%s.old", buf); + + for (i = 1; access (buf2, F_OK) == 0; i++) + snprintf (buf2, sizeof (buf2), "%s.old.%d", buf, i); + + rename (buf, buf2); + } + + done: + [X11App prefs_set_boolean:@PREFS_DONE_XINIT_CHECK value:YES]; + [X11App prefs_synchronize]; +} + +void +X11ApplicationMain (int argc, const char *argv[], + void (*server_thread) (void *), void *server_arg) +{ + NSAutoreleasePool *pool; + +#ifdef DEBUG + while (access ("/tmp/x11-block", F_OK) == 0) + sleep (1); +#endif + + pool = [[NSAutoreleasePool alloc] init]; + + X11App = (X11Application *) [X11Application sharedApplication]; + + init_ports (); + + [NSApp read_defaults]; + + [NSBundle loadNibNamed:@"main" owner:NSApp]; + + [[NSNotificationCenter defaultCenter] addObserver:NSApp + selector:@selector (became_key:) + name:NSWindowDidBecomeKeyNotification object:nil]; + + check_xinitrc (); + + /* + * The xpr Quartz mode is statically linked into this server. + * Initialize all the Quartz functions. + */ + QuartzModeBundleInit(); + + /* Calculate the height of the menubar so we can avoid it. */ + aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) - + NSMaxY([[NSScreen mainScreen] visibleFrame]) - 1; + + if (!create_thread (server_thread, server_arg)) + { + fprintf (stderr, "can't create secondary thread\n"); + exit (1); + } + + [NSApp run]; + + /* not reached */ +} + + +/* event conversion */ + +static inline unsigned short +convert_flags (unsigned int nsflags) +{ + unsigned int xflags; + + if (nsflags == ~0) return 0xffff; + + xflags = 0; + + if (nsflags & NSAlphaShiftKeyMask) xflags |= LockMask; + if (nsflags & NSShiftKeyMask) xflags |= ShiftMask; + if (nsflags & NSControlKeyMask) xflags |= ControlMask; + if (nsflags & NSAlternateKeyMask) xflags |= Mod1Mask; + if (nsflags & NSCommandKeyMask) xflags |= Mod2Mask; + /* FIXME: secondaryfn? */ + + return xflags; +} + +static void +send_nsevent (NSEventType type, NSEvent *e) +{ + static unsigned int button_state = 0; + NSRect screen; + NSPoint location; + NSWindow *window; + int pointer_x, pointer_y; + xEvent xe; + + memset (&xe, 0, sizeof (xe)); + + /* This field should be filled in for every event */ + xe.u.keyButtonPointer.time = GetTimeInMillis(); + + /* convert location to global top-left coordinates */ + location = [e locationInWindow]; + window = [e window]; + screen = [[[NSScreen screens] objectAtIndex:0] frame]; + + if (window != nil) { + NSRect frame = [window frame]; + pointer_x = location.x + frame.origin.x; + pointer_y = (((screen.origin.y + screen.size.height) + - location.y) - frame.origin.y); + } else { + pointer_x = location.x; + pointer_y = (screen.origin.y + screen.size.height) - location.y; + } + + xe.u.keyButtonPointer.rootX = pointer_x; + xe.u.keyButtonPointer.rootY = pointer_y; + + switch (type) { + float count; + + case NSLeftMouseDown: + xe.u.u.type = ButtonPress; + xe.u.u.detail = 1; + goto do_press_event; + + case NSRightMouseDown: + xe.u.u.type = ButtonPress; + xe.u.u.detail = 3; + goto do_press_event; + + case NSOtherMouseDown: + xe.u.u.type = ButtonPress; + xe.u.u.detail = 2; /* FIXME? */ + goto do_press_event; + +do_press_event: + if (!quartzProcs->IsX11Window([e window], [e windowNumber])) { + /* X server doesn't grok this window, drop the event. + + Note: theoretically this isn't necessary, but if I click + on the menubar, we get sent a LeftMouseDown when the + release happens, but no LeftMouseUp is ever seen! */ + + break; + } + goto do_event; + + case NSLeftMouseUp: + xe.u.u.type = ButtonRelease; + xe.u.u.detail = 1; + goto do_release_event; + + case NSRightMouseUp: + xe.u.u.type = ButtonRelease; + xe.u.u.detail = 3; + goto do_release_event; + + case NSOtherMouseUp: + xe.u.u.type = ButtonRelease; + xe.u.u.detail = 2; /* FIXME? */ + goto do_release_event; + +do_release_event: + if ((button_state & (1 << xe.u.u.detail)) == 0) + { + /* X didn't see the button press for this release, so skip it */ + break; + } + goto do_event; + + case NSMouseMoved: + case NSLeftMouseDragged: + case NSRightMouseDragged: + case NSOtherMouseDragged: + xe.u.u.type = MotionNotify; + goto do_event; + + case NSKeyDown: + xe.u.u.type = KeyPress; + xe.u.u.detail = [e keyCode]; + goto do_event; + + case NSKeyUp: + xe.u.u.type = KeyRelease; + xe.u.u.detail = [e keyCode]; + goto do_event; + + case NSScrollWheel: + xe.u.keyButtonPointer.state = convert_flags ([e modifierFlags]); + count = [e deltaY]; + xe.u.u.detail = count > 0.0f ? 4 : 5; + for (count = fabs(count); count > 0.0; count = count - 1.0f) { + xe.u.u.type = ButtonPress; + DarwinEQEnqueue(&xe); + xe.u.u.type = ButtonRelease; + DarwinEQEnqueue(&xe); + } + xe.u.u.type = 0; + break; + + case NSFlagsChanged: + xe.u.u.type = kXDarwinUpdateModifiers; + xe.u.clientMessage.u.l.longs0 = [e modifierFlags]; + DarwinEQEnqueue (&xe); + break; + +do_event: + // xe.u.keyButtonPointer.state = convert_flags ([e modifierFlags]); + DarwinEQEnqueue (&xe); + break; + + default: break; /* for gcc */ + } + + if (xe.u.u.type == ButtonPress) + button_state |= (1 << xe.u.u.detail); + else if (xe.u.u.type == ButtonRelease) + button_state &= ~(1 << xe.u.u.detail); +} diff --git a/hw/darwin/apple/X11Controller.h b/hw/darwin/apple/X11Controller.h new file mode 100644 index 000000000..954d0abb9 --- /dev/null +++ b/hw/darwin/apple/X11Controller.h @@ -0,0 +1,86 @@ +/* X11Controller.h -- connect the IB ui + $Id: X11Controller.h,v 1.21 2003/07/24 17:52:29 jharper Exp $ + + Copyright (c) 2002 Apple Computer, Inc. All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization. */ + +#ifndef X11CONTROLLER_H +#define X11CONTROLLER_H 1 + +#if __OBJC__ + +#import +#include "../quartz/xpr/x-list.h" + +@interface X11Controller : NSObject +{ + NSPanel *prefs_panel; + + NSButton *fake_buttons; + NSButton *enable_fullscreen; + NSButton *use_sysbeep; + NSButton *enable_keyequivs; + NSButton *sync_keymap; + NSButton *enable_auth; + NSButton *enable_tcp; + NSPopUpButton *depth; + + NSMenuItem *x11_about_item; + NSMenuItem *window_separator; + NSMenuItem *dock_window_separator; + NSMenuItem *apps_separator; + NSMenuItem *toggle_fullscreen_item; + NSMenu *dock_apps_menu; + NSTableView *apps_table; + + NSArray *apps; + NSMutableArray *table_apps; + + NSMenu *dock_menu; + + int checked_window_item; + x_list *pending_apps; + + BOOL finished_launching; + BOOL can_quit; +} + +- (void) set_window_menu:(NSArray *)list; +- (void) set_window_menu_check:(NSNumber *)n; +- (void) set_apps_menu:(NSArray *)list; +- (void) set_can_quit:(BOOL)state; +- (void) server_ready; + +@end + +#endif /* __OBJC__ */ + +extern void X11ControllerMain (int argc, const char *argv[], + void (*server_thread) (void *), + void *server_arg); + +#endif /* X11CONTROLLER_H */ diff --git a/hw/darwin/apple/X11Controller.m b/hw/darwin/apple/X11Controller.m new file mode 100644 index 000000000..cc039b115 --- /dev/null +++ b/hw/darwin/apple/X11Controller.m @@ -0,0 +1,748 @@ +/* X11Controller.m -- connect the IB ui, also the NSApp delegate + $Id: X11Controller.m,v 1.40 2006/09/06 21:19:32 jharper Exp $ + + Copyright (c) 2002-2007 Apple Inc. All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization. */ + +#define DEFAULT_PATH "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11/bin" + +#include "../quartz/quartzCommon.h" + +#import "X11Controller.h" +#import "X11Application.h" +#import + +/* ouch! */ +#define BOOL X_BOOL +//# include "Xproto.h" +#include "opaque.h" +# include "darwin.h" +# include "../quartz/quartz.h" +# define _APPLEWM_SERVER_ +# include "X11/extensions/applewm.h" +# include "../quartz/applewmExt.h" +//# include "X.h" +#undef BOOL + +#include +#include +#include +#include +#include + +#define TRACE() fprintf (stderr, "%s\n", __FUNCTION__) + +@implementation X11Controller + +- (void) awakeFromNib +{ + X11Application *xapp = NSApp; + NSArray *array; + + /* Point X11Application at ourself. */ + [xapp set_controller:self]; + + array = [xapp prefs_get_array:@PREFS_APPSMENU]; + if (array != nil) + { + int count; + + /* convert from [TITLE1 COMMAND1 TITLE2 COMMAND2 ...] + to [[TITLE1 COMMAND1] [TITLE2 COMMAND2] ...] format. */ + + count = [array count]; + if (count > 0 + && ![[array objectAtIndex:0] isKindOfClass:[NSArray class]]) + { + int i; + NSMutableArray *copy, *sub; + + copy = [NSMutableArray arrayWithCapacity:(count / 2)]; + + for (i = 0; i < count / 2; i++) + { + sub = [[NSMutableArray alloc] initWithCapacity:3]; + [sub addObject:[array objectAtIndex:i*2]]; + [sub addObject:[array objectAtIndex:i*2+1]]; + [sub addObject:@""]; + [copy addObject:sub]; + [sub release]; + } + + array = copy; + } + + [self set_apps_menu:array]; + } +} + +- (void) item_selected:sender +{ + [NSApp activateIgnoringOtherApps:YES]; + + QuartzMessageServerThread (kXDarwinControllerNotify, 2, + AppleWMWindowMenuItem, [sender tag]); +} + +- (void) remove_window_menu +{ + NSMenu *menu; + int first, count, i; + + /* Work backwards so we don't mess up the indices */ + menu = [window_separator menu]; + first = [menu indexOfItem:window_separator] + 1; + count = [menu numberOfItems]; + for (i = count - 1; i >= first; i--) + [menu removeItemAtIndex:i]; + + menu = [dock_window_separator menu]; + count = [menu indexOfItem:dock_window_separator]; + for (i = 0; i < count; i++) + [dock_menu removeItemAtIndex:0]; +} + +- (void) install_window_menu:(NSArray *)list +{ + NSMenu *menu; + NSMenuItem *item; + int first, count, i; + + menu = [window_separator menu]; + first = [menu indexOfItem:window_separator] + 1; + count = [list count]; + for (i = 0; i < count; i++) + { + NSString *name, *shortcut; + + name = [[list objectAtIndex:i] objectAtIndex:0]; + shortcut = [[list objectAtIndex:i] objectAtIndex:1]; + + item = (NSMenuItem *) [menu addItemWithTitle:name action:@selector + (item_selected:) keyEquivalent:shortcut]; + [item setTarget:self]; + [item setTag:i]; + [item setEnabled:YES]; + + item = (NSMenuItem *) [dock_menu insertItemWithTitle:name + action:@selector + (item_selected:) keyEquivalent:shortcut + atIndex:i]; + [item setTarget:self]; + [item setTag:i]; + [item setEnabled:YES]; + } + + if (checked_window_item >= 0 && checked_window_item < count) + { + item = (NSMenuItem *) [menu itemAtIndex:first + checked_window_item]; + [item setState:NSOnState]; + item = (NSMenuItem *) [dock_menu itemAtIndex:checked_window_item]; + [item setState:NSOnState]; + } +} + +- (void) remove_apps_menu +{ + NSMenu *menu; + NSMenuItem *item; + int i; + + if (apps == nil || apps_separator == nil) return; + + menu = [apps_separator menu]; + + if (menu != nil) + { + for (i = [menu numberOfItems] - 1; i >= 0; i--) + { + item = (NSMenuItem *) [menu itemAtIndex:i]; + if ([item tag] != 0) + [menu removeItemAtIndex:i]; + } + } + + if (dock_apps_menu != nil) + { + for (i = [dock_apps_menu numberOfItems] - 1; i >= 0; i--) + { + item = (NSMenuItem *) [dock_apps_menu itemAtIndex:i]; + if ([item tag] != 0) + [dock_apps_menu removeItemAtIndex:i]; + } + } + + [apps release]; + apps = nil; +} + +- (void) prepend_apps_item:(NSArray *)list index:(int)i menu:(NSMenu *)menu +{ + NSString *title, *shortcut = @""; + NSArray *group; + NSMenuItem *item; + + group = [list objectAtIndex:i]; + title = [group objectAtIndex:0]; + if ([group count] >= 3) + shortcut = [group objectAtIndex:2]; + + if ([title length] != 0) + { + item = (NSMenuItem *) [menu insertItemWithTitle:title + action:@selector (app_selected:) + keyEquivalent:shortcut atIndex:0]; + [item setTarget:self]; + [item setEnabled:YES]; + } + else + { + item = (NSMenuItem *) [NSMenuItem separatorItem]; + [menu insertItem:item atIndex:0]; + } + + [item setTag:i+1]; /* can't be zero, so add one */ +} + +- (void) install_apps_menu:(NSArray *)list +{ + NSMenu *menu; + int i, count; + + count = [list count]; + + if (count == 0 || apps_separator == nil) return; + + menu = [apps_separator menu]; + + for (i = count - 1; i >= 0; i--) + { + if (menu != nil) + [self prepend_apps_item:list index:i menu:menu]; + if (dock_apps_menu != nil) + [self prepend_apps_item:list index:i menu:dock_apps_menu]; + } + + apps = [list retain]; +} + +- (void) set_window_menu:(NSArray *)list +{ + [self remove_window_menu]; + [self install_window_menu:list]; + + QuartzMessageServerThread (kXDarwinControllerNotify, 1, + AppleWMWindowMenuNotify); +} + +- (void) set_window_menu_check:(NSNumber *)nn +{ + NSMenu *menu; + NSMenuItem *item; + int first, count; + int n = [nn intValue]; + + menu = [window_separator menu]; + first = [menu indexOfItem:window_separator] + 1; + count = [menu numberOfItems] - first; + + if (checked_window_item >= 0 && checked_window_item < count) + { + item = (NSMenuItem *) [menu itemAtIndex:first + checked_window_item]; + [item setState:NSOffState]; + item = (NSMenuItem *) [dock_menu itemAtIndex:checked_window_item]; + [item setState:NSOffState]; + } + if (n >= 0 && n < count) + { + item = (NSMenuItem *) [menu itemAtIndex:first + n]; + [item setState:NSOnState]; + item = (NSMenuItem *) [dock_menu itemAtIndex:n]; + [item setState:NSOnState]; + } + checked_window_item = n; +} + +- (void) set_apps_menu:(NSArray *)list +{ + [self remove_apps_menu]; + [self install_apps_menu:list]; +} + +- (void) launch_client:(NSString *)filename +{ + const char *command = [filename UTF8String]; + const char *argv[5]; + int child1, child2 = 0; + int status; + + argv[0] = "/usr/bin/login"; + argv[1] = "-fp"; + argv[2] = getlogin(); + argv[3] = command; + argv[4] = NULL; + + /* Do the fork-twice trick to avoid having to reap zombies */ + + child1 = fork(); + + switch (child1) { + case -1: /* error */ + break; + + case 0: /* child1 */ + child2 = fork(); + + switch (child2) { + int max_files, i; + char buf[1024], *temp; + + case -1: /* error */ + _exit(1); + + case 0: /* child2 */ + /* close all open files except for standard streams */ + max_files = sysconf(_SC_OPEN_MAX); + for (i = 3; i < max_files; i++) close(i); + + /* ensure stdin is on /dev/null */ + close(0); + open("/dev/null", O_RDONLY); + + /* Setup environment */ + temp = getenv("DISPLAY"); + if (temp == NULL || temp[0] == 0) { + snprintf(buf, sizeof(buf), ":%s", display); + setenv("DISPLAY", buf, TRUE); + } + + temp = getenv("PATH"); + if (temp == NULL || temp[0] == 0) + setenv ("PATH", DEFAULT_PATH, TRUE); + else if (strnstr(temp, "/usr/X11/bin", sizeof(temp)) == NULL) { + snprintf(buf, sizeof(buf), "%s:/usr/X11/bin", temp); + setenv("PATH", buf, TRUE); + } + /* cd $HOME */ + temp = getenv("HOME"); + if (temp != NULL && temp[0]!=0) chdir(temp); + + execvp(argv[0], (char **const) argv); + + _exit(2); + + default: /* parent (child1) */ + _exit(0); + } + break; + + default: /* parent */ + waitpid(child1, &status, 0); + } +} + +- (void) app_selected:sender +{ + int tag; + NSString *item; + + tag = [sender tag] - 1; + if (apps == nil || tag < 0 || tag >= [apps count]) + return; + + item = [[apps objectAtIndex:tag] objectAtIndex:1]; + + [self launch_client:item]; +} + +- (IBAction) apps_table_show:sender +{ + NSArray *columns; + + if (table_apps == nil) { + table_apps = [[NSMutableArray alloc] initWithCapacity:1]; + + if (apps != nil)[table_apps addObjectsFromArray:apps]; + } + + columns = [apps_table tableColumns]; + [[columns objectAtIndex:0] setIdentifier:@"0"]; + [[columns objectAtIndex:1] setIdentifier:@"1"]; + [[columns objectAtIndex:2] setIdentifier:@"2"]; + + [apps_table setDataSource:self]; + [apps_table selectRow:0 byExtendingSelection:NO]; + + [[apps_table window] makeKeyAndOrderFront:sender]; +} + +- (IBAction) apps_table_cancel:sender +{ + [[apps_table window] orderOut:sender]; + [apps_table reloadData]; + + [table_apps release]; + table_apps = nil; +} + +- (IBAction) apps_table_done:sender +{ + [apps_table deselectAll:sender]; /* flush edits? */ + + [self remove_apps_menu]; + [self install_apps_menu:table_apps]; + + [NSApp prefs_set_array:@PREFS_APPSMENU value:table_apps]; + [NSApp prefs_synchronize]; + + [[apps_table window] orderOut:sender]; + + [table_apps release]; + table_apps = nil; +} + +- (IBAction) apps_table_new:sender +{ + NSMutableArray *item; + + int row = [apps_table selectedRow], i; + + if (row < 0) row = 0; + else row = row + 1; + + i = row; + if (i > [table_apps count]) + return; /* avoid exceptions */ + + [apps_table deselectAll:sender]; + + item = [[NSMutableArray alloc] initWithCapacity:3]; + [item addObject:@""]; + [item addObject:@""]; + [item addObject:@""]; + + [table_apps insertObject:item atIndex:i]; + [item release]; + + [apps_table reloadData]; + [apps_table selectRow:row byExtendingSelection:NO]; +} + +- (IBAction) apps_table_duplicate:sender +{ + int row = [apps_table selectedRow], i; + NSObject *item; + + if (row < 0) { + [self apps_table_new:sender]; + return; + } + + i = row; + if (i > [table_apps count] - 1) return; /* avoid exceptions */ + + [apps_table deselectAll:sender]; + + item = [[table_apps objectAtIndex:i] mutableCopy]; + [table_apps insertObject:item atIndex:i]; + [item release]; + + [apps_table reloadData]; + [apps_table selectRow:row+1 byExtendingSelection:NO]; +} + +- (IBAction) apps_table_delete:sender +{ + int row = [apps_table selectedRow]; + + if (row >= 0) + { + int i = row; + + if (i > [table_apps count] - 1) return; /* avoid exceptions */ + + [apps_table deselectAll:sender]; + + [table_apps removeObjectAtIndex:i]; + } + + [apps_table reloadData]; + + row = MIN (row, [table_apps count] - 1); + if (row >= 0) + [apps_table selectRow:row byExtendingSelection:NO]; +} + +- (int) numberOfRowsInTableView:(NSTableView *)tableView +{ + if (table_apps == nil) return 0; + + return [table_apps count]; +} + +- (id) tableView:(NSTableView *)tableView +objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row +{ + NSArray *item; + int col; + + if (table_apps == nil) return nil; + + col = [[tableColumn identifier] intValue]; + + item = [table_apps objectAtIndex:row]; + if ([item count] > col) + return [item objectAtIndex:col]; + else + return @""; +} + +- (void) tableView:(NSTableView *)tableView setObjectValue:(id)object + forTableColumn:(NSTableColumn *)tableColumn row:(int)row +{ + NSMutableArray *item; + int col; + + if (table_apps == nil) return; + + col = [[tableColumn identifier] intValue]; + + item = [table_apps objectAtIndex:row]; + [item replaceObjectAtIndex:col withObject:object]; +} + +- (void) hide_window:sender +{ + if ([X11App x_active]) + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMHideWindow); + else + NSBeep (); /* FIXME: something here */ +} + +- (IBAction)bring_to_front:sender +{ + QuartzMessageServerThread(kXDarwinControllerNotify, 1, AppleWMBringAllToFront); +} + +- (IBAction)close_window:sender +{ + if ([X11App x_active]) + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMCloseWindow); + else + [[NSApp keyWindow] performClose:sender]; +} + +- (IBAction)minimize_window:sender +{ + if ([X11App x_active]) + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMMinimizeWindow); + else + [[NSApp keyWindow] performMiniaturize:sender]; +} + +- (IBAction)zoom_window:sender +{ + if ([X11App x_active]) + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMZoomWindow); + else + [[NSApp keyWindow] performZoom:sender]; +} + +- (IBAction) next_window:sender +{ + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMNextWindow); +} + +- (IBAction) previous_window:sender +{ + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMPreviousWindow); +} + +- (IBAction) enable_fullscreen_changed:sender +{ + int value = ![enable_fullscreen intValue]; + +#ifdef DARWIN_DDX_MISSING + QuartzMessageServerThread (kXDarwinSetRootless, 1, value); +#endif + + [NSApp prefs_set_boolean:@PREFS_ROOTLESS value:value]; + [NSApp prefs_synchronize]; +} + +- (IBAction) toggle_fullscreen:sender +{ +#ifdef DARWIN_DDX_MISSING + QuartzMessageServerThread (kXDarwinToggleFullscreen, 0); +#endif +} + +- (void) set_can_quit:(BOOL)state +{ + can_quit = state; +} + +- (IBAction)prefs_changed:sender +{ + darwinFakeButtons = [fake_buttons intValue]; + quartzUseSysBeep = [use_sysbeep intValue]; + X11EnableKeyEquivalents = [enable_keyequivs intValue]; + darwinSyncKeymap = [sync_keymap intValue]; + + /* after adding prefs here, also add to [X11Application read_defaults] + and below */ + + [NSApp prefs_set_boolean:@PREFS_FAKEBUTTONS value:darwinFakeButtons]; + [NSApp prefs_set_boolean:@PREFS_SYSBEEP value:quartzUseSysBeep]; + [NSApp prefs_set_boolean:@PREFS_KEYEQUIVS value:X11EnableKeyEquivalents]; + [NSApp prefs_set_boolean:@PREFS_SYNC_KEYMAP value:darwinSyncKeymap]; + [NSApp prefs_set_boolean:@PREFS_NO_AUTH value:![enable_auth intValue]]; + [NSApp prefs_set_boolean:@PREFS_NO_TCP value:![enable_tcp intValue]]; + [NSApp prefs_set_integer:@PREFS_DEPTH value:[depth selectedTag]]; + + [NSApp prefs_synchronize]; +} + +- (IBAction) prefs_show:sender +{ + [fake_buttons setIntValue:darwinFakeButtons]; + [use_sysbeep setIntValue:quartzUseSysBeep]; + [enable_keyequivs setIntValue:X11EnableKeyEquivalents]; + [sync_keymap setIntValue:darwinSyncKeymap]; + [sync_keymap setEnabled:darwinKeymapFile == NULL]; + + [enable_auth setIntValue:![NSApp prefs_get_boolean:@PREFS_NO_AUTH default:NO]]; + [enable_tcp setIntValue:![NSApp prefs_get_boolean:@PREFS_NO_TCP default:NO]]; + [depth selectItemAtIndex:[depth indexOfItemWithTag:[NSApp prefs_get_integer:@PREFS_DEPTH default:-1]]]; + + [enable_fullscreen setIntValue:!quartzEnableRootless]; + + [prefs_panel makeKeyAndOrderFront:sender]; +} + +- (IBAction) quit:sender +{ + QuartzMessageServerThread (kXDarwinQuit, 0); +} + +- (IBAction) x11_help:sender +{ + AHLookupAnchor ((CFStringRef)NSLocalizedString(@"Mac Help", no comment), CFSTR ("mchlp2276")); +} + +- (BOOL) validateMenuItem:(NSMenuItem *)item +{ + NSMenu *menu = [item menu]; + + if (item == toggle_fullscreen_item) + return !quartzEnableRootless; + else if (menu == [window_separator menu] || menu == dock_menu + || (menu == [x11_about_item menu] && [item tag] == 42)) + return (AppleWMSelectedEvents () & AppleWMControllerNotifyMask) != 0; + else + return TRUE; +} + +- (void) applicationDidHide:(NSNotification *)notify +{ + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMHideAll); +} + +- (void) applicationDidUnhide:(NSNotification *)notify +{ + QuartzMessageServerThread (kXDarwinControllerNotify, 1, AppleWMShowAll); +} + +- (NSApplicationTerminateReply) applicationShouldTerminate:sender +{ + NSString *msg; + + if (can_quit || [X11App prefs_get_boolean:@PREFS_NO_QUIT_ALERT default:NO]) + return NSTerminateNow; + + /* Make sure we're frontmost. */ + [NSApp activateIgnoringOtherApps:YES]; + + msg = NSLocalizedString (@"Are you sure you want to quit X11?\n\nIf you quit X11, any X11 applications you are running will stop immediately and you will lose any changes you have not saved.", @"Dialog when quitting"); + + /* FIXME: safe to run the alert in here? Or should we return Later + and then run the alert on a timer? It seems to work here, so.. */ + + return (NSRunAlertPanel (nil, msg, NSLocalizedString (@"Quit", @""), + NSLocalizedString (@"Cancel", @""), nil) + == NSAlertDefaultReturn) ? NSTerminateNow : NSTerminateCancel; +} + +- (void) applicationWillTerminate:(NSNotification *)aNotification +{ + [X11App prefs_synchronize]; + + /* shutdown the X server, it will exit () for us. */ + QuartzMessageServerThread (kXDarwinQuit, 0); + + /* In case it doesn't, exit anyway after a while. */ + while (sleep (10) != 0) ; + exit (1); +} + +- (void) server_ready +{ + x_list *node; + + finished_launching = YES; + + for (node = pending_apps; node != NULL; node = node->next) + { + NSString *filename = node->data; + [self launch_client:filename]; + [filename release]; + } + + x_list_free (pending_apps); + pending_apps = NULL; +} + +- (BOOL) application:(NSApplication *)app openFile:(NSString *)filename +{ + const char *name = [filename UTF8String]; + + if (finished_launching) + [self launch_client:filename]; + else if (name[0] != ':') /* ignore display names */ + pending_apps = x_list_prepend (pending_apps, [filename retain]); + + /* FIXME: report failures. */ + return YES; +} + +@end + +void X11ControllerMain (int argc, const char *argv[], + void (*server_thread) (void *), void *server_arg) +{ + X11ApplicationMain (argc, argv, server_thread, server_arg); +} diff --git a/hw/darwin/apple/Xquartz.man b/hw/darwin/apple/Xquartz.man new file mode 100644 index 000000000..edac30ee9 --- /dev/null +++ b/hw/darwin/apple/Xquartz.man @@ -0,0 +1,158 @@ +.\" $XFree86: xc/programs/Xserver/hw/darwin/XDarwin.man,v 1.4 2002/01/09 18:01:58 torrey Exp $ +.\" +.TH XQUARTZ 1 __vendorversion__ +.SH NAME +Xquartz \- X window system server for Quartz operating system +.SH SYNOPSIS +.B Xquartz +[ options ] ... +.SH DESCRIPTION +.I Xquartz +is the X window server for Mac OS X provided by Apple. +.I Xquartz +runs in parallel with Aqua in rootless mode. In rootless mode, the X +window system and Mac OS X share your display. The root window of the +X11 display is the size of the screen and contains all the other +windows. The X11 root window is not displayed in rootless mode as Mac +OS X handles the desktop background. +.SH OPTIONS +.PP +In addition to the normal server options described in the \fIXserver(1)\fP +manual page, \fIXquartz\fP accepts the following command line switches: +.TP 8 +.B \-fakebuttons +Emulates a 3 button mouse using modifier keys. By default, the Command modifier +is used to emulate button 2 and Option is used for button 3. Thus, clicking the +first mouse button while holding down Command will act like clicking +button 2. Holding down Option will simulate button 3. +.TP 8 +.B \-nofakebuttons +Do not emulate a 3 button mouse. This is the default. +.TP 8 +.B "\-fakemouse2 \fImodifiers\fP" +Change the modifier keys used to emulate the second mouse button. By default, +Command is used to emulate the second button. Any combination of the following +modifier names may be used: Shift, Option, Control, Command, Fn. For example, +.B \-fakemouse2 """Option,Shift"" +will set holding Option, Shift and clicking on button one as equivalent to +clicking the second mouse button. +.TP 8 +.B "\-fakemouse3 \fImodifiers\fP" +Change the modifier keys used to emulate the third mouse button. By default, +Option is used to emulate the third button. Any combination of the following +modifier names may be used: Shift, Option, Control, Command, Fn. For example, +.B \-fakemouse3 """Control,Shift"" +will set holding Control, Shift and clicking on button one as equivalent to +clicking the third mouse button. +.TP 8 +.B "\-swapAltMeta" +Swaps the meaning of the Alt and Meta modifier keys. +.TP 8 +.B "\-keymap \fIfile\fP" +On startup \fIXquartz\fP translates a Darwin keymapping into an X keymap. +The default is to read this keymapping from USA.keymapping. With this option +the keymapping will be read from \fIfile\fP instead. If the file's path is +not specified, it will be searched for in Library/Keyboards/ underneath the +following directories (in order): ~, /, /Network, /System. +.TP 8 +.B \-nokeymap +On startup \fIXquartz\fP translates a Darwin keymapping into an X keymap. +With this option \fIXquartz\fP queries the kernel for the current keymapping +instead of reading it from a file. This will often fail on newer kernels. +.TP 8 +.B "\-depth \fIdepth\fP" +Specifies the color bit depth to use. Currently only 15, and 24 color +bits per pixel are supported. If not specified, defaults to the depth +of the main display. +.SH CUSTOMIZATION +\fIXquartz\fP can also be customized using the defaults(1) command. The available options are: +.TP 8 +.B defaults write com.apple.x11 enable_fake_buttons -boolean true +Equivalent to the \fB-fakebuttons\fP command line option. +.TP 8 +.B defaults write com.apple.x11 fake_button2 \fImodifiers\fP +Equivalent to the \fB-fakemouse2\fP option. +.TP 8 +.B defaults write com.apple.x11 fake_button3 \fImodifiers\fP +Equivalent to the \fB-fakemouse3\fP option. +.TP 8 +.B defaults write com.apple.x11 swap_alt_meta -boolean true +Equivalent to the \fB-swapAltMeta\fP option. +.TP 8 +.B defaults write com.apple.x11 keymap_file \fIfilename\fP +Equivalent to the \fB-keymap\fP option. +.TP 8 +.B defaults write com.apple.x11 no_quit_alert -boolean true +Disables the alert dialog displayed when attempting to quit X11. +.TP 8 +.B defaults write com.apple.x11 no_auth -boolean true +Stops the X server requiring that clients authenticate themselves when +connecting. See Xsecurity(__miscmansuffix__). +.TP 8 +.B defaults write com.apple.x11 nolisten_tcp -boolean true +Prevents the X server accepting remote connections. +.TP 8 +.B defaults write com.apple.x11 xinit_kills_server -boolean false +Stops the X server exiting when the xinitrc script terminates. +.TP 8 +.B defaults write com.apple.x11 fullscreen_hotkeys -boolean false +Allows system hotkeys to be handled while in X11 fullscreen mode. +.TP 8 +.B defaults write com.apple.x11 enable_system_beep -boolean false +Don't use the standard system beep effect for X11 alerts. +.TP 8 +.B defaults write com.apple.x11 enable_key_equivalents -boolean false +Disable menu keyboard equivalents while X11 windows are focused. +.TP 8 +.B defaults write com.apple.x11 depth \fIdepth\fP +Equivalent to the \fB-depth\fP option. +.SH "SEE ALSO" +.PP +X(__miscmansuffix__), XFree86(1), Xserver(1), xdm(1), xinit(1) +.PP +.SH AUTHORS +XFree86 was originally ported to Mac OS X Server by John Carmack. Dave +Zarzycki used this as the basis of his port of XFree86 4.0 to Darwin 1.0. +Torrey T. Lyons improved and integrated this code into the XFree86 +Project's mainline for the 4.0.2 release. +.PP +The following members of the XonX Team contributed to the following +releases (in alphabetical order): +.TP 4 +XFree86 4.1.0: +.br +Rob Braun - Darwin x86 support +.br +Torrey T. Lyons - Project Lead +.br +Andreas Monitzer - Cocoa version of XDarwin front end +.br +Gregory Robert Parker - Original Quartz implementation +.br +Christoph Pfisterer - Dynamic shared X libraries +.br +Toshimitsu Tanaka - Japanese localization +.TP 4 +XFree86 4.2.0: +.br +Rob Braun - Darwin x86 support +.br +Pablo Di Noto - Spanish localization +.br +Paul Edens - Dutch localization +.br +Kyunghwan Kim - Korean localization +.br +Mario Klebsch - Non-US keyboard support +.br +Torrey T. Lyons - Project Lead +.br +Andreas Monitzer - German localization +.br +Patrik Montgomery - Swedish localization +.br +Greg Parker - Rootless support +.br +Toshimitsu Tanaka - Japanese localization +.br +Olivier Verdier - French localization diff --git a/hw/darwin/apple/bundle-main.c b/hw/darwin/apple/bundle-main.c new file mode 100644 index 000000000..34cbcbab5 --- /dev/null +++ b/hw/darwin/apple/bundle-main.c @@ -0,0 +1,914 @@ +/* bundle-main.c -- X server launcher + + Copyright (c) 2002-2007 Apple Inc. All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization. + + Parts of this file are derived from xdm, which has this copyright: + + Copyright 1988, 1998 The Open Group + + Permission to use, copy, modify, distribute, and sell this software + and its documentation for any purpose is hereby granted without fee, + provided that the above copyright notice appear in all copies and + that both that copyright notice and this permission notice appear in + supporting documentation. + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of The Open Group shall + not be used in advertising or otherwise to promote the sale, use or + other dealings in this Software without prior written authorization + from The Open Group. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#define X_SERVER "/usr/X11/bin/Xquartz" +#define XTERM_PATH "/usr/X11/bin/xterm" +#define WM_PATH "/usr/bin/quartz-wm" +#define DEFAULT_XINITRC "/usr/X11/lib/X11/xinit/xinitrc" +#define DEFAULT_PATH "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11/bin" + +/* what xinit does */ +#ifndef SHELL +# define SHELL "sh" +#endif + +#undef FALSE +#define FALSE 0 +#undef TRUE +#define TRUE 1 + +#define MAX_DISPLAYS 64 + +static int server_pid = -1, client_pid = -1; +static int xinit_kills_server = FALSE; +static jmp_buf exit_continuation; +static const char *server_name = NULL; +static Display *server_dpy; + +static char *auth_file; + +typedef struct addr_list_struct addr_list; + +struct addr_list_struct { + addr_list *next; + Xauth auth; +}; + +static addr_list *addresses; + + +/* Utility functions. */ + +/* Return the current host name. Matches what Xlib does. */ +static char * +host_name (void) +{ +#ifdef NEED_UTSNAME + static struct utsname name; + + uname(&name); + + return name.nodename; +#else + static char buf[100]; + + gethostname(buf, sizeof(buf)); + + return buf; +#endif +} + +static int +read_boolean_pref (CFStringRef name, int default_) +{ + int value; + Boolean ok; + + value = CFPreferencesGetAppBooleanValue (name, + CFSTR ("com.apple.x11"), &ok); + return ok ? value : default_; +} + +static inline int +binary_equal (const void *a, const void *b, int length) +{ + return memcmp (a, b, length) == 0; +} + +static inline void * +binary_dup (const void *a, int length) +{ + void *b = malloc (length); + if (b != NULL) + memcpy (b, a, length); + return b; +} + +static inline void +binary_free (void *data, int length) +{ + if (data != NULL) + free (data); +} + + +/* Functions for managing the authentication entries. */ + +/* Returns true if something matching AUTH is in our list of auth items */ +static int +check_auth_item (Xauth *auth) +{ + addr_list *a; + + for (a = addresses; a != NULL; a = a->next) + { + if (a->auth.family == auth->family + && a->auth.address_length == auth->address_length + && binary_equal (a->auth.address, auth->address, auth->address_length) + && a->auth.number_length == auth->number_length + && binary_equal (a->auth.number, auth->number, auth->number_length) + && a->auth.name_length == auth->name_length + && binary_equal (a->auth.name, auth->name, auth->name_length)) + { + return TRUE; + } + } + + return FALSE; +} + +/* Add one item to our list of auth items. */ +static void +add_auth_item (Xauth *auth) +{ + addr_list *a = malloc (sizeof (addr_list)); + + a->auth.family = auth->family; + a->auth.address_length = auth->address_length; + a->auth.address = binary_dup (auth->address, auth->address_length); + a->auth.number_length = auth->number_length; + a->auth.number = binary_dup (auth->number, auth->number_length); + a->auth.name_length = auth->name_length; + a->auth.name = binary_dup (auth->name, auth->name_length); + a->auth.data_length = auth->data_length; + a->auth.data = binary_dup (auth->data, auth->data_length); + + a->next = addresses; + addresses = a; +} + +/* Free all allocated auth items. */ +static void +free_auth_items (void) +{ + addr_list *a; + + while ((a = addresses) != NULL) + { + addresses = a->next; + + binary_free (a->auth.address, a->auth.address_length); + binary_free (a->auth.number, a->auth.number_length); + binary_free (a->auth.name, a->auth.name_length); + binary_free (a->auth.data, a->auth.data_length); + free (a); + } +} + +/* Add the unix domain auth item. */ +static void +define_local (Xauth *auth) +{ + char *host = host_name (); + +#ifdef DEBUG + fprintf (stderr, "x11: hostname is %s\n", host); +#endif + + auth->family = FamilyLocal; + auth->address_length = strlen (host); + auth->address = host; + + add_auth_item (auth); +} + +/* Add the tcp auth item. */ +static void +define_named (Xauth *auth, const char *name) +{ + struct ifaddrs *addrs, *ptr; + + if (getifaddrs (&addrs) != 0) + return; + + for (ptr = addrs; ptr != NULL; ptr = ptr->ifa_next) + { + if (ptr->ifa_addr->sa_family != AF_INET) + continue; + + auth->family = FamilyInternet; + auth->address_length = sizeof (struct in_addr); + auth->address = (char *) &(((struct sockaddr_in *) ptr->ifa_addr)->sin_addr); + +#ifdef DEBUG + fprintf (stderr, "x11: ipaddr is %d.%d.%d.%d\n", + (unsigned char) auth->address[0], + (unsigned char) auth->address[1], + (unsigned char) auth->address[2], + (unsigned char) auth->address[3]); +#endif + + add_auth_item (auth); + } + + freeifaddrs (addrs); +} + +/* Parse the display number from NAME and add it to AUTH. */ +static void +set_auth_number (Xauth *auth, const char *name) +{ + char *colon; + char *dot, *number; + + colon = strrchr(name, ':'); + if (colon != NULL) + { + colon++; + dot = strchr(colon, '.'); + + if (dot != NULL) + auth->number_length = dot - colon; + else + auth->number_length = strlen (colon); + + number = malloc (auth->number_length + 1); + if (number != NULL) + { + strncpy (number, colon, auth->number_length); + number[auth->number_length] = '\0'; + } + else + { + auth->number_length = 0; + } + + auth->number = number; + } +} + +/* Put 128 bits of random data into DATA. If possible, it will be "high + quality" */ +static int +generate_mit_magic_cookie (char data[16]) +{ + int fd, ret, i; + long *ldata = (long *) data; + + fd = open ("/dev/random", O_RDONLY); + if (fd > 0) { + ret = read (fd, data, 16); + close (fd); + if (ret == 16) return TRUE; + } + + /* fall back to the usual crappy rng */ + + srand48 (getpid () ^ time (NULL)); + + for (i = 0; i < 4; i++) + ldata[i] = lrand48 (); + + return TRUE; +} + +/* Create the keys we'll be using for the display named NAME. */ +static int +make_auth_keys (const char *name) +{ + Xauth auth; + char key[16]; + + if (auth_file == NULL) + return FALSE; + + auth.name = "MIT-MAGIC-COOKIE-1"; + auth.name_length = strlen (auth.name); + + if (!generate_mit_magic_cookie (key)) + { + auth_file = NULL; + return FALSE; + } + + auth.data = key; + auth.data_length = 16; + + set_auth_number (&auth, name); + + define_named (&auth, host_name ()); + define_local (&auth); + + free (auth.number); + + return TRUE; +} + +/* If ADD-ENTRIES is true, merge our auth entries into the existing + Xauthority file. If ADD-ENTRIES is false, remove our entries. */ +static int +write_auth_file (int add_entries) +{ + char *home, newname[1024]; + int fd, ret; + FILE *new_fh, *old_fh; + addr_list *addr; + Xauth *auth; + + if (auth_file == NULL) + return FALSE; + + home = getenv ("HOME"); + if (home == NULL) + { + auth_file = NULL; + return FALSE; + } + + snprintf (newname, sizeof (newname), "%s/.XauthorityXXXXXX", home); + mktemp (newname); + + if (XauLockAuth (auth_file, 1, 2, 10) != LOCK_SUCCESS) + { + /* FIXME: do something here? */ + + auth_file = NULL; + return FALSE; + } + + fd = open (newname, O_WRONLY | O_CREAT | O_TRUNC, 0600); + if (fd >= 0) + { + new_fh = fdopen (fd, "w"); + if (new_fh != NULL) + { + if (add_entries) + { + for (addr = addresses; addr != NULL; addr = addr->next) + { + XauWriteAuth (new_fh, &addr->auth); + } + } + + old_fh = fopen (auth_file, "r"); + if (old_fh != NULL) + { + while ((auth = XauReadAuth (old_fh)) != NULL) + { + if (!check_auth_item (auth)) + XauWriteAuth (new_fh, auth); + XauDisposeAuth (auth); + } + fclose (old_fh); + } + + fclose (new_fh); + unlink (auth_file); + + ret = rename (newname, auth_file); + + if (ret != 0) + auth_file = NULL; + + XauUnlockAuth (auth_file); + return ret == 0; + } + + close (fd); + } + + XauUnlockAuth (auth_file); + auth_file = NULL; + return FALSE; +} + + +/* Subprocess management functions. */ + +static int +start_server (char **xargv) +{ + int child; + + child = fork (); + + switch (child) + { + case -1: /* error */ + perror ("fork"); + return FALSE; + + case 0: /* child */ + execv (X_SERVER, xargv); + perror ("Couldn't exec " X_SERVER); + _exit (1); + + default: /* parent */ + server_pid = child; + return TRUE; + } +} + +static int +wait_for_server (void) +{ + int count = 100; + + while (count-- > 0) + { + int status; + + server_dpy = XOpenDisplay (server_name); + if (server_dpy != NULL) + return TRUE; + + if (waitpid (server_pid, &status, WNOHANG) == server_pid) + return FALSE; + + sleep (1); + } + + return FALSE; +} + +static int +start_client (void) +{ + int child; + + child = fork(); + + switch (child) { + char *temp, buf[1024]; + + case -1: /* error */ + perror("fork"); + return FALSE; + + case 0: /* child */ + /* Setup environment */ + temp = getenv("DISPLAY"); + if (temp != NULL && temp[0] != 0) + setenv("DISPLAY", server_name, TRUE); + + temp = getenv("PATH"); + if (temp == NULL || temp[0] == 0) + setenv ("PATH", DEFAULT_PATH, TRUE); + else if (strnstr(temp, "/usr/X11/bin", sizeof(temp)) == NULL) { + snprintf(buf, sizeof(buf), "%s:/usr/X11/bin", temp); + setenv("PATH", buf, TRUE); + } + + /* First try value of $XINITRC, if set. */ + temp = getenv("XINITRC"); + if (temp != NULL && temp[0] != 0 && access(temp, R_OK) == 0) + execlp (SHELL, SHELL, temp, NULL); + + /* Then look for .xinitrc in user's home directory. */ + temp = getenv("HOME"); + if (temp != NULL && temp[0] != 0) { + chdir(temp); + snprintf (buf, sizeof (buf), "%s/.xinitrc", temp); + if (access(buf, R_OK) == 0) + execlp(SHELL, SHELL, buf, NULL); + } + + /* Then try the default xinitrc in the lib directory. */ + + if (access(DEFAULT_XINITRC, R_OK) == 0) + execlp(SHELL, SHELL, DEFAULT_XINITRC, NULL); + + /* Then fallback to hardcoding an xterm and the window manager. */ + + // system(XTERM_PATH " &"); + execl(WM_PATH, WM_PATH, NULL); + + perror("exec"); + _exit(1); + + default: /* parent */ + client_pid = child; + return TRUE; + } +} + +static void +sigchld_handler (int sig) +{ + int pid, status; + + again: + pid = waitpid (WAIT_ANY, &status, WNOHANG); + + if (pid > 0) + { + if (pid == server_pid) + { + server_pid = -1; + + if (client_pid >= 0) + kill (client_pid, SIGTERM); + } + else if (pid == client_pid) + { + client_pid = -1; + + if (server_pid >= 0 && xinit_kills_server) + kill (server_pid, SIGTERM); + } + goto again; + } + + if (server_pid == -1 && client_pid == -1) + longjmp (exit_continuation, 1); + + signal (SIGCHLD, sigchld_handler); +} + + +/* Server utilities. */ + +static Boolean +display_exists_p (int number) +{ + char buf[64]; + xcb_connection_t *conn; + char *fullname = NULL; + int idisplay, iscreen; + char *conn_auth_name, *conn_auth_data; + int conn_auth_namelen, conn_auth_datalen; + + // extern void *_X11TransConnectDisplay (); + // extern void _XDisconnectDisplay (); + + /* Since connecting to the display waits for a few seconds if the + display doesn't exist, check for trivial non-existence - if the + socket in /tmp exists or not.. (note: if the socket exists, the + server may still not, so we need to try to connect in that case..) */ + + sprintf (buf, "/tmp/.X11-unix/X%d", number); + if (access (buf, F_OK) != 0) + return FALSE; + + /* This is a private function that we shouldn't really be calling, + but it's the best way to see if the server exists (without + needing to hold the necessary authentication to use it) */ + + sprintf (buf, ":%d", number); + /* conn = _X11TransConnectDisplay (buf, &fullname, &idisplay, &iscreen, + &conn_auth_name, &conn_auth_namelen, + &conn_auth_data, &conn_auth_datalen); */ + conn = xcb_connect(buf, NULL); + + if (conn == NULL) + return FALSE; + + // _XDisconnectDisplay (conn); + xcb_disconnect(conn); + return TRUE; +} + + +/* Monitoring when the system's ip addresses change. */ + +static Boolean pending_timer; + +static void +timer_callback (CFRunLoopTimerRef timer, void *info) +{ + pending_timer = FALSE; + + /* Update authentication names. Need to write .Xauthority file first + without the existing entries, then again with the new entries.. */ + + write_auth_file (FALSE); + + free_auth_items (); + make_auth_keys (server_name); + + write_auth_file (TRUE); +} + +/* This function is called when the system's ip addresses may have changed. */ +static void +ipaddr_callback (SCDynamicStoreRef store, CFArrayRef changed_keys, void *info) +{ +#if DEBUG + if (changed_keys != NULL) { + fprintf (stderr, "x11: changed sc keys: "); + CFShow (changed_keys); + } +#endif + + if (auth_file != NULL && !pending_timer) + { + CFRunLoopTimerRef timer; + + timer = CFRunLoopTimerCreate (NULL, CFAbsoluteTimeGetCurrent () + 1.0, + 0.0, 0, 0, timer_callback, NULL); + CFRunLoopAddTimer (CFRunLoopGetCurrent (), timer, + kCFRunLoopDefaultMode); + CFRelease (timer); + + pending_timer = TRUE; + } +} + +/* This code adapted from "Living in a Dynamic TCP/IP Environment" technote. */ +static Boolean +install_ipaddr_source (void) +{ + CFRunLoopSourceRef source = NULL; + + SCDynamicStoreContext context = {0}; + SCDynamicStoreRef ref; + + ref = SCDynamicStoreCreate (NULL, + CFSTR ("AddIPAddressListChangeCallbackSCF"), + ipaddr_callback, &context); + + if (ref != NULL) + { + const void *keys[4], *patterns[2]; + int i; + + keys[0] = SCDynamicStoreKeyCreateNetworkGlobalEntity (NULL, kSCDynamicStoreDomainState, kSCEntNetIPv4); + keys[1] = SCDynamicStoreKeyCreateNetworkGlobalEntity (NULL, kSCDynamicStoreDomainState, kSCEntNetIPv6); + keys[2] = SCDynamicStoreKeyCreateComputerName (NULL); + keys[3] = SCDynamicStoreKeyCreateHostNames (NULL); + + patterns[0] = SCDynamicStoreKeyCreateNetworkInterfaceEntity (NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetIPv4); + patterns[1] = SCDynamicStoreKeyCreateNetworkInterfaceEntity (NULL, kSCDynamicStoreDomainState, kSCCompAnyRegex, kSCEntNetIPv6); + + if (keys[0] != NULL && keys[1] != NULL && keys[2] != NULL + && keys[3] != NULL && patterns[0] != NULL && patterns[1] != NULL) + { + CFArrayRef key_array, pattern_array; + + key_array = CFArrayCreate (NULL, keys, 4, &kCFTypeArrayCallBacks); + pattern_array = CFArrayCreate (NULL, patterns, 2, &kCFTypeArrayCallBacks); + + if (key_array != NULL || pattern_array != NULL) + { + SCDynamicStoreSetNotificationKeys (ref, key_array, pattern_array); + source = SCDynamicStoreCreateRunLoopSource (NULL, ref, 0); + } + + if (key_array != NULL) + CFRelease (key_array); + if (pattern_array != NULL) + CFRelease (pattern_array); + } + + + for (i = 0; i < 4; i++) + if (keys[i] != NULL) + CFRelease (keys[i]); + for (i = 0; i < 2; i++) + if (patterns[i] != NULL) + CFRelease (patterns[i]); + + CFRelease (ref); + } + + if (source != NULL) + { + CFRunLoopAddSource (CFRunLoopGetCurrent (), + source, kCFRunLoopDefaultMode); + CFRelease (source); + } + + return source != NULL; +} + + +/* Entrypoint. */ + +void +termination_signal_handler (int unused_sig) +{ + signal (SIGTERM, SIG_DFL); + signal (SIGHUP, SIG_DFL); + signal (SIGINT, SIG_DFL); + signal (SIGQUIT, SIG_DFL); + + longjmp (exit_continuation, 1); +} + +int +main (int argc, char **argv) +{ + char **xargv; + int i, j; + int fd; + + xargv = alloca (sizeof (char *) * (argc + 32)); + + if (!read_boolean_pref (CFSTR ("no_auth"), FALSE)) + auth_file = XauFileName (); + + /* The standard X11 behaviour is for the server to quit when the first + client exits. But it can be useful for debugging (and to mimic our + behaviour in the beta releases) to not do that. */ + + xinit_kills_server = read_boolean_pref (CFSTR ("xinit_kills_server"), TRUE); + + for (i = 1; i < argc; i++) + { + if (argv[i][0] == ':') + server_name = argv[i]; + } + + if (server_name == NULL) + { + static char name[8]; + + /* No display number specified, so search for the first unused. + + There's a big old race condition here if two servers start at + the same time, but that's fairly unlikely. We could create + lockfiles or something, but that's seems more likely to cause + problems than the race condition itself.. */ + + for (i = 0; i < MAX_DISPLAYS; i++) + { + if (!display_exists_p (i)) + break; + } + + if (i == MAX_DISPLAYS) + { + fprintf (stderr, "%s: couldn't allocate a display number", argv[0]); + exit (1); + } + + sprintf (name, ":%d", i); + server_name = name; + } + + if (auth_file != NULL) + { + /* Create new Xauth keys and add them to the .Xauthority file */ + + make_auth_keys (server_name); + write_auth_file (TRUE); + } + + /* Construct our new argv */ + + i = j = 0; + + xargv[i++] = argv[j++]; + + if (auth_file != NULL) + { + xargv[i++] = "-auth"; + xargv[i++] = auth_file; + } + + /* By default, don't listen on tcp sockets if Xauth is disabled. */ + + if (read_boolean_pref (CFSTR ("nolisten_tcp"), auth_file == NULL)) + { + xargv[i++] = "-nolisten"; + xargv[i++] = "tcp"; + } + + while (j < argc) + { + if (argv[j++][0] != ':') + xargv[i++] = argv[j-1]; + } + + xargv[i++] = (char *) server_name; + xargv[i++] = NULL; + + /* Detach from any controlling terminal and connect stdin to /dev/null */ + +#ifdef TIOCNOTTY + fd = open ("/dev/tty", O_RDONLY); + if (fd != -1) + { + ioctl (fd, TIOCNOTTY, 0); + close (fd); + } +#endif + + fd = open ("/dev/null", O_RDWR, 0); + if (fd >= 0) + { + dup2 (fd, 0); + if (fd > 0) + close (fd); + } + + if (!start_server (xargv)) + return 1; + + if (!wait_for_server ()) + { + kill (server_pid, SIGTERM); + return 1; + } + + if (!start_client ()) + { + kill (server_pid, SIGTERM); + return 1; + } + + signal (SIGCHLD, sigchld_handler); + + signal (SIGTERM, termination_signal_handler); + signal (SIGHUP, termination_signal_handler); + signal (SIGINT, termination_signal_handler); + signal (SIGQUIT, termination_signal_handler); + + if (setjmp (exit_continuation) == 0) + { + if (install_ipaddr_source ()) + CFRunLoopRun (); + else + while (1) pause (); + } + + signal (SIGCHLD, SIG_IGN); + + if (client_pid >= 0) kill (client_pid, SIGTERM); + if (server_pid >= 0) kill (server_pid, SIGTERM); + + if (auth_file != NULL) + { + /* Remove our Xauth keys */ + + write_auth_file (FALSE); + } + + free_auth_items (); + + return 0; +} diff --git a/hw/darwin/bundle/Dutch.lproj/Localizable.strings b/hw/darwin/bundle/Dutch.lproj/Localizable.strings index 6abd9107299ea24f4724f2fe30c513968b74e8cc..4fe16b355438d41c73a9a500e7462adcee91999c 100644 GIT binary patch delta 16 XcmbQl-N(J*In(5qOkJBxnPr&(IlcxW delta 20 bcmeC $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/bundle/English.lproj/Localizable.strings b/hw/darwin/bundle/English.lproj/Localizable.strings index 2c25c1dc31fc32a5c85b97b5bd0bb8535589cb7c..f2e8e3c238ea22879f195a9af3ad9c3667f34a67 100644 GIT binary patch literal 1424 zcmd6nO;5r=5QgXMuV@G-A{6l>24jpOo-}IE=(W&-XemuwME&vVGh1K_67*=Ac6Mjy zC7H$XSGRkbSmT#1eE zfUhSbGP+o5-eiW;CF>Ne&w0X1@ww6ko#qL#bXTgbq0OT{b9TAJfQP60)K;q9CYvKW z=y#C~sq-}OuA_6&)zQ`s?tNra_E;+;V=!q|%1@h$Vq}>&uYF$q9jG&tch0qTL~B&W zVk(Q+g$uuu+)|(VR&3+kNeK5szbf5*qZG zscB?>8 z$a$Q5XGk^0EpM#x1#FdRYu+fwD>-i}_NdnI;tX#*8s8^Y9i$-q)*0>>SYque77*tN zrs_ydalE{9L>IF;wwbD3wQ;)iYU#=KOjWch*RD0JRt@Kt)F_?UzVxs96%FW>rDT-- z@`}^s9A{~IrqWY&o+6#izoql9Gf3qeb-3NuI1cJT{?Uk~;96U9f?6}#kefU-MtZ-| z$BzlV<8$aT0%$A$>X&{G!}vQ6T4ODQTxnPfL30P!Fo(J&o(< $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp \ + InfoPlist.strings.cpp + diff --git a/hw/darwin/bundle/French.lproj/Makefile.am b/hw/darwin/bundle/French.lproj/Makefile.am new file mode 100644 index 000000000..4dca9342f --- /dev/null +++ b/hw/darwin/bundle/French.lproj/Makefile.am @@ -0,0 +1,41 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit + +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + + +resourcesdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents/Resources + +Frenchlprojdir = $(resourcesdir)/French.lproj + +Frenchlproj_DATA = \ + XDarwinHelp.html \ + InfoPlist.strings \ + Credits.rtf Localizable.strings + +Frenchlprojnibdir = $(Frenchlprojdir)/MainMenu.nib +Frenchlprojnib_DATA = \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib + +InfoPlist.strings: $(srcdir)/../English.lproj/InfoPlist.strings.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) | $(SED) -e's/__quote__/"/g' | iconv -t UTF-16 > $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/bundle/German.lproj/Makefile.am b/hw/darwin/bundle/German.lproj/Makefile.am new file mode 100644 index 000000000..fcb5dd24f --- /dev/null +++ b/hw/darwin/bundle/German.lproj/Makefile.am @@ -0,0 +1,39 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + +resourcesdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents/Resources + +Germanlprojdir = $(resourcesdir)/German.lproj + +Germanlproj_DATA = \ + XDarwinHelp.html \ + InfoPlist.strings \ + Credits.rtf Localizable.strings Localizable.strings + +Germanlprojnibdir = $(Germanlprojdir)/MainMenu.nib +Germanlprojnib_DATA = \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib + +InfoPlist.strings: $(srcdir)/../English.lproj/InfoPlist.strings.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) | $(SED) -e's/__quote__/"/g' | iconv -t UTF-16 > $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/bundle/Info.plist b/hw/darwin/bundle/Info.plist new file mode 100644 index 000000000..7e1770819 --- /dev/null +++ b/hw/darwin/bundle/Info.plist @@ -0,0 +1,66 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + x11app + + CFBundleTypeName + X11 Application + CFBundleTypeOSTypes + + **** + + CFBundleTypeRole + Viewer + + + CFBundleTypeExtensions + + tool + * + + CFBundleTypeName + UNIX Application + CFBundleTypeOSTypes + + **** + + CFBundleTypeRole + Viewer + + + CFBundleExecutable + XDarwin + CFBundleGetInfoString + XDarwin 1.4.0, X.Org Foundation + CFBundleIconFile + XDarwin.icns + CFBundleIdentifier + org.x.X11 + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + XDarwin + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.0.0 + CFBundleSignature + ???? + CFBundleVersion + + NSHelpFile + XDarwinHelp.html + NSMainNibFile + MainMenu + NSPrincipalClass + XApplication + + diff --git a/hw/darwin/bundle/Japanese.lproj/Makefile.am b/hw/darwin/bundle/Japanese.lproj/Makefile.am new file mode 100644 index 000000000..8d891edb5 --- /dev/null +++ b/hw/darwin/bundle/Japanese.lproj/Makefile.am @@ -0,0 +1,40 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + + +resourcesdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents/Resources + +Japaneselprojdir = $(resourcesdir)/Japanese.lproj + +Japaneselproj_DATA = \ + XDarwinHelp.html \ + InfoPlist.strings \ + Credits.rtf Localizable.strings + +Japaneselprojnibdir = $(Japaneselprojdir)/MainMenu.nib +Japaneselprojnib_DATA = \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib + +InfoPlist.strings: $(srcdir)/../English.lproj/InfoPlist.strings.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) | $(SED) -e's/__quote__/"/g' | iconv -t UTF-16 > $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/bundle/Makefile.am b/hw/darwin/bundle/Makefile.am new file mode 100644 index 000000000..dee34fd83 --- /dev/null +++ b/hw/darwin/bundle/Makefile.am @@ -0,0 +1,38 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + +SUBDIRS = English.lproj Dutch.lproj French.lproj German.lproj Japanese.lproj \ + ko.lproj Portuguese.lproj Spanish.lproj Swedish.lproj + +bin_SCRIPTS = startXClients + +startXClients: $(srcdir)/startXClients.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) -DXINITDIR=$(XINITDIR) -DXBINDIR=$(BINDIR) $< | $(CPP_SED_MAGIC) > $@ + -chmod 755 startXClients + +contentsdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents +resourcesdir = $(contentsdir)/Resources + +contents_DATA = Info.plist +resources_DATA = XDarwin.icns startXClients + +install-data-hook: + chmod 755 $(DESTDIR)$(resourcesdir)/startXClients + echo "APPL????" > $(DESTDIR)$(contentsdir)/PkgInfo + touch $(DESTDIR)@APPLE_APPLICATIONS_DIR@/XDarwin.app + +uninstall-hook: + rm -rf $(DESTDIR)$(contentsdir)/PkgInfo + +CLEANFILES = startXClients + +EXTRA_DIST = \ + XDarwin.icns \ + Info.plist diff --git a/hw/darwin/bundle/Portuguese.lproj/Makefile.am b/hw/darwin/bundle/Portuguese.lproj/Makefile.am new file mode 100644 index 000000000..540649c7a --- /dev/null +++ b/hw/darwin/bundle/Portuguese.lproj/Makefile.am @@ -0,0 +1,39 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + +resourcesdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents/Resources + +Portugueselprojdir = $(resourcesdir)/Portuguese.lproj + +Portugueselproj_DATA = \ + XDarwinHelp.html \ + InfoPlist.strings \ + Credits.rtf Localizable.strings + +Portugueselprojnibdir = $(Portugueselprojdir)/MainMenu.nib +Portugueselprojnib_DATA = \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib + +InfoPlist.strings: $(srcdir)/../English.lproj/InfoPlist.strings.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) | $(SED) -e's/__quote__/"/g' | iconv -t UTF-16 > $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/bundle/Spanish.lproj/Makefile.am b/hw/darwin/bundle/Spanish.lproj/Makefile.am new file mode 100644 index 000000000..978ac3542 --- /dev/null +++ b/hw/darwin/bundle/Spanish.lproj/Makefile.am @@ -0,0 +1,39 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + +resourcesdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents/Resources + +Spanishlprojdir = $(resourcesdir)/Spanish.lproj + +Spanishlproj_DATA = \ + XDarwinHelp.html \ + InfoPlist.strings \ + Credits.rtf Localizable.strings + +Spanishlprojnibdir = $(Spanishlprojdir)/MainMenu.nib +Spanishlprojnib_DATA = \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib + +InfoPlist.strings: $(srcdir)/../English.lproj/InfoPlist.strings.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) | $(SED) -e's/__quote__/"/g' | iconv -t UTF-16 > $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/bundle/Swedish.lproj/Makefile.am b/hw/darwin/bundle/Swedish.lproj/Makefile.am new file mode 100644 index 000000000..3cf542c4a --- /dev/null +++ b/hw/darwin/bundle/Swedish.lproj/Makefile.am @@ -0,0 +1,39 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + +resourcesdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents/Resources + +Swedishlprojdir = $(resourcesdir)/Swedish.lproj + +Swedishlproj_DATA = \ + XDarwinHelp.html \ + InfoPlist.strings \ + Credits.rtf Localizable.strings + +Swedishlprojnibdir = $(Swedishlprojdir)/MainMenu.nib +Swedishlprojnib_DATA = \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib + +InfoPlist.strings: $(srcdir)/../English.lproj/InfoPlist.strings.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) | $(SED) -e's/__quote__/"/g' | iconv -t UTF-16 > $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/bundle/ko.lproj/Makefile.am b/hw/darwin/bundle/ko.lproj/Makefile.am new file mode 100644 index 000000000..a5462ff9f --- /dev/null +++ b/hw/darwin/bundle/ko.lproj/Makefile.am @@ -0,0 +1,40 @@ +BINDIR = ${bindir} +include $(top_srcdir)/cpprules.in +XINITDIR = $(libdir)/X11/xinit +XDEFS = \ + -DX_VERSION="$(PLIST_VERSION_STRING)" \ + -DX_PRE_RELEASE="$(PRE)" \ + -DX_REL_DATE="$(XORG_DATE)" \ + -DX_VENDOR_NAME="$(VENDOR_STRING)" \ + -DX_VENDOR_LINK="$(PLIST_VENDOR_WEB)" + + +resourcesdir = @APPLE_APPLICATIONS_DIR@/XDarwin.app/Contents/Resources + +kolprojdir = $(resourcesdir)/ko.lproj + +kolproj_DATA = \ + XDarwinHelp.html \ + InfoPlist.strings \ + Credits.rtf Localizable.strings + +kolprojnibdir = $(kolprojdir)/MainMenu.nib +kolprojnib_DATA = \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib + +InfoPlist.strings: $(srcdir)/../English.lproj/InfoPlist.strings.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) | $(SED) -e's/__quote__/"/g' | iconv -t UTF-16 > $@ + +XDarwinHelp.html: XDarwinHelp.html.cpp + $(RAWCPP) $(RAWCPPFLAGS) $(XDEFS) $(CPP_FILES_FLAGS) $< | $(CPP_SED_MAGIC) > $@ + +CLEANFILES = XDarwinHelp.html InfoPlist.strings + +EXTRA_DIST = \ + Credits.rtf Localizable.strings \ + Localizable.strings \ + MainMenu.nib/classes.nib \ + MainMenu.nib/objects.nib \ + XDarwinHelp.html.cpp + diff --git a/hw/darwin/iokit/Makefile.am b/hw/darwin/iokit/Makefile.am new file mode 100644 index 000000000..77227d77b --- /dev/null +++ b/hw/darwin/iokit/Makefile.am @@ -0,0 +1,17 @@ +noinst_LIBRARIES = libiokit.a + +AM_CFLAGS = @XORG_CFLAGS@ +INCLUDES = -I. -I.. -I$(srcdir) -I$(srcdir)/.. @XORG_INCS@ +AM_DEFS = +if XQUARTZ +AM_DEFS += -DDARWIN_WITH_QUARTZ -DXFree86Server +XQUARTZ_SUBDIRS = bundle quartz +endif +DEFS = @DEFS@ $(AM_DEFS) + +libiokit_a_SOURCES = xfIOKit.c \ + xfIOKitCursor.c \ + xfIOKitStartup.c + +EXTRA_DIST = \ + xfIOKit.h diff --git a/hw/darwin/launcher/Info.plist b/hw/darwin/launcher/Info.plist new file mode 100644 index 000000000..b5385b61a --- /dev/null +++ b/hw/darwin/launcher/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + X11 + CFBundleGetInfoString + 2.0, Copyright © 2003-2007, Apple Inc. + CFBundleIconFile + X11.icns + CFBundleIdentifier + org.x.X11_launcher + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + X11 + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.0 + CFBundleSignature + x11l + LSUIElement + 1 + NSHumanReadableCopyright + Copyright © 2007, Apple Inc. + + diff --git a/hw/darwin/launcher/X11.icns b/hw/darwin/launcher/X11.icns new file mode 100644 index 0000000000000000000000000000000000000000..d770e617ddb455d8a499550e712f93a06a69f871 GIT binary patch literal 65908 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 E014<25dZ)H literal 0 HcmV?d00001 diff --git a/hw/darwin/launcher/X11.xcodeproj/project.pbxproj b/hw/darwin/launcher/X11.xcodeproj/project.pbxproj new file mode 100644 index 000000000..f82552ac5 --- /dev/null +++ b/hw/darwin/launcher/X11.xcodeproj/project.pbxproj @@ -0,0 +1,297 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 527F241B0B5D938C007840A7 /* X11.icns in Resources */ = {isa = PBXBuildFile; fileRef = 50459C5F038587C60ECA21EC /* X11.icns */; }; + 527F241D0B5D938C007840A7 /* bundle-main.c in Sources */ = {isa = PBXBuildFile; fileRef = 50EE2AB703849F0B0ECA21EC /* bundle-main.c */; }; + 527F241F0B5D938C007840A7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50F4F0A7039D6ACA0E82C0CB /* CoreFoundation.framework */; }; + 527F24370B5D9D89007840A7 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 527F24260B5D938C007840A7 /* Info.plist */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 50459C5F038587C60ECA21EC /* X11.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = X11.icns; sourceTree = ""; }; + 50EE2AB703849F0B0ECA21EC /* bundle-main.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = "bundle-main.c"; sourceTree = ""; }; + 50F4F0A7039D6ACA0E82C0CB /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + 527F24260B5D938C007840A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Info.plist; sourceTree = ""; }; + 527F24270B5D938C007840A7 /* X11.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = X11.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 527F241E0B5D938C007840A7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 527F241F0B5D938C007840A7 /* CoreFoundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 195DF8CFFE9D517E11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 527F24270B5D938C007840A7 /* X11.app */, + ); + name = Products; + sourceTree = ""; + }; + 20286C29FDCF999611CA2CEA /* X11 */ = { + isa = PBXGroup; + children = ( + 20286C2AFDCF999611CA2CEA /* Sources */, + 20286C2CFDCF999611CA2CEA /* Resources */, + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, + 195DF8CFFE9D517E11CA2CBB /* Products */, + 527F24260B5D938C007840A7 /* Info.plist */, + ); + name = X11; + sourceTree = ""; + }; + 20286C2AFDCF999611CA2CEA /* Sources */ = { + isa = PBXGroup; + children = ( + 50EE2AB703849F0B0ECA21EC /* bundle-main.c */, + ); + name = Sources; + sourceTree = ""; + }; + 20286C2CFDCF999611CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 50459C5F038587C60ECA21EC /* X11.icns */, + ); + name = Resources; + sourceTree = ""; + }; + 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 50F4F0A7039D6ACA0E82C0CB /* CoreFoundation.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 527F24170B5D938C007840A7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 527F24160B5D938C007840A7 /* X11 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 527F24220B5D938C007840A7 /* Build configuration list for PBXNativeTarget "X11" */; + buildPhases = ( + 527F24170B5D938C007840A7 /* Headers */, + 527F24180B5D938C007840A7 /* Resources */, + 527F241C0B5D938C007840A7 /* Sources */, + 527F241E0B5D938C007840A7 /* Frameworks */, + 527F24210B5D938C007840A7 /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = X11; + productName = X11; + productReference = 527F24270B5D938C007840A7 /* X11.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 20286C28FDCF999611CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 527F24080B5D8FFC007840A7 /* Build configuration list for PBXProject "X11" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 20286C29FDCF999611CA2CEA /* X11 */; + projectDirPath = ""; + projectRoot = ""; + shouldCheckCompatibility = 1; + targets = ( + 527F24160B5D938C007840A7 /* X11 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 527F24180B5D938C007840A7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 527F24370B5D9D89007840A7 /* Info.plist in Resources */, + 527F241B0B5D938C007840A7 /* X11.icns in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 527F24210B5D938C007840A7 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 527F241C0B5D938C007840A7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 527F241D0B5D938C007840A7 /* bundle-main.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 527F24090B5D8FFC007840A7 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + SKIP_INSTALL = YES; + }; + name = Development; + }; + 527F240A0B5D8FFC007840A7 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + SKIP_INSTALL = YES; + }; + name = Deployment; + }; + 527F240B0B5D8FFC007840A7 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + SKIP_INSTALL = YES; + }; + name = Default; + }; + 527F24230B5D938C007840A7 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(NATIVE_ARCH_32_BIT)"; + COPY_PHASE_STRIP = NO; + DSTROOT = "$(DSTROOT)"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = /usr/X11/include; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = $DSTROOT/Applications/Utilties; + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-lXau", + "-lxcb", + "-lX11", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = X11; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = Development; + }; + 527F24240B5D938C007840A7 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DSTROOT = "$(DSTROOT)"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = /usr/X11/include; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = $DSTROOT/Applications/Utilties; + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + OTHER_REZFLAGS = ""; + PRODUCT_NAME = X11; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = Deployment; + }; + 527F24250B5D938C007840A7 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = "$(DSTROOT)"; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = /usr/X11/include; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = $DSTROOT/Applications/Utilties; + LIBRARY_SEARCH_PATHS = /usr/X11/lib; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ( + "-lXau", + "-lxcb", + "-lX11", + ); + OTHER_REZFLAGS = ""; + PRODUCT_NAME = X11; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = app; + }; + name = Default; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 527F24080B5D8FFC007840A7 /* Build configuration list for PBXProject "X11" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 527F24090B5D8FFC007840A7 /* Development */, + 527F240A0B5D8FFC007840A7 /* Deployment */, + 527F240B0B5D8FFC007840A7 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; + 527F24220B5D938C007840A7 /* Build configuration list for PBXNativeTarget "X11" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 527F24230B5D938C007840A7 /* Development */, + 527F24240B5D938C007840A7 /* Deployment */, + 527F24250B5D938C007840A7 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; +/* End XCConfigurationList section */ + }; + rootObject = 20286C28FDCF999611CA2CEA /* Project object */; +} diff --git a/hw/darwin/launcher/bundle-main.c b/hw/darwin/launcher/bundle-main.c new file mode 100644 index 000000000..988c04f68 --- /dev/null +++ b/hw/darwin/launcher/bundle-main.c @@ -0,0 +1,79 @@ +/* main.c -- X application launcher + + Copyright (c) 2007 Apple Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization. */ + +#include +#include +#include + +#include + +#define DEFAULT_APP "/usr/X11/bin/xterm" + +int main (int argc, char **argv) { + char *command = DEFAULT_APP; + const char *newargv[5]; + int child; + + + CFPropertyListRef PlistRef = CFPreferencesCopyAppValue(CFSTR("app_to_run"), + kCFPreferencesCurrentApplication); + + if ((PlistRef == NULL) || (CFGetTypeID(PlistRef) != CFStringGetTypeID())) { + CFPreferencesSetAppValue(CFSTR("app_to_run"), CFSTR(DEFAULT_APP), + kCFPreferencesCurrentApplication); + CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); + } else { + int len = CFStringGetLength((CFStringRef)PlistRef)+1; + command = (char *) malloc(len); + CFStringGetCString((CFStringRef)PlistRef, command, len, kCFStringEncodingASCII); + fprintf(stderr, "command=%s\n", command); + } + + if (PlistRef) CFRelease(PlistRef); + + newargv[0] = "/usr/bin/login"; + newargv[1] = "-fp"; + newargv[2] = getlogin(); + newargv[3] = command; + newargv[4] = NULL; + + child = fork(); + + switch (child) { + case -1: /* error */ + perror ("fork"); + return EXIT_FAILURE; + case 0: /* child */ + execvp (newargv[0], (char **const) newargv); + perror ("Couldn't exec"); + _exit (1); + } + + return 0; +} diff --git a/hw/darwin/quartz/Makefile.am b/hw/darwin/quartz/Makefile.am new file mode 100644 index 000000000..bc6d4fc29 --- /dev/null +++ b/hw/darwin/quartz/Makefile.am @@ -0,0 +1,57 @@ +noinst_LIBRARIES = libXQuartz.a + +AM_CFLAGS = @XORG_CFLAGS@ +AM_OBJCFLAGS = @XORG_CFLAGS@ + +INCLUDES = -I$(srcdir) -I$(srcdir)/.. @XORG_INCS@ +AM_DEFS = -DHAS_CG_MACH_PORT -DHAS_KL_API +if HAVE_X_PLUGIN +AM_DEFS += -DBUILD_XPR +XPR = xpr +endif +DEFS = @DEFS@ $(AM_DEFS) -DXBINDIR=\"${bindir}\" +SUBDIRS = cr fullscreen $(XPR) + +libXQuartz_a_SOURCES = \ + Preferences.m \ + XApplication.m \ + XServer.m \ + applewm.c \ + keysym2ucs.c \ + quartz.c \ + quartzAudio.c \ + quartzCocoa.m \ + quartzPasteboard.c \ + quartzKeyboard.c \ + quartzStartup.c \ + pseudoramiX.c + +bin_PROGRAMS = XDarwinStartup + +XDarwinStartup_SOURCES = XDarwinStartup.c +XDarwinStartup_LDFLAGS = -Wl,-framework,CoreFoundation \ + -Wl,-framework,ApplicationServices +XDarwinStartupCFLAGS = -DXBINDIR="${bindir}" +XDARWINROOT = @APPLE_APPLICATIONS_DIR@ +BINDIR = $(bindir) +install-exec-local: + -(cd $(DESTDIR)$(BINDIR); rm X; $(LN_S) XDarwinStartup X) + +man1_MANS = XDarwinStartup.man + + +EXTRA_DIST = \ + applewmExt.h \ + keysym2ucs.h \ + Preferences.h \ + pseudoramiX.h \ + quartzAudio.h \ + quartzCommon.h \ + quartzCursor.c \ + quartzCursor.h \ + quartz.h \ + quartzPasteboard.h \ + XApplication.h \ + XDarwin.pbproj/project.pbxproj \ + XServer.h \ + XDarwinStartup.man diff --git a/hw/darwin/quartz/cr/Makefile.am b/hw/darwin/quartz/cr/Makefile.am new file mode 100644 index 000000000..abfac991c --- /dev/null +++ b/hw/darwin/quartz/cr/Makefile.am @@ -0,0 +1,21 @@ +noinst_LIBRARIES = libcr.a +AM_CFLAGS = @XORG_CFLAGS@ +AM_OBJCFLAGS = @XORG_CFLAGS@ +DEFS = @DEFS@ -DDEFER_NSWINDOW +INCLUDES = @XORG_INCS@ \ + -I../fullscreen \ + -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \ + -I$(top_srcdir)/miext/rootless \ + -I$(top_srcdir)/miext/rootless/safeAlpha \ + -I$(top_srcdir)/mi + +libcr_a_SOURCES = crAppleWM.m \ + crFrame.m \ + crScreen.m \ + ../fullscreen/quartzCursor.c \ + XView.m + +EXTRA_DIST = \ + cr.h \ + XView.h + diff --git a/hw/darwin/quartz/fullscreen/Makefile.am b/hw/darwin/quartz/fullscreen/Makefile.am new file mode 100644 index 000000000..37c767c35 --- /dev/null +++ b/hw/darwin/quartz/fullscreen/Makefile.am @@ -0,0 +1,9 @@ +noinst_LIBRARIES = libfullscreen.a +AM_CFLAGS = @XORG_CFLAGS@ +INCLUDES = @XORG_INCS@ -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. + +libfullscreen_a_SOURCES = fullscreen.c \ + quartzCursor.c + +EXTRA_DIST = \ + quartzCursor.h diff --git a/hw/darwin/quartz/xpr/Makefile.am b/hw/darwin/quartz/xpr/Makefile.am new file mode 100644 index 000000000..980c7a4d6 --- /dev/null +++ b/hw/darwin/quartz/xpr/Makefile.am @@ -0,0 +1,30 @@ +noinst_LIBRARIES = libxpr.a +AM_CFLAGS = @XORG_CFLAGS@ +INCLUDES = @XORG_INCS@ \ + -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \ + -I$(top_srcdir)/miext/rootless \ + -I$(top_srcdir)/miext/rootless/safeAlpha \ + -I$(top_srcdir)/miext + +libxpr_a_SOURCES = \ + appledri.c \ + dri.c \ + xprAppleWM.c \ + xprCursor.c \ + xprFrame.c \ + xprScreen.c \ + x-hash.c \ + x-hook.c \ + x-list.c + +xprbundledir = @APPLE_APPLICATIONS_DIR@/Resources/xpr.bundle/Contents/MacOS + +EXTRA_DIST = \ + dri.h \ + dristruct.h \ + x-hash.h \ + x-hook.h \ + x-list.h \ + Xplugin.h \ + xpr.h + diff --git a/hw/darwin/quartz/xpr/appledri.h b/hw/darwin/quartz/xpr/appledri.h new file mode 100644 index 000000000..9c630373d --- /dev/null +++ b/hw/darwin/quartz/xpr/appledri.h @@ -0,0 +1,107 @@ +/* $XFree86: xc/lib/GL/dri/xf86dri.h,v 1.7 2000/12/07 20:26:02 dawes Exp $ */ +/************************************************************************** + +Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. +Copyright 2000 VA Linux Systems, Inc. +Copyright (c) 2002 Apple Computer, Inc. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin + * Jens Owen + * Rickard E. (Rik) Faith + * + */ + +#ifndef _APPLEDRI_H_ +#define _APPLEDRI_H_ + +#include + +#define X_AppleDRIQueryVersion 0 +#define X_AppleDRIQueryDirectRenderingCapable 1 +#define X_AppleDRICreateSurface 2 +#define X_AppleDRIDestroySurface 3 +#define X_AppleDRIAuthConnection 4 +/* Requests up to and including 18 were used in a previous version */ + +/* Events */ +#define AppleDRIObsoleteEvent1 0 +#define AppleDRIObsoleteEvent2 1 +#define AppleDRIObsoleteEvent3 2 +#define AppleDRISurfaceNotify 3 +#define AppleDRINumberEvents 4 + +/* Errors */ +#define AppleDRIClientNotLocal 0 +#define AppleDRIOperationNotSupported 1 +#define AppleDRINumberErrors (AppleDRIOperationNotSupported + 1) + +/* Kinds of SurfaceNotify events: */ +#define AppleDRISurfaceNotifyChanged 0 +#define AppleDRISurfaceNotifyDestroyed 1 + +#ifndef _APPLEDRI_SERVER_ + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + Time time; /* server timestamp when event happened */ + int kind; /* subtype of event */ + int arg; +} XAppleDRINotifyEvent; + +_XFUNCPROTOBEGIN + +Bool XAppleDRIQueryExtension (Display *dpy, int *event_base, int *error_base); + +Bool XAppleDRIQueryVersion (Display *dpy, int *majorVersion, + int *minorVersion, int *patchVersion); + +Bool XAppleDRIQueryDirectRenderingCapable (Display *dpy, int screen, + Bool *isCapable); + +void *XAppleDRISetSurfaceNotifyHandler (void (*fun) (Display *dpy, + unsigned uid, int kind)); + +Bool XAppleDRIAuthConnection (Display *dpy, int screen, unsigned int magic); + +Bool XAppleDRICreateSurface (Display *dpy, int screen, Drawable drawable, + unsigned int client_id, unsigned int key[2], + unsigned int* uid); + +Bool XAppleDRIDestroySurface (Display *dpy, int screen, Drawable drawable); + +Bool XAppleDRISynchronizeSurfaces (Display *dpy); + +_XFUNCPROTOEND + +#endif /* _APPLEDRI_SERVER_ */ +#endif /* _APPLEDRI_H_ */ + diff --git a/hw/darwin/quartz/xpr/appledristr.h b/hw/darwin/quartz/xpr/appledristr.h new file mode 100644 index 000000000..36a2e891e --- /dev/null +++ b/hw/darwin/quartz/xpr/appledristr.h @@ -0,0 +1,176 @@ +/* $XFree86: xc/lib/GL/dri/xf86dristr.h,v 1.9 2001/03/21 16:01:08 dawes Exp $ */ +/************************************************************************** + +Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. +Copyright 2000 VA Linux Systems, Inc. +Copyright (c) 2002 Apple Computer, Inc. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin + * Jens Owen + * Rickard E. (Rik) Fiath + * + */ + +#ifndef _APPLEDRISTR_H_ +#define _APPLEDRISTR_H_ + +#include "appledri.h" + +#define APPLEDRINAME "Apple-DRI" + +#define APPLE_DRI_MAJOR_VERSION 1 /* current version numbers */ +#define APPLE_DRI_MINOR_VERSION 0 +#define APPLE_DRI_PATCH_VERSION 0 + +typedef struct _AppleDRIQueryVersion { + CARD8 reqType; /* always DRIReqCode */ + CARD8 driReqType; /* always X_DRIQueryVersion */ + CARD16 length B16; +} xAppleDRIQueryVersionReq; +#define sz_xAppleDRIQueryVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; /* major version of DRI protocol */ + CARD16 minorVersion B16; /* minor version of DRI protocol */ + CARD32 patchVersion B32; /* patch version of DRI protocol */ + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xAppleDRIQueryVersionReply; +#define sz_xAppleDRIQueryVersionReply 32 + +typedef struct _AppleDRIQueryDirectRenderingCapable { + CARD8 reqType; /* always DRIReqCode */ + CARD8 driReqType; /* X_DRIQueryDirectRenderingCapable */ + CARD16 length B16; + CARD32 screen B32; +} xAppleDRIQueryDirectRenderingCapableReq; +#define sz_xAppleDRIQueryDirectRenderingCapableReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + BOOL isCapable; + BOOL pad2; + BOOL pad3; + BOOL pad4; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; + CARD32 pad9 B32; +} xAppleDRIQueryDirectRenderingCapableReply; +#define sz_xAppleDRIQueryDirectRenderingCapableReply 32 + +typedef struct _AppleDRIAuthConnection { + CARD8 reqType; /* always DRIReqCode */ + CARD8 driReqType; /* always X_DRICloseConnection */ + CARD16 length B16; + CARD32 screen B32; + CARD32 magic B32; +} xAppleDRIAuthConnectionReq; +#define sz_xAppleDRIAuthConnectionReq 12 + +typedef struct { + BYTE type; + BOOL pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 authenticated B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xAppleDRIAuthConnectionReply; +#define zx_xAppleDRIAuthConnectionReply 32 + +typedef struct _AppleDRICreateSurface { + CARD8 reqType; /* always DRIReqCode */ + CARD8 driReqType; /* always X_DRICreateSurface */ + CARD16 length B16; + CARD32 screen B32; + CARD32 drawable B32; + CARD32 client_id B32; +} xAppleDRICreateSurfaceReq; +#define sz_xAppleDRICreateSurfaceReq 16 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 key_0 B32; + CARD32 key_1 B32; + CARD32 uid B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xAppleDRICreateSurfaceReply; +#define sz_xAppleDRICreateSurfaceReply 32 + +typedef struct _AppleDRIDestroySurface { + CARD8 reqType; /* always DRIReqCode */ + CARD8 driReqType; /* always X_DRIDestroySurface */ + CARD16 length B16; + CARD32 screen B32; + CARD32 drawable B32; +} xAppleDRIDestroySurfaceReq; +#define sz_xAppleDRIDestroySurfaceReq 12 + +typedef struct _AppleDRINotify { + BYTE type; /* always eventBase + event type */ + BYTE kind; + CARD16 sequenceNumber B16; + Time time B32; /* time of change */ + CARD16 pad1 B16; + CARD32 arg B32; + CARD32 pad3 B32; +} xAppleDRINotifyEvent; +#define sz_xAppleDRINotifyEvent 20 + +#ifdef _APPLEDRI_SERVER_ + +void AppleDRISendEvent ( +#if NeedFunctionPrototypes + int /* type */, + unsigned int /* mask */, + int /* which */, + int /* arg */ +#endif +); + +#endif /* _APPLEDRI_SERVER_ */ +#endif /* _APPLEDRISTR_H_ */ diff --git a/hw/darwin/utils/Makefile.am b/hw/darwin/utils/Makefile.am new file mode 100644 index 000000000..92bf151cb --- /dev/null +++ b/hw/darwin/utils/Makefile.am @@ -0,0 +1,12 @@ +bin_PROGRAMS = dumpkeymap + +dumpkeymap_SOURCES = dumpkeymap.c + +dumpkeymap_LDFLAGS = -Wl,-framework,IOKit + +man1_MANS = dumpkeymap.man + +EXTRA_DIST = \ + README.txt \ + dumpkeymap.man + diff --git a/hw/darwin/utils/event_status_driver.h b/hw/darwin/utils/event_status_driver.h new file mode 100644 index 000000000..8948f3349 --- /dev/null +++ b/hw/darwin/utils/event_status_driver.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. + * + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/****************************************************************************** + event_status_driver.h + API for the events status driver. + This file contains public API. + mpaque 11Oct91 + + Copyright 1991 NeXT Computer, Inc. + + Modified: + +******************************************************************************/ + +#ifndef _DRIVERS_EVENT_STATUS_DRIVER_ +#define _DRIVERS_EVENT_STATUS_DRIVER_ + +__BEGIN_DECLS + +#include +#include +#include +#include + +/* + * Event System Handle: + * + * Information used by the system between calls to NXOpenEventSystem and + * NXCloseEventSystem. The application should not + * access any of the elements of this structure. + */ +typedef mach_port_t NXEventHandle; + +/* Open and Close */ +NXEventHandle NXOpenEventStatus(void); +void NXCloseEventStatus(NXEventHandle handle); + +/* Status */ +extern NXEventSystemInfoType NXEventSystemInfo(NXEventHandle handle, + char *flavor, + int *evs_info, + unsigned int *evs_info_cnt); +/* Keyboard */ +extern void NXSetKeyRepeatInterval(NXEventHandle handle, double seconds); +extern double NXKeyRepeatInterval(NXEventHandle handle); +extern void NXSetKeyRepeatThreshold(NXEventHandle handle, double threshold); +extern double NXKeyRepeatThreshold(NXEventHandle handle); +extern void NXResetKeyboard(NXEventHandle handle); + +/* Mouse */ +extern void NXSetClickTime(NXEventHandle handle, double seconds); +extern double NXClickTime(NXEventHandle handle); +extern void NXSetClickSpace(NXEventHandle handle, _NXSize_ *area); +extern void NXGetClickSpace(NXEventHandle handle, _NXSize_ *area); +extern void NXResetMouse(NXEventHandle handle); + +/* DEPRECATED API */ + +/* NXIdleTime has been deprecated as this API does not take into account + events posted through the CG API set. Instead, we strongly encourage + developers to make use of the CGSSecondsSinceLastInputEvent API. */ +extern double NXIdleTime(NXEventHandle handle) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +/* These methods are NOT supported. */ +extern NXKeyMapping *NXSetKeyMapping(NXEventHandle h, NXKeyMapping *keymap) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern int NXKeyMappingLength(NXEventHandle handle) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern NXKeyMapping *NXGetKeyMapping(NXEventHandle h, NXKeyMapping *keymap) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +/* These methods are NOT supported and will return NULL values. */ +extern void NXSetMouseScaling(NXEventHandle handle, NXMouseScaling *scaling) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern void NXGetMouseScaling(NXEventHandle handle, NXMouseScaling *scaling) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern void NXSetAutoDimThreshold(NXEventHandle handle, double seconds) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern double NXAutoDimThreshold(NXEventHandle handle) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern double NXAutoDimTime(NXEventHandle handle) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern void NXSetAutoDimState(NXEventHandle handle, boolean_t dimmed) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern boolean_t NXAutoDimState(NXEventHandle handle) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern void NXSetAutoDimBrightness(NXEventHandle handle, double level) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern double NXAutoDimBrightness(NXEventHandle handle) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern void NXSetScreenBrightness(NXEventHandle handle, double level) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +extern double NXScreenBrightness(NXEventHandle handle) +AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4; + +/* END DEPRECATED API */ + +__END_DECLS + +#endif /*_DRIVERS_EVENT_STATUS_DRIVER_ */ +