From 02174ac95fb840d3155567507c4686af8c4789a8 Mon Sep 17 00:00:00 2001 From: fliep Date: Tue, 19 May 2009 20:47:32 +0000 Subject: [PATCH] - Changed splittest.c to run through all the examples of window splitting in the Glk spec - Took screenshots and added those to the documentation --- docs/reference/Makefile.am | 22 +- docs/reference/glk-window-arrangement.sgml | 58 +++- docs/reference/images/fig1.png | Bin 0 -> 2465 bytes docs/reference/images/fig10.png | Bin 0 -> 2403 bytes docs/reference/images/fig11.png | Bin 0 -> 2753 bytes docs/reference/images/fig2.png | Bin 0 -> 2457 bytes docs/reference/images/fig3a.png | Bin 0 -> 2465 bytes docs/reference/images/fig3b.png | Bin 0 -> 2458 bytes docs/reference/images/fig3c.png | Bin 0 -> 2452 bytes docs/reference/images/fig4a.png | Bin 0 -> 1153 bytes docs/reference/images/fig4b.png | Bin 0 -> 1547 bytes docs/reference/images/fig4c.png | Bin 0 -> 1920 bytes docs/reference/images/fig5-7a.png | Bin 0 -> 4954 bytes docs/reference/images/fig6.png | Bin 0 -> 5337 bytes docs/reference/images/fig7b.png | Bin 0 -> 1966 bytes docs/reference/images/fig7c.png | Bin 0 -> 1387 bytes docs/reference/images/fig7d.png | Bin 0 -> 1198 bytes docs/reference/images/fig7e.png | Bin 0 -> 815 bytes docs/reference/images/fig8a.png | Bin 0 -> 1600 bytes docs/reference/images/fig8b.png | Bin 0 -> 3209 bytes docs/reference/images/fig8c.png | Bin 0 -> 3841 bytes docs/reference/images/fig9.png | Bin 0 -> 2706 bytes src/main.c | 2 +- src/splittest.c | 353 +++++++++++++++++++-- src/window.c | 97 +++++- 25 files changed, 484 insertions(+), 48 deletions(-) create mode 100644 docs/reference/images/fig1.png create mode 100644 docs/reference/images/fig10.png create mode 100644 docs/reference/images/fig11.png create mode 100644 docs/reference/images/fig2.png create mode 100644 docs/reference/images/fig3a.png create mode 100644 docs/reference/images/fig3b.png create mode 100644 docs/reference/images/fig3c.png create mode 100644 docs/reference/images/fig4a.png create mode 100644 docs/reference/images/fig4b.png create mode 100644 docs/reference/images/fig4c.png create mode 100644 docs/reference/images/fig5-7a.png create mode 100644 docs/reference/images/fig6.png create mode 100644 docs/reference/images/fig7b.png create mode 100644 docs/reference/images/fig7c.png create mode 100644 docs/reference/images/fig7d.png create mode 100644 docs/reference/images/fig7e.png create mode 100644 docs/reference/images/fig8a.png create mode 100644 docs/reference/images/fig8b.png create mode 100644 docs/reference/images/fig8c.png create mode 100644 docs/reference/images/fig9.png diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am index 4e05bb9..3af6caa 100644 --- a/docs/reference/Makefile.am +++ b/docs/reference/Makefile.am @@ -51,7 +51,27 @@ IGNORE_HFILES = chimara-glk-private.h \ callbacks.h error.h # Images to copy into HTML directory. -HTML_IMAGES = +HTML_IMAGES = \ + $(srcdir)/images/fig1.png \ + $(srcdir)/images/fig2.png \ + $(srcdir)/images/fig3a.png \ + $(srcdir)/images/fig3b.png \ + $(srcdir)/images/fig3c.png \ + $(srcdir)/images/fig4a.png \ + $(srcdir)/images/fig4b.png \ + $(srcdir)/images/fig4c.png \ + $(srcdir)/images/fig5-7a.png \ + $(srcdir)/images/fig6.png \ + $(srcdir)/images/fig7b.png \ + $(srcdir)/images/fig7c.png \ + $(srcdir)/images/fig7d.png \ + $(srcdir)/images/fig7e.png \ + $(srcdir)/images/fig8a.png \ + $(srcdir)/images/fig8b.png \ + $(srcdir)/images/fig8c.png \ + $(srcdir)/images/fig9.png \ + $(srcdir)/images/fig10.png \ + $(srcdir)/images/fig11.png # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). content_files = version.xml \ diff --git a/docs/reference/glk-window-arrangement.sgml b/docs/reference/glk-window-arrangement.sgml index 9926d81..fe9f667 100644 --- a/docs/reference/glk-window-arrangement.sgml +++ b/docs/reference/glk-window-arrangement.sgml @@ -37,11 +37,40 @@ It is important to remember that the order of splitting matters. If you split tw Example time. Say you do two splits, each a 50-50 percentage split. You start with the original window A, and split that into A and B; then you split B into B and C. -Screen shot 1 + + + + O + / \ + A O + / \ + B C + + Or, you could split A into A and B, and then split A again into A and C. -Screen shot 2 + + + + O + / \ + O B + / \ + A C + + I'm using the simplest possible splits in the examples above. Every split is 50-50, and the new window of the pair is always below the original one (the one that gets split.) You can get fancier than that. Here are three more ways to perform the first example; all of them have the same tree structure, but look different on the screen. -Screen shot 3 + + + + + + O + / \ + A O + / \ + B C + + On the left, we turn the second split (B into B/C) upside down; we put the new window (C) above the old window (B). @@ -55,7 +84,28 @@ The visible windows on the Glk screen are leaf nodes of the binar You don't create pair windows directly; they are created as a consequence of window splits. Whenever you create a new window, a new pair window is also created automatically. In the following two-split process, you can see that when a window is split, it is replaced by a new pair window, and moves down to become one of that O's two children. -Screen shot 4 + + + + A + + + + + O + / \ + A B + + + + + O + / \ + A O + / \ + B C + + You can't draw into a pair window. It's completely filled up with the two windows it contains. They're what you should be drawing into. diff --git a/docs/reference/images/fig1.png b/docs/reference/images/fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..3314081683ce132f81664ee1856e5a1b5ca10520 GIT binary patch literal 2465 zcmds3do&w(7LMuzonmAT#geMFwBpf5RM%_0MwBwE+CG6|(kLJ*ILsny9C&(euf zmBVT?NYSNHB}q|k#u8Z8Vs zxSKfPM>2X$1IGL2w;%9Dlpg@Y8V$WaF(g;Ab+4M1d-sSMdoqANj16lHkcc&paIRd1b6mDSLZ!zI>^4!B#59A<+9&B_Ybo3Rb zNjRA{C;97DUxYtyAvx9)jkcU7@p-4IH&N&w>wEI7b2wv47lp$$>U_Jn*wzbie$Kn= zEUZ~_rzOGb3T4^u;DVQ8W!Y=D4t{v6`NnZC0%p^U!_5i1_Y+8#4v#aYkXd!WmbHd3 z`-N(W>F1sg6*M{TvZy9$J7brAe3pARVTz9s6*#Lm?!N9U+Cy{7T!%E(B->j5$qxS#ERK30Fp-BT#-^zXVT?Zq1bSG2I}CzT;pLGb&2wvrNkga z6@I~IHfxf%p1qV&7UYktW9HOUi|xJ2XQTT35ml!MUk*@5m5r#8Sx<*CxqfU*Gzx8( ze7>&8X!C-;Eq$lTy2-60e?9@?U%CwZ2d(w!=x{LswC$Tae{Pr4;Gl=MPIRwr@c%Su z3n%-?4daP#2rtfl4f!tu_Aj*c?ZR($Z`5;Ng{N5JX%UOH%5HFB~Q znB76;YGlnnQNg#@XX@f?=r%FLo<4e;I&?8EMm-HRdXnAJ1!nWdqI9$rY;JCTq~L0P zBwH3OM-uZes>VEty_57(WE`#p8eQM{)Tfy=$0KQ^XGvInK)=P+VwuRbqjhO!%i07` z0NvqrPsIZtwiQWibpC=Em;!k)H#Jje)4H*cpQln}-i;L%72De#+kPR67n(=FD@^`b zY>paE*nD`*euMtZzuyB~yg+^3=vi#U5OAr1Hi(E{}0|#s)PT^Am!LAtLJ2*8uCFuOnrbrjlThB=9*WwJ>uZd-pz*Ys95VcfB@f_-IjzBoNy!el5U zX4!IV?$eHA5PSsJ`O)F0f6pfuDFfJo%psmB=Hj9jmA3SNDNwXa2iX9xwl=w3@ZAb7 zfycuPomS?++CSDZ*I^vaxmz9OAJiuD&o5~=5$2s?R5OXaBNCgwPZ5Qt-YJ#U;+TsI zzty^?j2syaE8B|Se6C`$yT-NOnxuxkX?|=&52#lpzgv%@t}CiUq!@l_%_vD(u}5W* zL=YbDX`df4A_~lmiH!?lp$PN-UB$NxR`(UNTMZ4Cw8fVh4A)=Uwwy)-{y>ygkqN?K z@-vY6)^)@9eNA2BA02!In`=y!g=T7UVj6NJVfI06FKdNy?eH+jsb*9_tFi&Zq~chZ o$%niF%COrOM1tGz5UJTauzw3`_&wp4_Q(PR2ZjZ-`o-n{6Bdar(*OVf literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig10.png b/docs/reference/images/fig10.png new file mode 100644 index 0000000000000000000000000000000000000000..54c29898f2b858fd607662e8007909c9f56ab913 GIT binary patch literal 2403 zcmchZc~BE}7RRGV8xaI?@IWD`6(}lJQ6ooS4WJ+pkU|Kj%}M};9FRaLM?fw?TA~)P z0g<*V*o8Aq2Qlz4MIeIiOxN@K9GDAP~rz@_ea2?j|@R2w!5u z2t;HI3J{LLqEScimts&T3_b!&5Na^&0RW)H)#;2+{GG*#l&I%oqn;&cW7{+1BiZ>N zW>%WFG`aX&I~SycEgM(pG+RMJxXym z#62`;2U}EI`bsi+t)>5m03Fj#ul?<-7ImC&yE8R<fahYLD8N^c9w%krChjiz%$C zlKl1LBNkYBs3f-SprJZ|>`5jE+uGE)QotUgLU8*b@vZZ(*FC_&d>o>Ex)6pSm9Ly@ zxE-aKxH|nT=VB4jf20|;crBnNf(LW-I}E*v^1KJv=+iR{$rFtQ78SMdg1X?k4T^AF>*=;l;+2wC zvX)(QZ+ln@`QvR%EMhSEx^{l5ope!h&J)|kNg_1mHR{05O@5wlr(s^brQI{5fj8E_j z)q|(HV>x~0`F=hLgW#jP?3!N9<5^LI73jBd&YO{%r{5{AO9){Kvy`>w>$lp|NBnpx z80u?8q$57Ov=e<{8y@n59waHTjv^+YOKpksPkY>Q?HCTpoC7q5H+XoczE^bXDK|IE zY5!E{`Kzz_5eQKvHgb}5%*7zz7X9fCc5>7 zM-}<*mZiFl(!Qv3Y$*gSfR>x}&mycPTsn(cKFZy5ba^Al>q1*a`SD2}UQ{^8t<<{n zO)l|{W>D(~nEnAmeoL=5@Z4{zzP|N;=`a5Li=ZSc&9lJ&NaLT4@^2;j7qpXvhWB^6nSN(|O+P2&yU#N_SM00;=>+~`vJw*fAVt|3i8Ue@cqm8q z$aj#a9eg@8|NVENhWKiA5>F-E$6zeYdGchv>#n73s**9dO(6Vdwb-RrGuP6EtQyG75%FLT>#+S)z?kDtSF7!V%7tx(bKw|S zOdEy8G>g3Bg7ID-9-0ZxuAqa3uH|EH)kdddDC zs=qK<)Fa5rdtQ0;R70%9*C%C`Vz%>ikbwdBkoJw0t%dUjWMlk5J-@E1q8aHi(KxuL z>$1JydK+{Au^|TIFrzIh)%}s)Bx%_HU7S9xng@ literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig11.png b/docs/reference/images/fig11.png new file mode 100644 index 0000000000000000000000000000000000000000..04baff63bf14a9a2464806e16da08f45c639d501 GIT binary patch literal 2753 zcmc&$X;>0i7q*&=D6>T^Q^(4!acMKdWP~(Z%(VnVOHCayDO5xtF=1RA*X%Jf7c|=} zMMfV#w^A(4$k41-uK*_?(KO-3%DDo zp`oGWde-HF+P>4!SQ7|XtKNCVFig~D9oE?u1^@tfLa%Z4Q9t$+BGxAg8A}L`3DXFV zj6#RmU_)cV!XmL(qhclN+8`PlK$xqG6YNIGr?G3-FUj;7U#6GvhA%yNrYKa=G5xh` zsz=h9u(uBAu~P$l>Z`X1mk2OExj!E>JF``1m;2_l6Is{np28pcfH1R~&L@39=ejZ) z5`Qv!z{VFf9$)8d}8Woe46nl9OiIZ~Ka9=Jpg z+OIRh<8=t%4OMI7@OX&w+W;Dkris%!gx>pM^{)Hi3Uk;ki2|vYSwZ73VQs-LY;3Fi zFQvfCLi*lNr{vij$dxtq@YecmY@KYg@W=kQHYh-<85Nq>U=u`dX>0@)Fm*FKFFc2( zu0hn!`B)dBP!R+J|Fkn(R>t3#`Lj7TzSL!%^ro%}YGIE>TDw+9hjM4oO?W=18ffL~ zK)FXUi@ho6ot7e};+maFN9R8L;c{6Z<@Xr-*H7_~LtJiicyDPlcKWU8O9m&Md%a<$ zgF`292HO_z^b}-+FYKk(-ag&)%Pn?a-<^Y-w-^$^(9wckt%7skFZ>d2MxK11kDn;9 zC#zPzIszCNOVZ#QUxuq}F-Q38^nJ=KDY>#TU#m!>$j+R)l+vOC*+dpgWA|E%fzcxwhm2d*E?t{Mvf z7bAN|)t7Ad$teRxd74Y*nFr}GYrW7~#IHYlnQo_vPw(4y9*&%Hzv=r99{kA?YL(R) z;^^p@oSamay8Dt%cNe;}`GVeDn2ni9e(a4_3|fzh)@(UMBYr_Q`^ry{o;FoFg(+w)jzC`oYS!XP#c6O_nJ?1v@3x zTq&J4lJ=TfBTQrF8%I*sZ){Kc%fH77k-NwG>{dNfz^3g##?AM_#FDYr^Y)$tt{_cE zx9q*t#R2J?5xR3%x2AmTTSek!mS}K$I}y4VIgCb5mvI&pomGU{5}y@0A@V-A zGRd`^?qdO@j6!r1KE2TK#w6|cib|stxSybkGY=_o>$w!~iA^q~)Xd4BiM~PVoEMA)_N4jo$}$_< zIwNtTCg`HgUMi4(<77#ql^$W=TM>@-QbUzUrmTJx-njP zz}CQMwBb5ebjFx)GDo6I8(kR*0$Fdl`kx}^~$WBRJyimd3utl|T9b)ZrNPvSwO zrED9r2Or>}ke{p;P=MpQf@|m59-aGPT>3xI_a93B z;r{F09%L1C!`x=8zX|GLJ3QEdLQ@$&i`XGCtqD;J@*mRtU_JhuNGzlIR`cfmU_FYm zIy<1X!|ArKZHc?N?Si)hWy^1OXFD*4wwGFoxbIIu4#UbtXxr!B#Ir3*PJEDRc|||b z6J(?w)|fMZs-zeMU9!5ED?v9;hyfgb-JivKVGaTvxKid4R`&=sh!G`BrDR%JWRT8UPEt-wQ+>sLqW9ofl(i3s*CJ2^N zm@wJk;dI-_V4surp@e*bf9S)m+W~cx&&#L|d!NOjHU)d2=JCmXn9nDsz6S&}{@GTO zDP;>g(gHFUY6jPn=|LmLq(0Ga6LU;#Q=b z)%m}fr?rQw{hA_+vo(mD7OJtWNs;ZH(8S;O8>a01w#V-Gnx~bp8;YTPaksV7&ok9H zt4Hy8i0X%(VDx(j$-jr=WriPmuPR1E+m3@?Jx8tY1zPPQY+z#A(+9hA^6uTlbgsV` z)pRv7D~!~V-V5}rwcNG1q`$gOwe)Xx`v>H9G5`5JvW{K04wt6;w+HKs@tia@iG7>R RRewS?Tu*tr(44O%{TGlP%yIw# literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig2.png b/docs/reference/images/fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..2865a2f7ed61d096fca439005eb8193e4debe710 GIT binary patch literal 2457 zcmdUxdo&wZ9>>#3>s@0_=_slrj80MQ5RXAlThybcI4JQ5lcqt7M8qRRq+^I_(V#Qc zprwnN85-1hlsrZ{jc0{w5s#*x37SN_f{<=@cecCzdv?yA{p)w{@80u0=XcNN_r1Rx zzTWN!)sCnE0Dyy@9kbo!@Iu2=xMI<1RC~P!3Q4C~40031BPuH^nxH92XTn#O z+h-9oHg;uZu+Z(M-dA>CYJXAkqxJE`Bf6=dl01Vzcb0lhP8nk^|N31>6UqWJluxP- z9?Yl0xk{lWaOG&E8!g4}cy%>d+7e|oriJ2UCreU%$g+&^A*^hsc%kn}4ZX*~+up$T z&8+S!9sr@JsB32(P-SKAho3c05-MeCdzB9;@3wIW~TnOyQE6BW#);n?+K%RQF{A{G&&U5}+Z$;effgzt5&= z@j~lEhk>5fw*QVJnk0elAhu*l2-3 ziV5|_P4W#LN5OZ4(R@+r+Gbdq6KJljQBY}Ru;rS>$7+$N03Jgr+EJnn|Ew11fqTQjzSOkxk z`m$e?wvbE?azWgu<4Y*Q3Ts+0bO zt#DOPoxSYnPp6w$MN!r+xA=Bfd|>`X#d^!mayn_NRxRviZc4gF8_vDxze&gMB)&&X z@k9i{6!&`JOx_1aD_f5WWHdxo8^^II>kskxf$Z`ws^Z$IVs=8`E zkJEt~*qxsbT_WG#z=r_rr{nEKTCJzQY+4w9t}d#L7TtWvKQ!r-k}R*mc5r^NHH^iz zHg~BaEo!f(%`=RdcDIaO(1 z#4L=`*l&FbJBvZL3KE=QJGy+&dr3qquQ}qI^y`0m;I=2 zFDc%m;V+8rHh*2ren<&M1TlFonfVPfQ^boc6nZ-Csra+b^H7N{1aq4rgoQ5uQ_D>n zz!~uV_#J9{SVk|O5U|H%^u0|}FTK$Ur1|cE@zOe<6eV*MlbY@xC#}Hu; z?0MugXfKKFH+y}Oo=gHEaCgJ_U)mox^_u5dZc_ z*6d=0i+DgO?@-hSzL?d8&Q`QD=o#U4p~=4t^*zRaW{dpqwC6jYgn6;YdWIuUW(XQd zw_zDR>KbMSnq7vy9F7#(E10&wMX?NRdCMwpd_4dnrY;ZSg+C$Gh{X-aX<#_ujRoyD^o{ zmJs0)I*IfQJQA<)E}N##=u!o>-!zbF*Y;qMcN`?%%$)r|IBe<+adhHfz14O|HpO!M zai`d!vtUVjeQ25W!-(6};Bo@3UF3eDM%HWwRWW~%OGKU07dRP0puC2p=fEL(iDe&p z6B~F&EAZT_SFegQ96sHPNA#5SiU)*c>l{PVY)HPE2DOo7{=MzCGMH1!^)brm6lxwE5;@N*6N8Z=6s~;fU1*3qgBE@h8 N@O1NbrJnmb^KWbOG#LN@ literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig3a.png b/docs/reference/images/fig3a.png new file mode 100644 index 0000000000000000000000000000000000000000..b178d7d6b4a79207cd1411b90411d2fab544b5da GIT binary patch literal 2465 zcmds(eK^y5AIFC{qnL{$4>c-E-5yr0d5E^dJnPK4b?~c1?A|C3lX=S6PL8;D604kf zC|pT7lV^FRp<`2xQsQW4Y{F=kh8f1~oco`<|L^{|@4r6Z&-;5_-|KUIuGi=L{!o9w zxNB+{X@Ec=O-~OO-|g530x1Q7mA6kmv24@rph9%^{1FTWb0>W!wo}76S0L^T0Uwtb z5{miXaBKuCw^F z&sc|aGqWvyIj>u9-SQZ8DRR31wze-PBtH%j%BViAY^r0fmh~HAo~5JD3kM2Sd9z0J zsM?2y2|xL(33z2cczILC8((eCX2hgwR4o#HOr&ImYe_o_d1>5Hwq$*Efa-EUE#-|f z8PZj*8{(8!yUz)r?X&bK(?Wi$m3fD$a&7lbH{I+QR@#pLxYgcm2HvTYuBzVi|0iGY z43;f+EPczqa)^`kLSm(a1_EMB@i^~FKIa^tk*@E(j*n&&` z{Vx$ccXFN8bVppE`&9a7#S2a%aj^=rkA`-S(HoSlUrV(EwwG1u3CTS@Fc;0>4aJR1 z{(j8~K*tCpf*tYrJ;UTtj#o)O4&QEECB5nwqfKw7v)GU)%TrS|9dOuN&LbGFaN4f? zazHV4G1<;C{exJR^UYH(87ixTsCfd|Isgc)k>KSXdz0 z9pu=uR4(O2@(V9-C8(;0T(xUWd^Za4(_xC$M<1Wu_@>-CX#vi-Pjt5#YF=Jzu{!Ll zFg|J|4h$gRdE)k&elAh8m_-w^usKg-mS7J@)=yX+z2{-JSh|0&*7|W=?riiZJV6jT z5}%puJpFrbQ9r?q_-0oBPk=u8=Ffhj$Bx8H2|TgZ@Cd@fqH~@@XethulBUDmfjpuR zHFkA~vyeQUkmHWV7I%^g3&e*{(ZZX-D){Pl94QYZfI68Yqx4yjk$iU02M3XJ2RDqwWb#Jc&QYo;*)boEDTIx`D zX6az~=fsIK8SpO#ut!+a6JvL80}6i9EiwBlvpP%*)h`T6N#>=M)?f-~cj&k2aHOQo zUYeH|#c)U-kX%xla5-=*9X-bC;}l-Dfwk0hFih#icPP@a(aBfS3B^&-j=)wlF;Dje z;Llrqk$Rm>*z2msXY~m;fq!n+#ZC);0m8@H#5KrPL3Slg%KT<52_5xrt-d}3JCh1E z0Ntz8S(a^vVS>6*C)fVQPo^kRa)Ph#AymnUlG5{s4pO+k^%~C4jgz88eAv=7f9-ad zAAY(lJ2=k!w!11sUqU4}FVYIE#+v#h`@7u$Y6Yt0A|9eQy>`m%53t4Hvwua0t$AZ({xXEe#2y zu&Bsb{_JzPj6@+k*e;8KDw^`Uh6bq4qLGih1|&}eV=CI}p@<^I!a>LiVrZcan-J1_ z*JQN`wr|yg&24A$mc$43*bbqhR=KOIE#~=4apa{x+cqG=nCHqTU=T@L9^^ji_^K(i z$HRB#KvRB!>X{;11%BEq}0Kvo!)d*;EAGU9~c^-O>mhsv#g3GpK9IqVK;31D<8`d+rWZC zZhq%8kA!Zae64e;g}LBzp0F~+ z4cdBl0a>k~fwWknebS-}%d+|nZKGI~1U=Xhi_{peljU-kpHUW5Ss(UK3d2%%ZOr`q rHTQyaHdLX;Ux64L8Tf)9>X!1P?gqlUGu&i*$pU%0VqB`7FQ)wqli(>6 literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig3b.png b/docs/reference/images/fig3b.png new file mode 100644 index 0000000000000000000000000000000000000000..112f4af3b91c630533ffaee75ed756b11f9c3c89 GIT binary patch literal 2458 zcmcImYcw0!7EZYxp_6K>rd5k*tIP;hNlh5UrD`y18m1UVMblI;kw-nFo@2CKQ}L)< z+>|0pb%c0UXbIBsx>TlB@rXzxjrS|4ghV>&oxAS6oi+d3`L)mf&RKi!v(9(Ey?^pN z_a#W{h!y|<0J*!le510x0KhI3P))T$M)Vw48TCkKcW)pN$P*%8s$9LOvwl(MiP)%E zbVM*9gh0dxTSQ_af`bW>p~R>a^>zdRplRXm;^a*(T;k)yeKZVuByU<0OE-3v0i(Kf z^$!|k_L*4SGq2Y;kwd9J!MiY8Lg=Ju_>*3o#FQ6w?a!tR)OA3ozpuIkZTJjy-zwY# zf66TMi2v@Uz34^Mm$ch?2!1?Ily3H8Jdzf;xiCi+a3EI+L5k-IwhnD@+aApuPd-YR za8AGneQ% z^>5HAx;QbB*Oxh@!um> zqz^ibs+^i74=oK~4Io^5C^i^52yF<=8kV=3*#P?ka6>v8>% z>|z+WQw>F#{PpRjmJPCN?-fy956XUfrhXyu&L@Y@tzpDU4%q0|p+_N$zjQGc_HKfx zI)`E(wjy%=;p%8;M2fz_^loMZkQNAV{~&2q)y6Wcee!B4e}#I_03A4(kxZQNf<2ax z+1aB&8F9-+Vc4d7iygg#T88XL11-n(m1Gv&0yjPFA6Fz;&8_so#?;4%TVy5e5OiAZ zMZrC5tgqkN1#GWGaeeV;oW~kej*c<1NzP^YBf@D9R>ppG++kpUG+$f0MKZ4oPmp)r zcZVb1bkc@d7W&mdoSQuxnjWJ#aa>CO8N0jTMuSekv&sEWRj9>W@59nY!p`R7=vg}$Ol=VL=Svn%BXNOk)2dW76Xl`;RE z6o;(c$1OR@;$P&BTro+gWuX`DXkeb*vFImmM*99;wO2`}Tkh05ZgzI(*yakTJgd1N zI}feIBf5t#U_d^f;@6}&)TxGIhqXpQfLcoJ^`jWY5|+zfs}!7h>(ZF`Vru#2gE9wW z01)?J8&d&ytQ{X%n^~u?&Nq|6-eF;LZmQRatqNn8JBX7*vSG z0rOc!>+#G3d6&)3Xnj|l_ z)~KtezDlDrs#GpQN12Mm^PQpZ64 zb4l8opTBKxC$^uDo`&HTDccUlqd>?r^^wa3W5`UV{CAgaN`yAF;cz>@$C{m-9~+w! z3M`Yc$x{VM>J#Ju{FAx;C|#Sh+)r;OJ)Lw|7`m&xX~%#Fym-SasI^N$7(T-;GwS|SK>zsE vAGWK1fRx9qw>*sx=xrIu(u9}WLC literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig3c.png b/docs/reference/images/fig3c.png new file mode 100644 index 0000000000000000000000000000000000000000..6309db9e47f5885ad4814d86ae4489bde1ac495c GIT binary patch literal 2452 zcmd^B`&SYO7IxOre1y)_q&;y?+E{~*ZPb`gPNt#FD3vy&`2sycBmx4d)FAmlM-&ka z3m=%8Hd97wD)>keGipPb%pes*Q!_=SR7CK#?Afzt_w0W#yFcB>`OZD}o^!wN-kdW* zP=Lj53nL>VK!CsRIfH#>Wb|2-*`Gt~#aY#}! zf)Hnf!r~I*oQbi7xHv5FB95ds7J3^QnL7sfo(M@Pn;W8H29o!QKWVietWQ&~eU%oT z*kc-JC4Lf6eAWgLl;aRTSXgPfXTbU9*`1bFPP^jU&9Rk*W7kcJ|N3(*;2W^y5BTox z+5yvQ<3Rg+k7w)iMh?-=UC^uMhaOOGg${w{nUCg)P%cv_z`2aEaa`S7ZRdSk3)*C#>?zIO8e!p5Qhl%0iXMvgM=x{Xyfbnh75#9WmAIpRe6e_+fkw`KnC zrQ5h&8?SV`#yzE_o~v&1@N-)ck+5(I8A^I4aaRuOf10|ca{E2Ao;Nia2$jt4v9{4~ zzAsRRjXWvg*u&&xERf)Ji1vl-=7!#Z%xH?-@7BJyVN};!Mp+!dok)@M*hz=RwDX?>d9&QNaI$MN$nJh zGg!y===V}%PU>_AE3)m(5k1;cM=fWt10|0pb6EUa3*e#{W0V|dy8v$S%v9S;nL`j;NeHp{xPT;ps4L>&-U{|;n4!F7iv|pCcv%q%bJl% zwVi7*7>V@sP6Px0;ki2)C=)xK{UcrtsI_^EjD>}wwANP7}%luPs zum2v(!M#?FsavpzBO3lqRRawZJ9n67bUjh~Bddkq5b39OQs{!1{{yc6Ly`7}iRe*S zibluyfi65uAz<}_B}IUa-xuA~R#p3H!cYE6vB*329Z}T8Ar^bJv`%A~Ds=3EPvsxK zp6r4j?y|q2;=7Q4YixEbVTI%6>Etfhdrj0uoZHZncG=sdp!F_qQj<;J=7|>Ik9)rJ zPlvIl$jFvUukV6fV%J9;-;!6~td^t4Evcz9D+{nm2f~jL)v&WAMfX{Q1tmbXRx@*rOOXi2sIq`Ku9Zhd&M|Y zH2&x;xZTU6doJ%felkdPcWD*|i5&j8&VCp%*XpfRT73F4lA?fr|AyjCYHC1>_0TF- zTgmI>*0N)!Vgx1CNAEGhde41U-Wt)g!HfsG-URquRJ51agb(Kzli>>WCwyN1`86;=LTK z#E2cv56W*8eW{B4fWvs<^iQ105v+R({D&;p5VHFI zj&{}6>?}wG5QBYlRoPKB!}lh&xa0u*qzTlNa*m1ZfpKW%Dvs9Gb6%{yLrw6z97uj{ z?P~j#Ej95o(H zE;$8!k^_)7)9xBQb9rrHwDP^MIf(?wla{9}qHv&26nbz*oQrZx{iVb~2->?$P-H4{ zz$oeZrD-}nkQpS!Z}MS=U2Du_OUkm@Yo{vqYa7P1eE)UD|CARxrSi-(jj7_=e<|1o Z;PvfE=Vpcn-0)W!1^5N|@_gXwe+O`RCEWl3 literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig4a.png b/docs/reference/images/fig4a.png new file mode 100644 index 0000000000000000000000000000000000000000..973e6def170ea67e74c30a5f2f6bdfa736f2e35d GIT binary patch literal 1153 zcmeAS@N?(olHy`uVBq!ia0vp^bAb2)2NRI2b(qf!q?n7HJVQ7*IBq}me*ol4mbgZg z1m~xflqVLYGNk9_=ceiwCl{rr<`rk;m%L}*Z^yvEBI4=d7*a9k?X~!fsiiWKWjx)7UAW}f8ms| z)`Y;u9)zR$*8Dv8vUAb% zCoM9i|E~R<99(`{cKsY%TN%M{|9#c#UwHmhaR2-B27BbR-0H`Vzw!R&v$+~KThjL1 z@wtoKpEgRHX7kkijdtPTwGkF#JqjI$Q~{68!L?W?=!axkKewr+&|q?Y1=#d zd$Uw7FWze|{^NW?&XxE4eJ)4(_<#TZdGp(kZufb0ivs7r`@Jyg#X1{<#b&Q3=f`)3Ine%+2(%S5-izt+9K=CnEaxBL0^xqItxeEsy?f7_Ha^|oWr z{%I9N^F?*ZZO}Tm$5u>m>uzORTk(Ij`<6{f>1{n6ANxD=!_KB`?OS^7P1W3%F0cF8^QoxMtquu+Uk{y8RmZ@5kHOPD;IbY`WW~rL#WYeVhB) ze7~)oW%!pfp)K9BO!?;S6cb!O@5atE`cBfBgRa zi_Q6B`=E<{y1HUwlP>BnQv5Re#r%@ywF$m!HD=99*1aw9GD`25kJ&M^Z5NxGW!Mgi zNjJ8zZgyU=ZU3#d=qpx}C!3aAtuHOV*PmbSajr7mrQ-X~y7>FoAM5Xrf8TFz^Y`C} z9lvW#_utoVIl8QhA*!Z_t0R!nP)os$b;{g5r{9*P*YW+jf9%+?XKx=)gi9S+(I6oz zu$U<+!~vn6BtaiZQ@MRHGbS(1jB>oncXhMGM9sy&{7l&waSG1-v-9=rlO3-Ld5%vB z4nzGu5UdGXBgXs~3@$wh2> zInuMbbTqT$LSKkX6y>!o^Ob&^FW3J`re^ZVMRj{O`n$;eS&*A%oc{7uU-h)(N{e-u z@07Ujo7N@O|09b1xXJ9~^QX(tzsvctBg}>ER@K$BsTOHnR-ZyoZ_U{A;2yvHx$WoQ z>D1T#&%L>=^P%7SD_aiT|HH{QfL2LCY(4Q*LhLIVBUQ-e$djx7^0v ztIDs7EUP)F9ILBjRJ5v6Y1@OJH?7VHmL?>x?+Cf_w)obTDf%b$^H*z^96L1q{YZA|WZ#DNHjk?V56lllEvB%;fGzPJUA!z1zNJ%a?e$m2Pf_ z-DgBFQIb3*L<723{HfS?^P>kV#EWSmZ^I({_DnkU>euz{RqpvKf%tQRZJU$pbmp-b^r+jg&VRT1P}A*b?I zN5u5U??Ayqv9&?A9=9TuvTA-Et9<{l)W4+TMEBjftB!l_7U8ZuFk|PYbDMU*yY=kl z{}qX?t16AyEML9ZZ=&?^!H)lD7HnUhTU)Yg`|sZ4p?y>9P6XP@oxgL|<;$sayWF?$ z-)R)_=k~%~T&~WkO{(iw8s~hQ^u3C|>qL6~+W=edsz{Ah9TwBc@m|E6wfsLLJyrulUf^QX+3HS6C`!;k3+Z_d1Qynm&n?&sy> z_VH^AR`EF0y)QqP7Itq^>eNuv^HX|3J3FOVHI`0T9&KW#i{an^LB{Ts5N>Z^P literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig4c.png b/docs/reference/images/fig4c.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b60cae74621c1aeda373424ca9e1b2ffff60ea GIT binary patch literal 1920 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 a6~n3`MM1FJ`6q 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 TpWJO=l4tOA^>bP0l+XkKXpv|C literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig8a.png b/docs/reference/images/fig8a.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa9ea70dffd544cb8542969bdc4887c5c157729 GIT binary patch literal 1600 zcmeAS@N?(olHy`uVBq!ia0vp^Cm0wQ<2aarEdQe8%0P;_*vT`5gM;JtL;nXru4IX8 zL`iUdT1k0gQ7S`vUVd(>ZgFx^YHD6_Mt;eA=KXdI46K(uT^vIy=DfY;+c7ttvF+ja z9?vWvQQt13Edhc{y$lt0P0C?$jM>WNYA&{2ZB|hBhK^o)!LF#NE>Z1Q>n5Zwb=3$G zza~)dmVc#^>cTUTTYPVcoaveQvQTkKnUQeJmwA(e*JYRA`>Z?f=-KakCr_O^l`((o z(n|gZZ#^SaT3nq#MAG%C?x#M3# z+ZUzXD;DeAu&wmv(&O@0-(TJPJOBS#W%Xkc_0=!#U4Leq*~pO{UBB~x_2!#zrmg>* zasT)JPgnWhMBDzq^7nsL>b=EcZ5y^3M(_U}{$CA)rt<0| zfos>!{r_vdTz}o(-^UKeTWl!r`S{RU{)X*LoBvlHitGQD`xoD`b?g26rA0j-JKxLy zy?@^J{m(D8@|Ev@-TLhQZ->$KSZ?Qt=o=B%zrUt0o4oY3+@DYFarS#YFK<64;V)mC zQ@0!B{(^Vq?s2>JZ2Z62{?C)IyW{Qmyezh_zQ1lMcY5FaT|eeq=0%I_erEe1>dTAm ze!Yfa@wSyOE(qt_?9a|Nva9|pL&8s654Ug?q=Z}xL|1J8Yz%@1h`(JNJJbrdt?%r;bo1YqA=UY|X zZruBN_4(SzSDr<)=0Ev#F8aXJxw1++LWh(TM~T4_1{+_WTKuwP*JtaB*&mM~IqGA) YW9pFr;rE8=z&e1z)78&qol`;+0Md$L+W-In literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig8b.png b/docs/reference/images/fig8b.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4c05bf07274b484a73523fdbe5694c0f0e1aa2 GIT binary patch literal 3209 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 literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig8c.png b/docs/reference/images/fig8c.png new file mode 100644 index 0000000000000000000000000000000000000000..d579b84f72e7b2a749739e0d672dafdbad05db54 GIT binary patch literal 3841 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 literal 0 HcmV?d00001 diff --git a/docs/reference/images/fig9.png b/docs/reference/images/fig9.png new file mode 100644 index 0000000000000000000000000000000000000000..73869552bc11ff13abd2faeb47b7fb2e2f7a47d7 GIT binary patch literal 2706 zcmd5;dpHw%A7A2W=0$JstT@RniRBU!GIvEfQ$ox2?8qoGOm^I+!^$n*N{*(CBw~9v z&Nx^`aWpaaT!tBQZ!T$;yS;nsy>$LN=k0mk=l$#V`+a}k@9*+FpU?O6Nj(ogBMVXj z0RRA5Cr5i%@z??Y?D7Rlh-WSlObzj{8)NI_1_T0!$6dz6OT|bBMC3&@DiVu~2ml0z zqOS+&V*Dcl0zxrC=*Xqr4VC}^NYlyQ#_fm43!LCEH=*+DW$v4JCu`La31HB(6tKB( z0XY0vVKW@6dNlI1T35PTsGI`+`&XWlcvr;>AaLHB%F6F53Z5HP+VO8{_d(2iL13v{ z=UdMHcvHIEDT-F2f8eN-$$__8BFw|38TXHO_jexl>mbe(Lh5>YTz6ZduTu7mwb~=@ zsvdLP3posw*{3L!zcD}9y}DhTzYozJRM~MaF;POxS%S2alVbEK11}}rm?(*~Ni0{j z`J(U-gkAB?RGSIf#GQYhq@IFgFmUWy>gv)%u7w7S=75{o!E#O}2uYMPwUa)FbzvI! z2g-t1N9|67^}K~Inkw-88>P`g?nwW5?8@33noGvw$<-;&9Q%5xvT*?h*HN)MHjO)~ z?7ShDP!zUfa+)|pxQs+TArRL4D$-_OZJ*ky*o;&s5MtZ!OzF4l&ksL{eMb^$o?YHS z$T5xwyd25FVwEhm+b=;PJKHR<29WKU9<$yNIhn-5!oqZwBOQk>i_)dC0;%2x6z;t> zO5u_)q7qsK$g9w4Gx6z*s+szzYqmTfN7xmUDc7P1oif{eS`ES0#(NlQBy6T?Z081^ zm?}$`+Q=A)g2776=T?d9ZPxAzValPg}1FpsIFw^_~Ct&*Jes#$)PgffYkuc9R5 zSsdrvx$K?3Z+zrSHLa117?YLH1?AFo6O?kZp!L$JTQbOIjI+DerYA3|4>B{(VbBLUezr3oBx|WUMb&c{C zMCLwOlSfw8A9X>fUTf9c=_1oIy(Y6`*Y=&f0!~ zbZwlDq~)oOFCuuURB(fIdxn9x-l9Tb>SreX0YZp*_dmiS{CNQUMW zAm8<@?;`}nC6`?qFW8AJYZX2=P$N5Ew)B5N$f$21Ee){Za8$k-(iS0`mN!_la^9gx zc+xixMdHhj2R8oQL5H7-*Y`{??fPz*F0#a-}h?;=kdz ztZ6v^D#{2q!esgW5cz1recT37n!P|^FzU*pOHx;-&#>m{70!mRrT5dR%n1t>6A<#* zN9LLSTy};PA!ZTjk-iHcQEiyI|bU%Epq*y{nU@z%{QnzVaN4Gm(9j_%HQJu>!$pBG3dCQqy4TS z|8Q8XssC>@z;(;5#jp6~6i@$R!T&b}{-btZ%Q_E`@AWx$`w*6YV(SGhO+G&y_6adP z=E)!s=A=wSQVP3+@-*<-jkV=* zT#-o4>cYzV942+Bcd>XTbMf(f$mR2Y_IO$ZY$MZoXtr+s{d>KdhoIq=(3*G2%_ltk z1ExP3(yr98gm=SK$*;@SI%QChs~9R@ZQL4>PZqcIMV_quh$WMCTaU<(fty~bIkeY% zhEl25!eXGJx~JFushBD)Zy?ELzi+4ksnpb$?(emHzto@C7Ys=dk@Ny@Ng_`?fBt-y zm;7d}yX3Yop7&&z!h#&-K!0EN^R6)^Qbmv9u+=Z9TEh0m9vAxPJ_-B{#h<<8OlX4@ zLa{CZkUqD|E_$(!!CqvE#mE|wk$p#m?M}*SCyxbNDBukBM!zu*9jOth9C68Uz=m)< zTz&Hf)-z@Kr%k;TAS2LoPdcCoV$LXe-JKJ&QX4$D+bA%u#12xjPJhRRPTtA3%^U7q z1Fv=N`C4Q0dpYoLxAe96`Hi7cf4cJ|$arYwRM@TYe_5l?CTmTlwH_Ih1WY(0c9j4p M2e>`O_PfNt1E_7XB>(^b literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c index c34e4c5..496f1b2 100644 --- a/src/main.c +++ b/src/main.c @@ -118,7 +118,7 @@ main(int argc, char *argv[]) g_object_unref( G_OBJECT(builder) ); - if( !chimara_glk_run(CHIMARA_GLK(glk), ".libs/first.so", &error) ) { + if( !chimara_glk_run(CHIMARA_GLK(glk), ".libs/splittest.so", &error) ) { error_dialog(GTK_WINDOW(window), error, "Error starting Glk library: "); return 1; } diff --git a/src/splittest.c b/src/splittest.c index 58ed6f6..7448437 100644 --- a/src/splittest.c +++ b/src/splittest.c @@ -1,34 +1,331 @@ -#include "stdio.h" +#include +#include #include "glk.h" -void glk_main(void) +#define SPACE_FACTOR 1.8 + +void center_text(winid_t win, char *text) +{ + glui32 width, height; + glk_window_get_size(win, &width, &height); + + glk_set_window(win); + glk_window_clear(win); + + if(glk_window_get_type(win) == wintype_TextGrid) { + glk_window_move_cursor(win, width / 2 - strlen(text) / 2, height / 2); + glk_put_string(text); + } else if(glk_window_get_type(win) == wintype_TextBuffer) { + int count; + for(count = 0; count < height / 2; count++) + glk_put_char('\n'); + for(count = 0; + count < (int)(SPACE_FACTOR * (width / 2 - strlen(text) / 2)); + count++) + glk_put_char(' '); + glk_put_string(text); + } +} + +void print_two_rows(winid_t win) +{ + glui32 width, height; + glk_window_get_size(win, &width, &height); + + glk_set_window(win); + glk_window_clear(win); + + glui32 x = width / 2 - 3; + glui32 y = (height - 1) / 2; + if(x < 0) + x = 0; + if(y < 0) + y = 0; + + glk_window_move_cursor(win, x, y); + glk_put_string("C: 2"); + glk_window_move_cursor(win, x + 3, y + 1); + glk_put_string("rows"); +} + +void wait_for_key(winid_t win) { event_t ev; - winid_t mainwin = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); - if(!mainwin) - return; - - winid_t subwin = glk_window_open(mainwin, winmethod_Right | winmethod_Proportional, 50, wintype_TextBuffer, 1); - printf("created new window\n"); - glk_set_window(mainwin); - glk_put_string("Philip en Marijn zijn vet goed.\n"); - glk_set_window(subwin); - glk_put_string("A veeeeeeeeeeeeeeeeeeeeeeeeeeeery looooooooooooooooooooooooong striiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiing.\n"); + glk_request_char_event(win); + do + glk_select(&ev); + while(ev.type != evtype_CharInput); +} - - guint32 width, height; - glk_window_get_size(mainwin, &width, &height); - printf("got window size\n"); - fprintf(stderr, "\nWidth: %d\nHeight: %d\n", width, height); - - glk_request_char_event(mainwin); - //while(1) { - glk_select(&ev); - if(ev.type == evtype_CharInput) { - glk_window_get_size(mainwin, &width, &height); - fprintf(stderr, "\nWidth: %d\nHeight: %d\n", width, height); - } - //} - glk_window_close(subwin, NULL); - printf("closed window\n"); +void glk_main(void) +{ + winid_t win_a = NULL, win_b = NULL, win_c = NULL, win_d = NULL; + + fprintf(stderr, "TEST CASES FROM GLK SPEC\n\n" + "(Press a key in window A to continue each time)\n\n" + "Say you do two splits, each a 50-50 percentage split. You start\n" + "with the original window A, and split that into A and B; then\n" + "you split B into B and C.\n\n"); + + win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + win_b = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0); + win_c = glk_window_open(win_b, winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0); + if(!win_a || !win_b || !win_c) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + + wait_for_key(win_a); + glk_window_close(glk_window_get_root(), NULL); + + fprintf(stderr, "Or, you could split A into A and B, and then split A\n" + "again into A and C.\n\n"); + + win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + win_b = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0); + win_c = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0); + if(!win_a || !win_b || !win_c) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + + wait_for_key(win_a); + glk_window_close(glk_window_get_root(), NULL); + + fprintf(stderr, "Here are more ways to perform the first example; all of\n" + "them have the same tree structure, but look different on the\n" + "screen. Here, we turn the second split (B into B/C) upside down;\n" + "we put the new window (C) above the old window (B).\n\n"); + + win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + win_b = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0); + win_c = glk_window_open(win_b, winmethod_Proportional | winmethod_Above, + 50, wintype_TextBuffer, 0); + if(!win_a || !win_b || !win_c) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + + wait_for_key(win_a); + glk_window_close(glk_window_get_root(), NULL); + + fprintf(stderr, "Here, we mess with the percentages. The first split (A\n" + "into A/B) is a 25-75 split, which makes B three times the size\n" + "of A. The second (B into B/C) is a 33-66 split, which makes C\n" + "twice the size of B. This looks rather like the second example,\n" + "but has a different internal structure.\n\n"); + + win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + win_b = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, + 75, wintype_TextBuffer, 0); + win_c = glk_window_open(win_b, winmethod_Proportional | winmethod_Below, + 67, wintype_TextBuffer, 0); + if(!win_a || !win_b || !win_c) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + + wait_for_key(win_a); + glk_window_close(glk_window_get_root(), NULL); + + fprintf(stderr, "Here, the second split (B into B/C) is vertical instead\n" + "of horizontal, with the new window (C) on the left of the old\n" + "one.\n\n"); + + win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + win_b = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0); + win_c = glk_window_open(win_b, winmethod_Proportional | winmethod_Left, + 50, wintype_TextBuffer, 0); + if(!win_a || !win_b || !win_c) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + + wait_for_key(win_a); + glk_window_close(glk_window_get_root(), NULL); + + fprintf(stderr, "In the following two-split process, you can see that\n" + "when a window is split, it is replaced by a new pair window, and\n" + "moves down to become one of its two children.\n\n"); + + if(!(win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0))) + return; + center_text(win_a, "A"); + wait_for_key(win_a); + + if(!(win_b = glk_window_open(win_a, + winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0))) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + wait_for_key(win_a); + + if(!(win_c = glk_window_open(win_b, winmethod_Proportional | winmethod_Left, + 50, wintype_TextBuffer, 0))) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + wait_for_key(win_a); + + glk_window_close(glk_window_get_root(), NULL); + + fprintf(stderr, "What happens when there is a conflict? The rules are\n" + "simple. Size control always flows down the tree, and the player\n" + "is at the top. Let's bring out an example: first we split A into\n" + "A and B, with a 50%% proportional split. Then we split A into A\n" + "and C, with C above, being a text grid window, and C gets a\n" + "fixed size of two rows (as measured in its own font size). A\n" + "gets whatever remains of the 50%% it had before.\n\n"); + + win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + win_b = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0); + win_c = glk_window_open(win_a, winmethod_Fixed | winmethod_Above, + 2, wintype_TextGrid, 0); + if(!win_a || !win_b || !win_c) + return; + center_text(win_a, "A"); + center_text(win_b, "B: 50%"); + print_two_rows(win_c); + wait_for_key(win_a); + + fprintf(stderr, "(Stage 1) Now the player stretches the window\n" + "vertically.\n\n"); + + wait_for_key(win_a); + + fprintf(stderr, "(Stage 2) Then the user maliciously starts squeezing the\n" + "window down, in stages.\n\n"); + + center_text(win_a, "A"); + center_text(win_b, "B: 50%"); + print_two_rows(win_c); + wait_for_key(win_a); + + fprintf(stderr, "(Stage 3) The logic remains the same. At stage 3,\n" + "there's no room left for A, so it winds up with zero height.\n" + "Nothing displayed in A will be visible.\n\n"); + + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + wait_for_key(win_a); + + fprintf(stderr, "(Stage 4) At stage 4, there isn't even room in the upper\n" + "50%% to give C its two rows; so it only gets one.\n\n"); + + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + wait_for_key(win_a); + + fprintf(stderr, "(Stage 5) Finally, C is squashed out of existence as\n" + "well.\n\n"); + + center_text(win_a, "A"); + center_text(win_b, "B"); + wait_for_key(win_a); + + glk_window_close(glk_window_get_root(), NULL); + + fprintf(stderr, "What happens when you split a fixed-size window? The\n" + "resulting pair window retains the same size constraint as the\n" + "original window that was split. The key window for the original\n" + "split is still the key window for that split, even though it's\n" + "now a grandchild instead of a child.\n\n"); + + if(!(win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0))) + return; + center_text(win_a, "A"); + wait_for_key(win_a); + + fprintf(stderr, "After the first split, the new pair window (O1, which\n" + "covers the whole screen) knows that its first child (A) is above\n" + "the second, and gets 50%% of its own area. (A is the key window\n" + "for this split, but a proportional split doesn't care about key\n" + "windows.)\n\n"); + + if(!(win_b = glk_window_open(win_a, + winmethod_Proportional | winmethod_Below, + 50, wintype_TextBuffer, 0))) + return; + center_text(win_a, "A: 50%"); + center_text(win_b, "B"); + wait_for_key(win_a); + + fprintf(stderr, "After the second split, all this remains true; O1 knows\n" + "that its first child gets 50%% of its space, and A is O1's key\n" + "window. But now O1's first child is O2 instead of A. The newer\n" + "pair window (O2) knows that its first child (C) is above the\n" + "second, and gets a fixed size of two rows. (As measured in C's\n" + "font, because C is O2's key window.)\n\n"); + + if(!(win_c = glk_window_open(win_a, winmethod_Fixed | winmethod_Above, 2, + wintype_TextGrid, 0))) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + print_two_rows(win_c); + wait_for_key(win_a); + + fprintf(stderr, "If we split C, now, the resulting pair will still be two\n" + "C-font rows high -- that is, tall enough for two lines of\n" + "whatever font C displays. For the sake of example, we'll do this\n" + "vertically.\n\n"); + + if(!(win_d = glk_window_open(win_c, + winmethod_Proportional | winmethod_Right, + 50, wintype_TextBuffer, 0))) + return; + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + center_text(win_d, "D"); + wait_for_key(win_a); + + fprintf(stderr, "When you close a window (and it is not the root window),\n" + "the other window in its pair takes over all the freed-up area.\n" + "Let's close D, in the current example:\n\n"); + + glk_window_close(win_d, NULL); + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_c, "C"); + wait_for_key(win_a); + + fprintf(stderr, "But what if we had closed C instead of D? We would have\n" + "gotten this:\n\n"); + + glk_window_close(glk_window_get_root(), NULL); + win_a = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); + win_b = glk_window_open(win_a, winmethod_Proportional | winmethod_Below, 50, + wintype_TextBuffer, 0); + win_c = glk_window_open(win_a, winmethod_Fixed | winmethod_Above, 2, + wintype_TextGrid, 0); + win_d = glk_window_open(win_c, winmethod_Proportional | winmethod_Right, 50, + wintype_TextBuffer, 0); + glk_window_close(win_c, NULL); + center_text(win_a, "A"); + center_text(win_b, "B"); + center_text(win_d, "D"); + wait_for_key(win_a); + + glk_window_close(win_d, NULL); + glk_window_close(win_b, NULL); + glk_window_clear(win_a); + glk_set_window(win_a); + glk_put_string("That's all, folks..."); } diff --git a/src/window.c b/src/window.c index 876db66..2f3c602 100644 --- a/src/window.c +++ b/src/window.c @@ -237,8 +237,17 @@ glk_window_get_root() * What happens when there is a conflict? The rules are simple. Size control * always flows down the tree, and the player is at the top. Let's bring out an * example: - * Screen shot 5 - * + * + * + * + * + * O + * / \ + * O B + * / \ + * A C + * + * * * First we split A into A and B, with a 50% proportional split. Then we split * A into A and C, with C above, C being a text grid window, and C gets a fixed @@ -246,8 +255,8 @@ glk_window_get_root() * of the 50% it had before. * * Now the player stretches the window vertically. - * Screen shot 6 - * + * + * * * The library figures: the topmost split, the original A/B split, is 50-50. So * B gets half the screen space, and the pair window next to it (the lower @@ -255,8 +264,18 @@ glk_window_get_root() * O. C gets two rows; A gets the rest. All done. * * Then the user maliciously starts squeezing the window down, in stages: - * - * Screen shot 7 + * + * + * + * + * + * + * + * + * + * + * + * * * The logic remains the same. B always gets half the space. At stage 3, * there's no room left for A, so it winds up with zero height. Nothing @@ -290,8 +309,29 @@ glk_window_get_root() * is stored by a window's parent, not the window itself; and a constraint * consists of a pointer to a key window plus a size value. * - * Screen shot 8 - * + * + * + * + * + * A + * + * + * + * + * O1 + * / \ + * A B + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A C + * + * * After the first split, the new pair window (O1, which covers the whole * screen) knows that its first child (A) is above the second, and gets 50% of * its own area. (A is the key window for this split, but a proportional split @@ -306,8 +346,19 @@ glk_window_get_root() * If we split C, now, the resulting pair will still be two C-font rows high * — that is, tall enough for two lines of whatever font C displays. For * the sake of example, we'll do this vertically. - * Screen shot 9 - * + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A O3 + * / \ + * C D + * + * * * O3 now knows that its children have a 50-50 left-right split. O2 is still * committed to giving its upper child, O3, two C-font rows. Again, this is @@ -611,8 +662,17 @@ free_winids_below(winid_t win) * When you close a window (and it is not the root window), the other window * in its pair takes over all the freed-up area. Let's close D, in the current * example: - * Screen shot 10 - * + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A C + * + * * * Notice what has happened. D is gone. O3 is gone, and its 50-50 left-right * split has gone with it. The other size constraints are unchanged; O2 is @@ -622,8 +682,17 @@ free_winids_below(winid_t win) * to the way it was before we created D. * * But what if we had closed C instead of D? We would have gotten this: - * Screen shot 11 - * + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A D + * + * * * Again, O3 is gone. But D has collapsed to zero height. This is because its * height is controlled by O2, and O2's key window was C, and C is now gone. O2 -- 2.30.2