diff options
-rw-r--r-- | console/ChangeLog | 17 | ||||
-rw-r--r-- | console/console.c | 2 | ||||
-rw-r--r-- | console/display.c | 65 |
3 files changed, 67 insertions, 17 deletions
diff --git a/console/ChangeLog b/console/ChangeLog index 5a14f195..332a70ba 100644 --- a/console/ChangeLog +++ b/console/ChangeLog @@ -1,3 +1,20 @@ +2002-06-09 Marcus Brinkmann <marcus@gnu.org> + + * display.c (struct cursor): Change type of all members from int + to u_int32_t. + (screen_init): Initialize SCREEN->lines with 25 instead 200 for + now. + (screen_fill): Bring SCREEN->current_line into the calculation of + MATRIXP. + (screen_scroll_up): Likewise. + (screen_scroll_down): Likewise. + (screen_scroll_left): Likewise. + (screen_scroll_right): Likewise. + (display_output_one): Beautify code a bit. + (display_read): Add metadata to beginning of file. + * console.c (new_node): Increase size of display node to include + metadata. + 2002-06-05 Marcus Brinkmann <marcus@gnu.org> * input.h: New file. diff --git a/console/console.c b/console/console.c index 57e93de6..c0dbf4f5 100644 --- a/console/console.c +++ b/console/console.c @@ -288,7 +288,7 @@ new_node (struct node **np, vcons_t vcons, vcons_node_type type) (*np)->nn_stat.st_ino = (vcons->id << 2) + 2; (*np)->nn_stat.st_mode |= S_IFREG; (*np)->nn_stat.st_mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); - (*np)->nn_stat.st_size = 2000 * sizeof (wchar_t); /* XXX */ + (*np)->nn_stat.st_size = 2008 * sizeof (wchar_t); /* XXX */ break; case VCONS_NODE_INPUT: (*np)->nn_stat.st_ino = (vcons->id << 2) + 3; diff --git a/console/display.c b/console/display.c index d2c0b590..0fffba24 100644 --- a/console/display.c +++ b/console/display.c @@ -60,14 +60,14 @@ typedef struct screen *screen_t; struct cursor { /* The visibility of the cursor. */ - int status; + u_int32_t status; #define CURSOR_INVISIBLE 1 #define CURSOR_STANDOUT 2 - size_t x; - size_t y; - size_t saved_x; - size_t saved_y; + u_int32_t x; + u_int32_t y; + u_int32_t saved_x; + u_int32_t saved_y; }; typedef struct cursor *cursor_t; @@ -151,7 +151,7 @@ screen_init (screen_t screen) { screen->width = 80; screen->height = 25; - screen->lines = 200; /* XXX For now. */ + screen->lines = 25; /* XXX For now. */ screen->current_line = 0; screen->matrix = calloc (screen->lines * screen->width, sizeof (wchar_t)); if (!screen->matrix) @@ -172,7 +172,8 @@ static void screen_fill (screen_t screen, size_t x, size_t y, size_t w, size_t h, wchar_t chr, char attr) { - wchar_t *matrixp = screen->matrix + y * screen->width + x; + wchar_t *matrixp = screen->matrix + + ((screen->current_line + y) % screen->height) * screen->width + x; while (h--) { @@ -188,7 +189,8 @@ static void screen_scroll_up (screen_t screen, size_t x, size_t y, size_t w, size_t h, int amt, wchar_t chr, char attr) { - wchar_t *matrixp = screen->matrix + y * screen->width + x; + wchar_t *matrixp = screen->matrix + + ((screen->current_line + y) % screen->height) * screen->width + x; if (amt < 0) return; @@ -205,7 +207,9 @@ static void screen_scroll_down (screen_t screen, size_t x, size_t y, size_t w, size_t h, int amt, wchar_t chr, char attr) { - wchar_t *matrixp = screen->matrix + (y + h - 1) * screen->width + x; + wchar_t *matrixp = screen->matrix + + ((screen->current_line + y + h - 1) % screen->height) + * screen->width + x; if (amt < 0) return; @@ -223,7 +227,8 @@ screen_scroll_left (screen_t screen, size_t x, size_t y, size_t w, size_t h, int amt, wchar_t chr, char attr) { int i; - wchar_t *matrixp = screen->matrix + y * screen->width + x; + wchar_t *matrixp = screen->matrix + + ((screen->current_line + y) % screen->height) * screen->width + x; if (amt < 0) return; @@ -243,7 +248,8 @@ screen_scroll_right (screen_t screen, size_t x, size_t y, size_t w, size_t h, int amt, wchar_t chr, char attr) { int i; - wchar_t *matrixp = screen->matrix + y * screen->width + x; + wchar_t *matrixp = screen->matrix + + ((screen->current_line + y) % screen->height) * screen->width + x; if (amt < 0) return; @@ -631,10 +637,9 @@ display_output_one (display_t display, wchar_t chr) } else { - if (display->screen.current_line == display->screen.lines - 1) - display->screen.current_line = 0; - else - display->screen.current_line++; + display->screen.current_line++; + display->screen.current_line %= display->screen.lines; + /* XXX Set attribute flags. */ screen_fill (&display->screen, 0, display->screen.height - 1, display->screen.width, 1, L' ', display->screen.width); @@ -1001,12 +1006,40 @@ display_output (display_t display, int nonblock, char *data, size_t datalen) ssize_t display_read (display_t display, int nonblock, off_t off, char *data, size_t len) { + u_int32_t metadata[8]; + size_t metadatalen = sizeof (metadata); + ssize_t written = 0; + mutex_lock (&display->lock); + metadata[0] = display->screen.width; + metadata[1] = display->screen.height; + metadata[2] = display->screen.lines; + metadata[3] = display->screen.current_line; + metadata[4] = display->screen.scrolling_max; + metadata[5] = display->cursor.x; + metadata[6] = display->cursor.y; + metadata[7] = display->cursor.status; + + if (off >= 0 && off < metadatalen) + { + int part_len = len; + + if (part_len > metadatalen) + part_len = metadatalen; + memcpy (data, (char *) metadata + off, part_len); + data += part_len; + len -= part_len; + written += part_len; + } + off -= metadatalen; + if (off < 0) + off = 0; + if (off + len > 2000 * sizeof(wchar_t)) len = 2000 * sizeof(wchar_t) - off; memcpy (data, (char *) display->screen.matrix + off, len); mutex_unlock (&display->lock); - return len; + return written + len; } /* Resume the output on the display DISPLAY. */ |