|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef AGENT_WIN32_CONSOLE_BUFFER_H |
|
#define AGENT_WIN32_CONSOLE_BUFFER_H |
|
|
|
#include <windows.h> |
|
|
|
#include <string.h> |
|
|
|
#include <memory> |
|
|
|
#include "Coord.h" |
|
#include "SmallRect.h" |
|
|
|
class ConsoleScreenBufferInfo : public CONSOLE_SCREEN_BUFFER_INFO { |
|
public: |
|
ConsoleScreenBufferInfo() |
|
{ |
|
memset(this, 0, sizeof(*this)); |
|
} |
|
|
|
Coord bufferSize() const { return dwSize; } |
|
SmallRect windowRect() const { return srWindow; } |
|
Coord cursorPosition() const { return dwCursorPosition; } |
|
}; |
|
|
|
class Win32ConsoleBuffer { |
|
private: |
|
Win32ConsoleBuffer(HANDLE conout, bool owned) : |
|
m_conout(conout), m_owned(owned) |
|
{ |
|
} |
|
|
|
public: |
|
static const int kDefaultAttributes = 7; |
|
|
|
~Win32ConsoleBuffer() { |
|
if (m_owned) { |
|
CloseHandle(m_conout); |
|
} |
|
} |
|
|
|
static std::unique_ptr<Win32ConsoleBuffer> openStdout(); |
|
static std::unique_ptr<Win32ConsoleBuffer> openConout(); |
|
static std::unique_ptr<Win32ConsoleBuffer> createErrorBuffer(); |
|
|
|
Win32ConsoleBuffer(const Win32ConsoleBuffer &other) = delete; |
|
Win32ConsoleBuffer &operator=(const Win32ConsoleBuffer &other) = delete; |
|
|
|
HANDLE conout(); |
|
void clearLines(int row, int count, const ConsoleScreenBufferInfo &info); |
|
void clearAllLines(const ConsoleScreenBufferInfo &info); |
|
|
|
|
|
ConsoleScreenBufferInfo bufferInfo(); |
|
Coord bufferSize(); |
|
SmallRect windowRect(); |
|
void resizeBuffer(const Coord &size); |
|
bool resizeBufferRange(const Coord &initialSize, Coord &finalSize); |
|
bool resizeBufferRange(const Coord &initialSize) { |
|
Coord dummy; |
|
return resizeBufferRange(initialSize, dummy); |
|
} |
|
void moveWindow(const SmallRect &rect); |
|
|
|
|
|
Coord cursorPosition(); |
|
void setCursorPosition(const Coord &point); |
|
|
|
|
|
void read(const SmallRect &rect, CHAR_INFO *data); |
|
void write(const SmallRect &rect, const CHAR_INFO *data); |
|
|
|
void setTextAttribute(WORD attributes); |
|
|
|
private: |
|
HANDLE m_conout = nullptr; |
|
bool m_owned = false; |
|
}; |
|
|
|
#endif |
|
|