SerialConnect: draw the cursor.
* Drawn as "inverse video" for now. * Should use VTerm state to get the cursor shape (rect, underline or left line) * Should also handle blinking if enabled, and visibility.
This commit is contained in:
parent
ea7fbc874f
commit
30636d2eb6
@ -74,6 +74,9 @@ TermView::Draw(BRect updateRect)
|
|||||||
font_height height;
|
font_height height;
|
||||||
GetFontHeight(&height);
|
GetFontHeight(&height);
|
||||||
|
|
||||||
|
VTermPos cursorPos;
|
||||||
|
vterm_state_get_cursorpos(vterm_obtain_state(fTerm), &cursorPos);
|
||||||
|
|
||||||
for (pos.row = updatedChars.start_row; pos.row <= updatedChars.end_row;
|
for (pos.row = updatedChars.start_row; pos.row <= updatedChars.end_row;
|
||||||
pos.row++) {
|
pos.row++) {
|
||||||
float x = updatedChars.start_col * fFontWidth + kBorderSpacing;
|
float x = updatedChars.start_col * fFontWidth + kBorderSpacing;
|
||||||
@ -96,7 +99,8 @@ TermView::Draw(BRect updateRect)
|
|||||||
background.blue = cell.bg.blue;
|
background.blue = cell.bg.blue;
|
||||||
background.alpha = 255;
|
background.alpha = 255;
|
||||||
|
|
||||||
if (cell.attrs.reverse) {
|
if ((cell.attrs.reverse != 0) ^ (pos.col == cursorPos.col
|
||||||
|
&& pos.row == cursorPos.row)) {
|
||||||
SetLowColor(foreground);
|
SetLowColor(foreground);
|
||||||
SetViewColor(foreground);
|
SetViewColor(foreground);
|
||||||
SetHighColor(background);
|
SetHighColor(background);
|
||||||
@ -107,9 +111,10 @@ TermView::Draw(BRect updateRect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
BPoint penLocation = PenLocation();
|
BPoint penLocation = PenLocation();
|
||||||
FillRect(BRect(penLocation.x, penLocation.y - height.ascent,
|
FillRect(BRect(penLocation.x,
|
||||||
|
penLocation.y - ceil(height.ascent) + 1,
|
||||||
penLocation.x + cell.width * fFontWidth - 1,
|
penLocation.x + cell.width * fFontWidth - 1,
|
||||||
penLocation.y + height.descent + height.leading),
|
penLocation.y + ceil(height.descent) + ceil(height.leading)),
|
||||||
B_SOLID_LOW);
|
B_SOLID_LOW);
|
||||||
|
|
||||||
if (cell.chars[0] == 0) {
|
if (cell.chars[0] == 0) {
|
||||||
@ -308,11 +313,28 @@ TermView::_GetCell(VTermPos pos, VTermScreenCell& cell)
|
|||||||
void
|
void
|
||||||
TermView::_Damage(VTermRect rect)
|
TermView::_Damage(VTermRect rect)
|
||||||
{
|
{
|
||||||
// Invalidate();
|
|
||||||
Invalidate(_GlyphsToPixels(rect));
|
Invalidate(_GlyphsToPixels(rect));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
TermView::_MoveCursor(VTermPos pos, VTermPos oldPos, int visible)
|
||||||
|
{
|
||||||
|
VTermRect r;
|
||||||
|
r.start_row = pos.row;
|
||||||
|
r.start_col = pos.col;
|
||||||
|
r.end_col = pos.col + 1;
|
||||||
|
r.end_row = pos.row + 1;
|
||||||
|
Invalidate(_GlyphsToPixels(r));
|
||||||
|
|
||||||
|
r.start_row = oldPos.row;
|
||||||
|
r.start_col = oldPos.col;
|
||||||
|
r.end_col = oldPos.col + 1;
|
||||||
|
r.end_row = oldPos.row + 1;
|
||||||
|
Invalidate(_GlyphsToPixels(r));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TermView::_PushLine(int cols, const VTermScreenCell* cells)
|
TermView::_PushLine(int cols, const VTermScreenCell* cells)
|
||||||
{
|
{
|
||||||
@ -359,6 +381,16 @@ TermView::_Damage(VTermRect rect, void* user)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* static */ int
|
||||||
|
TermView::_MoveCursor(VTermPos pos, VTermPos oldPos, int visible, void* user)
|
||||||
|
{
|
||||||
|
TermView* view = (TermView*)user;
|
||||||
|
view->_MoveCursor(pos, oldPos, visible);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* static */ int
|
/* static */ int
|
||||||
TermView::_PushLine(int cols, const VTermScreenCell* cells, void* user)
|
TermView::_PushLine(int cols, const VTermScreenCell* cells, void* user)
|
||||||
{
|
{
|
||||||
@ -373,7 +405,7 @@ const
|
|||||||
VTermScreenCallbacks TermView::sScreenCallbacks = {
|
VTermScreenCallbacks TermView::sScreenCallbacks = {
|
||||||
&TermView::_Damage,
|
&TermView::_Damage,
|
||||||
/*.moverect =*/ NULL,
|
/*.moverect =*/ NULL,
|
||||||
/*.movecursor =*/ NULL,
|
&TermView::_MoveCursor,
|
||||||
/*.settermprop =*/ NULL,
|
/*.settermprop =*/ NULL,
|
||||||
/*.setmousefunc =*/ NULL,
|
/*.setmousefunc =*/ NULL,
|
||||||
/*.bell =*/ NULL,
|
/*.bell =*/ NULL,
|
||||||
|
@ -37,9 +37,13 @@ class TermView: public BView
|
|||||||
void _GetCell(VTermPos pos, VTermScreenCell& cell);
|
void _GetCell(VTermPos pos, VTermScreenCell& cell);
|
||||||
|
|
||||||
void _Damage(VTermRect rect);
|
void _Damage(VTermRect rect);
|
||||||
|
void _MoveCursor(VTermPos pos, VTermPos oldPos,
|
||||||
|
int visible);
|
||||||
void _PushLine(int cols, const VTermScreenCell* cells);
|
void _PushLine(int cols, const VTermScreenCell* cells);
|
||||||
|
|
||||||
static int _Damage(VTermRect rect, void* user);
|
static int _Damage(VTermRect rect, void* user);
|
||||||
|
static int _MoveCursor(VTermPos pos, VTermPos oldPos,
|
||||||
|
int visible, void* user);
|
||||||
static int _PushLine(int cols, const VTermScreenCell* cells,
|
static int _PushLine(int cols, const VTermScreenCell* cells,
|
||||||
void* user);
|
void* user);
|
||||||
static int _PopLine(int cols, const VTermScreenCell* cells,
|
static int _PopLine(int cols, const VTermScreenCell* cells,
|
||||||
|
Loading…
Reference in New Issue
Block a user