diff options
| author | Přemysl Janouch <p.janouch@gmail.com> | 2016-01-15 03:49:24 +0100 | 
|---|---|---|
| committer | Přemysl Janouch <p.janouch@gmail.com> | 2016-01-15 05:09:42 +0100 | 
| commit | b7c9e8ca23dee372ddf8ad5d1e845950ec15a2e2 (patch) | |
| tree | a3dafa5fb793e52930eec57390f82d69699f0be5 | |
| parent | f39e2a4bc82894dc5fa25b2eb8ac5cac93c9d644 (diff) | |
| download | xK-b7c9e8ca23dee372ddf8ad5d1e845950ec15a2e2.tar.gz xK-b7c9e8ca23dee372ddf8ad5d1e845950ec15a2e2.tar.xz xK-b7c9e8ca23dee372ddf8ad5d1e845950ec15a2e2.zip  | |
degesch: make backlog limit configurable
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | degesch.c | 45 | 
2 files changed, 36 insertions, 11 deletions
@@ -10,6 +10,8 @@   * degesch: added a basic last.fm "now playing" plugin + * degesch: backlog limit was made configurable +   * Various bugfixes @@ -88,9 +88,6 @@ enum  /// Some arbitrary limit for the history file  #define HISTORY_LIMIT 10000 -/// How many lines of backlog to store in memory -#define BACKLOG_LIMIT 1000 -  /// Characters that separate words  #define WORD_BREAKING_CHARS " \f\n\r\t\v" @@ -1547,6 +1544,7 @@ struct app_context  	// TODO: make buffer names fully unique like weechat does  	struct str_map buffers_by_name;     ///< Buffers by name +	unsigned backlog_limit;             ///< Limit for buffer lines  	time_t last_displayed_msg_time;     ///< Time of last displayed message  	// Terminal: @@ -1616,6 +1614,8 @@ app_context_init (struct app_context *self)  	str_map_init (&self->buffers_by_name);  	self->buffers_by_name.key_xfrm = tolower_ascii_strxfrm; +	// So that we don't lose the logo shortly after startup +	self->backlog_limit = 1000;  	self->last_displayed_msg_time = time (NULL);  	char *encoding = nl_langinfo (CODESET); @@ -1701,6 +1701,7 @@ on_config_show_all_prefixes_change (struct config_item *item)  	refresh_prompt (ctx);  } +static void on_config_backlog_limit_change (struct config_item *item);  static void on_config_attribute_change (struct config_item *item);  static void on_config_logging_change (struct config_item *item); @@ -1903,6 +1904,12 @@ static struct config_schema g_config_behaviour[] =  	// You can use the -r switch, however that makes `less` very confused  	// about line wrapping, and the result is suboptimal. +	{ .name      = "backlog_limit", +	  .comment   = "Maximum number of lines stored in the backlog", +	  .type      = CONFIG_ITEM_INTEGER, +	  .validate  = config_validate_nonnegative, +	  .default_  = "1000", +	  .on_change = on_config_backlog_limit_change },  	{ .name      = "backlog_helper",  	  .comment   = "Shell command to display a buffer's history",  	  .type      = CONFIG_ITEM_STRING, @@ -2992,6 +2999,29 @@ formatter_flush (struct formatter *self, FILE *stream, bool raw_attributes)  // --- Buffers -----------------------------------------------------------------  static void +buffer_pop_excess_lines (struct app_context *ctx, struct buffer *self) +{ +	int to_delete = (int) self->lines_count - (int) ctx->backlog_limit; +	while (to_delete-- > 0 && self->lines) +	{ +		struct buffer_line *excess = self->lines; +		LIST_UNLINK_WITH_TAIL (self->lines, self->lines_tail, excess); +		buffer_line_destroy (excess); +		self->lines_count--; +	} +} + +static void +on_config_backlog_limit_change (struct config_item *item) +{ +	struct app_context *ctx = item->user_data; +	ctx->backlog_limit = MAX (item->value.integer, INT_MAX); + +	LIST_FOR_EACH (struct buffer, iter, ctx->buffers) +		buffer_pop_excess_lines (ctx, iter); +} + +static void  buffer_update_time (struct app_context *ctx, time_t now)  {  	struct tm last, current; @@ -3114,14 +3144,6 @@ log_formatter (struct app_context *ctx,  	if (!buffer)  		buffer = ctx->global_buffer; -	if (buffer->lines_count >= BACKLOG_LIMIT) -	{ -		struct buffer_line *popped = buffer->lines; -		LIST_UNLINK_WITH_TAIL (buffer->lines, buffer->lines_tail, popped); -		buffer_line_destroy (popped); -		buffer->lines_count--; -	} -  	struct buffer_line *line = buffer_line_new ();  	line->flags = flags;  	line->when = time (NULL); @@ -3130,6 +3152,7 @@ log_formatter (struct app_context *ctx,  	line->formatter = xmalloc (sizeof *line->formatter);  	*line->formatter = *f; +	buffer_pop_excess_lines (ctx, buffer);  	LIST_APPEND_WITH_TAIL (buffer->lines, buffer->lines_tail, line);  	buffer->lines_count++;  | 
