mirror of
https://github.com/ksherlock/TwoTerm.git
synced 2025-01-03 07:29:28 +00:00
add TextPort, move size to textPort.
git-svn-id: svn://qnap.local/TwoTerm/trunk@1897 5590a31f-7b70-45f8-8c82-aa3a8e5f4507
This commit is contained in:
parent
35918005de
commit
10ee324572
171
Screen.cpp
171
Screen.cpp
@ -13,17 +13,21 @@
|
|||||||
|
|
||||||
Screen::Screen(unsigned height, unsigned width)
|
Screen::Screen(unsigned height, unsigned width)
|
||||||
{
|
{
|
||||||
_height = height;
|
|
||||||
_width = width;
|
_port.frame = iRect(0, 0, width, height);
|
||||||
|
_port.rightMargin = TextPort::RMTruncate;
|
||||||
|
_port.advanceCursor = true;
|
||||||
|
_port.scroll = true;
|
||||||
|
|
||||||
|
|
||||||
_flag = 0;
|
_flag = 0;
|
||||||
|
|
||||||
_screen.resize(_height);
|
_screen.resize(height);
|
||||||
|
|
||||||
|
|
||||||
for (ScreenIterator iter = _screen.begin(); iter != _screen.end(); ++iter)
|
for (ScreenIterator iter = _screen.begin(); iter != _screen.end(); ++iter)
|
||||||
{
|
{
|
||||||
iter->resize(_width);
|
iter->resize(width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -45,8 +49,8 @@ iRect Screen::endUpdate()
|
|||||||
{
|
{
|
||||||
int maxX = -1;
|
int maxX = -1;
|
||||||
int maxY = -1;
|
int maxY = -1;
|
||||||
int minX = _width;
|
int minX = width();
|
||||||
int minY = _height;
|
int minY = height();
|
||||||
|
|
||||||
|
|
||||||
if (_cursor != _updateCursor)
|
if (_cursor != _updateCursor)
|
||||||
@ -86,13 +90,13 @@ void Screen::clearFlagBit(uint8_t bit)
|
|||||||
|
|
||||||
void Screen::putc(uint8_t c, bool incrementX)
|
void Screen::putc(uint8_t c, bool incrementX)
|
||||||
{
|
{
|
||||||
if (_cursor.x < _width)
|
if (_cursor.x < width())
|
||||||
{
|
{
|
||||||
_updates.push_back(_cursor);
|
_updates.push_back(_cursor);
|
||||||
|
|
||||||
_screen[_cursor.y][_cursor.x] = CharInfo(c, _flag);
|
_screen[_cursor.y][_cursor.x] = CharInfo(c, _flag);
|
||||||
|
|
||||||
if (incrementX && _cursor.x < _width - 1) ++_cursor.x;
|
if (incrementX && _cursor.x < width() - 1) ++_cursor.x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,10 +106,10 @@ void Screen::deletec()
|
|||||||
// move following character up
|
// move following character up
|
||||||
// set final character to ' ' (retaining flags from previous char)
|
// set final character to ' ' (retaining flags from previous char)
|
||||||
|
|
||||||
if (_cursor.x >= _width) return;
|
if (_cursor.x >= width()) return;
|
||||||
|
|
||||||
_updates.push_back(_cursor);
|
_updates.push_back(_cursor);
|
||||||
_updates.push_back(iPoint(_width - 1, _cursor.y));
|
_updates.push_back(iPoint(width() - 1, _cursor.y));
|
||||||
|
|
||||||
|
|
||||||
CharInfoIterator end = _screen[_cursor.y].end() - 1;
|
CharInfoIterator end = _screen[_cursor.y].end() - 1;
|
||||||
@ -126,10 +130,10 @@ void Screen::insertc(uint8_t c)
|
|||||||
// insert character at cursor.
|
// insert character at cursor.
|
||||||
// move following characters up (retaining flags).
|
// move following characters up (retaining flags).
|
||||||
|
|
||||||
if (_cursor.x >= _width) return;
|
if (_cursor.x >= width()) return;
|
||||||
|
|
||||||
_updates.push_back(_cursor);
|
_updates.push_back(_cursor);
|
||||||
_updates.push_back(iPoint(_width - 1, _cursor.y));
|
_updates.push_back(iPoint(width() - 1, _cursor.y));
|
||||||
|
|
||||||
CharInfoIterator end = _screen[_cursor.y].end() - 1;
|
CharInfoIterator end = _screen[_cursor.y].end() - 1;
|
||||||
CharInfoIterator iter = _screen[_cursor.y].begin() + _cursor.x;
|
CharInfoIterator iter = _screen[_cursor.y].begin() + _cursor.x;
|
||||||
@ -148,7 +152,7 @@ void Screen::tabTo(unsigned xPos)
|
|||||||
CharInfo clear(' ', _flag);
|
CharInfo clear(' ', _flag);
|
||||||
CharInfoIterator iter;
|
CharInfoIterator iter;
|
||||||
|
|
||||||
xPos = std::min(xPos, _width - 1);
|
xPos = std::min(xPos, width() - 1);
|
||||||
|
|
||||||
|
|
||||||
_updates.push_back(_cursor);
|
_updates.push_back(_cursor);
|
||||||
@ -169,9 +173,9 @@ void Screen::setX(int x, bool clamp)
|
|||||||
if (clamp) _cursor.x = 0;
|
if (clamp) _cursor.x = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (x >= _width)
|
if (x >= width())
|
||||||
{
|
{
|
||||||
if (clamp) _cursor.x = _width - 1;
|
if (clamp) _cursor.x = width() - 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,9 +190,9 @@ void Screen::setY(int y, bool clamp)
|
|||||||
if (clamp) _cursor.y = 0;
|
if (clamp) _cursor.y = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (y >= _height)
|
if (y >= height())
|
||||||
{
|
{
|
||||||
if (clamp) _cursor.y = _height - 1;
|
if (clamp) _cursor.y = height() - 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,7 +242,7 @@ void Screen::erase(EraseRegion region)
|
|||||||
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
|
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
|
||||||
}
|
}
|
||||||
_updates.push_back(iPoint(0,0));
|
_updates.push_back(iPoint(0,0));
|
||||||
_updates.push_back(iPoint(_width - 1, _height - 1));
|
_updates.push_back(iPoint(width() - 1, height() - 1));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -253,7 +257,7 @@ void Screen::erase(EraseRegion region)
|
|||||||
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
|
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
|
||||||
}
|
}
|
||||||
_updates.push_back(iPoint(0,0));
|
_updates.push_back(iPoint(0,0));
|
||||||
_updates.push_back(iPoint(_width - 1, _cursor.y));
|
_updates.push_back(iPoint(width() - 1, _cursor.y));
|
||||||
|
|
||||||
region = EraseLineBeforeCursor;
|
region = EraseLineBeforeCursor;
|
||||||
}
|
}
|
||||||
@ -266,7 +270,7 @@ void Screen::erase(EraseRegion region)
|
|||||||
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
|
std::fill(screenIter->begin(), screenIter->end(), CharInfo(0,0));
|
||||||
}
|
}
|
||||||
_updates.push_back(iPoint(0,_cursor.y + 1));
|
_updates.push_back(iPoint(0,_cursor.y + 1));
|
||||||
_updates.push_back(iPoint(_width - 1, _height - 1));
|
_updates.push_back(iPoint(width() - 1, height() - 1));
|
||||||
|
|
||||||
region = EraseLineAfterCursor;
|
region = EraseLineAfterCursor;
|
||||||
}
|
}
|
||||||
@ -278,7 +282,7 @@ void Screen::erase(EraseRegion region)
|
|||||||
std::fill(_screen[y].begin(), _screen[y].end(), CharInfo(0,0));
|
std::fill(_screen[y].begin(), _screen[y].end(), CharInfo(0,0));
|
||||||
|
|
||||||
_updates.push_back(iPoint(0, _cursor.y));
|
_updates.push_back(iPoint(0, _cursor.y));
|
||||||
_updates.push_back(iPoint(_width - 1, _cursor.y));
|
_updates.push_back(iPoint(width() - 1, _cursor.y));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -300,7 +304,7 @@ void Screen::erase(EraseRegion region)
|
|||||||
std::fill(_screen[y].begin() + _cursor.x, _screen[y].end(), CharInfo(0,0));
|
std::fill(_screen[y].begin() + _cursor.x, _screen[y].end(), CharInfo(0,0));
|
||||||
|
|
||||||
_updates.push_back(_cursor);
|
_updates.push_back(_cursor);
|
||||||
_updates.push_back(iPoint(_width - 1, _cursor.y));
|
_updates.push_back(iPoint(width() - 1, _cursor.y));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,7 +321,7 @@ void Screen::eraseLine()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updates.push_back(_cursor);
|
_updates.push_back(_cursor);
|
||||||
_updates.push_back(iPoint(_width - 1, _cursor.y));
|
_updates.push_back(iPoint(width() - 1, _cursor.y));
|
||||||
}
|
}
|
||||||
void Screen::eraseScreen()
|
void Screen::eraseScreen()
|
||||||
{
|
{
|
||||||
@ -325,7 +329,7 @@ void Screen::eraseScreen()
|
|||||||
|
|
||||||
eraseLine();
|
eraseLine();
|
||||||
|
|
||||||
if (_cursor.y == _height -1) return;
|
if (_cursor.y == height() -1) return;
|
||||||
|
|
||||||
for (ScreenIterator iter = _screen.begin() + _cursor.y; iter < _screen.end(); ++iter)
|
for (ScreenIterator iter = _screen.begin() + _cursor.y; iter < _screen.end(); ++iter)
|
||||||
{
|
{
|
||||||
@ -337,15 +341,15 @@ void Screen::eraseScreen()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updates.push_back(iPoint(0, _cursor.y + 1));
|
_updates.push_back(iPoint(0, _cursor.y + 1));
|
||||||
_updates.push_back(iPoint(_width - 1, _height - 1));
|
_updates.push_back(iPoint(width() - 1, height() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Screen::eraseRect(iRect rect)
|
void Screen::eraseRect(iRect rect)
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned maxX = std::min(_width, (unsigned)rect.maxX());
|
unsigned maxX = std::min(width(), (unsigned)rect.maxX());
|
||||||
unsigned maxY = std::min(_height, (unsigned)rect.maxY());
|
unsigned maxY = std::min(height(), (unsigned)rect.maxY());
|
||||||
|
|
||||||
CharInfo clear;
|
CharInfo clear;
|
||||||
|
|
||||||
@ -367,29 +371,9 @@ void Screen::lineFeed()
|
|||||||
{
|
{
|
||||||
// moves the screen up one row, inserting a blank line at the bottom.
|
// moves the screen up one row, inserting a blank line at the bottom.
|
||||||
|
|
||||||
if (_cursor.y == _height - 1)
|
if (_cursor.y == height() - 1)
|
||||||
{
|
{
|
||||||
/*
|
deleteLine(0);
|
||||||
// move lines 1..end up 1 line.
|
|
||||||
for (ScreenIterator iter = _screen.begin() + 1; iter < _screen.end(); ++iter)
|
|
||||||
{
|
|
||||||
iter[-1] = *iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset the bottom line
|
|
||||||
//_screen.back().clear();
|
|
||||||
//_screen.back().resize(_width);
|
|
||||||
|
|
||||||
for (CharInfoIterator ciIter = _screen.back().begin(); ciIter < _screen.back().end(); ++ciIter)
|
|
||||||
{
|
|
||||||
*ciIter = CharInfo(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_updates.push_back(iPoint(0, 0));
|
|
||||||
_updates.push_back(iPoint(_width - 1, _height - 1));
|
|
||||||
*/
|
|
||||||
|
|
||||||
removeLine(0);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -397,6 +381,31 @@ void Screen::lineFeed()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Screen::lineFeed(TextPort *textPort)
|
||||||
|
{
|
||||||
|
int maxY;
|
||||||
|
|
||||||
|
if (!textPort)
|
||||||
|
{
|
||||||
|
lineFeed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
maxY = textPort->frame.maxY();
|
||||||
|
|
||||||
|
maxY = std::min(maxY, (int)height());
|
||||||
|
|
||||||
|
if (_cursor.y < maxY)
|
||||||
|
{
|
||||||
|
_cursor.y++;
|
||||||
|
}
|
||||||
|
else if (textPort->scroll)
|
||||||
|
{
|
||||||
|
_cursor.y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Screen::reverseLineFeed()
|
void Screen::reverseLineFeed()
|
||||||
{
|
{
|
||||||
@ -404,26 +413,7 @@ void Screen::reverseLineFeed()
|
|||||||
|
|
||||||
if (_cursor.y == 0)
|
if (_cursor.y == 0)
|
||||||
{
|
{
|
||||||
/*
|
insertLine(0);
|
||||||
for (ReverseScreenIterator iter = _screen.rbegin() + 1; iter < _screen.rend(); ++iter)
|
|
||||||
{
|
|
||||||
iter[-1] = *iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset the top line
|
|
||||||
//_screen.front().clear();
|
|
||||||
//_screen.front().resize(_width);
|
|
||||||
|
|
||||||
for (CharInfoIterator ciIter = _screen.front().begin(); ciIter < _screen.front().end(); ++ciIter)
|
|
||||||
{
|
|
||||||
*ciIter = CharInfo(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
_updates.push_back(iPoint(0, 0));
|
|
||||||
_updates.push_back(iPoint(_width - 1, _height - 1));
|
|
||||||
*/
|
|
||||||
|
|
||||||
addLine(0);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -434,15 +424,15 @@ void Screen::reverseLineFeed()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Screen::addLine(unsigned line)
|
void Screen::insertLine(unsigned line)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (line >= _height) return;
|
if (line >= height()) return;
|
||||||
|
|
||||||
if (line == _height - 1)
|
if (line == height() - 1)
|
||||||
{
|
{
|
||||||
_screen.back().clear();
|
_screen.back().clear();
|
||||||
_screen.back().resize(_width);
|
_screen.back().resize(width());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -451,19 +441,19 @@ void Screen::addLine(unsigned line)
|
|||||||
|
|
||||||
_screen.pop_back();
|
_screen.pop_back();
|
||||||
iter = _screen.insert(_screen.begin() + line, newLine);
|
iter = _screen.insert(_screen.begin() + line, newLine);
|
||||||
iter->resize(_width);
|
iter->resize(width());
|
||||||
}
|
}
|
||||||
|
|
||||||
_updates.push_back(iPoint(0, line));
|
_updates.push_back(iPoint(0, line));
|
||||||
_updates.push_back(iPoint(_width - 1, _height - 1));
|
_updates.push_back(iPoint(width() - 1, height() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Screen::removeLine(unsigned line)
|
void Screen::deleteLine(unsigned line)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (line >= _height) return;
|
if (line >= height()) return;
|
||||||
|
|
||||||
if (line == _height - 1)
|
if (line == height() - 1)
|
||||||
{
|
{
|
||||||
_screen.back().clear();
|
_screen.back().clear();
|
||||||
|
|
||||||
@ -477,11 +467,11 @@ void Screen::removeLine(unsigned line)
|
|||||||
_screen.push_back(newLine);
|
_screen.push_back(newLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
_screen.back().resize(_width);
|
_screen.back().resize(width());
|
||||||
|
|
||||||
|
|
||||||
_updates.push_back(iPoint(0, line));
|
_updates.push_back(iPoint(0, line));
|
||||||
_updates.push_back(iPoint(_width - 1, _height - 1));
|
_updates.push_back(iPoint(width() - 1, height() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -489,18 +479,18 @@ void Screen::removeLine(unsigned line)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Screen::setSize(unsigned width, unsigned height)
|
void Screen::setSize(unsigned w, unsigned h)
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((_height == height) && (_width == width)) return;
|
if ((height() == h) && (width() == w)) return;
|
||||||
|
|
||||||
if (_height < height)
|
if (height() < h)
|
||||||
{
|
{
|
||||||
_screen.resize(height);
|
_screen.resize(h);
|
||||||
}
|
}
|
||||||
else if (_height > height)
|
else if (height() > h)
|
||||||
{
|
{
|
||||||
unsigned count = _height - height;
|
unsigned count = height() - h;
|
||||||
// erase lines from the top.
|
// erase lines from the top.
|
||||||
_screen.erase(_screen.begin(), _screen.begin() + count);
|
_screen.erase(_screen.begin(), _screen.begin() + count);
|
||||||
}
|
}
|
||||||
@ -511,17 +501,16 @@ void Screen::setSize(unsigned width, unsigned height)
|
|||||||
ScreenIterator iter;
|
ScreenIterator iter;
|
||||||
for (iter = _screen.begin(); iter != _screen.end(); ++iter)
|
for (iter = _screen.begin(); iter != _screen.end(); ++iter)
|
||||||
{
|
{
|
||||||
iter->resize(width);
|
iter->resize(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_height = height;
|
_port.frame.size = iSize(w, h);
|
||||||
_width = width;
|
|
||||||
|
|
||||||
|
|
||||||
if (_cursor.y >= height) _cursor.y = height - 1;
|
if (_cursor.y >= h) _cursor.y = h - 1;
|
||||||
if (_cursor.x >= width) _cursor.x = width - 1;
|
if (_cursor.x >= w) _cursor.x = w - 1;
|
||||||
|
|
||||||
//fprintf(stderr, "setSize(%u, %u)\n", width, height);
|
//fprintf(stderr, "setSize(%u, %u)\n", width, height);
|
||||||
|
|
||||||
|
47
Screen.h
47
Screen.h
@ -28,27 +28,26 @@ typedef struct CharInfo {
|
|||||||
} CharInfo;
|
} CharInfo;
|
||||||
|
|
||||||
|
|
||||||
typedef struct ViewPort {
|
typedef struct TextPort {
|
||||||
|
|
||||||
|
enum RightMargin {
|
||||||
|
RMTruncate,
|
||||||
|
RMWrap,
|
||||||
|
RMOverwrite
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
iRect frame;
|
iRect frame;
|
||||||
|
|
||||||
union flags
|
|
||||||
{
|
|
||||||
unsigned wrap:1;
|
|
||||||
unsigned advance:1;
|
|
||||||
unsigned lineFeed:1;
|
|
||||||
unsigned scroll:1;
|
|
||||||
|
|
||||||
flags()
|
RightMargin rightMargin;
|
||||||
{
|
|
||||||
wrap = 0;
|
bool advanceCursor;
|
||||||
advance = 0;
|
//bool lineFeed;
|
||||||
lineFeed = 0;
|
bool scroll;
|
||||||
scroll = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} flags;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class Screen {
|
class Screen {
|
||||||
@ -128,11 +127,15 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
void lineFeed();
|
void lineFeed();
|
||||||
|
void lineFeed(TextPort *textPort);
|
||||||
|
|
||||||
void reverseLineFeed();
|
void reverseLineFeed();
|
||||||
|
void reverseLineFeed(TextPort *textPort);
|
||||||
|
|
||||||
|
|
||||||
void addLine(unsigned line);
|
|
||||||
void removeLine(unsigned line);
|
void deleteLine(unsigned line);
|
||||||
|
void insertLine(unsigned line);
|
||||||
|
|
||||||
|
|
||||||
void beginUpdate();
|
void beginUpdate();
|
||||||
@ -150,8 +153,8 @@ private:
|
|||||||
|
|
||||||
iPoint _cursor;
|
iPoint _cursor;
|
||||||
|
|
||||||
unsigned _height;
|
TextPort _port;
|
||||||
unsigned _width;
|
|
||||||
|
|
||||||
uint8_t _flag;
|
uint8_t _flag;
|
||||||
|
|
||||||
@ -195,12 +198,12 @@ inline uint8_t Screen::flag() const
|
|||||||
|
|
||||||
inline unsigned Screen::height() const
|
inline unsigned Screen::height() const
|
||||||
{
|
{
|
||||||
return _height;
|
return _port.frame.size.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline unsigned Screen::width() const
|
inline unsigned Screen::width() const
|
||||||
{
|
{
|
||||||
return _width;
|
return _port.frame.size.width;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Screen::setCursor(iPoint point, bool clampX, bool clampY)
|
inline void Screen::setCursor(iPoint point, bool clampX, bool clampY)
|
||||||
@ -230,7 +233,7 @@ inline void Screen::unlock()
|
|||||||
inline CharInfo Screen::getc(int x, int y) const
|
inline CharInfo Screen::getc(int x, int y) const
|
||||||
{
|
{
|
||||||
if (x < 0 || y < 0) return CharInfo(0,0);
|
if (x < 0 || y < 0) return CharInfo(0,0);
|
||||||
if (x >= _width || y >= _height) return CharInfo(0,0);
|
if (x >= width() || y >= height()) return CharInfo(0,0);
|
||||||
|
|
||||||
return _screen[y][x];
|
return _screen[y][x];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user