Hi

I would like to ask you for help again.

I am trying to achive double buffering for console under Windows (I was in 
shock when I noticed that there is double buffering for console).

My current code: 
    
    
    import winim
    from os import execShellCmd, sleep
    
    var buffer1: HANDLE = GetStdHandle(STD_OUTPUT_HANDLE)
    var buffer2: HANDLE = CreateConsoleScreenBuffer( GENERIC_WRITE, 0, NULL, 
CONSOLE_TEXTMODE_BUFFER, NULL)
    
    discard execShellCmd("cls")
    
    var begin: COORD
    begin.X = 0;
    begin.Y = 0;
    
    SetConsoleCursorPosition(buffer1, begin)
    
    var written: DWORD;
    var s: wstring = `+$`[wstring]("milk!")
    var s1: wstring = `+$`[wstring]("choco")
    
    WriteConsole( buffer1, &s, 5, addr written, NULL)
    echo "buffer 1"
    WriteConsole( buffer2, &s1, 5, addr written, NULL)
    
    proc open_osfhandle(osfhandle: Handle, flags: int): int  {.importc: 
"_open_osfhandle", header: "io.h".}
    proc fdopen(fd: int, mode: char): FILE {.importc: "_fdopen", header: 
"stdio.h".}
    
    var fd = open_osfhandle(buffer1, 8)
    echo "FD: ", fd
    
    # This line produces error
    # SIGSEGV: Illegal storage access. (Attempt to read from nil?)
    # var f = fdopen(fd, 'a') # <- ERROR
    
    #f.write("2 buf")
    
    sleep(2000)
    SetConsoleActiveScreenBuffer( buffer2 )
    
    sleep(2000)
    SetConsoleActiveScreenBuffer( buffer1 )
    

So I have found that required functions are fortunately wrapped in _winim_. 
Fantastic, I could rewrite c++ code without almost any changes. And it works. 
However, having this I would like to be able to just use standard _"write"_ Nim 
procedure. Then the problems started to pile up. I need Nim _File_ having c 
_HANDLE_. I have found that I can change _HANDLE_ to FILE* in c by obtaining 
first file descriptor using __open_osfhandle_ and then get FILE* from FD using 
__fd_open_. I tried but I find difficult to map c types to Nim and back. In 
example code I have error. Could you help me?

Reply via email to