Change the way fore and back-color are handled by terminal. They are now color 0 and 7 in the color table, instead of entirely separate colors. This makes more sense and allows the colors to stay even in apps using other colors.
Also make the color attribute propagate to the end of a line. This fixes part of #6143 and allows to use vim with a multicolor syntax highlighting without too much trouble. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38316 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -69,6 +69,7 @@ TermParse::_NextParseChar()
|
|||||||
TermParse::TermParse(int fd)
|
TermParse::TermParse(int fd)
|
||||||
:
|
:
|
||||||
fFd(fd),
|
fFd(fd),
|
||||||
|
fAttr(FORECOLORED(7)),
|
||||||
fParseThread(-1),
|
fParseThread(-1),
|
||||||
fReaderThread(-1),
|
fReaderThread(-1),
|
||||||
fReaderSem(-1),
|
fReaderSem(-1),
|
||||||
@@ -341,7 +342,7 @@ TermParse::EscParse()
|
|||||||
int width = 1;
|
int width = 1;
|
||||||
BAutolock locker(fBuffer);
|
BAutolock locker(fBuffer);
|
||||||
|
|
||||||
fAttr = fSavedAttr = BACKCOLOR;
|
fAttr = fSavedAttr = FORECOLORED(7);
|
||||||
|
|
||||||
while (!fQuitting) {
|
while (!fQuitting) {
|
||||||
try {
|
try {
|
||||||
@@ -806,7 +807,7 @@ TermParse::EscParse()
|
|||||||
switch (param[row]) {
|
switch (param[row]) {
|
||||||
case DEFAULT:
|
case DEFAULT:
|
||||||
case 0: /* Reset attribute */
|
case 0: /* Reset attribute */
|
||||||
fAttr = 0;
|
fAttr = FORECOLORED(7);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: /* Bold */
|
case 1: /* Bold */
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
extern int function_keycode_table[];
|
extern int function_keycode_table[];
|
||||||
extern char *function_key_char_table[];
|
extern char *function_key_char_table[];
|
||||||
|
|
||||||
const static rgb_color kTermColorTable[256] = {
|
static rgb_color kTermColorTable[256] = {
|
||||||
{ 40, 40, 40, 0}, // black
|
{ 40, 40, 40, 0}, // black
|
||||||
{204, 0, 0, 0}, // red
|
{204, 0, 0, 0}, // red
|
||||||
{ 78, 154, 6, 0}, // green
|
{ 78, 154, 6, 0}, // green
|
||||||
@@ -548,8 +548,6 @@ TermView::_InitObject(int32 argc, const char** argv)
|
|||||||
fVisibleTextBuffer = NULL;
|
fVisibleTextBuffer = NULL;
|
||||||
fScrollBar = NULL;
|
fScrollBar = NULL;
|
||||||
fInline = NULL;
|
fInline = NULL;
|
||||||
fTextForeColor = kBlackColor;
|
|
||||||
fTextBackColor = kWhiteColor;
|
|
||||||
fCursorForeColor = kWhiteColor;
|
fCursorForeColor = kWhiteColor;
|
||||||
fCursorBackColor = kBlackColor;
|
fCursorBackColor = kBlackColor;
|
||||||
fSelectForeColor = kWhiteColor;
|
fSelectForeColor = kWhiteColor;
|
||||||
@@ -609,7 +607,7 @@ TermView::_InitObject(int32 argc, const char** argv)
|
|||||||
if (error < B_OK)
|
if (error < B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
SetLowColor(fTextBackColor);
|
SetLowColor(kTermColorTable[8]);
|
||||||
SetViewColor(B_TRANSPARENT_32_BIT);
|
SetViewColor(B_TRANSPARENT_32_BIT);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -836,10 +834,10 @@ TermView::GetTermSizeFromRect(const BRect &rect, int *_rows,
|
|||||||
void
|
void
|
||||||
TermView::SetTextColor(rgb_color fore, rgb_color back)
|
TermView::SetTextColor(rgb_color fore, rgb_color back)
|
||||||
{
|
{
|
||||||
fTextForeColor = fore;
|
kTermColorTable[0] = back;
|
||||||
fTextBackColor = back;
|
kTermColorTable[7] = fore;
|
||||||
|
|
||||||
SetLowColor(fTextBackColor);
|
SetLowColor(back);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1103,7 +1101,7 @@ void
|
|||||||
TermView::_DrawLinePart(int32 x1, int32 y1, uint32 attr, char *buf,
|
TermView::_DrawLinePart(int32 x1, int32 y1, uint32 attr, char *buf,
|
||||||
int32 width, bool mouse, bool cursor, BView *inView)
|
int32 width, bool mouse, bool cursor, BView *inView)
|
||||||
{
|
{
|
||||||
rgb_color rgb_fore = fTextForeColor, rgb_back = fTextBackColor;
|
rgb_color rgb_fore, rgb_back;
|
||||||
|
|
||||||
inView->SetFont(&fHalfFont);
|
inView->SetFont(&fHalfFont);
|
||||||
|
|
||||||
@@ -1115,10 +1113,10 @@ TermView::_DrawLinePart(int32 x1, int32 y1, uint32 attr, char *buf,
|
|||||||
int forecolor = IS_FORECOLOR(attr);
|
int forecolor = IS_FORECOLOR(attr);
|
||||||
int backcolor = IS_BACKCOLOR(attr);
|
int backcolor = IS_BACKCOLOR(attr);
|
||||||
|
|
||||||
if (IS_FORESET(attr))
|
// if (IS_FORESET(attr))
|
||||||
rgb_fore = kTermColorTable[forecolor];
|
rgb_fore = kTermColorTable[forecolor];
|
||||||
|
|
||||||
if (IS_BACKSET(attr))
|
// if (IS_BACKSET(attr))
|
||||||
rgb_back = kTermColorTable[backcolor];
|
rgb_back = kTermColorTable[backcolor];
|
||||||
|
|
||||||
// Selection check.
|
// Selection check.
|
||||||
@@ -1201,7 +1199,7 @@ TermView::_DrawCursor()
|
|||||||
if (selected)
|
if (selected)
|
||||||
SetHighColor(fSelectBackColor);
|
SetHighColor(fSelectBackColor);
|
||||||
else
|
else
|
||||||
SetHighColor(cursorVisible ? fCursorBackColor : fTextBackColor);
|
SetHighColor(cursorVisible ? fCursorBackColor : kTermColorTable[IS_BACKCOLOR(attr)]);
|
||||||
|
|
||||||
FillRect(rect);
|
FillRect(rect);
|
||||||
}
|
}
|
||||||
@@ -1339,27 +1337,6 @@ TermView::DetachedFromWindow()
|
|||||||
void
|
void
|
||||||
TermView::Draw(BRect updateRect)
|
TermView::Draw(BRect updateRect)
|
||||||
{
|
{
|
||||||
// if (IsPrinting()) {
|
|
||||||
// _DoPrint(updateRect);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// debug_printf("TermView::Draw((%f, %f) - (%f, %f))\n", updateRect.left,
|
|
||||||
// updateRect.top, updateRect.right, updateRect.bottom);
|
|
||||||
// {
|
|
||||||
// BRect bounds(Bounds());
|
|
||||||
// debug_printf("Bounds(): (%f, %f) - (%f - %f)\n", bounds.left, bounds.top,
|
|
||||||
// bounds.right, bounds.bottom);
|
|
||||||
// debug_printf("clipping region:\n");
|
|
||||||
// BRegion region;
|
|
||||||
// GetClippingRegion(®ion);
|
|
||||||
// for (int32 i = 0; i < region.CountRects(); i++) {
|
|
||||||
// BRect rect(region.RectAt(i));
|
|
||||||
// debug_printf(" (%f, %f) - (%f, %f)\n", rect.left, rect.top, rect.right,
|
|
||||||
// rect.bottom);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
int32 x1 = (int32)updateRect.left / fFontWidth;
|
int32 x1 = (int32)updateRect.left / fFontWidth;
|
||||||
int32 x2 = std::min((int)updateRect.right / fFontWidth, fColumns - 1);
|
int32 x2 = std::min((int)updateRect.right / fFontWidth, fColumns - 1);
|
||||||
|
|
||||||
@@ -1367,33 +1344,10 @@ TermView::Draw(BRect updateRect)
|
|||||||
int32 y1 = _LineAt(updateRect.top);
|
int32 y1 = _LineAt(updateRect.top);
|
||||||
int32 y2 = std::min(_LineAt(updateRect.bottom), (int32)fRows - 1);
|
int32 y2 = std::min(_LineAt(updateRect.bottom), (int32)fRows - 1);
|
||||||
|
|
||||||
//debug_printf("TermView::Draw(): (%ld, %ld) - (%ld, %ld), top: %f, fontHeight: %d, scrollOffset: %f\n",
|
|
||||||
//x1, y1, x2, y2, updateRect.top, fFontHeight, fScrollOffset);
|
|
||||||
|
|
||||||
// clear the area to the right of the line ends
|
|
||||||
if (y1 <= y2) {
|
|
||||||
float clearLeft = fColumns * fFontWidth;
|
|
||||||
if (clearLeft <= updateRect.right) {
|
|
||||||
BRect rect(clearLeft, updateRect.top, updateRect.right,
|
|
||||||
updateRect.bottom);
|
|
||||||
SetHighColor(fTextBackColor);
|
|
||||||
FillRect(rect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear the area below the last line
|
|
||||||
if (y2 == fRows - 1) {
|
|
||||||
float clearTop = _LineOffset(fRows);
|
|
||||||
if (clearTop <= updateRect.bottom) {
|
|
||||||
BRect rect(updateRect.left, clearTop, updateRect.right,
|
|
||||||
updateRect.bottom);
|
|
||||||
SetHighColor(fTextBackColor);
|
|
||||||
FillRect(rect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw the affected line parts
|
// draw the affected line parts
|
||||||
if (x1 <= x2) {
|
if (x1 <= x2) {
|
||||||
|
uint32 attr = 0;
|
||||||
|
|
||||||
for (int32 j = y1; j <= y2; j++) {
|
for (int32 j = y1; j <= y2; j++) {
|
||||||
int32 k = x1;
|
int32 k = x1;
|
||||||
char buf[fColumns * 4 + 1];
|
char buf[fColumns * 4 + 1];
|
||||||
@@ -1404,23 +1358,29 @@ TermView::Draw(BRect updateRect)
|
|||||||
if (k < 0)
|
if (k < 0)
|
||||||
k = 0;
|
k = 0;
|
||||||
|
|
||||||
for (int32 i = k; i <= x2;) {
|
int32 lastColumn = (int)updateRect.right / fFontWidth;
|
||||||
int32 lastColumn = x2;
|
for (int32 i = k; i <= lastColumn;) {
|
||||||
bool insideSelection = _CheckSelectedRegion(j, i, lastColumn);
|
bool insideSelection = _CheckSelectedRegion(j, i, lastColumn);
|
||||||
uint32 attr;
|
|
||||||
int32 count = fVisibleTextBuffer->GetString(j - firstVisible, i,
|
int32 count = fVisibleTextBuffer->GetString(j - firstVisible, i,
|
||||||
lastColumn, buf, attr);
|
lastColumn, buf, attr);
|
||||||
|
|
||||||
//debug_printf(" fVisibleTextBuffer->GetString(%ld, %ld, %ld) -> (%ld, \"%.*s\"), selected: %d\n",
|
// debug_printf(" fVisibleTextBuffer->GetString(%ld, %ld, %ld) -> (%ld, \"%.*s\"), selected: %d\n",
|
||||||
//j - firstVisible, i, lastColumn, count, (int)count, buf, insideSelection);
|
// j - firstVisible, i, lastColumn, count, (int)count, buf, insideSelection);
|
||||||
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
BRect rect(fFontWidth * i, _LineOffset(j),
|
BRect rect(fFontWidth * i, _LineOffset(j),
|
||||||
fFontWidth * (lastColumn + 1) - 1, 0);
|
fFontWidth * (lastColumn + 1) - 1, 0);
|
||||||
rect.bottom = rect.top + fFontHeight - 1;
|
rect.bottom = rect.top + fFontHeight - 1;
|
||||||
|
|
||||||
|
int t = 1;
|
||||||
|
while(count == 0 && i - t > 0) {
|
||||||
|
count = fVisibleTextBuffer->GetString(j - firstVisible, i - t,
|
||||||
|
lastColumn, buf, attr);
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
|
||||||
SetHighColor(insideSelection ? fSelectBackColor
|
SetHighColor(insideSelection ? fSelectBackColor
|
||||||
: fTextBackColor);
|
: kTermColorTable[IS_BACKCOLOR(attr)]);
|
||||||
FillRect(rect);
|
FillRect(rect);
|
||||||
|
|
||||||
i = lastColumn + 1;
|
i = lastColumn + 1;
|
||||||
|
|||||||
@@ -238,8 +238,6 @@ private:
|
|||||||
InlineInput* fInline;
|
InlineInput* fInline;
|
||||||
|
|
||||||
// Color and Attribute.
|
// Color and Attribute.
|
||||||
rgb_color fTextForeColor;
|
|
||||||
rgb_color fTextBackColor;
|
|
||||||
rgb_color fCursorForeColor;
|
rgb_color fCursorForeColor;
|
||||||
rgb_color fCursorBackColor;
|
rgb_color fCursorBackColor;
|
||||||
rgb_color fSelectForeColor;
|
rgb_color fSelectForeColor;
|
||||||
|
|||||||
Reference in New Issue
Block a user