Terminal: handle color queries

this allows apps like vim to select a color scheme based on a dark or light background.

Change-Id: Ia9f98d2373523a8b5fa379225a1c906ae075edf7
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4693
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
This commit is contained in:
Jérôme Duval 2021-11-05 20:34:56 +01:00 committed by waddlesplash
parent fe3e5f05a1
commit f78b75b15d
6 changed files with 57 additions and 0 deletions

View File

@ -87,6 +87,7 @@ static const uint32 MSG_MOVE_TAB_LEFT = 'mvtl';
static const uint32 MSG_MOVE_TAB_RIGHT = 'mvtr'; static const uint32 MSG_MOVE_TAB_RIGHT = 'mvtr';
static const uint32 MSG_ACTIVATE_TERM = 'msat'; static const uint32 MSG_ACTIVATE_TERM = 'msat';
static const uint32 MSG_SET_CURSOR_STYLE = 'mscs'; static const uint32 MSG_SET_CURSOR_STYLE = 'mscs';
static const uint32 MSG_GET_TERMINAL_COLOR = 'getc';
// Preference Read/Write Keys // Preference Read/Write Keys

View File

@ -1571,6 +1571,10 @@ TermParse::_ProcessOperatingSystemControls(uchar* params)
{ {
int32 offset = mode - 10; int32 offset = mode - 10;
int32 count = 0; int32 count = 0;
if (strcmp((char*)params, "?") == 0) {
fBuffer->GetColor(mode);
break;
}
char* p = strtok((char*)params, ";"); char* p = strtok((char*)params, ";");
do { do {
if (gXColorsTable.LookUpColor(p, &colors[count]) != B_OK) { if (gXColorsTable.LookUpColor(p, &colors[count]) != B_OK) {

View File

@ -720,6 +720,30 @@ TermView::SetTermColor(uint index, rgb_color color, bool dynamic)
} }
status_t
TermView::GetTermColor(uint index, rgb_color* color)
{
if (color == NULL)
return B_BAD_VALUE;
switch (index) {
case 10:
*color = fTextForeColor;
break;
case 11:
*color = fTextBackColor;
break;
case 12:
*color = fCursorBackColor;
break;
default:
return B_BAD_VALUE;
break;
}
return B_OK;
}
int int
TermView::Encoding() const TermView::Encoding() const
{ {
@ -1833,6 +1857,21 @@ TermView::MessageReceived(BMessage *message)
} }
break; break;
} }
case MSG_GET_TERMINAL_COLOR:
{
uint8 index = 0;
if (message->FindUInt8("index", &index) != B_OK)
break;
rgb_color color;
status_t status = GetTermColor(index, &color);
if (status == B_OK) {
BString reply;
reply.SetToFormat("\033]%u;rgb:%02x/%02x/%02x\033\\",
index, color.red, color.green, color.blue);
fShell->Write(reply.String(), reply.Length());
}
break;
}
case MSG_SET_CURSOR_STYLE: case MSG_SET_CURSOR_STYLE:
{ {
int32 style = BLOCK_CURSOR; int32 style = BLOCK_CURSOR;

View File

@ -94,6 +94,7 @@ public:
void SetSelectColor(rgb_color fore, rgb_color back); void SetSelectColor(rgb_color fore, rgb_color back);
void SetTermColor(uint index, rgb_color color, void SetTermColor(uint index, rgb_color color,
bool dynamic = false); bool dynamic = false);
status_t GetTermColor(uint index, rgb_color* color);
int Encoding() const; int Encoding() const;
void SetEncoding(int encoding); void SetEncoding(int encoding);

View File

@ -228,6 +228,17 @@ TerminalBuffer::ResetColors(uint8* indexes, int32 count, bool dynamic)
} }
void
TerminalBuffer::GetColor(uint8 index)
{
if (fListenerValid) {
BMessage message(MSG_GET_TERMINAL_COLOR);
message.AddUInt8("index", index);
fListener.SendMessage(&message);
}
}
void void
TerminalBuffer::SetCursorStyle(int32 style, bool blinking) TerminalBuffer::SetCursorStyle(int32 style, bool blinking)
{ {

View File

@ -37,6 +37,7 @@ public:
int32 count = 1, bool dynamic = false); int32 count = 1, bool dynamic = false);
void ResetColors(uint8* indexes, void ResetColors(uint8* indexes,
int32 count = 1, bool dynamic = false); int32 count = 1, bool dynamic = false);
void GetColor(uint8 index);
void SetCursorStyle(int32 style, bool blinking); void SetCursorStyle(int32 style, bool blinking);
void SetCursorBlinking(bool blinking); void SetCursorBlinking(bool blinking);
void SetCursorHidden(bool hidden); void SetCursorHidden(bool hidden);