X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=linux_usr%2Fv3_cons_sc.c;h=6272357408e562515b10b9dce9c805ac2ecd0d54;hp=a8e7046cbc2b1b627f6c25f05beff2f31849a9f0;hb=a569df65eac9f48c73e30f85afbb385f65c2eb38;hpb=035ac752dc4e0eda744205896a9c7c92689bea42 diff --git a/linux_usr/v3_cons_sc.c b/linux_usr/v3_cons_sc.c index a8e7046..6272357 100644 --- a/linux_usr/v3_cons_sc.c +++ b/linux_usr/v3_cons_sc.c @@ -21,6 +21,10 @@ #include "v3_ctrl.h" +static int in_color = 0; +static int color8 = 0; +#define TRANS_STYLE(x) ( !color8 ? (x) : ((x)&0x7)|(((x)&0x70)>>1)) + static int use_curses = 0; static int debug_enable = 0; @@ -117,7 +121,9 @@ static int handle_char_set(struct character_msg * msg) { return -1; } + if (in_color) {wattron(console.win, COLOR_PAIR(TRANS_STYLE(msg->style)));} mvwaddch(console.win, msg->y, msg->x, c); + if (in_color) {wattroff(console.win, COLOR_PAIR(TRANS_STYLE(msg->style)));} } else { //stdout text display @@ -285,8 +291,8 @@ struct key_code { }; static const struct key_code ascii_to_key_code[] = { // ASCII Value Serves as Index - NO_KEY, NO_KEY, NO_KEY, NO_KEY, // 0x00 - 0x03 - NO_KEY, NO_KEY, NO_KEY, { 0x0E, 0 }, // 0x04 - 0x07 + NO_KEY, NO_KEY, {0x50, 0}, {0x48, 0}, // 0x00 - 0x03 + {0x4B, 0}, {0x4D, 0}, NO_KEY, { 0x0E, 0 }, // 0x04 - 0x07 { 0x0E, 0 }, { 0x0F, 0 }, { 0x1C, 0 }, NO_KEY, // 0x08 - 0x0B NO_KEY, { 0x1C, 0 }, NO_KEY, NO_KEY, // 0x0C - 0x0F NO_KEY, NO_KEY, NO_KEY, NO_KEY, // 0x10 - 0x13 @@ -371,7 +377,93 @@ int send_char_to_palacios_as_scancodes(int fd, unsigned char c) } return 0; } + + +#define MIN_TTY_COLS 80 +#define MIN_TTY_ROWS 25 +int check_terminal_size (void) +{ + unsigned short n_cols = 0; + unsigned short n_rows = 0; + struct winsize winsz; + + ioctl (fileno(stdin), TIOCGWINSZ, &winsz); + n_cols = winsz.ws_col; + n_rows = winsz.ws_row; + + if (n_cols < MIN_TTY_COLS || n_rows < MIN_TTY_ROWS) { + printf ("Your window is not large enough.\n"); + printf ("It must be at least %dx%d, but yours is %dx%d\n", + MIN_TTY_COLS, MIN_TTY_ROWS, n_cols, n_rows); + return (-1); + } + + /* SUCCESS */ + return (0); +} + + + +static void +init_colors (void) +{ + unsigned short i; + + if (!has_colors()) { + fprintf(stderr,"No color support\n"); + in_color=0; + color8=0; + return; + } + start_color(); + + if (can_change_color() && COLORS>=16 && COLOR_PAIRS>=256) { + fprintf(stderr, "Modifyable color support with enough colors available\n"); + // initialize first 16 colors to be the PC colors + // then create all the pairings + for (i=0;i<16;i++) { + unsigned short red, green, blue, intens; + // i = IRGB (4 bits) + intens = i>>3 & 0x1; + red = i>>2 & 0x1; + green = i>>1 & 0x1; + blue = i>>0 & 0x1; + init_color(i, 500*(red+intens), 500*(blue+intens), 500*(green+intens)); + } + for (i=0;i<256;i++) { + init_pair(i, i & 0xf, (i >> 4) & 0xf); + } + in_color = 1; + color8 = 0; + return; + } else { + if (COLORS!=8 || COLOR_PAIRS<64) { + fprintf(stderr,"Insufficient number of fixed colors (%d) or color pairs (%d)\n",COLORS,COLOR_PAIRS); + in_color = 0; + color8 = 0; + return; + } + // We have only the low-intensity colors available, so + // map just to these + fprintf(stderr,"Only 8 color standard palette available\n"); + for (i=0;i<64;i++) { + // VGA color order: black, blue, green, cyan, red, magenta, brown, gray + // curses color order: black, red, green, yellow, blue, magenta, cyan, white + short map[] = { 0, 4, 2, 6, 1, 5, 3, 7 }; + unsigned short fg, bg; + // discard intensity bit + bg = (i>>3 & 0x7); + fg = i & 0x7; + init_pair(i, map[fg], map[bg]); + } + in_color = 1; + color8 = 1; + return; + } +} + + int main(int argc, char* argv[]) { int vm_fd; int cons_fd; @@ -385,6 +477,12 @@ int main(int argc, char* argv[]) { return -1; } + /* Check for minimum Terminal size at start */ + if (0 != check_terminal_size()) { + printf ("Error: terminal too small!\n"); + return -1; + } + vm_dev = argv[1]; vm_fd = open(vm_dev, O_RDONLY); @@ -423,6 +521,8 @@ int main(int argc, char* argv[]) { scrollok(console.win, 1); erase(); + init_colors(); + //abort(); } /* @@ -450,13 +550,6 @@ int main(int argc, char* argv[]) { //ioctl(STDIN_FILENO, KDSKBMODE, K_RAW); - if (LINES<25 || COLS<80) { - printf("Your window is not large enough.\nIt must be at least 80x25, but yours is %dx%d\n",COLS,LINES); - close(cons_fd); - exit(-1); - } - - while (1) { int ret; int bytes_read = 0; @@ -484,32 +577,32 @@ int main(int argc, char* argv[]) { } } - if (FD_ISSET(STDIN_FILENO, &rset)) { - unsigned char key = getch(); - - if (key == '\\') { // ESC - break; - } else if (key == '`') { - unsigned char sc = 0x44; // F10 - writeit(cons_fd,sc); - sc |= 0x80; - writeit(cons_fd,sc); - } else if (key == '~') { // CTRL-C - unsigned char sc; - sc = 0x1d; // left ctrl down - writeit(cons_fd,sc); - sc = 0x2e; // c down - writeit(cons_fd,sc); - sc = 0x2e | 0x80; // c up - writeit(cons_fd,sc); - sc = 0x1d | 0x80; // left ctrl up - writeit(cons_fd,sc); - } else { - if (send_char_to_palacios_as_scancodes(cons_fd,key)) { - printf("Error sending key to console\n"); - return -1; - } - } + if (FD_ISSET(STDIN_FILENO, &rset)) { + unsigned char key = getch(); + + if (key == '\\') { // ESC + break; + } else if (key == '`') { + unsigned char sc = 0x44; // F10 + writeit(cons_fd,sc); + sc |= 0x80; + writeit(cons_fd,sc); + } else if (key == '~') { // CTRL-C + unsigned char sc; + sc = 0x1d; // left ctrl down + writeit(cons_fd,sc); + sc = 0x2e; // c down + writeit(cons_fd,sc); + sc = 0x2e | 0x80; // c up + writeit(cons_fd,sc); + sc = 0x1d | 0x80; // left ctrl up + writeit(cons_fd,sc); + } else { + if (send_char_to_palacios_as_scancodes(cons_fd,key)) { + printf("Error sending key to console\n"); + return -1; + } + } } }