diff options
| -rw-r--r-- | libcons/ChangeLog | 7 | ||||
| -rw-r--r-- | libcons/cons.h | 17 | ||||
| -rw-r--r-- | libcons/file-changed.c | 8 | ||||
| -rw-r--r-- | libcons/vcons-refresh.c | 2 | ||||
| -rw-r--r-- | libcons/vcons-scrollback.c | 5 | 
5 files changed, 35 insertions, 4 deletions
diff --git a/libcons/ChangeLog b/libcons/ChangeLog index a6b30aff..b9aeef5d 100644 --- a/libcons/ChangeLog +++ b/libcons/ChangeLog @@ -1,5 +1,12 @@  2002-09-16  Marcus Brinkmann  <marcus@gnu.org> +	* cons.h: Add prototype for cons_vcons_clear. +	* file-changed.c (cons_S_file_changed): Prepare all areas we write +	to with cons_vcons_clear (unless we use cons_vcons_scroll +	already). +	* vcons-refresh.c (cons_vcons_refresh): Likewise. +	* vcons-scrollback.c (_cons_vcons_scrollback): Likewise. +  	* opts-std-startup.c (parse_startup_opt): Use argp_error instead  	argp_usage for error.  Replace case for ARGP_KEY_END with case for  	ARGP_KEY_NO_ARGS. diff --git a/libcons/cons.h b/libcons/cons.h index 67f4e45b..8105a723 100644 --- a/libcons/cons.h +++ b/libcons/cons.h @@ -136,6 +136,15 @@ extern const char *cons_client_version;     version specification that should be printed for --version. */  extern char *cons_extra_version; +/* The user must define this function.  Deallocate the scarce +   resources (like font glyph slots, colors etc) in the LENGTH entries +   of the screen matrix starting from position COL and ROW.  This call +   is immediately followed by calls to cons_vcons_write that cover the +   same area.  If there are no scarce resources, the caller might do +   nothing.  */ +void cons_vcons_clear (vcons_t vcons, size_t length, +		       uint32_t col, uint32_t row); +  /* The user must define this function.  Write LENGTH characters     starting from STR on the virtual console VCONS, which is locked,     starting from position COL and ROW.  */ @@ -165,10 +174,10 @@ void cons_vcons_set_cursor_status (vcons_t vcons, uint32_t status);     prepare a full refresh of the screen.  In the latter case the user     should not really perform any scrolling.  Instead it might     deallocate limited resources (like display glyph slots and palette -   colors) if that helps to perform the subsequent write.  It goes -   without saying that the same deallocation, if any, should be -   performed on the area that will be filled with the scrolled in -   content. +   colors) if that helps to perform the subsequent write, just like +   cons_vcons_clear.  It goes without saying that the same +   deallocation, if any, should be performed on the area that will be +   filled with the scrolled in content.     XXX Possibly need a function to invalidate scrollback buffer, or in     general to signal a switch of the console so state can be reset. diff --git a/libcons/file-changed.c b/libcons/file-changed.c index 7b78a317..f65eb0b5 100644 --- a/libcons/file-changed.c +++ b/libcons/file-changed.c @@ -162,6 +162,10 @@ cons_S_file_changed (cons_notify_t notify, natural_t tickno,  			    scrolling = vcons->state.screen.height;  			  if (scrolling < vcons->state.screen.height)  			    cons_vcons_scroll (vcons, scrolling); +			  else +			    cons_vcons_clear (vcons, vcons->state.screen.width +					      * vcons->state.screen.height, +					      0, 0);  			  vis_start = vcons->state.screen.width  			    * (cur_disp_line % vcons->state.screen.lines);  			  start = (((cur_disp_line % vcons->state.screen.lines) @@ -299,6 +303,9 @@ cons_S_file_changed (cons_notify_t notify, natural_t tickno,  	      if (start != -1)  		{ +		  cons_vcons_clear (vcons, end - start + 1, +				    start_rel % vcons->state.screen.width, +				    start_rel / vcons->state.screen.width);  		  cons_vcons_write (vcons, vcons->state.screen.matrix + start,  				    end < size  				    ? end - start + 1 @@ -314,6 +321,7 @@ cons_S_file_changed (cons_notify_t notify, natural_t tickno,  				      / vcons->state.screen.width);  		  if (end2 != -1)  		    { +		      cons_vcons_clear (vcons, end2 - rotate + 1, 0, 0);  		      cons_vcons_write (vcons,  					vcons->state.screen.matrix + rotate,  					end2 < size diff --git a/libcons/vcons-refresh.c b/libcons/vcons-refresh.c index c2db2c57..7851618a 100644 --- a/libcons/vcons-refresh.c +++ b/libcons/vcons-refresh.c @@ -37,6 +37,8 @@ cons_vcons_refresh (vcons_t vcons)    vcons->state.flags = vcons->display->flags;    vcons->state.changes.written = vcons->display->changes.written; +  cons_vcons_clear (vcons, vcons->state.screen.width +		    * vcons->state.screen.height, 0, 0);    cons_vcons_write (vcons, vcons->state.screen.matrix  		    + (vcons->state.screen.cur_line % vcons->state.screen.lines)  		    * vcons->state.screen.width, diff --git a/libcons/vcons-scrollback.c b/libcons/vcons-scrollback.c index 84fef0b0..c54303e9 100644 --- a/libcons/vcons-scrollback.c +++ b/libcons/vcons-scrollback.c @@ -84,6 +84,11 @@ _cons_vcons_scrollback (vcons_t vcons, cons_scroll_t type, float value)  	|| (scrolling < 0  	    && (uint32_t) (-scrolling) < vcons->state.screen.height))        cons_vcons_scroll (vcons, scrolling); +    else if ((scrolling > 0 && scrolling == vcons->state.screen.height) +	|| (scrolling < 0 +	    && (uint32_t) (-scrolling) == vcons->state.screen.height)) +      cons_vcons_clear (vcons, vcons->state.screen.width +			* vcons->state.screen.height, 0, 0);      vis_start = vcons->state.screen.width        * (new_cur_line % vcons->state.screen.lines);  | 
