* 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:
Egor Duda 2001-02-27 09:14:35 +00:00
parent 5b331f1ef1
commit a53136cc46
3 changed files with 244 additions and 94 deletions

View File

@ -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.

View File

@ -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 */

View File

@ -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++;
} }