From af0c41316aae956975d473a3e6053f01d789a2e3 Mon Sep 17 00:00:00 2001 From: Dustin Boyd Date: Thu, 14 Feb 2019 05:16:59 -0600 Subject: [PATCH] Fixes #90 --- internal/c/libqb.cpp | 94 +++++++++++++++++++++++++++++++++++-- internal/c/makeline_lnx.txt | 2 +- internal/c/makeline_osx.txt | 4 +- setup_lnx.sh | 8 ++-- setup_osx.command | 2 +- 5 files changed, 97 insertions(+), 13 deletions(-) diff --git a/internal/c/libqb.cpp b/internal/c/libqb.cpp index 51a196ea9..413f7b1e3 100644 --- a/internal/c/libqb.cpp +++ b/internal/c/libqb.cpp @@ -22,6 +22,17 @@ #endif +#ifndef QB64_WINDOWS +#include +#include +// ncurses defines macros for terminfo capability names, which causes +// conflicts. +#undef create_window +#undef buttons +#undef tab +#undef newline +#endif + int32 disableEvents=0; @@ -11192,7 +11203,66 @@ void qbg_sub_view(int32 x1,int32 y1,int32 x2,int32 y2,int32 fillcolor,int32 bord return; } - +#ifdef QB64_WINDOWS +static bool clear_console(void) +{ + bool ret; + CONSOLE_SCREEN_BUFFER_INFO csbi; + COORD origin = {0, 0}; + HANDLE hConsole = CreateFileA("CONOUT$", + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, 0, NULL); + DWORD nCharsWritten; + if (hConsole == INVALID_HANDLE_VALUE) + return false; + ret = (GetConsoleScreenBufferInfo(hConsole, &csbi) && + FillConsoleOutputCharacterA(console, ' ', + csbi.dwSize.X * csbi.dwSize.Y, origin, &nCharsWritten)); + CloseHandle(console); + return ret; +} +#else +// Terminal file descriptor +static int ttyfd; +// putchar replacement acting on ttyfd instead of stdin +static int putc_tty(int c) +{ + int nWritten = 0; + unsigned char uc = (unsigned char)c; + if (ttyfd == -1) + return EOF; + while (nWritten == 0) + nWritten = write(ttyfd, &uc, 1); + if (nWritten != 1) + return EOF; + return c; +} +static bool clear_console(void) +{ + int err; + ttyfd = open("/dev/tty", O_RDWR); + if (ttyfd == -1) { + // No controlling TTY for the process? + return false; + } + // A non-null err pointer must be passed to prevent the process from + // exiting. + if (ERR == setupterm(NULL, ttyfd, &err)) { + // No matter what the error was, it is ignored, and we + // simply return that there was an error. + return false; + } + char *cls = tigetstr("clear"); + if (cls == (char *)-1 || cls == (char *)0) { + return false; + } + tputs(cls, 1, putc_tty); + del_curterm(cur_term); + close(ttyfd); + ttyfd = -1; + return true; +} +#endif void sub_cls(int32 method,uint32 use_color,int32 passed){ if (new_error) return; @@ -11232,7 +11302,10 @@ void sub_cls(int32 method,uint32 use_color,int32 passed){ if ((passed&1)==0){//no method specified //video mode: clear only graphics viewport //text mode: clear text view port AND the bottom line - if (write_page->text){ + if (write_page->console){ + // TODO: handle background arguments + clear_console(); + }else if (write_page->text){ //text view port characters=write_page->width*(write_page->bottom_row-write_page->top_row+1); sp=(uint16*)&write_page->offset[(write_page->top_row-1)*write_page->width*2]; @@ -11275,7 +11348,10 @@ void sub_cls(int32 method,uint32 use_color,int32 passed){ } if (method==0){//clear everything - if (write_page->text){ + if (write_page->console){ + // TODO: handle background arguments + clear_console(); + }else if (write_page->text){ characters=write_page->height*write_page->width; sp=(uint16*)write_page->offset; for (i=0;itext) return; + if (write_page->console){ + // TODO: handle background arguments + clear_console(); + }else if (write_page->text) return; //graphics view port if (write_page->bytes_per_pixel==1){//8-bit if (write_page->clipping_or_scaling){ @@ -11335,7 +11414,12 @@ void sub_cls(int32 method,uint32 use_color,int32 passed){ } if (method==2){//ONLY clear the VIEW PRINT range text viewport - if (write_page->text){ + if (write_page->console){ + // TODO: handle background arguments + // Once VIEW PRINT is supported in the console, this will need + // handled as well. + clear_console(); + }else if (write_page->text){ //text viewport characters=write_page->width*(write_page->bottom_row-write_page->top_row+1); sp=(uint16*)&write_page->offset[(write_page->top_row-1)*write_page->width*2]; diff --git a/internal/c/makeline_lnx.txt b/internal/c/makeline_lnx.txt index 24a94a34d..df34b0920 100644 --- a/internal/c/makeline_lnx.txt +++ b/internal/c/makeline_lnx.txt @@ -1,2 +1,2 @@ -g++ -w qbx.cpp parts/core/os/lnx/src.a -lGL -lGLU -lX11 -lpthread -ldl -lrt -D FREEGLUT_STATIC -o +g++ -w qbx.cpp parts/core/os/lnx/src.a -lGL -lGLU -lX11 -lcurses -lpthread -ldl -lrt -D FREEGLUT_STATIC -o diff --git a/internal/c/makeline_osx.txt b/internal/c/makeline_osx.txt index 2406a18c6..713689fb9 100644 --- a/internal/c/makeline_osx.txt +++ b/internal/c/makeline_osx.txt @@ -1,4 +1,4 @@ -g++ -w qbx.cpp -framework OpenGL -framework IOKit -framework GLUT -framework OpenGL -framework Cocoa -o +g++ -w qbx.cpp -framework OpenGL -framework IOKit -framework GLUT -framework OpenGL -framework Cocoa -lcurses -o (below for reference purposes only, above is minimum viable) -g++ -w qbx.cpp -framework ApplicationServices -framework OpenGL -framework IOKit -framework CoreServices -framework CoreFoundation -framework GLUT -framework OpenGL -framework Cocoa -o \ No newline at end of file +g++ -w qbx.cpp -framework ApplicationServices -framework OpenGL -framework IOKit -framework CoreServices -framework CoreFoundation -framework GLUT -framework OpenGL -framework Cocoa -lcurses -o diff --git a/setup_lnx.sh b/setup_lnx.sh index d0dfd3d18..e10a2659f 100755 --- a/setup_lnx.sh +++ b/setup_lnx.sh @@ -105,7 +105,7 @@ if [ "$DISTRO" == "arch" ]; then if [ "$SDL" == "1" ]; then pkg_list="gcc sdl sdl_image sdl_mixer sdl_net sdl_ttf $GET_WGET" else - pkg_list="gcc $GET_WGET" + pkg_list="gcc ncurses $GET_WGET" fi installed_packages=`pacman -Q` installer_command="sudo pacman -S " @@ -115,7 +115,7 @@ elif [ "$DISTRO" == "linuxmint" ] || [ "$DISTRO" == "ubuntu" ] || [ "$DISTRO" == if [ "$SDL" == "1" ]; then pkg_list="g++ libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl1.2-dev $GET_WGET" else - pkg_list="g++ mesa-common-dev libglu1-mesa-dev libasound2-dev $GET_WGET" + pkg_list="g++ mesa-common-dev libglu1-mesa-dev libncurses-dev libasound2-dev $GET_WGET" fi installed_packages=`dpkg -l` installer_command="sudo apt-get -y install " @@ -125,7 +125,7 @@ elif [ "$DISTRO" == "fedora" ] || [ "$DISTRO" == "redhat" ] || [ "$DISTRO" == "c if [ "$SDL" == "1" ]; then pkg_list="gcc-c++ SDL-devel SDL_image-devel SDL_mixer-devel SDL_net-devel SDL_ttf-devel $GET_WGET" else - pkg_list="gcc-c++ mesa-libGLU-devel alsa-lib-devel $GET_WGET" + pkg_list="gcc-c++ mesa-libGLU-devel ncurses-devel alsa-lib-devel $GET_WGET" fi installed_packages=`yum list installed` installer_command="sudo yum install " @@ -192,7 +192,7 @@ else echo "Building 'QB64'" cp -r ./internal/source/* ./internal/temp/ cd internal/c - g++ -w qbx.cpp libqb/os/lnx/libqb_setup.o parts/video/font/ttf/os/lnx/src.o parts/core/os/lnx/src.a -lGL -lGLU -lX11 -lpthread -ldl -lrt -D FREEGLUT_STATIC -o ../../qb64 + g++ -w qbx.cpp libqb/os/lnx/libqb_setup.o parts/video/font/ttf/os/lnx/src.o parts/core/os/lnx/src.a -lGL -lGLU -lX11 -lcurses -lpthread -ldl -lrt -D FREEGLUT_STATIC -o ../../qb64 cd ../.. fi diff --git a/setup_osx.command b/setup_osx.command index f7b38d763..60789ac59 100755 --- a/setup_osx.command +++ b/setup_osx.command @@ -47,7 +47,7 @@ cd ../../../../../../../.. echo "Building 'QB64' (~3 min)" cp ./internal/source/* ./internal/temp/ cd internal/c -g++ -w qbx.cpp libqb/os/osx/libqb_setup.o parts/video/font/ttf/os/osx/src.o -framework GLUT -framework OpenGL -framework Cocoa -o ../../qb64 +g++ -w qbx.cpp libqb/os/osx/libqb_setup.o parts/video/font/ttf/os/osx/src.o -framework GLUT -framework OpenGL -framework Cocoa -lcurses -o ../../qb64 cd ../.. echo ""