From b27899ee0e035ebd4072a5e6162678f2afe81053 Mon Sep 17 00:00:00 2001 From: Geenz Date: Mon, 13 May 2013 19:39:45 -0400 Subject: [PATCH] Added IME input window white list. --- indra/llwindow/llappdelegate-objc.h | 4 +++ indra/newview/SecondLife.nib | Bin 12997 -> 13009 bytes indra/newview/SecondLife.xib | 25 +++++++++------- indra/newview/llappdelegate-objc.mm | 45 +++++++++++++++++++++++----- 4 files changed, 57 insertions(+), 17 deletions(-) diff --git a/indra/llwindow/llappdelegate-objc.h b/indra/llwindow/llappdelegate-objc.h index e7f6ecd5fc..be9ad4d79f 100644 --- a/indra/llwindow/llappdelegate-objc.h +++ b/indra/llwindow/llappdelegate-objc.h @@ -14,12 +14,16 @@ NSWindow *inputWindow; LLNonInlineTextView *inputView; NSTimer *frameTimer; + NSString *currentInputLanguage; } @property (assign) IBOutlet LLNSWindow *window; @property (assign) IBOutlet NSWindow *inputWindow; @property (assign) IBOutlet LLNonInlineTextView *inputView; +@property (retain) NSString *currentInputLanguage; + - (void) mainLoop; - (void) showInputWindow:(bool)show; +- (void) languageUpdated; @end diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nib index 0b0ff5308b71f9db0b88f9d506ffc7a443a97d7d..cb289ebf097adfcaca74c7524dc5663cc72c50ad 100644 GIT binary patch delta 8067 zcmcI|cVJW1+y5DvZPMKAohG@tlrmeE>`|c17HEOe0i~2!3Z;b(OR10p0xHP7ASfcx zvRB!lh=2&FsO&EeWI7QLQB+jqeUh}O$j{&R{o~DTliYLeGtP59&*yn^j`&ac=OqL> zA~{l^Xv8BQYJi%eB$SN$q5dcX4MjO<1bPzXp;2fIDnirH3urEyhvuV2=w-AGZAUxM zQS=G=6kR}{p^NAex{R)%tLPf~9DRYlL|>t=(KqNi`WD?l53mAju?gF-3;S?=+z7|v zMBEqm3*aF*38&)`I2Vt^dAIMa*zs0xl_xNZ03;rGdK`@aJIpK(w=!l7!iG|pSgYcv& zX-?XZP9%}^Ac3Bw7fB}lNGi!8qewm(O^V1kGM!1)JE+zn%1K+v_6fcjcE(olD48x&~~&d?MA!PL|RUt zrjzJ2I)~1s%jh~WDg_&ZrAqT~RmG9VMb3s3+5R@){CheM>iLzEO)oCQ4dT1ER9+sS%R92cZqQKv! zxHzYx8pejB*tF!-&~0XAd|a~@johu`;wFVfa?!}a$*F_${pHmt7x~3P8BgL{i=wO{ z%}1lfLo#DlK8g)LTY$!9Jyf6SFRexes1U^tN=}8F)2JbMHx6aha5^*|6{8YViptPa zs2oi|6=))=L{FnhXfg^QhNhsY%)qQ{kf=6$I5Zv2K+l4-0X>gqqFG``vzIe6GqapV zZWx}8yv!tyGrIz40TQ!0Lvm_z{)m2Mr3L=du0@4~5b>hoYM5JyVqyI-_i*&=L*37# z#b^nd#f;3x1~SV<*p#K{6|@Y!3Ko`woq=coS^*(miK|Ib9Ly!UBRugJ&`z`qOz%c}Lgx2|%)bVE{5skPo-Rgjq66q4I)vVW_qWjzQLS_- zU>g&QbH@6`hDuM*_M8NkVq@8CEX!g!S|x&y;cQrVBaWdaHJlc`gWg5&q2uU%^a1)1 zoj@niDRdg0L1)o9^dEE{eZ->0q6m*#m(5v|{X+)2pDZdY6?0Vj9or)=;H31*HqBc% za<^zU=>ob5?%qP*fy1{$E(hcFJ-UN_fY{tcKcSz|FX$dP`y2cpM1Kqc$mN#i7Zt*n zlEi|Xyb|%Qs&nUY%*kQC)2)Peh9iVnv4V|fS^5X?Vh9IUki~bp4KwgMhY`k@V2X5D z0wxw?8J3G>>NYkTYtGu9!%DOQN8m`9R-sNf3TrSYzN3x{v}P?>n=@DkZmz(3Y(SmB zht$&I{K7oel0Cs70y=EQ7Hmz2lr0HQwCW!MIksa*HmCU$=AqeY7Vr?3R(a}m*(Ub1|^!-O8jm3Qyh<*;pVWg7PuvDg`aTX*0>FB3$X2kJK&DE z6M7wY!3nr4+;=01vj}g<{9Q$UNJRqcz!E{Y2N*5!7XVTCM~1@&YpPptVNhE_ z9H&sn%tX@I8?zH^EkwxWzhWLA>!EB;%}IrjSk=6z}KtrO?-bA-nARl%A%xcX zTt!H27eJ&$2AxjVg8Xs8-C9MY!M*{-ehix%EDZx-AHIj}y$Pk_9&sq4Dg^5R>@oU* zXn^gD6hW4UYn&J`G_w#rF@V0*+~T5w0)O#pxHpD6k#`NaTApM zf!cZlE@gy5L*ht$Hm6HY4O8`>fUF|T#NUjzz&~`h3hC^Pd$ULMJgC>*mC-_IE zmgbcD!`n2GR04A9oT(xcLxnL1`rg7kf3L!j^|s+hCzC)nXRPfF#SK=j=VZeE(Jj^m zVk&tC0x^$?Y|cky5E)2jzyb!7GzddF$s(ELIg&w!l3C;hGF&9K9w~KQCRu;?8Bo57~D#cU?f0I7@ea@2*a6qnjMG_T#4)npB* ze3>nKygN&3-PuGogFBJ-hHW0YvxDp;yFhk1t75DEU3wpR1Eh=WG5C36Q>Sf1+uv&u7UwklVmE{aX+&fJ}c!(>j?ez{7Oc$uh=*2 z>cBxztOiUR1U*Sn+gd14L^0^!%l18@-%yK%S_4#072w!#r=>PU3Ka6dcvh~Oh~ zMrs1NjZRygoP#<+?k#rY-{pAf1G!(Ejykypv?0hHWAFXDTs&Z9|Hpn3Nrwm zPKKbH29i#D0Um=SFpMlgU1*R9B<`lRc_?cmSpW+UECq zG7HjCXce$e2k9YDo$6`is%0X2494DtSY2kHu`A&S9YGLJp)1U(7lABTzsdm%;bx9}g+w z2K$!H9GKzbO8Ey>^7S@I9#oVm6VMb z3vmtqdWQN1U8Tf~vR0F+SbE|}quTr@K{0&~4W8GZ+{y!HxefDAX( zW;nEf!4^Dti5b2=fpDS*`#|WlLsz)BmE;Ebr3=*2|3ijBZnAE@lI0X$N zTTTsdq}hV@2jZMWU!p7MM!FdeF1OJgbQj$VhnM>yMGwRA<%e)^d4XP}H|SkBv{Xtg z5~rk|q^YE>q=TfBq>F?}W=l3p_DDXEd@A``@<6JRx}^1`t)vOk!O{|GnY3J5A+3~7 zk_MzqIyE4jCY>RjC7msuE1fSDr8Uxh(xcK(r8lL&$RskgOe53E^fIH&BJ;?+GM}um zti7zOtdA^BHe8k`E0j%?iL%|Y1G3Yy^Rmmbo3bBezsjk+fxMBti9Al;Ox{A?O5R%D zR^DFTQQldeAnztml=qbPmiLt>%lpf7(QIspDDwZf#Db^^~DK;oJDYhuKDz+mE!`+Vr8Xr zg|bSyO1Vb4PPsw3Nx4P2Rk>ZcQ@LBYSNXc~4dt84gUYv*Z!0e=??)&innWZ<|g8HKRvickKZ&4^p7iEuX9MvqU zTh#cd8Bt=?(x@#_Z$*6^bwfim4ow?PJ52{of~K1$QPWe?ThmvQ9MJUFq-e4=d74s9 zxu!x>shOsEK{H?Ts%DL5qh_X8HO+UL`<#@Mb4o6fQ*#>5#I@kM zaQ(Oe+>_iWZZucG6>?L#x!eM7A-9a%z}0YXaEG}g+%fK5?j(1bJInot`-r>3-Q<4N zBCTAj)CNpiUfWpPR2#2tu5G97rcKhOXfw4VwUt_?U94TN-L5^PJ*qvay`sIQ{X+Yd z_8Xl`=hk_3K3zRseO;`sp{}v6m9Dj}t**Upur60OM)#cV72T`46}l?jD%~30I^8zi zPTg+ZUfs`nsotiqr|+d7rXQ_;T0dF;jDC7R|E&Ib{Q~_${fqh~`j_-o`c?Wh`WpRS z{Q>+`X@P02X}jr7({a-!(;d@~rn{y;%*ag4k!H79Ft;_QnbXY~=3KMioM)b9 zo?(90JkPwqywJSOyu-XRVBT*&U_N9%Y`$QAV2QLiEG~=N;*_M|ruUKBSR9jYC)>_tEHd@}Wykj|GIb}IxIcGU+{y7)>YOwtcR_qt$|C{E7oh)FKjZK&E~Lq zY`jgd#n@tP4Q(xKt!#a5Lv7i%99yo;d}% z`$GG&fPJ}rrM<@fy8W2_UHftS2liX`+xENmpY8YTzuE8GA2=c%K1aNxxud1y3CBRk zV8;+gh9k={%rV@N@0jYC>zMBl9g7^>9XlPn9eW+GJKk`-={W2->G;fX$#KPT%_(up zoC;@zQ{{|ua!#i++Uarf&ic*<&NycWXP}d_i?ge9r1MGVDCcNrfwRy#&RObw%30}r z&N)Zyn z$!&4l+zz+P?RIv)*~$<=&OvYVT_ATJL)AM(<{CjrXMY zwD+v{Ki-eLpLj2LuXwNV3O<5Y@lm{n*YY~vz?=AXdU`)2uO`{w%Q`$XR&-(ufO zzNNlpzU97^zG~lU-&)^#-$vhNUyW~@Z%4ql%eTk(ns1+PzwdzWkngbXePMu*Dhv|R zgmfWO7%F57IYO@B7xILBVT>?VC=$jCB|@1{E>sAW!XzOeOc9a7s8MoD(kA%dO|Hmsc;p-k5r0#h2p8%gr&i7-x)I)Ha(GeIe#j%+;7L lVs6EJ7xR70uQ9*H+^;XIZ>(>t->80k{Z8WQX3@CI{{Ya*EQNZWfjQF6cJfR0YO&F z5ZP0P$`FK$sO+I4itCEVR9RQ~-XsOl%jb9RA72in$$8&r{hsIfJ#Wq_?-B3Zlt3FG z1u_r~IN%2LKr%=Jy+I$)7Yqc0Kp`jsL%>i_0!qPHFb-6M@n9Nw3Dkf$!CvqlI0Mdt zbKnPX4g3hMgP*_+a1-1Dx4|877yJx<0l$KK;68W&9)jP&W2lA}$iX<+04Bp`uoY|z zQ{aFA90WaZ7|e&mp&wSkQE)7r2m^33oCfE>xo{qQ4K9Iiz$~}|u7a!Kn{XX`3vPy6 z;M;H?JOB^Eqwp9!0Y8SP;8}P9ehI&VSK)W?d-zZIBfJjp!p8_BIf_CCWJD&EfSRHf zs3mHJ+Muh6&XI{FFSKzGms z^c(seJ;nfwa0HITO02?~05)R_wqhG*aV(C*@wgsN#7%KC+#I*SFW^qNGwy=B;xTvv zo`|R6Ie0E!hS%XOcq`t9_u<3%2>t+nh(E@k;M4ds{0;sV-@rHVE&NafMM#82ks`gw zAaaOeMRB4eQL?C^s8F;vG*eex?gISIBVV)`}-wweTAAoqkL zxTJqlPFhA{dEqc`k-xGAB!EOBAsW)~3KInyf<~Y*XabsoW}rD}0W_c`Xa!n>7eE`( z7PJHHK?jgRuTG#d=mNTeZlF8pLGShgsoROj0a2r5VTCwOn+`HSKPsI`*RsF>kPUK# z&%_^|UhNX%!en?~Nf^0*IgJ zh(S&&iCX)ZzE+J90iqXLXdHq5StVt~<)gFGGWvMRyrmat5E&pHOaK#UF#TvCgesW~ zrhptUHJ?$3o$Od%R_XV7O3M6|d1)DG-ZB23-myXNiHaDhxe>%fN>79ORM~Wpw-QXD z-y?%~PXsf;%U~A0{|cB5=799pU@o;YkJ_9M1n??&4J@GVi@@t(F%2acOb%EEmV*^w z<$$z|$}XjzA(hnEEl;O_3o+WPfJFn4Ohbkd3mML}I|)KB z;w1(O0N0+W`)($Uxpue0U&4;og1lO4dNEi*CB39EiToU_18-56*Hf1@)Y%Qx({!+r z`nm~h23zR04Q!{#>;${$`);r&J1rx{(zRoGX}OPnEE*N^mVW9~UK9jJXeoDk+A<>aLF;lqH~t_3aS|8dh@0>vhQyLM5>M)p`lJC#Ac-W2B$I~Q56d6HA>p!q z1pbx#w5&6{{#x(|{08DPX2wsLL6cGgzVkm-Q@G6u- z8I(f>i~v)hl7cw}GBn*Ciu@(zWkO_R`}RYKg@IhV8!5*MXwpcDj0`2FP%RSxgAkgY zrt=)sKrPfkJ}<-W`HGi~;Sb4;g-6N!bw6oU|n1G!==5^o6grNz_^wht`^mC>g3)0PY_b`X+PhWZ_0C)k;~+y!=p-C%dv z1NMZyXqmK!yas?)X%(v!3$?MZirHa!E+z-*X9#RtM%m?z{% zSp)6D{^!F2+Jd1nuYvg>{tPS(wmK|=gJB6>NgVDSTUi5(p_gjGTeM}&%gx~f`xDqd>t;Pmc!!x z##VS~m31rkXH=B?871jU`eaqpR!V3wA?)W;xa_I18n`@EWntOy`bt1jX zPB=@~x58~SMcd&HxD)Q8euj317>-V^bZ<{1teb(bYlbm zfX69vnd!Z1;D;f0p&vtm0uTJC26%!w3McfFU_v`3vwx)YG(7VptQvS4#D@Vo2hY=k zLC4aPiXb_!g6D#h7sOwp?H{D5bT9{EkO={VFap{xK}C?4=#>M-@Cv1$!LlIj&})dW zR^P}3zlPsXeHlf*^3qbTZ#Dh?ZD^L?)_2N-Kfr4gv+!cr+z(-Me=uYiq@Up4RqzJ9 z32(vMq>NOMk;F$lbS%T4;VI#e|W68MFbe?KZGvFd)h$ydDuMQOz zoxG*qAs)YXKylrNFodlUrC%LAw9c7ToE6onDqoSe2369od}i|)AKuwmE_#WgGYHK>uON>gv2;y;nl^z}%WG8lHG;^Z=VAJK9j0#}51B<4 zkm+O^Sx9D5jzmvzT>(;1jj-I(rg2@8)}Xai^HA;UQs(m3?CSC^|;v*N`{=H|Y~0C^n*#RQiUsc~YIv z=g@g7_ZHdkcOYD*GW~2xfjXJ1=xZvoiEMeE%#&ig76NWc2)NB;X1|>B@)5ao9t|${ zjR<~j^(2co(JiWN8`<@I&+pcu_A9yENHp zwZyHc+zIl@^W}1J+h9514mgF%)jB$qc7uC2Gl^&??ty!vT%1Z7=PH_lTjF$Dw*p#& z&Y>N60M5oacp%Qjd3X>yiVLs@-93Y>rYAl@JB})lTOKrPIdr2inuw_)O#Bakv_f zr|flxoF>0yr_$pv8zh?0XvG1Lw+g3Y5AKNz$XROS2DwWjF9j(x%no=u%7(Q4b8rvZ zltF&TN3Vkv9OMWYn`D^>^424PMj4DX7Z0GZA4TVAygP)xtc9aI6V!v3qXBqDh=7Bg zP1S(TC_nh0s+rB!kNz_sJ=6bqBM$ceMK-?wf1ry}4=s2(nMVJSng13B<^Ld4g`%KI zIfxHY)mhF4jyjUU$LPJ|6ss@EW%5-Rp%WlaSn0F|PU2H_w7=9&`|&oN;j|c^=SA+Hy%5%LPVP^0K4g|wt0*Bvt*1iN`m=D2vlaw<7wCX4+`V-0 zg)aIn*u8(baBlDpUF#9*-n$f}x+|!GcCW6kdxOW|;L{m;30`;4K)5f1XJPu3C3J<4 z{Gy^DcXXgF_5a8o$ddRUoC*=0pU;p?!Zh2aT46Sg5LZsHY4yZdY_K5dsvJ$*o_LBVUnkiK=RPl824Dl=CIpTR@LHwF{tN2~< zG4W;bP4PpCL=q)YOSBTb#3->yIEh;lBT169m2{S*O0p$|k`hUUWW3}x$!^I($yv!I zsY=R7HBz0_AT>$NQmfQ1jgiJl>q#3(yGT=|nNpv0y7X1)0_h^@V(A;wWzrSWz&hy$ z=_ctG=}qZ<8IY-DoGeM!S~f^lDGSKv$pqOV*<#rnvSqThvURfcvW>D$vbSY>Wcy@? zWgp4T%FfF!%088SE?3Hpa;Ln$yotQ0JXPLX-dCO>&y;7$v*iQjgX9JBLV2-#guFuT zll$cx<@@C)>#{LaB&Ss1;g;L19u@6gGuJ!77?5Iw*Q5$`vCO zm5M6GXvJ7XwPJ!IpqQkXqL`+5QSp-EWyLFsIf{7-L9tnJLUBRyTZBHMSwuzziC7k~ zH{yK6kCD>I){$9}BO_-=E{t3ixju4hgyYJAkxsD)AMqYg!#i~5lfGcLx>#4z=l1SW}T$TVh}GR>KmOlzha(}&4p z3YbEsm>I!TG2@sQnK{g>%mQW+vy@rRtYm7Lx0w^nMdmx^26KzK!~D$r%G_rjtL^G~ z>K5u&>fY+U>I`+JI!irVJw{!vo}iwt4hZT+>ecEE>P_k`>TT*h>V4{W)%(>4)yLK6 z)nBWBP~TGDQ9ss1Y782a#-g!l+?oVUGfitvCrzrRSW}`Qn)#X~nzuBYHAgfjG?z4A zX};EctNC7YL-SZ0snu%rT8q}Eb!cO?^|TGNiQ4Ac7qo4)?X@Y|PTIcO?10v*9ilDK z4%dF6{a*W%_KxWxOD*=RM|jnPJ@ku&nfSYy1gzA?er*4WjUY0NX` z8$HG%qt{qwtT6hF#Q2hNzHyy#i*dj4r17-ztnqxnc+q&(c-Q!g@t*O4@sUYtGMOwU zo5^8fO|hmXre>xVrdFmb(;!o+X_RS_=_S(w(<0Mi({j^FQ>|&WX{~9u>9FZT(?_OH zOs7m|O#d|fVEWZ8HcQQNbA(xI=FN%b4(2ZA40EPA%baa4HCLI5d762ld4+kmdA~XE zvH3IeW%CvDR~BS3SWFhXCEDV&a2DPYYe}{=vUIa#TLxP4Ecq6XWuk>xCR?UjrdwuM zW?Gh5mRgouR$6K;Z(A-{zOj5~`KRTYHNvX2Mp@NXtyOO|S`(~E)~41j)^64w)?U^$ zYq@o#wbEK;9c>+Jt+vj#&J9>!w=S_RwXV1Bvc7LUVm)g8hxMBEy7jj8uJsq|J?jJO zBb(I5+7fI@wuZLGwm!CWTR&TW+W=dRE!XC?O|-pid&M@#HqW-nw#By1w!^l|w%fMX zw%>NbcFFdc?XvBP9oUgwWS7`wc7;9CZnj(Pc6+qlZI7`xum@V&Tie^%+t~~3h4y0m zVEa(}Fng)J!tS$=wokQBx6iQ8w6C{sv~RX=wQslYw7+eC$NrxEu>F+%jQyPbg8jbz zq5WU>-yOh#93qFp5$Vu6Scl8ucEmWkI=VZ0I#M0I9eo`cjzNwB$8g6O$2iA$$3(|+ z$4bW<$D2CGTaFEmO^z*&!;TLepE|ydPKoX$oJ!0KY>nO?y)*jl=snTzN1up37kwf6 zQuJrhm!q$+B38vRtcKOG2G+z{SR3nL6WC^KD%+dw%Vw~dY!;i%4rKG#eAdGjv0ip2 zyNF%Qu4UJ;>)8$LCU!HsmEF#sWzVx0*-zQe*)P~H*$3<+C+l=M-OdAGo4w^Z0A5{o-^O+aTYmCoz>1+&e_hn&iT$)olBj|oGYB$oco-IoJXD4oj07f zoOhgeoxeDLb>4SAbVa+IF3!cfVq9^qcvpQ_f~%D)-{o-?xxB6+t`gU9*9cd+%kP@v zn&n#JTIyQvTIs5Ft#$?0y4JbYyH2=1cAa#ccAa&dcU^Q{c3t5_oP?8c3NC_Eaw?AD zG+cA8CD)p3!?oi&a2>hMTvx6?m(LC3O1Uzwg7a~HZWOnKTgolxR&q7mDsDBmmRrZ| z=FV{!xJ%q;+-2?x_Z9aYcZYlA&T;3u2e}K}g#mZ5d$4<`dzib_UFNQE``mu_DEAom zIQMw>L^p9yc29Lrch7LobkB0ncF%Rscfaah;9lfj?0&<&%)P>0<6h-n<9^fqmV1MH zlY5JMn|p_QmwUJSAm4@W#`oZR@o9V?KArE!_vZ)jIeacZh%ev^`C@)BKa?NF2TJ)e zzJmAhetr}`h9Ad|=O^-npUh9?r}H!Tnfxq%Hb0l2&%eqq;1}_W`8W7w{0hE?U&XKC z-{jxoH}ISIE&Miq2fvHo&F|&k;osvA@Q3)r{0ICo{y2XoW#77$=WY#j$aG NTw`HtqiERle*hP-D}4X} diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib index fdfea49c42..c6b72485a1 100644 --- a/indra/newview/SecondLife.xib +++ b/indra/newview/SecondLife.xib @@ -2,9 +2,9 @@ 1060 - 12D78 + 12E30 3084 - 1187.37 + 1187.39 626.00 com.apple.InterfaceBuilder.CocoaPlugin @@ -329,16 +329,13 @@ - + 256 {1024, 600} - - - _NS:20 - {{0, 0}, {2560, 1440}} + {{0, 0}, {2560, 1418}} {10000000000000, 10000000000000} Second Life 128 @@ -349,7 +346,7 @@ 2 {{272, 176}, {938, 42}} -1535638528 - Window + Input Window NSPanel @@ -536,7 +533,7 @@ _NS:21 - {{0, 0}, {2560, 1440}} + {{0, 0}, {2560, 1418}} {10000000000000, 10000000000000} YES @@ -1112,7 +1109,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - + @@ -1182,6 +1179,14 @@ ./Classes/LLNonInlineTextView.h + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + 0 diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 8da44fcf33..de77447006 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -8,12 +8,14 @@ #import "llappdelegate-objc.h" #include "llwindowmacosx-objc.h" +#include // Used for Text Input Services ("Safe" API - it's well supported) @implementation LLAppDelegate @synthesize window; @synthesize inputWindow; @synthesize inputView; +@synthesize currentInputLanguage; - (void)dealloc { @@ -24,12 +26,16 @@ { frameTimer = nil; + [self languageUpdated]; + if (initViewer()) { frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(mainLoop) userInfo:nil repeats:YES]; } else { handleQuit(); } + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil]; } - (void) applicationDidBecomeActive:(NSNotification *)notification @@ -67,15 +73,40 @@ - (void) showInputWindow:(bool)show { - if (show) + // How to add support for new languages with the input window: + // Simply append this array with the language code (ja for japanese, ko for korean, zh for chinese, etc.) + NSArray *authorizedLanguages = [[NSArray alloc] initWithObjects:@"ja", @"ko", @"zh-Hant", @"zh-Hans", nil]; + + if ([authorizedLanguages containsObject:currentInputLanguage]) { - NSLog(@"Showing input window."); - [inputWindow makeKeyAndOrderFront:inputWindow]; - } else { - NSLog(@"Hiding input window."); - [inputWindow orderOut:inputWindow]; - [window makeKeyAndOrderFront:window]; + if (show) + { + NSLog(@"Showing input window."); + [inputWindow makeKeyAndOrderFront:inputWindow]; + } else { + NSLog(@"Hiding input window."); + [inputWindow orderOut:inputWindow]; + [window makeKeyAndOrderFront:window]; + } } } +// This will get called multiple times by NSNotificationCenter. +// It will be called every time that the window focus changes, and every time that the input language gets changed. +// The primary use case for this selector is to update our current input language when the user, for whatever reason, changes the input language. +// This is the more elegant way of handling input language changes instead of checking every time we want to use the input window. + +- (void) languageUpdated +{ + TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource(); + CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages); + +#if 1 // In the event of ever needing to add new language sources, change this to 1 and watch the terminal for "languages:" + NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages)); +#endif + + // Typically the language we want is going to be the very first result in the array. + currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0); +} + @end