* fhandler.h (class fhandler_console): Make all variables that
describe "state" of console to be members of fhandler_console. default_color is now the color which is set when console recieves reset command. * fhandler_console.cc (fhandler_console::fhandler_console): Turn mouse handling and raw keyboard mode off by default. Initialize state information. * fhandler.cc (fhandler_console::set_raw_win32_keyboard_mode): New function. * fhandler_console.cc (fhandler_console::set_default_attr): New function. Reset console attributes to default values. * fhandler_console.cc (fhandler_console::open): Reset attributes. * fhandler_console.cc (fhandler_console::get_win32_attr): New function. Calculate win32-style console attribute based on terminal attributes. * fhandler_console.cc (fhandler_console::set_cursor_maybe): Use member variable. * fhandler_console.cc (fhandler_console::read): If in raw-win32 keyboard mode, encode win32 keyboard events in \033{x;y;z;t;u;wK sequences. * fhandler_console.cc (fhandler_console::dup): Copy all state information to the dup()ed handle. * fhandler_console.cc (fhandler_console::scroll_screen): Use current fill-in attribute. * fhandler_console.cc (fhandler_console::clear_screen): Ditto. * fhandler_console.cc (fhandler_console::char_command): Check if we saw '?' symbol by member variable. Set terminal attributes on \033[Xm commands. \033[24m - turn off underline mode, \033[27m - turn off reverse mode, \033[39m - restore default foreground color. \033[49m - restore default background color. \033[2000h - turn on raw keyboard mode, \033[2000l - turn off raw keyboard mode. * fhandler_console.cc (fhandler_console::write): Set attribues to default values on reset command.
This commit is contained in:
parent
5b331f1ef1
commit
a53136cc46
|
@ -1,3 +1,38 @@
|
||||||
|
2001-02-27 Egor Duda <deo@logos-m.ru>
|
||||||
|
|
||||||
|
* fhandler.h (class fhandler_console): Make all variables that
|
||||||
|
describe "state" of console to be members of fhandler_console.
|
||||||
|
default_color is now the color which is set when console recieves
|
||||||
|
reset command.
|
||||||
|
* fhandler_console.cc (fhandler_console::fhandler_console): Turn
|
||||||
|
mouse handling and raw keyboard mode off by default. Initialize
|
||||||
|
state information.
|
||||||
|
* fhandler.cc (fhandler_console::set_raw_win32_keyboard_mode): New
|
||||||
|
function.
|
||||||
|
* fhandler_console.cc (fhandler_console::set_default_attr): New
|
||||||
|
function. Reset console attributes to default values.
|
||||||
|
* fhandler_console.cc (fhandler_console::open): Reset attributes.
|
||||||
|
* fhandler_console.cc (fhandler_console::get_win32_attr): New function.
|
||||||
|
Calculate win32-style console attribute based on terminal attributes.
|
||||||
|
* fhandler_console.cc (fhandler_console::set_cursor_maybe): Use
|
||||||
|
member variable.
|
||||||
|
* fhandler_console.cc (fhandler_console::read): If in raw-win32
|
||||||
|
keyboard mode, encode win32 keyboard events in \033{x;y;z;t;u;wK
|
||||||
|
sequences.
|
||||||
|
* fhandler_console.cc (fhandler_console::dup): Copy all state
|
||||||
|
information to the dup()ed handle.
|
||||||
|
* fhandler_console.cc (fhandler_console::scroll_screen): Use current
|
||||||
|
fill-in attribute.
|
||||||
|
* fhandler_console.cc (fhandler_console::clear_screen): Ditto.
|
||||||
|
* fhandler_console.cc (fhandler_console::char_command): Check if we
|
||||||
|
saw '?' symbol by member variable. Set terminal attributes on \033[Xm
|
||||||
|
commands. \033[24m - turn off underline mode, \033[27m - turn off
|
||||||
|
reverse mode, \033[39m - restore default foreground color.
|
||||||
|
\033[49m - restore default background color. \033[2000h - turn on raw
|
||||||
|
keyboard mode, \033[2000l - turn off raw keyboard mode.
|
||||||
|
* fhandler_console.cc (fhandler_console::write): Set attribues to
|
||||||
|
default values on reset command.
|
||||||
|
|
||||||
2001-02-26 Mike Simons <msimons@moria.simons-clan.com>
|
2001-02-26 Mike Simons <msimons@moria.simons-clan.com>
|
||||||
|
|
||||||
* times.cc (settimeofday): Replace function stub with working code.
|
* times.cc (settimeofday): Replace function stub with working code.
|
||||||
|
|
|
@ -575,14 +575,14 @@ public:
|
||||||
virtual void __release_output_mutex (const char *fn, int ln) {}
|
virtual void __release_output_mutex (const char *fn, int ln) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This is a input and output console handle */
|
enum ansi_intensity
|
||||||
class fhandler_console: public fhandler_termios
|
|
||||||
{
|
{
|
||||||
private:
|
INTENSITY_INVISIBLE,
|
||||||
|
INTENSITY_DIM,
|
||||||
|
INTENSITY_NORMAL,
|
||||||
|
INTENSITY_BOLD
|
||||||
|
};
|
||||||
|
|
||||||
/* Output state */
|
|
||||||
|
|
||||||
// enum {normal, gotesc, gotsquare, gotarg1, gotcommand} state;
|
|
||||||
#define normal 1
|
#define normal 1
|
||||||
#define gotesc 2
|
#define gotesc 2
|
||||||
#define gotsquare 3
|
#define gotsquare 3
|
||||||
|
@ -592,13 +592,55 @@ private:
|
||||||
#define gettitle 7
|
#define gettitle 7
|
||||||
#define eattitle 8
|
#define eattitle 8
|
||||||
#define MAXARGS 10
|
#define MAXARGS 10
|
||||||
|
|
||||||
|
/* This is a input and output console handle */
|
||||||
|
class fhandler_console: public fhandler_termios
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
WORD default_color, underline_color, dim_color;
|
||||||
|
|
||||||
|
/* Output state */
|
||||||
int state_;
|
int state_;
|
||||||
int args_[MAXARGS];
|
int args_[MAXARGS];
|
||||||
int nargs_;
|
int nargs_;
|
||||||
|
unsigned rarg;
|
||||||
|
BOOL saw_question_mark;
|
||||||
|
|
||||||
DWORD default_color;
|
char my_title_buf [TITLESIZE + 1];
|
||||||
|
|
||||||
|
WORD current_win32_attr;
|
||||||
|
ansi_intensity intensity;
|
||||||
|
BOOL underline, blink, reverse;
|
||||||
|
WORD fg, bg;
|
||||||
|
|
||||||
|
/* saved cursor coordinates */
|
||||||
|
int savex, savey;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
short Top, Bottom;
|
||||||
|
} scroll_region;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
SHORT winTop;
|
||||||
|
SHORT winBottom;
|
||||||
|
COORD dwWinSize;
|
||||||
|
COORD dwBufferSize;
|
||||||
|
COORD dwCursorPosition;
|
||||||
|
WORD wAttributes;
|
||||||
|
} info;
|
||||||
|
|
||||||
|
COORD dwLastCursorPosition;
|
||||||
|
DWORD dwLastButtonState;
|
||||||
|
int nModifiers;
|
||||||
|
|
||||||
|
BOOL use_mouse;
|
||||||
|
BOOL raw_win32_keyboard_mode;
|
||||||
|
|
||||||
/* Output calls */
|
/* Output calls */
|
||||||
|
void set_default_attr ();
|
||||||
|
WORD get_win32_attr ();
|
||||||
|
|
||||||
BOOL fillin_info ();
|
BOOL fillin_info ();
|
||||||
void clear_screen (int, int, int, int);
|
void clear_screen (int, int, int, int);
|
||||||
|
@ -607,7 +649,8 @@ private:
|
||||||
void cursor_get (int *, int *);
|
void cursor_get (int *, int *);
|
||||||
void cursor_rel (int, int);
|
void cursor_rel (int, int);
|
||||||
const unsigned char * write_normal (unsigned const char*, unsigned const char *);
|
const unsigned char * write_normal (unsigned const char*, unsigned const char *);
|
||||||
void char_command (char, bool);
|
void char_command (char);
|
||||||
|
BOOL set_raw_win32_keyboard_mode (BOOL);
|
||||||
int output_tcsetattr (int a, const struct termios *t);
|
int output_tcsetattr (int a, const struct termios *t);
|
||||||
|
|
||||||
/* Input calls */
|
/* Input calls */
|
||||||
|
|
|
@ -36,10 +36,6 @@ details. */
|
||||||
* xn, yn - new ul corner
|
* xn, yn - new ul corner
|
||||||
* Negative values represents current screen dimensions
|
* Negative values represents current screen dimensions
|
||||||
*/
|
*/
|
||||||
static struct
|
|
||||||
{
|
|
||||||
short Top, Bottom;
|
|
||||||
} scroll_region = {0, -1};
|
|
||||||
|
|
||||||
#define srTop (info.winTop + scroll_region.Top)
|
#define srTop (info.winTop + scroll_region.Top)
|
||||||
#define srBottom ((scroll_region.Bottom < 0) ? info.winBottom : info.winTop + scroll_region.Bottom)
|
#define srBottom ((scroll_region.Bottom < 0) ? info.winBottom : info.winTop + scroll_region.Bottom)
|
||||||
|
@ -48,8 +44,6 @@ static struct
|
||||||
|
|
||||||
const char * get_nonascii_key (INPUT_RECORD&, char *);
|
const char * get_nonascii_key (INPUT_RECORD&, char *);
|
||||||
|
|
||||||
static BOOL use_mouse = FALSE;
|
|
||||||
|
|
||||||
static tty_min NO_COPY *shared_console_info = NULL;
|
static tty_min NO_COPY *shared_console_info = NULL;
|
||||||
|
|
||||||
/* Allocate and initialize the shared record for the current console.
|
/* Allocate and initialize the shared record for the current console.
|
||||||
|
@ -116,20 +110,28 @@ set_console_state_for_spawn ()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
fhandler_console::set_raw_win32_keyboard_mode (BOOL new_mode)
|
||||||
|
{
|
||||||
|
BOOL old_mode = raw_win32_keyboard_mode;
|
||||||
|
raw_win32_keyboard_mode = new_mode;
|
||||||
|
syscall_printf ("raw keyboard mode %sabled", raw_win32_keyboard_mode ? "en" : "dis");
|
||||||
|
return old_mode;
|
||||||
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
fhandler_console::set_cursor_maybe ()
|
fhandler_console::set_cursor_maybe ()
|
||||||
{
|
{
|
||||||
CONSOLE_SCREEN_BUFFER_INFO now;
|
CONSOLE_SCREEN_BUFFER_INFO now;
|
||||||
static CONSOLE_SCREEN_BUFFER_INFO last = {{0, 0}, {-1, -1}, 0, {0, 0}, {0, 0}};
|
|
||||||
|
|
||||||
if (!GetConsoleScreenBufferInfo (get_output_handle(), &now))
|
if (!GetConsoleScreenBufferInfo (get_output_handle(), &now))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (last.dwCursorPosition.X != now.dwCursorPosition.X ||
|
if (dwLastCursorPosition.X != now.dwCursorPosition.X ||
|
||||||
last.dwCursorPosition.Y != now.dwCursorPosition.Y)
|
dwLastCursorPosition.Y != now.dwCursorPosition.Y)
|
||||||
{
|
{
|
||||||
SetConsoleCursorPosition (get_output_handle (), now.dwCursorPosition);
|
SetConsoleCursorPosition (get_output_handle (), now.dwCursorPosition);
|
||||||
last.dwCursorPosition = now.dwCursorPosition;
|
dwLastCursorPosition = now.dwCursorPosition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +155,7 @@ fhandler_console::read (void *pv, size_t buflen)
|
||||||
|
|
||||||
HANDLE w4[2];
|
HANDLE w4[2];
|
||||||
DWORD nwait;
|
DWORD nwait;
|
||||||
char tmp[17];
|
char tmp[60];
|
||||||
|
|
||||||
w4[0] = h;
|
w4[0] = h;
|
||||||
if (iscygthread ())
|
if (iscygthread ())
|
||||||
|
@ -198,6 +200,35 @@ fhandler_console::read (void *pv, size_t buflen)
|
||||||
switch (input_rec.EventType)
|
switch (input_rec.EventType)
|
||||||
{
|
{
|
||||||
case KEY_EVENT:
|
case KEY_EVENT:
|
||||||
|
#define virtual_key_code (input_rec.Event.KeyEvent.wVirtualKeyCode)
|
||||||
|
#define control_key_state (input_rec.Event.KeyEvent.dwControlKeyState)
|
||||||
|
|
||||||
|
#ifdef DEBUGGING
|
||||||
|
/* allow manual switching to/from raw mode via ctrl-alt-scrolllock */
|
||||||
|
if (input_rec.Event.KeyEvent.bKeyDown &&
|
||||||
|
virtual_key_code == VK_SCROLL &&
|
||||||
|
control_key_state & (LEFT_ALT_PRESSED | LEFT_CTRL_PRESSED) == LEFT_ALT_PRESSED | LEFT_CTRL_PRESSED
|
||||||
|
)
|
||||||
|
{
|
||||||
|
set_raw_win32_keyboard_mode ( !raw_win32_keyboard_mode );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (raw_win32_keyboard_mode)
|
||||||
|
{
|
||||||
|
__small_sprintf(tmp, "\033{%u;%u;%u;%u;%u;%luK",
|
||||||
|
input_rec.Event.KeyEvent.bKeyDown,
|
||||||
|
input_rec.Event.KeyEvent.wRepeatCount,
|
||||||
|
input_rec.Event.KeyEvent.wVirtualKeyCode,
|
||||||
|
input_rec.Event.KeyEvent.wVirtualScanCode,
|
||||||
|
input_rec.Event.KeyEvent.uChar.UnicodeChar,
|
||||||
|
input_rec.Event.KeyEvent.dwControlKeyState );
|
||||||
|
toadd = tmp;
|
||||||
|
nread = strlen (toadd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!input_rec.Event.KeyEvent.bKeyDown)
|
if (!input_rec.Event.KeyEvent.bKeyDown)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -265,7 +296,6 @@ fhandler_console::read (void *pv, size_t buflen)
|
||||||
|
|
||||||
/* This code assumes Windows never reports multiple button
|
/* This code assumes Windows never reports multiple button
|
||||||
events at the same time. */
|
events at the same time. */
|
||||||
static DWORD dwLastButtonState = 0;
|
|
||||||
int b = 0;
|
int b = 0;
|
||||||
char sz[32];
|
char sz[32];
|
||||||
if (mouse_event.dwButtonState == dwLastButtonState)
|
if (mouse_event.dwButtonState == dwLastButtonState)
|
||||||
|
@ -297,7 +327,6 @@ fhandler_console::read (void *pv, size_t buflen)
|
||||||
/* Remember the current button state */
|
/* Remember the current button state */
|
||||||
dwLastButtonState = mouse_event.dwButtonState;
|
dwLastButtonState = mouse_event.dwButtonState;
|
||||||
|
|
||||||
static int nModifiers = 0;
|
|
||||||
/* If a button was pressed, remember the modifiers */
|
/* If a button was pressed, remember the modifiers */
|
||||||
if (b != 3)
|
if (b != 3)
|
||||||
{
|
{
|
||||||
|
@ -354,16 +383,6 @@ fhandler_console::set_input_state ()
|
||||||
input_tcsetattr (0, &tc->ti);
|
input_tcsetattr (0, &tc->ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct
|
|
||||||
{
|
|
||||||
SHORT winTop;
|
|
||||||
SHORT winBottom;
|
|
||||||
COORD dwWinSize;
|
|
||||||
COORD dwBufferSize;
|
|
||||||
COORD dwCursorPosition;
|
|
||||||
WORD wAttributes;
|
|
||||||
} info;
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
fhandler_console::fillin_info (void)
|
fhandler_console::fillin_info (void)
|
||||||
{
|
{
|
||||||
|
@ -421,7 +440,7 @@ fhandler_console::scroll_screen (int x1, int y1, int x2, int y2, int xn, int yn)
|
||||||
else
|
else
|
||||||
dest.Y = yn > 0 ? yn : info.winBottom;
|
dest.Y = yn > 0 ? yn : info.winBottom;
|
||||||
fill.Char.AsciiChar = ' ';
|
fill.Char.AsciiChar = ' ';
|
||||||
fill.Attributes = default_color;
|
fill.Attributes = current_win32_attr;
|
||||||
ScrollConsoleScreenBuffer (get_output_handle (), &sr1, &sr2, dest, &fill);
|
ScrollConsoleScreenBuffer (get_output_handle (), &sr1, &sr2, dest, &fill);
|
||||||
|
|
||||||
/* ScrollConsoleScreenBuffer on Windows 95 is buggy - when scroll distance
|
/* ScrollConsoleScreenBuffer on Windows 95 is buggy - when scroll distance
|
||||||
|
@ -473,6 +492,8 @@ fhandler_console::open (const char *, int flags, mode_t)
|
||||||
if (fillin_info ())
|
if (fillin_info ())
|
||||||
default_color = info.wAttributes;
|
default_color = info.wAttributes;
|
||||||
|
|
||||||
|
set_default_attr ();
|
||||||
|
|
||||||
DWORD cflags;
|
DWORD cflags;
|
||||||
if (GetConsoleMode (get_io_handle (), &cflags))
|
if (GetConsoleMode (get_io_handle (), &cflags))
|
||||||
{
|
{
|
||||||
|
@ -511,8 +532,36 @@ fhandler_console::dup (fhandler_base *child)
|
||||||
if (!fhc->open(get_name (), get_flags (), 0))
|
if (!fhc->open(get_name (), get_flags (), 0))
|
||||||
system_printf ("error opening console, %E");
|
system_printf ("error opening console, %E");
|
||||||
|
|
||||||
fhc->state_ = state_;
|
|
||||||
fhc->default_color = default_color;
|
fhc->default_color = default_color;
|
||||||
|
fhc->underline_color = underline_color;
|
||||||
|
fhc->dim_color = dim_color;
|
||||||
|
fhc->state_ = state_;
|
||||||
|
fhc->nargs_ = nargs_;
|
||||||
|
for ( int i = 0; i < MAXARGS; i++ )
|
||||||
|
fhc->args_[i] = args_[i];
|
||||||
|
fhc->rarg = rarg;
|
||||||
|
fhc->saw_question_mark = saw_question_mark;
|
||||||
|
|
||||||
|
strncpy ( fhc->my_title_buf, my_title_buf, TITLESIZE + 1) ;
|
||||||
|
|
||||||
|
fhc->current_win32_attr = current_win32_attr;
|
||||||
|
fhc->intensity = intensity;
|
||||||
|
fhc->underline = underline;
|
||||||
|
fhc->blink = blink;
|
||||||
|
fhc->reverse = reverse;
|
||||||
|
fhc->fg = fg;
|
||||||
|
fhc->bg = bg;
|
||||||
|
|
||||||
|
fhc->savex = savex;
|
||||||
|
fhc->savey = savey;
|
||||||
|
|
||||||
|
fhc->scroll_region = scroll_region;
|
||||||
|
fhc->dwLastCursorPosition = dwLastCursorPosition;
|
||||||
|
fhc->dwLastButtonState = dwLastButtonState;
|
||||||
|
fhc->nModifiers = nModifiers;
|
||||||
|
|
||||||
|
fhc->use_mouse = use_mouse;
|
||||||
|
fhc->raw_win32_keyboard_mode = raw_win32_keyboard_mode;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -719,10 +768,62 @@ fhandler_console::fhandler_console (const char *name) :
|
||||||
fhandler_termios (FH_CONSOLE, name, -1)
|
fhandler_termios (FH_CONSOLE, name, -1)
|
||||||
{
|
{
|
||||||
set_cb (sizeof *this);
|
set_cb (sizeof *this);
|
||||||
|
default_color = dim_color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
|
||||||
|
underline_color = FOREGROUND_GREEN | FOREGROUND_BLUE;
|
||||||
state_ = normal;
|
state_ = normal;
|
||||||
|
nargs_ = 0;
|
||||||
|
for ( int i = 0; i < MAXARGS; i++ ) args_ [i] = 0;
|
||||||
|
savex = savey = 0;
|
||||||
|
scroll_region.Top = 0;
|
||||||
|
scroll_region.Bottom = -1;
|
||||||
|
dwLastCursorPosition.X = -1;
|
||||||
|
dwLastCursorPosition.Y = -1;
|
||||||
|
dwLastButtonState = 0;
|
||||||
|
nModifiers = 0;
|
||||||
|
use_mouse = raw_win32_keyboard_mode = FALSE;
|
||||||
set_need_fork_fixup ();
|
set_need_fork_fixup ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FOREGROUND_ATTR_MASK (FOREGROUND_RED | FOREGROUND_GREEN | \
|
||||||
|
FOREGROUND_BLUE | FOREGROUND_INTENSITY)
|
||||||
|
#define BACKGROUND_ATTR_MASK (BACKGROUND_RED | BACKGROUND_GREEN | \
|
||||||
|
BACKGROUND_BLUE | BACKGROUND_INTENSITY)
|
||||||
|
void
|
||||||
|
fhandler_console::set_default_attr ()
|
||||||
|
{
|
||||||
|
blink = underline = reverse = FALSE;
|
||||||
|
intensity = INTENSITY_NORMAL;
|
||||||
|
fg = default_color & FOREGROUND_ATTR_MASK;
|
||||||
|
bg = default_color & BACKGROUND_ATTR_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
WORD
|
||||||
|
fhandler_console::get_win32_attr ()
|
||||||
|
{
|
||||||
|
WORD win_fg = fg;
|
||||||
|
WORD win_bg = bg;
|
||||||
|
if ( reverse )
|
||||||
|
{
|
||||||
|
WORD save_fg = win_fg;
|
||||||
|
win_fg = ( win_bg & BACKGROUND_RED ? FOREGROUND_RED : 0 ) |
|
||||||
|
( win_bg & BACKGROUND_GREEN ? FOREGROUND_GREEN : 0 ) |
|
||||||
|
( win_bg & BACKGROUND_BLUE ? FOREGROUND_BLUE : 0 ) |
|
||||||
|
( win_fg & FOREGROUND_INTENSITY );
|
||||||
|
win_bg = ( save_fg & FOREGROUND_RED ? BACKGROUND_RED : 0 ) |
|
||||||
|
( save_fg & FOREGROUND_GREEN ? BACKGROUND_GREEN : 0 ) |
|
||||||
|
( save_fg & FOREGROUND_BLUE ? BACKGROUND_BLUE : 0 ) |
|
||||||
|
( win_bg & BACKGROUND_INTENSITY );
|
||||||
|
}
|
||||||
|
if ( underline ) win_fg = underline_color;
|
||||||
|
/* emulate blink with bright background */
|
||||||
|
if ( blink ) win_bg |= BACKGROUND_INTENSITY;
|
||||||
|
if ( intensity == INTENSITY_INVISIBLE )
|
||||||
|
win_fg = win_bg;
|
||||||
|
else if ( intensity == INTENSITY_BOLD )
|
||||||
|
win_fg |= FOREGROUND_INTENSITY;
|
||||||
|
return ( win_fg | win_bg );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clear the screen context from x1/y1 to x2/y2 cell.
|
* Clear the screen context from x1/y1 to x2/y2 cell.
|
||||||
* Negative values represents current screen dimensions
|
* Negative values represents current screen dimensions
|
||||||
|
@ -762,7 +863,7 @@ fhandler_console::clear_screen (int x1, int y1, int x2, int y2)
|
||||||
tlc,
|
tlc,
|
||||||
&done);
|
&done);
|
||||||
FillConsoleOutputAttribute (get_output_handle (),
|
FillConsoleOutputAttribute (get_output_handle (),
|
||||||
default_color,
|
current_win32_attr,
|
||||||
num,
|
num,
|
||||||
tlc,
|
tlc,
|
||||||
&done);
|
&done);
|
||||||
|
@ -858,20 +959,9 @@ static const char base_chars[256] =
|
||||||
/*F0 F1 F2 F3 F4 F5 F6 F7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
|
/*F0 F1 F2 F3 F4 F5 F6 F7 */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR,
|
||||||
/*F8 F9 FA FB FC FD FE FF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR };
|
/*F8 F9 FA FB FC FD FE FF */ NOR, NOR, NOR, NOR, NOR, NOR, NOR, NOR };
|
||||||
|
|
||||||
/*#define syscall_printf small_printf*/
|
|
||||||
|
|
||||||
static int savex, savey; /* for CSI s, CSI u */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
fhandler_console::char_command (char c, bool saw_question_mark)
|
fhandler_console::char_command (char c)
|
||||||
{
|
{
|
||||||
// Keep the background intensity with the colr since there doesn't seem
|
|
||||||
// to be a way to set this with termcap/terminfo.
|
|
||||||
static int fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
|
|
||||||
FOREGROUND_RED),
|
|
||||||
bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
|
||||||
BACKGROUND_RED | BACKGROUND_INTENSITY),
|
|
||||||
bold = default_color & FOREGROUND_INTENSITY;
|
|
||||||
int x, y;
|
int x, y;
|
||||||
char buf[40];
|
char buf[40];
|
||||||
|
|
||||||
|
@ -884,60 +974,32 @@ fhandler_console::char_command (char c, bool saw_question_mark)
|
||||||
switch (args_[i])
|
switch (args_[i])
|
||||||
{
|
{
|
||||||
case 0: /* normal color */
|
case 0: /* normal color */
|
||||||
fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
|
set_default_attr ();
|
||||||
FOREGROUND_RED);
|
|
||||||
bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
|
||||||
BACKGROUND_RED | BACKGROUND_INTENSITY);
|
|
||||||
bold = default_color & FOREGROUND_INTENSITY;
|
|
||||||
break;
|
break;
|
||||||
case 1: /* bold */
|
case 1: /* bold */
|
||||||
fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
|
intensity = INTENSITY_BOLD;
|
||||||
FOREGROUND_RED);
|
|
||||||
bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
|
||||||
BACKGROUND_RED | BACKGROUND_INTENSITY);
|
|
||||||
bold = FOREGROUND_INTENSITY;
|
|
||||||
break;
|
break;
|
||||||
case 4: /* underline - simulate with cyan */
|
case 4:
|
||||||
fg = FOREGROUND_BLUE | FOREGROUND_GREEN;
|
underline = 1;
|
||||||
bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
|
||||||
BACKGROUND_RED | BACKGROUND_INTENSITY);
|
|
||||||
bold = default_color & FOREGROUND_INTENSITY;
|
|
||||||
break;
|
break;
|
||||||
case 5: /* blink mode */
|
case 5: /* blink mode */
|
||||||
fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
|
blink = TRUE;
|
||||||
FOREGROUND_RED);
|
|
||||||
bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
|
||||||
BACKGROUND_RED | BACKGROUND_INTENSITY);
|
|
||||||
bold = default_color & FOREGROUND_INTENSITY;
|
|
||||||
break;
|
break;
|
||||||
case 7: /* reverse */
|
case 7: /* reverse */
|
||||||
fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0;
|
reverse = TRUE;
|
||||||
fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0;
|
|
||||||
fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0;
|
|
||||||
fg |= (default_color & BACKGROUND_INTENSITY) ?
|
|
||||||
FOREGROUND_INTENSITY : 0;
|
|
||||||
bg = (default_color & FOREGROUND_BLUE) ? BACKGROUND_BLUE : 0;
|
|
||||||
bg |= (default_color & FOREGROUND_GREEN) ? BACKGROUND_GREEN : 0;
|
|
||||||
bg |= (default_color & FOREGROUND_RED) ? BACKGROUND_RED : 0;
|
|
||||||
bg |= (default_color & FOREGROUND_INTENSITY) ?
|
|
||||||
BACKGROUND_INTENSITY : 0;
|
|
||||||
break;
|
break;
|
||||||
case 8: /* invisible */
|
case 8: /* invisible */
|
||||||
fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0;
|
intensity = INTENSITY_INVISIBLE;
|
||||||
fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0;
|
|
||||||
fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0;
|
|
||||||
bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
|
||||||
BACKGROUND_RED | BACKGROUND_INTENSITY);
|
|
||||||
bold = (default_color & BACKGROUND_INTENSITY) ?
|
|
||||||
FOREGROUND_INTENSITY : 0;
|
|
||||||
break;
|
break;
|
||||||
case 9: /* dim */
|
case 9: /* dim */
|
||||||
fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
|
intensity = INTENSITY_DIM;
|
||||||
FOREGROUND_RED);
|
|
||||||
bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
|
||||||
BACKGROUND_RED | BACKGROUND_INTENSITY);
|
|
||||||
bold = (fg == 0) ? FOREGROUND_INTENSITY : 0;
|
|
||||||
break;
|
break;
|
||||||
|
case 24:
|
||||||
|
underline = FALSE;
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
reverse = FALSE;
|
||||||
|
break;
|
||||||
case 30: /* BLACK foreground */
|
case 30: /* BLACK foreground */
|
||||||
fg = 0;
|
fg = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -962,6 +1024,9 @@ fhandler_console::char_command (char c, bool saw_question_mark)
|
||||||
case 37: /* WHITE foreg */
|
case 37: /* WHITE foreg */
|
||||||
fg = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
|
fg = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
|
||||||
break;
|
break;
|
||||||
|
case 39:
|
||||||
|
fg = default_color & FOREGROUND_ATTR_MASK;
|
||||||
|
break;
|
||||||
case 40: /* BLACK background */
|
case 40: /* BLACK background */
|
||||||
bg = 0;
|
bg = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -986,8 +1051,12 @@ fhandler_console::char_command (char c, bool saw_question_mark)
|
||||||
case 47: /* WHITE background */
|
case 47: /* WHITE background */
|
||||||
bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED;
|
bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED;
|
||||||
break;
|
break;
|
||||||
|
case 49:
|
||||||
|
bg = default_color & BACKGROUND_ATTR_MASK;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
SetConsoleTextAttribute (get_output_handle (), fg | bg | bold);
|
current_win32_attr = get_win32_attr ();
|
||||||
|
SetConsoleTextAttribute (get_output_handle (), current_win32_attr);
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'l':
|
case 'l':
|
||||||
|
@ -1000,6 +1069,10 @@ fhandler_console::char_command (char c, bool saw_question_mark)
|
||||||
syscall_printf("mouse support %sabled", use_mouse ? "en" : "dis");
|
syscall_printf("mouse support %sabled", use_mouse ? "en" : "dis");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 2000: /* Raw keyboard mode */
|
||||||
|
set_raw_win32_keyboard_mode ( (c == 'h') ? TRUE : FALSE );
|
||||||
|
break;
|
||||||
|
|
||||||
default: /* Ignore */
|
default: /* Ignore */
|
||||||
syscall_printf("unknown h/l command: %d", args_[0]);
|
syscall_printf("unknown h/l command: %d", args_[0]);
|
||||||
break;
|
break;
|
||||||
|
@ -1244,9 +1317,6 @@ fhandler_console::write (const void *vsrc, size_t len)
|
||||||
/* Run and check for ansi sequences */
|
/* Run and check for ansi sequences */
|
||||||
unsigned const char *src = (unsigned char *) vsrc;
|
unsigned const char *src = (unsigned char *) vsrc;
|
||||||
unsigned const char *end = src + len;
|
unsigned const char *end = src + len;
|
||||||
static NO_COPY unsigned rarg;
|
|
||||||
static NO_COPY char my_title_buf[TITLESIZE + 1];
|
|
||||||
bool saw_question_mark = 0;
|
|
||||||
|
|
||||||
debug_printf ("%x, %d", vsrc, len);
|
debug_printf ("%x, %d", vsrc, len);
|
||||||
|
|
||||||
|
@ -1265,6 +1335,7 @@ fhandler_console::write (const void *vsrc, size_t len)
|
||||||
if (*src == '[')
|
if (*src == '[')
|
||||||
{
|
{
|
||||||
state_ = gotsquare;
|
state_ = gotsquare;
|
||||||
|
saw_question_mark = FALSE;
|
||||||
for (nargs_ = 0; nargs_ < MAXARGS; nargs_++)
|
for (nargs_ = 0; nargs_ < MAXARGS; nargs_++)
|
||||||
args_[nargs_] = 0;
|
args_[nargs_] = 0;
|
||||||
nargs_ = 0;
|
nargs_ = 0;
|
||||||
|
@ -1283,6 +1354,7 @@ fhandler_console::write (const void *vsrc, size_t len)
|
||||||
}
|
}
|
||||||
else if (*src == 'c') /* Reset Linux terminal */
|
else if (*src == 'c') /* Reset Linux terminal */
|
||||||
{
|
{
|
||||||
|
set_default_attr ();
|
||||||
clear_screen (0, 0, -1, -1);
|
clear_screen (0, 0, -1, -1);
|
||||||
cursor_set (TRUE, 0, 0);
|
cursor_set (TRUE, 0, 0);
|
||||||
state_ = normal;
|
state_ = normal;
|
||||||
|
@ -1324,7 +1396,7 @@ fhandler_console::write (const void *vsrc, size_t len)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case gotcommand:
|
case gotcommand:
|
||||||
char_command (*src++, saw_question_mark);
|
char_command (*src++);
|
||||||
state_ = normal;
|
state_ = normal;
|
||||||
break;
|
break;
|
||||||
case gotrsquare:
|
case gotrsquare:
|
||||||
|
@ -1372,7 +1444,7 @@ fhandler_console::write (const void *vsrc, size_t len)
|
||||||
else if (*src != '@' && !isalpha (*src) && !isdigit (*src))
|
else if (*src != '@' && !isalpha (*src) && !isdigit (*src))
|
||||||
{
|
{
|
||||||
if (*src == '?')
|
if (*src == '?')
|
||||||
saw_question_mark = 1;
|
saw_question_mark = TRUE;
|
||||||
/* ignore any extra chars between [ and first arg or command */
|
/* ignore any extra chars between [ and first arg or command */
|
||||||
src++;
|
src++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue