From 0a4c3eacd6692a6404c7cd5bd4ef64b62c6200ce Mon Sep 17 00:00:00 2001 From: KosmX <kosmx.mc@gmail.com> Date: Sun, 6 Dec 2020 18:59:46 +0100 Subject: [PATCH] windows VT100 enabling for runtime --- .gitignore | 5 ++++- multiplatformLib.c | 34 +++++++++++++++++++++++++++++++++- multiplatformLib.h | 2 +- multiplatformLib.o | Bin 3576 -> 1852 bytes snake.c | 20 +++++++++++++------- snake.o | Bin 22128 -> 15046 bytes 6 files changed, 51 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index ddd94d6..f954e6e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,7 @@ snake structs multiplatformLib -debugmalloc \ No newline at end of file +debugmalloc +snake.zip +multiplatformLib.o +snake.o diff --git a/multiplatformLib.c b/multiplatformLib.c index 2366dea..1f32c55 100644 --- a/multiplatformLib.c +++ b/multiplatformLib.c @@ -9,6 +9,11 @@ #include<termios.h> #else #include<Windows.h> +//I need these two from Windows consoleapi.h +#include<wchar.h> +#include<WinBase.h> +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#define DISABLE_NEWLINE_AUTO_RETURN 0x0008 #include<conio.h> // read one char from stdio before pressing enter. essential for contol #endif @@ -37,7 +42,7 @@ struct termios term_config; /** * Init platform dependent stuff, mostly the custom oi control */ -void initMultiplatform(void){ +int initMultiplatform(void){ #ifdef __linux__ struct termios info; tcgetattr(0, &info); //get attr @@ -46,7 +51,34 @@ void initMultiplatform(void){ info.c_lflag &= ~ECHO; tcsetattr(0, TCSANOW, &info); //set attr setbuf(stdin, NULL); //??? + #else + //Enable vt100 emulation. Without this, snake is not working + HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); + if(out == INVALID_HANDLE_VALUE){ + return -1;// :( it won't work + } + + //following code is from docs.microsoft.com + //try to enable vt100 emulation + DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN; + + DWORD dwOriginalOutMode; + GetConsoleMode(out, &dwOriginalOutMode); + + DWORD dwOutMode = dwOriginalOutMode | dwRequestedOutModes; + if (!SetConsoleMode(out, dwOutMode)) + { + // we failed to set both modes, try to step down mode gracefully. + dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING; + dwOutMode = dwOriginalOutMode | dwRequestedOutModes; + if (!SetConsoleMode(out, dwOutMode)) + { + // Failed to set any VT mode, can't do anything here. + return EOF; + } + } #endif + return 0; } /** diff --git a/multiplatformLib.h b/multiplatformLib.h index 510cf1e..02048c1 100644 --- a/multiplatformLib.h +++ b/multiplatformLib.h @@ -5,7 +5,7 @@ struct Vec2i getWindowSize(void); -void initMultiplatform(void); +int initMultiplatform(void); void endMultiplatformLib(void); diff --git a/multiplatformLib.o b/multiplatformLib.o index 29833e5dca49440ac71379427a402f2b5de69d01..6a65ac0f4d2f9680741fdaa9df6b2f97ee6a6cbe 100644 GIT binary patch literal 1852 zcmZuy&1(};5TEVF;uoxnpS98jBev465o(Dd7@KHUXtj`H529((eKD))ZrE%!Ru9Ek zAxNQue?Tw#2MB^a^&=j%7gG;{dg;N7+N<cvII}O=?wSnDyqVw3n>TNFc2;}R3PhIz z07o1x0E*2Dwxe?~CIAGGgCe)L;v&QFn4%@^q$jSK8iC;@C6&)N^LeppiYxdNc4L6n z;*A1`Kq#W*{Ba`~GKX<?t-gI|Q{2hk|MvoXYsfboDN7wOfV3iYJa#r*i>t+r@WQVu z66FH5_@}Ct%JzslI}+?xOUoR7>KLEZr>7~XxVp3Y>D0%WC0i<0)Z*Ll^_%6ilerdG zTn+F5>G{g<FK$d}<>v>fBjP##|9Y^RPJSXL--D?;)#@=iQtFtd<qZ`|aP2&dSH0Dj zmZ@%;r;rx0YH2YR3`vWFL8Yrgz=`6Lpf0b=U2AG-W%h!gZlfEh^?dv^ybOOnGw%!S zXVyyZ9`5L>6n_X8XO^VcN_q47%?5TOwm_vxvE}j{whjobBDAJjLc$p8WMe}G`fKZ> z8iqI#`H6NRqYJP#VGj8jGGX(`tH^tiE68oQp&eHl*W<`R)I+!?kULQyh(^!KorQ2; zqOZ3nXXf=nPo8CZEOs~4E%#6ASzAusmxpv?V6<nnuUF1l=501^cgbPploI0K#eU2a z0BWcMj)tYfK}UOu@{pswM%m_QUs3WM-%&g4U`MeUs*-L4upL=+bgt1iMRyZnr|Tt~ zd+Da!OJ{P7a&b*|y>xSq(Y?7wUlHFMaxuCG_l8~XITwq#TFmvTE;i_D!>(6J>sf{t z(cdb-En#9ZYwNje(oUP!#Gsy1#>pp<KoUTP7JMGfh^7$L>%=$#CsEG%kSJR7KIAG| z6&IN_^n8}F9CZZGGhu4z<$b{s@06obM1lH+-oqw&CtM4{Vw0M^(~SmD(-_ZWqxUZg z^j7@jooZXqB?==bo%!Pnyiv1gZi~WspRaCY>I$w@H^2i&a={ULqIKfPi@J#`M_x4` ziw(%S57|IVv1mRAr>3UBVrh%zGx2eYF#~i%w}-rq0nE^R0Co!8V)hmM0Yx)Oi}X?5 z(9C;reTsP#CldNZE-}FDxUH#4L&NrSp{Qx(%`6)-wK^DQb|aX$lgj9JZCe6Q8qYN3 V;Dz^3rqj&2Y^2RvK%ANj{sBQeF&Y2> literal 3576 zcmbtWU2Gdg5MDbjag)^Nv``rZ5eu1;2y(JXC1?dGzs?1@KO(LQ63DgB=lF<yw(PT- z6a<k%L`*2^BM*R(=nFjc1%eQ29R-oT5#R-hzp6qIM1=yVp^A{q%-(LizFhhMBdurW z+nH~7XLk4e@@OpTcDV=_7kPp-ERGWLaa*H5K)VBEAL$@}N%wB8WHPeU{R&0V9*jro z%G`~UX=TxKe-FS)btI%jYU9<PV%4A5(N9?%356q@k$OfdctY?K3;AQ!>(GgZf=YD{ z`hd%$bLmjWO{tUGQs+K|rOvxhSw4*HaYQ1U+tf;0>9?k?v?_C-og932g^pz|;QEyF zlmVyz6$6FkTjO�+IUVt~eo0Tku9|%K3Q6L#beO9%V5W^1@UdbeEMqFjas}B<2Hh z5uj|5`tAAVYvu#WBHawzN)!Kn%Ab+CN1z^ckl%i=cGXD#_WCa$fYo2YO757ldYwi| zOP-Ll6c4$T<!eD@@7irPvy;E4x)s@MVh%uZ)Yav!Zbh$seJtfymTw*ET~pMndTqT0 za;!+ka__2M9~hE|qSn#=LaF|ek#fsYuP4OzI}!>sN{9LEamZ)&)_i^X;E}&yZ0p^a z``tDFl{E7Ciqt)ewRCM<L50}r3K<(7J{s&fm8uwKC3r;cm&1LLM=I2ey!3Eb4j=Bd zVB&!wKQugPW5-VsHz75|VChuuWZHG^DdL*;ySh4By%!+87;_IBqo)-5L1<xyy@NXH z^S|zn`p&ptYxDVseBQx!8V41k!np%rWf?YxTJZ&E+Ne9hG3$mwMcJ5p90teQ>Dar7 zfly9}b4RT}jQf<15ONl^;tRWVYYf-^4IArYdN+k9$wU6AJB_zEz8IK0p1tO%7Mks5 z46PP&$4-#qt-IjfU2tBB#xUl1zpzg3aUa7m7bvt|pbtai7~))>gpL!AdG92D)`QIP zF{aOecJhCI7reL&j<s{*SpXdObqO>I?i1xLXo#;-3(hpt?}2vWd7t?QvCts&jDh|T znv?%0fFnQN0TkRn%2jBHZ!nymIl#Vz=EU<Y^Dn}ML)kuu`AW{zi@BtkDU|XtJteE8 zq-9E4IXj`2G|eEop_|7<Cz2S8ofsO7B~C=66Ql7&d~hf>njoe+shLUBED=*H<r8Yb z$mo-RmKj<$)4D;xN>wr>ktmx<bt<7|rxKZ@o+Fx(ZkhyELK0J{tZov$pqe=X<j1vX zb2ytUVPD0c)4Gu^oSo3mX{2K4<(#G!iIFr4Rxe+G<n~+Jr8l7i`v2g24sx2|m=65h zJ;dxu8_xX=8;)Ek6-(heMtS%f^@0t@bB;1gfANkJ;)BNdUu8J*NCN%_!_gn>%KbkO z@J<0=VmMz9_rEFl<Jsl-0d{_nU*s7TaM3@`aQix+5&RDd{Idcs@_!`YBL6i37yZX^ zLJ(Z%-O%{@RRI_MYv6-o&vTHXgw~6NQiRtBF>L$}J#F*9#O$06Ut>1D6DXV~$o6y5 zg12#gpKCUp-{<daIKQ_<F3;r6WD2xdvUHaBN?I-{n{Y{poKBiaBB#n_BCCabUNZnQ z3Z^E*H@A;oJ!VfD6}ea{6t$8$LuAUJWfPfFGOw`}{67_ha7=;yi!%Ti%G+WQz~*_U zgYeS@4Qn_6O_XW&sq(XU{M(H4@Glj9k5LXmL)`v_{N6S%`l7IMSqA*#yMUbkH9i8d z$Qgzv3ZMT$5rjUUpX;LnCc1j<3u1#jj{D+w6jNp2E{_j#N2YoHIGlnGa@ym2*!=6< zk!gGUbAUV5Z(*+$P-AgeKaAz^ynaq|V~8I~K^EA;+M$n>_ISjcQuQV~kUzq>DE9o} To8lC&;DSN;J78Ij`f>YT`N|<; diff --git a/snake.c b/snake.c index 7c4a9c4..3263298 100644 --- a/snake.c +++ b/snake.c @@ -953,7 +953,7 @@ void _print1char(Matrix *map){ int core(int argc, char const *argv[]) { if(argc == 1){ - printf("Usage: snake <map name> [<snek skin>]"); + printf("Usage: %s <map name>", argv[0]); return 0; } @@ -1010,14 +1010,20 @@ int core(int argc, char const *argv[]) _testprint(&map); #endif - initMultiplatform(); // init stuff. + if(!initMultiplatform()){ // init stuff. - printf("\e[7\e[?25l");//save cursor state and turn invisible cursor - loop(&map, tickspeed, repeatMap, feedAmount, canBite, foodText, foodLen); - printf("\e[8\e[2JGAME OVER...\n"); - unisleep(2000); + printf("\e[7\e[?25l");//save cursor state and turn invisible cursor + loop(&map, tickspeed, repeatMap, feedAmount, canBite, foodText, foodLen); + printf("\e[0;0H\e[8\e[2JGAME OVER...\n"); + unisleep(2000); - endMultiplatformLib(); + endMultiplatformLib(); + } + else + { + printf("VT100 not working\n%sthis text should be blue...\n"); + } + //test code diff --git a/snake.o b/snake.o index 6f4ef847b7cf4b4640c5af555f362d467957bd4f..8577fad433ea62ecfc82da07de6075682baf0674 100644 GIT binary patch literal 15046 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 literal 22128 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 -- GitLab