mirror of https://github.com/cy384/ssheven.git
initial color implementation
This commit is contained in:
parent
4e8bad7acc
commit
50c83ab0a4
|
@ -5,6 +5,7 @@
|
||||||
* See LICENSE file for details
|
* See LICENSE file for details
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "ssheven.h"
|
||||||
#include "ssheven-console.h"
|
#include "ssheven-console.h"
|
||||||
|
|
||||||
char key_to_vterm[256] = { VTERM_KEY_NONE };
|
char key_to_vterm[256] = { VTERM_KEY_NONE };
|
||||||
|
@ -69,45 +70,107 @@ void check_cursor(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert vterm's ANSI color indexes into Quickdraw colors
|
||||||
|
inline int idx2qd(VTermColor c)
|
||||||
|
{
|
||||||
|
switch (c.indexed.idx)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return blackColor;
|
||||||
|
case 1:
|
||||||
|
return redColor;
|
||||||
|
case 2:
|
||||||
|
return greenColor;
|
||||||
|
case 3:
|
||||||
|
return yellowColor;
|
||||||
|
case 4:
|
||||||
|
return blueColor;
|
||||||
|
case 5:
|
||||||
|
return magentaColor;
|
||||||
|
case 6:
|
||||||
|
return cyanColor;
|
||||||
|
case 7:
|
||||||
|
return whiteColor;
|
||||||
|
case 8:
|
||||||
|
return blackColor;
|
||||||
|
case 9:
|
||||||
|
return redColor;
|
||||||
|
case 10:
|
||||||
|
return greenColor;
|
||||||
|
case 11:
|
||||||
|
return yellowColor;
|
||||||
|
case 12:
|
||||||
|
return blueColor;
|
||||||
|
case 13:
|
||||||
|
return magentaColor;
|
||||||
|
case 14:
|
||||||
|
return cyanColor;
|
||||||
|
case 15:
|
||||||
|
return whiteColor;
|
||||||
|
default:
|
||||||
|
return blackColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// closely inspired by the retro68 console library
|
// closely inspired by the retro68 console library
|
||||||
void draw_screen(Rect* r)
|
void draw_screen(Rect* r)
|
||||||
{
|
{
|
||||||
// get the intersection of our console region and the update region
|
// get the intersection of our console region and the update region
|
||||||
Rect bounds = (con.win->portRect);
|
//Rect bounds = (con.win->portRect);
|
||||||
SectRect(r, &bounds, r);
|
//SectRect(r, &bounds, r);
|
||||||
|
|
||||||
short minRow = (0 > (r->top - bounds.top) / con.cell_height) ? 0 : (r->top - bounds.top) / con.cell_height;
|
// right now we only call this function to redraw the entire screen
|
||||||
short maxRow = (con.size_y < (r->bottom - bounds.top + con.cell_height - 1) / con.cell_height) ? con.size_y : (r->bottom - bounds.top + con.cell_height - 1) / con.cell_height;
|
// so we don't need this (yet)
|
||||||
|
//short minRow = (0 > (r->top - bounds.top) / con.cell_height) ? 0 : (r->top - bounds.top) / con.cell_height;
|
||||||
|
//short maxRow = (con.size_y < (r->bottom - bounds.top + con.cell_height - 1) / con.cell_height) ? con.size_y : (r->bottom - bounds.top + con.cell_height - 1) / con.cell_height;
|
||||||
|
|
||||||
short minCol = (0 > (r->left - bounds.left) / con.cell_width) ? 0 : (r->left - bounds.left) / con.cell_width;
|
//short minCol = (0 > (r->left - bounds.left) / con.cell_width) ? 0 : (r->left - bounds.left) / con.cell_width;
|
||||||
short maxCol = (con.size_x < (r->right - bounds.left + con.cell_width - 1) / con.cell_width) ? con.size_x : (r->right - bounds.left + con.cell_width - 1) / con.cell_width;
|
//short maxCol = (con.size_x < (r->right - bounds.left + con.cell_width - 1) / con.cell_width) ? con.size_x : (r->right - bounds.left + con.cell_width - 1) / con.cell_width;
|
||||||
|
|
||||||
EraseRect(r);
|
short minRow = 0;
|
||||||
|
short maxRow = con.size_y;
|
||||||
|
short minCol = 0;
|
||||||
|
short maxCol = con.size_x;
|
||||||
|
|
||||||
// don't clobber font settings
|
// don't clobber font settings
|
||||||
short save_font = qd.thePort->txFont;
|
short save_font = qd.thePort->txFont;
|
||||||
short save_font_size = qd.thePort->txSize;
|
short save_font_size = qd.thePort->txSize;
|
||||||
short save_font_face = qd.thePort->txFace;
|
short save_font_face = qd.thePort->txFace;
|
||||||
|
short save_font_fg = qd.thePort->fgColor;
|
||||||
|
short save_font_bg = qd.thePort->bkColor;
|
||||||
|
|
||||||
|
TextFont(kFontIDMonaco);
|
||||||
|
TextSize(9);
|
||||||
|
TextFace(normal);
|
||||||
|
qd.thePort->bkColor = whiteColor;
|
||||||
|
qd.thePort->fgColor = blackColor;
|
||||||
|
|
||||||
|
EraseRect(r);
|
||||||
|
|
||||||
TextFont(kFontIDMonaco);
|
TextFont(kFontIDMonaco);
|
||||||
TextSize(9);
|
TextSize(9);
|
||||||
TextFace(normal);
|
TextFace(normal);
|
||||||
|
|
||||||
short face = normal;
|
short face = normal;
|
||||||
char c;
|
|
||||||
Rect cr;
|
Rect cr;
|
||||||
|
|
||||||
ScreenCell* vtsc = NULL;
|
ScreenCell* vtsc = NULL;
|
||||||
VTermPos pos = {.row = 0, .col = 0};
|
VTermPos pos = {.row = 0, .col = 0};
|
||||||
|
|
||||||
for(int i = minRow; i < maxRow; i++)
|
for(pos.row = minRow; pos.row < maxRow; pos.row++)
|
||||||
{
|
{
|
||||||
for (int j = minCol; j < maxCol; j++)
|
for (pos.col = minCol; pos.col < maxCol; pos.col++)
|
||||||
{
|
{
|
||||||
pos.row = i;
|
|
||||||
pos.col = j;
|
|
||||||
vtsc = vterm_screen_unsafe_get_cell(con.vts, pos);
|
vtsc = vterm_screen_unsafe_get_cell(con.vts, pos);
|
||||||
c = (char)vtsc->chars[0];
|
|
||||||
|
qd.thePort->fgColor = idx2qd(vtsc->pen.fg);
|
||||||
|
qd.thePort->bkColor = idx2qd(vtsc->pen.bg);
|
||||||
|
|
||||||
|
if (qd.thePort->bkColor != whiteColor)
|
||||||
|
{
|
||||||
|
cr = cell_rect(pos.col, pos.row, *r);
|
||||||
|
EraseRect(&cr);
|
||||||
|
}
|
||||||
|
|
||||||
face = normal;
|
face = normal;
|
||||||
if (vtsc->pen.bold) face |= (condense|bold);
|
if (vtsc->pen.bold) face |= (condense|bold);
|
||||||
|
@ -115,12 +178,12 @@ void draw_screen(Rect* r)
|
||||||
if (vtsc->pen.underline) face |= underline;
|
if (vtsc->pen.underline) face |= underline;
|
||||||
|
|
||||||
if (face != normal) TextFace(face);
|
if (face != normal) TextFace(face);
|
||||||
draw_char(j, i, r, c);
|
draw_char(pos.col, pos.row, r, (char)vtsc->chars[0]);
|
||||||
if (face != normal) TextFace(normal);
|
if (face != normal) TextFace(normal);
|
||||||
|
|
||||||
if (vtsc->pen.reverse)
|
if (vtsc->pen.reverse)
|
||||||
{
|
{
|
||||||
cr = cell_rect(j,i,con.win->portRect);
|
cr = cell_rect(pos.col, pos.row, *r);
|
||||||
InvertRect(&cr);
|
InvertRect(&cr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,11 +191,7 @@ void draw_screen(Rect* r)
|
||||||
|
|
||||||
// do the cursor if needed
|
// do the cursor if needed
|
||||||
if (con.cursor_state == 1 &&
|
if (con.cursor_state == 1 &&
|
||||||
con.cursor_visible == 1 &&
|
con.cursor_visible == 1)
|
||||||
con.cursor_y >= minRow &&
|
|
||||||
con.cursor_y <= maxRow &&
|
|
||||||
con.cursor_x >= minCol &&
|
|
||||||
con.cursor_x <= maxCol)
|
|
||||||
{
|
{
|
||||||
Rect cursor = cell_rect(con.cursor_x, con.cursor_y, con.win->portRect);
|
Rect cursor = cell_rect(con.cursor_x, con.cursor_y, con.win->portRect);
|
||||||
InvertRect(&cursor);
|
InvertRect(&cursor);
|
||||||
|
@ -141,6 +200,8 @@ void draw_screen(Rect* r)
|
||||||
TextFont(save_font);
|
TextFont(save_font);
|
||||||
TextSize(save_font_size);
|
TextSize(save_font_size);
|
||||||
TextFace(save_font_face);
|
TextFace(save_font_face);
|
||||||
|
qd.thePort->fgColor = save_font_fg;
|
||||||
|
qd.thePort->bkColor = save_font_bg;
|
||||||
|
|
||||||
// draw the grow icon in the bottom right corner, but not the scroll bars
|
// draw the grow icon in the bottom right corner, but not the scroll bars
|
||||||
// yes, this is really awkward
|
// yes, this is really awkward
|
||||||
|
@ -381,6 +442,14 @@ void console_setup(void)
|
||||||
VTermState* vtermstate = vterm_obtain_state(con.vterm);
|
VTermState* vtermstate = vterm_obtain_state(con.vterm);
|
||||||
vterm_state_reset(vtermstate, 1);
|
vterm_state_reset(vtermstate, 1);
|
||||||
|
|
||||||
|
VTermColor fg = { .type = VTERM_COLOR_INDEXED };
|
||||||
|
fg.indexed.idx = 0; // ANSI black
|
||||||
|
|
||||||
|
VTermColor bg = { .type = VTERM_COLOR_INDEXED };
|
||||||
|
bg.indexed.idx = 7; // ANSI white
|
||||||
|
|
||||||
|
vterm_state_set_default_colors(vtermstate, &fg, &bg);
|
||||||
|
|
||||||
vterm_output_set_callback(con.vterm, output_callback, NULL);
|
vterm_output_set_callback(con.vterm, output_callback, NULL);
|
||||||
|
|
||||||
con.vts = vterm_obtain_screen(con.vterm);
|
con.vts = vterm_obtain_screen(con.vterm);
|
||||||
|
|
|
@ -22,12 +22,15 @@
|
||||||
/* size in bytes for recv and send thread buffers */
|
/* size in bytes for recv and send thread buffers */
|
||||||
#define SSHEVEN_BUFFER_SIZE 4096
|
#define SSHEVEN_BUFFER_SIZE 4096
|
||||||
|
|
||||||
/* terminal type to send over ssh, determines features etc. some good options:
|
/*
|
||||||
|
* terminal type to send over ssh, determines features etc. some good options:
|
||||||
* "vanilla" supports basically nothing
|
* "vanilla" supports basically nothing
|
||||||
* "vt100" just the basics
|
* "vt100" just the basics
|
||||||
* "xterm" everything
|
* "xterm" everything
|
||||||
* "xterm-mono" everything but color */
|
* "xterm-mono" everything except color
|
||||||
#define SSHEVEN_TERMINAL_TYPE "xterm-mono"
|
* "xterm-16color" classic 16 ANSI colors only
|
||||||
|
*/
|
||||||
|
#define SSHEVEN_TERMINAL_TYPE "xterm-16color"
|
||||||
|
|
||||||
/* dialog for getting connection info */
|
/* dialog for getting connection info */
|
||||||
#define DLOG_CONNECT 128
|
#define DLOG_CONNECT 128
|
||||||
|
|
Loading…
Reference in New Issue