From be549330de1979ba914194bd79bfd7eb998a792e Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Tue, 10 Sep 2002 18:05:41 +0000 Subject: console/ 2002-09-10 Marcus Brinkmann * display.c (DISPLAY_CHANGE_FLAGS): New macro. (struct changes): New member FLAGS. (display_flush_filechange): Handle change of flags. (display_output_some): Initialize DISPLAY->changes.flags. (display_start_output): Clear CONS_FLAGS_SCROLL_LOCK in DISPLAY. (display_stop_output): Set CONS_FLAGS_SCROLL_LOCK in DISPLAY. hurd/ 2002-09-10 Marcus Brinkmann * console.h (struct cons_display): New member FLAGS. (union cons_change_t): Likewise for WHAT->flags. libcons/ 2002-09-10 Marcus Brinkmann * cons.h: New prototype for cons_vcons_set_scroll_lock. (struct vcons): Add member FLAGS to state. * file-changed.c (cons_S_file_changed): Handle change of flags. * vcons-refresh.c (cons_vcons_refresh): Copy FLAGS field. Call cons_vcons_set_scroll_lock. * cons-switch.c (cons_switch): Initialize VCONS_ENTRY even if DELTA is negative. utils/ 2002-09-09 Marcus Brinkmann * console-ncurses.c (cons_vcons_set_scroll_lock): New function. --- console/ChangeLog | 7 +++++++ console/display.c | 37 ++++++++++++++++++++++++++++++------- hurd/ChangeLog | 5 +++++ hurd/console.h | 8 +++++++- libcons/ChangeLog | 11 +++++++++++ libcons/cons-switch.c | 1 + libcons/cons.h | 5 +++++ libcons/file-changed.c | 10 ++++++++++ libcons/vcons-refresh.c | 2 ++ utils/ChangeLog | 2 ++ utils/console-ncurses.c | 5 +++++ 11 files changed, 85 insertions(+), 8 deletions(-) diff --git a/console/ChangeLog b/console/ChangeLog index bfa7eb14..e1bed32c 100644 --- a/console/ChangeLog +++ b/console/ChangeLog @@ -1,5 +1,12 @@ 2002-09-10 Marcus Brinkmann + * display.c (DISPLAY_CHANGE_FLAGS): New macro. + (struct changes): New member FLAGS. + (display_flush_filechange): Handle change of flags. + (display_output_some): Initialize DISPLAY->changes.flags. + (display_start_output): Clear CONS_FLAGS_SCROLL_LOCK in DISPLAY. + (display_stop_output): Set CONS_FLAGS_SCROLL_LOCK in DISPLAY. + * display.c (display_output_some): If iconv fails with EILSEQ, skip the next byte in the buffer and print a replacement character. diff --git a/console/display.c b/console/display.c index 638ac222..d11091b4 100644 --- a/console/display.c +++ b/console/display.c @@ -48,6 +48,7 @@ struct changes { + uint32_t flags; struct { uint32_t col; @@ -66,13 +67,14 @@ struct changes off_t start; off_t end; -#define DISPLAY_CHANGE_CURSOR_POS 1 -#define DISPLAY_CHANGE_CURSOR_STATUS 2 -#define DISPLAY_CHANGE_SCREEN_CUR_LINE 4 -#define DISPLAY_CHANGE_SCREEN_SCR_LINES 8 -#define DISPLAY_CHANGE_BELL_AUDIBLE 16 -#define DISPLAY_CHANGE_BELL_VISIBLE 32 -#define DISPLAY_CHANGE_MATRIX 64 +#define DISPLAY_CHANGE_CURSOR_POS 0x0001 +#define DISPLAY_CHANGE_CURSOR_STATUS 0x0002 +#define DISPLAY_CHANGE_SCREEN_CUR_LINE 0x0004 +#define DISPLAY_CHANGE_SCREEN_SCR_LINES 0x0008 +#define DISPLAY_CHANGE_BELL_AUDIBLE 0x0010 +#define DISPLAY_CHANGE_BELL_VISIBLE 0x0020 +#define DISPLAY_CHANGE_FLAGS 0x0030 +#define DISPLAY_CHANGE_MATRIX 0x0040 unsigned int which; }; @@ -646,6 +648,16 @@ display_flush_filechange (display_t display, unsigned int type) display->changes.which &= ~DISPLAY_CHANGE_BELL_VISIBLE; } + if (type & DISPLAY_CHANGE_FLAGS + && display->changes.which & DISPLAY_CHANGE_FLAGS + && display->changes.flags != user->flags) + { + notify = 1; + next->what.flags = 1; + bump_written = 1; + display->changes.which &= ~DISPLAY_CHANGE_FLAGS; + } + if (bump_written) user->changes.written++; if (notify) @@ -1609,6 +1621,7 @@ display_output_some (display_t display, char **buffer, size_t *length) display->changes.screen.scr_lines = display->user->screen.scr_lines; display->changes.bell_audible = display->user->bell.audible; display->changes.bell_visible = display->user->bell.visible; + display->changes.flags = display->user->flags; display->changes.which = ~DISPLAY_CHANGE_MATRIX; while (!err && *length > 0) @@ -1913,6 +1926,7 @@ display_output (display_t display, int nonblock, char *data, size_t datalen) return amount; } + ssize_t display_read (display_t display, int nonblock, off_t off, char *data, size_t len) @@ -1923,6 +1937,7 @@ display_read (display_t display, int nonblock, off_t off, return len; } + /* Resume the output on the display DISPLAY. */ void display_start_output (display_t display) @@ -1933,6 +1948,10 @@ display_start_output (display_t display) display->output.stopped = 0; condition_broadcast (&display->output.resumed); } + display->changes.flags = display->user->flags; + display->changes.which = DISPLAY_CHANGE_FLAGS; + display->user->flags &= ~CONS_FLAGS_SCROLL_LOCK; + display_flush_filechange (display, DISPLAY_CHANGE_FLAGS); mutex_unlock (&display->lock); } @@ -1943,6 +1962,10 @@ display_stop_output (display_t display) { mutex_lock (&display->lock); display->output.stopped = 1; + display->changes.flags = display->user->flags; + display->changes.which = DISPLAY_CHANGE_FLAGS; + display->user->flags |= CONS_FLAGS_SCROLL_LOCK; + display_flush_filechange (display, DISPLAY_CHANGE_FLAGS); mutex_unlock (&display->lock); } diff --git a/hurd/ChangeLog b/hurd/ChangeLog index deea9289..d4c72fac 100644 --- a/hurd/ChangeLog +++ b/hurd/ChangeLog @@ -1,3 +1,8 @@ +2002-09-10 Marcus Brinkmann + + * console.h (struct cons_display): New member FLAGS. + (union cons_change_t): Likewise for WHAT->flags. + 2002-09-04 Marcus Brinkmann * console.h: Include . diff --git a/hurd/console.h b/hurd/console.h index b673db54..bf15e357 100644 --- a/hurd/console.h +++ b/hurd/console.h @@ -65,7 +65,8 @@ typedef union uint32_t screen_scr_lines : 1; uint32_t bell_audible : 1; uint32_t bell_visible : 1; - uint32_t _unused : 25; + uint32_t flags : 1; + uint32_t _unused : 24; uint32_t not_matrix : 1; /* Here are 32 more unused bits. */ } what; @@ -82,6 +83,11 @@ struct cons_display uint32_t version; /* Version of interface. Lower 16 bits define the age, upper 16 bits the major version. */ + + /* Various one bit flags that don't deserve their own field. */ +#define CONS_FLAGS_SCROLL_LOCK 0x00000001 + uint32_t flags; + struct { uint32_t width; /* Width of screen matrix. */ diff --git a/libcons/ChangeLog b/libcons/ChangeLog index bae85db0..e6323d2f 100644 --- a/libcons/ChangeLog +++ b/libcons/ChangeLog @@ -1,3 +1,14 @@ +2002-09-10 Marcus Brinkmann + + * cons.h: New prototype for cons_vcons_set_scroll_lock. + (struct vcons): Add member FLAGS to state. + * file-changed.c (cons_S_file_changed): Handle change of flags. + * vcons-refresh.c (cons_vcons_refresh): Copy FLAGS field. + Call cons_vcons_set_scroll_lock. + + * cons-switch.c (cons_switch): Initialize VCONS_ENTRY even if + DELTA is negative. + 2002-09-09 Marcus Brinkmann * Makefile (SRCS): Add vcons-scrollback.c. diff --git a/libcons/cons-switch.c b/libcons/cons-switch.c index c39e83da..752af97e 100644 --- a/libcons/cons-switch.c +++ b/libcons/cons-switch.c @@ -56,6 +56,7 @@ cons_switch (vcons_t vcons, int id, int delta, vcons_t *r_vcons) else { assert (delta < 0); + vcons_entry = vcons->vcons_entry; while (delta++ < 0) { vcons_entry = vcons_entry->prev; diff --git a/libcons/cons.h b/libcons/cons.h index 6b2fca49..783aeb6a 100644 --- a/libcons/cons.h +++ b/libcons/cons.h @@ -76,6 +76,7 @@ struct vcons struct { + uint32_t flags; struct { uint32_t col; @@ -195,6 +196,10 @@ void cons_vcons_beep (vcons_t vcons); VCONS, which is locked, flash visibly. */ void cons_vcons_flash (vcons_t vcons); +/* The user must define this function. Notice the current status of + the scroll lock flag. */ +void cons_vcons_set_scroll_lock (vcons_t vcons, int onoff); + /* The user must define this function. It is called whenever a virtual console is selected to be the active one. It is the user's responsibility to close the console at some later time. */ diff --git a/libcons/file-changed.c b/libcons/file-changed.c index b4372ed9..fabc7f6e 100644 --- a/libcons/file-changed.c +++ b/libcons/file-changed.c @@ -202,6 +202,16 @@ cons_S_file_changed (cons_notify_t notify, natural_t tickno, vcons->state.bell.visible++; } } + if (change.what.flags) + { + uint32_t flags = vcons->display->flags; + + if (flags & CONS_FLAGS_SCROLL_LOCK + != vcons->display->flags & CONS_FLAGS_SCROLL_LOCK) + cons_vcons_set_scroll_lock (vcons, flags + & CONS_FLAGS_SCROLL_LOCK); + vcons->state.flags = flags; + } } else { diff --git a/libcons/vcons-refresh.c b/libcons/vcons-refresh.c index 35e74224..c2db2c57 100644 --- a/libcons/vcons-refresh.c +++ b/libcons/vcons-refresh.c @@ -34,6 +34,7 @@ cons_vcons_refresh (vcons_t vcons) vcons->state.cursor.status = vcons->display->cursor.status; vcons->state.bell.audible = vcons->display->bell.audible; vcons->state.bell.visible = vcons->display->bell.visible; + vcons->state.flags = vcons->display->flags; vcons->state.changes.written = vcons->display->changes.written; cons_vcons_write (vcons, vcons->state.screen.matrix @@ -60,5 +61,6 @@ cons_vcons_refresh (vcons_t vcons) cons_vcons_set_cursor_pos (vcons, vcons->state.cursor.col, vcons->state.cursor.row); cons_vcons_set_cursor_status (vcons, vcons->state.cursor.status); + cons_vcons_set_scroll_lock (vcons, vcons->state.flags & CONS_FLAGS_SCROLL_LOCK); cons_vcons_update (vcons); } diff --git a/utils/ChangeLog b/utils/ChangeLog index 496edd80..624ad649 100644 --- a/utils/ChangeLog +++ b/utils/ChangeLog @@ -1,5 +1,7 @@ 2002-09-09 Marcus Brinkmann + * console-ncurses.c (cons_vcons_set_scroll_lock): New function. + * console-ncurses.c (console_switch): Keep a reference to the port instead refering to it by number. diff --git a/utils/console-ncurses.c b/utils/console-ncurses.c index 98c212f6..0d290a2f 100644 --- a/utils/console-ncurses.c +++ b/utils/console-ncurses.c @@ -601,6 +601,11 @@ cons_vcons_flash (vcons_t vcons) mutex_unlock (&global_lock); } +void +cons_vcons_set_scroll_lock (vcons_t vcons, int onoff) +{ +} + int main (int argc, char *argv[]) -- cgit v1.2.3