Exemplo n.º 1
0
 public Size GetConsoleWindowSize()
 {
     Debug.Assert(Win32Console.GetConsoleScreenBufferInfo(_screenBuffer, out Win32Console.CONSOLE_SCREEN_BUFFER_INFO csbi));
     return(new Size(
                csbi.srWindow.Right - csbi.srWindow.Left,
                csbi.srWindow.Bottom - csbi.srWindow.Top));
 }
Exemplo n.º 2
0
        public void Resize(int width, int height)
        {
            _display   = new ScreenBuffer(this, width, height);
            Backbuffer = new ScreenBuffer(this, width, height);

            var newBuffer = Win32Console.CreateConsoleScreenBuffer(
                Win32Console.GENERIC_READ | Win32Console.GENERIC_WRITE,
                Win32Console.FILE_SHARE_READ,
                IntPtr.Zero,
                Win32Console.CONSOLE_TEXTMODE_BUFFER,
                IntPtr.Zero);

            Win32Console.SetConsoleScreenBufferSize(newBuffer, new Win32Console.COORD((short)width, (short)height));

            var cci = new Win32Console.CONSOLE_CURSOR_INFO();

            cci.dwSize   = 100;
            cci.bVisible = false;
            Win32Console.SetConsoleCursorInfo(newBuffer, ref cci);

            var cfi = new Win32Console.CONSOLE_FONT_INFOEX();

            cfi.cbSize     = Marshal.SizeOf(cfi);
            cfi.nFont      = 0;
            cfi.dwFontSize = new Win32Console.COORD(8, 14);
            cfi.FaceName   = "Lucida Console";
            cfi.FontFamily = 0;
            cfi.FontWeight = 0;
            Debug.Assert(Win32Console.SetCurrentConsoleFontEx(newBuffer, false, ref cfi));

            Debug.Assert(Win32Console.SetConsoleActiveScreenBuffer(newBuffer));
            if (_screenBuffer != IntPtr.Zero)
            {
                Debug.Assert(Win32Console.CloseHandle(_screenBuffer));
            }

            _screenBuffer = newBuffer;
        }
Exemplo n.º 3
0
        public void Commit()
        {
            for (int y = 0; y < _display.Height; y++)
            {
                for (int x = 0; x < _display.Width; x++)
                {
                    var i = y * _display.Width + x;
                    ref ScreenBufferCharacter displayChar    = ref _display.Buffer[i];
                    ref ScreenBufferCharacter backbufferChar = ref Backbuffer.Buffer[i];

                    if (displayChar != backbufferChar)
                    {
                        displayChar = backbufferChar;

                        var ci = new Win32Console.CHAR_INFO();
                        ci.Character  = (byte)displayChar.Character;
                        ci.Attributes = GetAttributesFromColors(displayChar.Foreground, displayChar.Background);

                        if (displayChar.Underline)
                        {
                            ci.Attributes |= Win32Console.COMMON_LVB_UNDERSCORE;
                        }

                        var ci_array = new Win32Console.CHAR_INFO[1] {
                            ci
                        };

                        var rc = new Win32Console.SMALL_RECT((short)x, (short)y, (short)(x + 1), (short)(y + 1));
                        Debug.Assert(Win32Console.WriteConsoleOutput(
                                         _screenBuffer,
                                         ci_array,
                                         new Win32Console.COORD(1, 1), // dwBufferSize - width/height of the 2d ci_array
                                         new Win32Console.COORD(),     // dwBufferCoord
                                         ref rc));                     // lpWriteRegion - where to write to
                    }
                }
Exemplo n.º 4
0
 public void Dispose()
 {
     Debug.Assert(Win32Console.SetConsoleActiveScreenBuffer(_defaultBuffer));
     Debug.Assert(Win32Console.CloseHandle(_screenBuffer));
 }
Exemplo n.º 5
0
 public ScreenBufferManager(int width, int height)
 {
     _defaultBuffer = Win32Console.GetStdHandle(Win32Console.STD_OUTPUT_HANDLE);
     Resize(width, height);
 }