Initial commit
This commit is contained in:
commit
83f1a1f3e1
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
*.exe
|
||||||
|
*.pbi.cfg
|
||||||
|
*.pb.cfg
|
||||||
|
*.txt
|
||||||
|
.idea/
|
83
AinsiEscapeCode.pbi
Normal file
83
AinsiEscapeCode.pbi
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
;{- Code Header
|
||||||
|
; ==- Basic Info -================================
|
||||||
|
; Name: AinsiEscapeCode.pbi
|
||||||
|
; Version: N/A
|
||||||
|
; Author: Herwin Bozet
|
||||||
|
;
|
||||||
|
; ==- Compatibility -=============================
|
||||||
|
; Compiler version: PureBasic 5.70 (x86/x64)
|
||||||
|
; Operating system: Windows 10 21H1 (Previous versions untested)
|
||||||
|
;
|
||||||
|
; ==- Links & License -===========================
|
||||||
|
; License: Unlicense
|
||||||
|
;}
|
||||||
|
|
||||||
|
;- Module Declaration
|
||||||
|
|
||||||
|
DeclareModule AinsiEscapeCode
|
||||||
|
;-> Documentation
|
||||||
|
; * https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
|
||||||
|
; * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
|
||||||
|
; * https://en.wikipedia.org/wiki/ANSI_escape_code
|
||||||
|
|
||||||
|
|
||||||
|
;-> Constants
|
||||||
|
|
||||||
|
;-> > Control characters
|
||||||
|
#BEL$ = #BEL$
|
||||||
|
#BS$ = #BS$
|
||||||
|
#HT$ = #TAB$
|
||||||
|
#LF$ = #LF$
|
||||||
|
#FF$ = #FF$
|
||||||
|
#CR$ = #CR$
|
||||||
|
#ESC$ = #ESC$
|
||||||
|
|
||||||
|
;-> > Operators
|
||||||
|
#CSI$ = "["
|
||||||
|
#OSC$ = "]"
|
||||||
|
|
||||||
|
;-> > Cursor
|
||||||
|
#CUU$ = "A" ; Cursor Up by n
|
||||||
|
#CUD$ = "B" ; Cursor Down by n
|
||||||
|
#CUF$ = "C" ; Cursor Forward (Right) by n
|
||||||
|
#CUB$ = "D" ; Cursor Backward (Left) by n
|
||||||
|
|
||||||
|
#CNL$ = "E" ; Cursor Next Line by n
|
||||||
|
#CPL$ = "F" ; Cursor Previous Line by n
|
||||||
|
|
||||||
|
|
||||||
|
;-> Buffer ?
|
||||||
|
#ED$ = "J" ; Erase in Display
|
||||||
|
#ED_0 = 0 ; 0 from cursor to end of screen
|
||||||
|
#ED_1 = 1 ; 1 from cursor to beginning of the screen
|
||||||
|
#ED_2 = 2 ; 2 clear entire screen (May move to 0:0)
|
||||||
|
#ED_3 = 3 ; 3 clear entire screen and lines saved in the scrollback buffer. (Does not work on Windows as of 21H1 in Windows Terminal)
|
||||||
|
|
||||||
|
|
||||||
|
;-> Queries
|
||||||
|
#DECXCPR$ = "6n" ; Emit the cursor position as: ESC [ <r> ; <c> R Where <r> = cursor row and <c> = cursor column
|
||||||
|
|
||||||
|
#DECSC$ = "7" ; Save Cursor Position in Memory**
|
||||||
|
#DECSR$ = "8" ; Restore Cursor Position from Memory**
|
||||||
|
|
||||||
|
#RI$ = "M" ; Reverse Index – Performs the reverse operation of \n, moves cursor up one line, maintains horizontal position, scrolls buffer if necessary*
|
||||||
|
|
||||||
|
|
||||||
|
; https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
|
||||||
|
|
||||||
|
; https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#cursor-positioning
|
||||||
|
#CHA$ = "G" ; Cursor Horizontal Absolute Cursor moves to <n>th position horizontally in the current line
|
||||||
|
#VPA$ = "d" ; Vertical Line Position Absolute Cursor moves to the <n>th position vertically in the current column
|
||||||
|
#CUP$ = "H" ; Cursor Position *Cursor moves to <x>; <y> coordinate within the viewport, where <x> is the column of the <y> line
|
||||||
|
#HVP$ = "f" ; Horizontal Vertical Position *Cursor moves to <x>; <y> coordinate within the viewport, where <x> is the column of the <y> line
|
||||||
|
#ANSISYSSC_DECSC$ = "s" ; Save Cursor – Ansi.sys emulation **With no parameters, performs a save cursor operation like DECSC
|
||||||
|
#ANSISYSSC_DECRC$ = "u" ; Restore Cursor – Ansi.sys emulation **With no parameters, performs a restore cursor operation like DECRC
|
||||||
|
|
||||||
|
EndDeclareModule
|
||||||
|
|
||||||
|
|
||||||
|
;- Module Definition
|
||||||
|
|
||||||
|
Module AinsiEscapeCode
|
||||||
|
; Nothing...
|
||||||
|
EndModule
|
188
Console.pbi
Normal file
188
Console.pbi
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
;{- Code Header
|
||||||
|
; ==- Basic Info -================================
|
||||||
|
; Name: Console.pbi
|
||||||
|
; Version: N/A
|
||||||
|
; Author: Herwin Bozet
|
||||||
|
;
|
||||||
|
; ==- Compatibility -=============================
|
||||||
|
; Compiler version: PureBasic 5.70 (x86/x64)
|
||||||
|
; Operating system: Windows 10 21H1 (Previous versions untested)
|
||||||
|
;
|
||||||
|
; ==- Links & License -===========================
|
||||||
|
; License: Unlicense
|
||||||
|
; MSDN: https://docs.microsoft.com/en-us/windows/console/console-functions
|
||||||
|
;}
|
||||||
|
|
||||||
|
;- Module declaration
|
||||||
|
|
||||||
|
DeclareModule Console
|
||||||
|
;-> Structures
|
||||||
|
|
||||||
|
Structure CursorPosition
|
||||||
|
X.l
|
||||||
|
Y.l
|
||||||
|
EndStructure
|
||||||
|
|
||||||
|
|
||||||
|
;-> Constants
|
||||||
|
|
||||||
|
CompilerIf #PB_Compiler_Console
|
||||||
|
#IsConsoleApp = #True
|
||||||
|
CompilerElse
|
||||||
|
#IsConsoleApp = #False
|
||||||
|
CompilerEndIf
|
||||||
|
|
||||||
|
; https://docs.microsoft.com/en-us/windows/console/setconsolemode
|
||||||
|
; https://docs.microsoft.com/en-us/windows/console/getconsolemode
|
||||||
|
; For input handles
|
||||||
|
#ENABLE_PROCESSED_INPUT = $0001
|
||||||
|
#ENABLE_LINE_INPUT = $0002
|
||||||
|
#ENABLE_ECHO_INPUT = $0004
|
||||||
|
#ENABLE_WINDOW_INPUT = $0008
|
||||||
|
#ENABLE_MOUSE_INPUT = $0010
|
||||||
|
#ENABLE_INSERT_MODE = $0020
|
||||||
|
#ENABLE_QUICK_EDIT_MODE = $0040
|
||||||
|
#ENABLE_VIRTUAL_TERMINAL_INPUT = $0200
|
||||||
|
|
||||||
|
; For buffer/output? handles
|
||||||
|
#ENABLE_PROCESSED_OUTPUT = $0001
|
||||||
|
#ENABLE_WRAP_AT_EOL_OUTPUT = $0002
|
||||||
|
#ENABLE_VIRTUAL_TERMINAL_PROCESSING = $0004
|
||||||
|
#DISABLE_NEWLINE_AUTO_RETURN = $0008
|
||||||
|
#ENABLE_LVB_GRID_WORLDWIDE = $0010
|
||||||
|
|
||||||
|
|
||||||
|
;-> Typedefs Macros
|
||||||
|
|
||||||
|
; DWORD and HANDLE types from MS libraries
|
||||||
|
Macro DWORD : l : EndMacro
|
||||||
|
Macro HANDLE : i : EndMacro
|
||||||
|
|
||||||
|
|
||||||
|
;-> Procedure Declaration
|
||||||
|
|
||||||
|
Declare.s GetConsoleTitle(MaxLength.i = 255)
|
||||||
|
Macro SetConsoleTitle(Title) : ConsoleTitle(Title) : EndMacro
|
||||||
|
|
||||||
|
Declare.b AddConsoleModeFlag(Flags.DWORD = #Null, ConsoleHandle.Console::HANDLE = #Null)
|
||||||
|
Declare.b RemoveConsoleModeFlag(Flags.DWORD = #Null, ConsoleHandle.Console::HANDLE = #Null)
|
||||||
|
|
||||||
|
; May fail on Windows if the program's output is piped.
|
||||||
|
Macro EnableVirtualTerminalProcessing() : Console::AddConsoleModeFlag(Console::#ENABLE_VIRTUAL_TERMINAL_PROCESSING, #Null) : EndMacro
|
||||||
|
Macro DisableVirtualTerminalProcessing() : Console::RemoveConsoleModeFlag(Console::#ENABLE_VIRTUAL_TERMINAL_PROCESSING, #Null) : EndMacro
|
||||||
|
|
||||||
|
|
||||||
|
;-> Generic Macros
|
||||||
|
|
||||||
|
; Macro for #IsConsoleApp
|
||||||
|
Macro IsConsoleApp() : #IsConsoleApp : EndMacro
|
||||||
|
|
||||||
|
; https://docs.microsoft.com/en-us/windows/console/getstdhandle
|
||||||
|
Macro GetOutputHandle() : GetStdHandle_( #STD_OUTPUT_HANDLE ) : EndMacro
|
||||||
|
Macro GetInputHandle() : GetStdHandle_( #STD_INPUT_HANDLE ) : EndMacro
|
||||||
|
Macro GetErrorHandle() : GetStdHandle_( #STD_ERROR_HANDLE ) : EndMacro
|
||||||
|
EndDeclareModule
|
||||||
|
|
||||||
|
|
||||||
|
;- Module Definition
|
||||||
|
|
||||||
|
Module Console
|
||||||
|
;-> Compiler Directives
|
||||||
|
|
||||||
|
EnableExplicit
|
||||||
|
|
||||||
|
|
||||||
|
;-> Procedure Definition
|
||||||
|
|
||||||
|
Procedure.s GetConsoleTitle(MaxLength.i = 255)
|
||||||
|
Protected *ConsoleTitleBuffer = AllocateMemory(MaxLength)
|
||||||
|
Protected ConsoleTitle$ = #Null$
|
||||||
|
|
||||||
|
If *ConsoleTitleBuffer
|
||||||
|
Protected ConsoleTitleLength.l = GetConsoleTitle_(*ConsoleTitleBuffer, MaxLength)
|
||||||
|
ConsoleTitle$ = PeekS(*ConsoleTitleBuffer, ConsoleTitleLength)
|
||||||
|
FreeMemory(*ConsoleTitleBuffer)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn ConsoleTitle$
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure.b AddConsoleModeFlag(Flags.DWORD = #Null, ConsoleHandle.Console::HANDLE = #Null)
|
||||||
|
Protected ConsoleMode.DWORD = 0
|
||||||
|
|
||||||
|
If ConsoleHandle = #Null
|
||||||
|
ConsoleHandle = GetOutputHandle()
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
If GetConsoleMode_(ConsoleHandle, @ConsoleMode)
|
||||||
|
ConsoleMode = ConsoleMode | Flags
|
||||||
|
|
||||||
|
If SetConsoleMode_(ConsoleHandle, ConsoleMode)
|
||||||
|
ProcedureReturn #True
|
||||||
|
EndIf
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
Debug GetLastError_()
|
||||||
|
ProcedureReturn #False
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure.b RemoveConsoleModeFlag(Flags.DWORD = #Null, ConsoleHandle.Console::HANDLE = #Null)
|
||||||
|
Protected ConsoleMode.DWORD = 0
|
||||||
|
|
||||||
|
If ConsoleHandle = #Null
|
||||||
|
ConsoleHandle = GetOutputHandle()
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
If GetConsoleMode_(ConsoleHandle, @ConsoleMode)
|
||||||
|
ConsoleMode = ConsoleMode & ~Flags
|
||||||
|
|
||||||
|
If SetConsoleMode_(ConsoleHandle, ConsoleMode)
|
||||||
|
ProcedureReturn #True
|
||||||
|
EndIf
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
Debug GetLastError_()
|
||||||
|
ProcedureReturn #False
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
; ???
|
||||||
|
EndModule
|
||||||
|
|
||||||
|
|
||||||
|
;- Tests
|
||||||
|
|
||||||
|
CompilerIf #PB_Compiler_IsMainFile
|
||||||
|
EnableExplicit
|
||||||
|
|
||||||
|
If Not OpenConsole("Console.pbi")
|
||||||
|
Debug "Can't open console !"
|
||||||
|
End 1
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
;Debug "Console title: "+Console::GetConsoleTitle()
|
||||||
|
|
||||||
|
If Console::EnableVirtualTerminalProcessing()
|
||||||
|
PrintN("Virtual terminal processing activated !"+#CRLF$)
|
||||||
|
Else
|
||||||
|
PrintN("Virtual terminal processing couldn't be activated !"+#CRLF$)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
Console::CursorSave()
|
||||||
|
PrintN("#####")
|
||||||
|
PrintN("#####")
|
||||||
|
PrintN("#####")
|
||||||
|
Console::CursorUp()
|
||||||
|
Print("A")
|
||||||
|
Console::CursorRestore()
|
||||||
|
Print("B")
|
||||||
|
|
||||||
|
|
||||||
|
If Console::DisableVirtualTerminalProcessing()
|
||||||
|
PrintN("Virtual terminal processing deactivated !"+#CRLF$)
|
||||||
|
Else
|
||||||
|
PrintN("Virtual terminal processing couldn't be deactivated !"+#CRLF$)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
Print("Press enter key to exit...")
|
||||||
|
Input()
|
||||||
|
CompilerEndIf
|
68
Examples/VirtualTerminal/Basic.pb
Normal file
68
Examples/VirtualTerminal/Basic.pb
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
;{- Code Header
|
||||||
|
; ==- Basic Info -================================
|
||||||
|
; Name: VirtualTerminal/Basic.pb
|
||||||
|
; Author: Herwin Bozet
|
||||||
|
;
|
||||||
|
; ==- Links & License -===========================
|
||||||
|
; License: Unlicense
|
||||||
|
;}
|
||||||
|
|
||||||
|
;- Compiler Directives
|
||||||
|
|
||||||
|
EnableExplicit
|
||||||
|
|
||||||
|
XIncludeFile "../../VirtualTerminal.pbi"
|
||||||
|
|
||||||
|
CompilerIf #PB_Compiler_ExecutableFormat <> #PB_Compiler_Console
|
||||||
|
CompilerWarning "You should preferably compile the example as a console app !"
|
||||||
|
CompilerEndIf
|
||||||
|
|
||||||
|
|
||||||
|
;- Code
|
||||||
|
|
||||||
|
; Safely openning the console
|
||||||
|
If OpenConsole("My first title")
|
||||||
|
If Not VirtualTerminal::EnableVirtualTerminalProcessing()
|
||||||
|
VirtualTerminal::WriteErrorN("Unable to activate virtual terminal processing, output is likely piped !")
|
||||||
|
CloseConsole()
|
||||||
|
End 2
|
||||||
|
EndIf
|
||||||
|
Else
|
||||||
|
Debug "Can't open console !"
|
||||||
|
End 1
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
; Clearing the console
|
||||||
|
VirtualTerminal::ClearDisplay(AinsiEscapeCode::#ED_2) ; 2 or +ClearDisplayFull() also works just fine
|
||||||
|
VirtualTerminal::CursorTo(0, 0)
|
||||||
|
|
||||||
|
; Intro
|
||||||
|
VirtualTerminal::WriteOutputN("-===- Welcome to the 'Basic' demo for 'VirtualTerminal' -===-")
|
||||||
|
VirtualTerminal::WriteOutputN("Press enter to start...")
|
||||||
|
Input()
|
||||||
|
|
||||||
|
; Basic info
|
||||||
|
VirtualTerminal::WriteOutputN("-=- Basic info -=-")
|
||||||
|
VirtualTerminal::WriteOutputN("Terminal size: "+Str(VirtualTerminal::GetTerminalWidth())+"x"+Str(VirtualTerminal::GetTerminalHeight()))
|
||||||
|
VirtualTerminal::WriteOutputN("Press enter to continue...")
|
||||||
|
Input()
|
||||||
|
|
||||||
|
; Title demo
|
||||||
|
VirtualTerminal::WriteOutputN("-=- Title -=-")
|
||||||
|
VirtualTerminal::WriteOutputN("Press enter to change the title...")
|
||||||
|
Input()
|
||||||
|
VirtualTerminal::SetWindowTitle("My new title")
|
||||||
|
|
||||||
|
; ???
|
||||||
|
|
||||||
|
; End
|
||||||
|
VirtualTerminal::WriteOutputN("-=- End of the demo -=-")
|
||||||
|
Print("Press enter to clear the terminal and exit...")
|
||||||
|
Input()
|
||||||
|
VirtualTerminal::ClearDisplayFull()
|
||||||
|
VirtualTerminal::CursorTo(0, 0)
|
||||||
|
|
||||||
|
; Quitting safely
|
||||||
|
VirtualTerminal::DisableVirtualTerminalProcessing()
|
||||||
|
CloseConsole()
|
||||||
|
End 0
|
24
LICENSE
Normal file
24
LICENSE
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
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 AUTHORS 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.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
215
VirtualTerminal.pbi
Normal file
215
VirtualTerminal.pbi
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
;{- Code Header
|
||||||
|
; ==- Basic Info -================================
|
||||||
|
; Name: VirtualTerminal.pbi
|
||||||
|
; Version: N/A
|
||||||
|
; Author: Herwin Bozet
|
||||||
|
;
|
||||||
|
; ==- Compatibility -=============================
|
||||||
|
; Compiler version: PureBasic 5.70 (x86/x64)
|
||||||
|
; Operating system: Windows 10 21H1 (Previous versions untested)
|
||||||
|
;
|
||||||
|
; ==- Links & License -===========================
|
||||||
|
; License: Unlicense
|
||||||
|
;}
|
||||||
|
|
||||||
|
;- Compiler directives
|
||||||
|
|
||||||
|
XIncludeFile "./Console.pbi"
|
||||||
|
XIncludeFile "./AinsiEscapeCode.pbi"
|
||||||
|
|
||||||
|
|
||||||
|
;- Module declaration
|
||||||
|
|
||||||
|
DeclareModule VirtualTerminal
|
||||||
|
;-> Macros
|
||||||
|
|
||||||
|
;-> > Console.pbi macros
|
||||||
|
|
||||||
|
Macro IsConsoleApp() : Console::#IsConsoleApp : EndMacro
|
||||||
|
|
||||||
|
Macro GetOutputHandle() : Console::GetOutputHandle() : EndMacro
|
||||||
|
Macro GetInputHandle() : Console::GetInputHandle() : EndMacro
|
||||||
|
Macro GetErrorHandle() : Console::GetErrorHandle() : EndMacro
|
||||||
|
|
||||||
|
;-> > Platform-dependant Macros
|
||||||
|
|
||||||
|
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
|
||||||
|
Macro EnableVirtualTerminalProcessing() : Console::EnableVirtualTerminalProcessing() : EndMacro
|
||||||
|
Macro DisableVirtualTerminalProcessing() : Console::DisableVirtualTerminalProcessing() : EndMacro
|
||||||
|
CompilerElse
|
||||||
|
Declare.b EnableVirtualTerminalProcessing()
|
||||||
|
Declare.b DisableVirtualTerminalProcessing()
|
||||||
|
CompilerEndIf
|
||||||
|
|
||||||
|
;-> > Generic Macros
|
||||||
|
|
||||||
|
Macro WriteOutput(Message) : Print(Message) : EndMacro
|
||||||
|
Macro WriteOutputN(Message) : PrintN(Message) : EndMacro
|
||||||
|
Macro WriteErrorN(Message) : ConsoleError(Message) : EndMacro
|
||||||
|
|
||||||
|
;-> > Ainsi Escape Code Macros
|
||||||
|
|
||||||
|
;-> > > Cursor
|
||||||
|
Macro CursorUp() : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CUU$) : EndMacro
|
||||||
|
Macro CursorDown() : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CUD$) : EndMacro
|
||||||
|
Macro CursorRight() : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CUF$) : EndMacro
|
||||||
|
Macro CursorLeft() : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CUB$) : EndMacro
|
||||||
|
Macro CursorNextLine(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CNL$) : EndMacro
|
||||||
|
Macro CursorPreviousLine(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CPL$) : EndMacro
|
||||||
|
|
||||||
|
Macro CursorUpBy(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Amount) + AinsiEscapeCode::#CUU$) : EndMacro
|
||||||
|
Macro CursorDownBy(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Amount) + AinsiEscapeCode::#CUD$) : EndMacro
|
||||||
|
Macro CursorRightBy(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Amount) + AinsiEscapeCode::#CUF$) : EndMacro
|
||||||
|
Macro CursorLeftBy(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Amount) + AinsiEscapeCode::#CUB$) : EndMacro
|
||||||
|
Macro CursorLineDownBy(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Amount) + AinsiEscapeCode::#CNL$) : EndMacro
|
||||||
|
Macro CursorLineUpBy(Amount) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Amount) + AinsiEscapeCode::#CPL$) : EndMacro
|
||||||
|
|
||||||
|
Macro CursorToColumn(ColumnNumber) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(ColumnNumber) + AinsiEscapeCode::#CHA$) : EndMacro
|
||||||
|
Macro CursorToLine(LineNumber) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(LineNumber) + AinsiEscapeCode::#VPA$) : EndMacro
|
||||||
|
|
||||||
|
Macro CursorTo(X, Y) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Y) + ";" + Str(X) + AinsiEscapeCode::#CUP$) : EndMacro
|
||||||
|
|
||||||
|
Macro CursorFlip() : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#RI$) : EndMacro
|
||||||
|
Macro CursorSave() : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#DECSC$) : EndMacro
|
||||||
|
Macro CursorRestore() : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#DECSR$) : EndMacro
|
||||||
|
|
||||||
|
;-> > > Others
|
||||||
|
Macro ClearDisplay(Mode = AinsiEscapeCode::#ED_0) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + Str(Mode) + AinsiEscapeCode::#ED$) : EndMacro
|
||||||
|
Macro ClearDisplayToEnd() : VirtualTerminal::ClearDisplay(AinsiEscapeCode::#ED_0) : EndMacro
|
||||||
|
Macro ClearDisplayToStart() : VirtualTerminal::ClearDisplay(AinsiEscapeCode::#ED_1) : EndMacro
|
||||||
|
Macro ClearDisplayFull() : VirtualTerminal::ClearDisplay(AinsiEscapeCode::#ED_2) : EndMacro
|
||||||
|
Macro ClearDisplayAbsolute() : VirtualTerminal::ClearDisplay(AinsiEscapeCode::#ED_3) : EndMacro
|
||||||
|
|
||||||
|
;-> > > Window
|
||||||
|
Macro SetWindowTitleAndIcon(Title) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#OSC$ + "0;" + Left(Title, 255) + AinsiEscapeCode::#BEL$) : EndMacro
|
||||||
|
Macro SetWindowTitle(Title) : VirtualTerminal::WriteOutput(#ESC$ + AinsiEscapeCode::#OSC$ + "2;" + Left(Title, 255) + AinsiEscapeCode::#BEL$) : EndMacro
|
||||||
|
|
||||||
|
|
||||||
|
;-> Procedure Declaration (See the "Platform-dependant Macros" section)
|
||||||
|
|
||||||
|
Declare.b GetCursorPosition(*CursorPosition.Console::CursorPosition, TimeoutMs.i = 1)
|
||||||
|
|
||||||
|
Declare.i GetTerminalWidth(RestorePosition.b = #True)
|
||||||
|
Declare.i GetTerminalHeight(RestorePosition.b = #True)
|
||||||
|
EndDeclareModule
|
||||||
|
|
||||||
|
|
||||||
|
;- Module Definition
|
||||||
|
|
||||||
|
Module VirtualTerminal
|
||||||
|
;-> Compiler Directives
|
||||||
|
|
||||||
|
EnableExplicit
|
||||||
|
|
||||||
|
|
||||||
|
;-> Procedure Definition
|
||||||
|
|
||||||
|
CompilerIf Not #PB_Compiler_OS = #PB_OS_Windows
|
||||||
|
; FIXME: May not work if piped, not sure !
|
||||||
|
Procedure.b EnableVirtualTerminalProcessing() : ProcedureReturn #True : EndIf
|
||||||
|
Procedure.b DisableVirtualTerminalProcessing() : ProcedureReturn #True : EndIf
|
||||||
|
CompilerEndIf
|
||||||
|
|
||||||
|
Procedure.b GetCursorPosition(*CursorPosition.Console::CursorPosition, TimeoutMs.i = 1)
|
||||||
|
Protected StartTime.q
|
||||||
|
Protected Input$ = #Null$
|
||||||
|
|
||||||
|
If *CursorPosition
|
||||||
|
WriteOutput(#ESC$ + AinsiEscapeCode::#CSI$ + AinsiEscapeCode::#DECXCPR$)
|
||||||
|
|
||||||
|
; Waiting for stuff to come in...
|
||||||
|
StartTime = ElapsedMilliseconds()
|
||||||
|
Repeat
|
||||||
|
Input$ = Inkey()
|
||||||
|
Until Input$ <> #Null$ Or ((TimeoutMs <> -1 And (ElapsedMilliseconds() - StartTime > TimeoutMs)) Or (TimeoutMs = -1))
|
||||||
|
|
||||||
|
Repeat
|
||||||
|
Protected NewChar$ = Inkey()
|
||||||
|
If NewChar$ <> #Null$
|
||||||
|
Input$ = Input$ + NewChar$
|
||||||
|
Else
|
||||||
|
Break
|
||||||
|
EndIf
|
||||||
|
ForEver
|
||||||
|
|
||||||
|
Protected.i ResponseCodeStart = FindString(Input$, "[") + 1
|
||||||
|
Input$ = Mid(Input$, ResponseCodeStart, FindString(Input$, "R", ResponseCodeStart) - ResponseCodeStart)
|
||||||
|
|
||||||
|
If FindString(Input$, ";") >= 2
|
||||||
|
*CursorPosition\Y = Val(StringField(Input$, 1, ";"))
|
||||||
|
*CursorPosition\X = Val(StringField(Input$, 2, ";"))
|
||||||
|
ProcedureReturn #True
|
||||||
|
EndIf
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn #False
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure.i GetTerminalWidth(RestorePosition.b = #True)
|
||||||
|
Define OriginalCursorPosition.Console::CursorPosition
|
||||||
|
Define MeasuringCursorPosition.Console::CursorPosition
|
||||||
|
|
||||||
|
If RestorePosition
|
||||||
|
VirtualTerminal::GetCursorPosition(@OriginalCursorPosition)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
VirtualTerminal::CursorTo(32767, 0)
|
||||||
|
VirtualTerminal::GetCursorPosition(@MeasuringCursorPosition)
|
||||||
|
|
||||||
|
If RestorePosition
|
||||||
|
VirtualTerminal::CursorTo(OriginalCursorPosition\X, OriginalCursorPosition\Y)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn MeasuringCursorPosition\X
|
||||||
|
EndProcedure
|
||||||
|
|
||||||
|
Procedure.i GetTerminalHeight(RestorePosition.b = #True)
|
||||||
|
Define OriginalCursorPosition.Console::CursorPosition
|
||||||
|
Define MeasuringCursorPosition.Console::CursorPosition
|
||||||
|
|
||||||
|
If RestorePosition
|
||||||
|
VirtualTerminal::GetCursorPosition(@OriginalCursorPosition)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
VirtualTerminal::CursorTo(0, 32767)
|
||||||
|
VirtualTerminal::GetCursorPosition(@MeasuringCursorPosition)
|
||||||
|
|
||||||
|
If RestorePosition
|
||||||
|
VirtualTerminal::CursorTo(OriginalCursorPosition\X, OriginalCursorPosition\Y)
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
ProcedureReturn MeasuringCursorPosition\Y
|
||||||
|
EndProcedure
|
||||||
|
EndModule
|
||||||
|
|
||||||
|
|
||||||
|
;- Tests
|
||||||
|
|
||||||
|
CompilerIf #PB_Compiler_IsMainFile
|
||||||
|
EnableExplicit
|
||||||
|
|
||||||
|
If OpenConsole("Console.pbi")
|
||||||
|
If Not VirtualTerminal::EnableVirtualTerminalProcessing()
|
||||||
|
VirtualTerminal::WriteErrorN("Unable to activate virtual terminal processing, output is likely piped !")
|
||||||
|
CloseConsole()
|
||||||
|
End 2
|
||||||
|
EndIf
|
||||||
|
Else
|
||||||
|
Debug "Can't open console !"
|
||||||
|
End 1
|
||||||
|
EndIf
|
||||||
|
|
||||||
|
VirtualTerminal::ClearDisplay(AinsiEscapeCode::#ED_2)
|
||||||
|
VirtualTerminal::CursorTo(0, 0)
|
||||||
|
PrintN("-==- Title Bar -==-")
|
||||||
|
|
||||||
|
Print("Size: "+VirtualTerminal::GetTerminalWidth()+"x"+VirtualTerminal::GetTerminalHeight())
|
||||||
|
|
||||||
|
;Print("Press enter key to exit...")
|
||||||
|
Debug Input()
|
||||||
|
;FreeMemory(*Buffer)
|
||||||
|
|
||||||
|
VirtualTerminal::DisableVirtualTerminalProcessing()
|
||||||
|
CloseConsole()
|
||||||
|
End 0
|
||||||
|
CompilerEndIf
|
Loading…
Reference in New Issue
Block a user