diff options
| -rw-r--r-- | nncmpp.c | 68 | 
1 files changed, 28 insertions, 40 deletions
| @@ -605,6 +605,7 @@ row_buffer_pop_cells (struct row_buffer *self, int space)  static void  row_buffer_ellipsis (struct row_buffer *self, int target, chtype attrs)  { +	// TODO: get "attrs" from the last eaten item  	row_buffer_pop_cells (self, self->total_width - target);  	ucs4_t ellipsis = L'…'; @@ -662,31 +663,21 @@ row_buffer_flush (struct row_buffer *self)  // --- Rendering ---------------------------------------------------------------  /// Write the given UTF-8 string padded with spaces. -/// @param[in] n  The number of characters to write, or -1 for the whole string. -/// @param[in] attrs  Text attributes for the text, without padding. -///                   To change the attributes of all output, use attrset(). -/// @return The number of characters output. -static size_t -app_write_utf8 (const char *str, chtype attrs, int n) +/// @param[in] attrs  Text attributes for the text, including padding. +static void +app_write_line (const char *str, chtype attrs)  { -	if (!n) -		return 0; -  	struct row_buffer buf;  	row_buffer_init (&buf);  	row_buffer_append (&buf, str, attrs); -	if (n < 0) -		n = buf.total_width; -	if (buf.total_width > n) -		row_buffer_ellipsis (&buf, n, attrs); +	if (buf.total_width > COLS) +		row_buffer_ellipsis (&buf, COLS, attrs);  	row_buffer_flush (&buf); -	for (int i = buf.total_width; i < n; i++) -		addch (' '); - +	for (int i = buf.total_width; i < COLS; i++) +		addch (' ' | attrs);  	row_buffer_free (&buf); -	return n;  }  /// Clear a row in the header to be used and increment the listview offset @@ -884,40 +875,38 @@ app_redraw_top (void)  	g_ctx.gauge_offset = -1;  	g_ctx.gauge_width = 0; -	attrset (0);  	switch (g_ctx.client.state)  	{  	case MPD_CONNECTED:  		app_redraw_status ();  		break;  	case MPD_CONNECTING: -		attrset (APP_ATTR (HEADER)); -		app_next_row (0); -		app_write_utf8 ("Connecting to MPD...", APP_ATTR (HEADER), COLS); +		app_next_row (APP_ATTR (HEADER)); +		app_write_line ("Connecting to MPD...", APP_ATTR (HEADER));  		break;  	case MPD_DISCONNECTED: -		attrset (APP_ATTR (HEADER)); -		app_next_row (0); -		app_write_utf8 ("Disconnected", APP_ATTR (HEADER), COLS); +		app_next_row (APP_ATTR (HEADER)); +		app_write_line ("Disconnected", APP_ATTR (HEADER));  	} -	attrset (APP_ATTR (TAB_BAR)); -	app_next_row (0); +	// XXX: can we get rid of this and still make it look acceptable? +	chtype a_normal = APP_ATTR (TAB_BAR); +	chtype a_active = APP_ATTR (TAB_ACTIVE); -	// The help tab is disguised so that it's not too intruding -	size_t indent = app_write_utf8 (APP_TITLE, -		g_ctx.active_tab == g_ctx.help_tab ? APP_ATTR (TAB_ACTIVE) : 0, -1); +	struct row_buffer buf; +	row_buffer_init (&buf); -	addch (' '); -	indent++; +	// The help tab is disguised so that it's not too intruding +	row_buffer_append (&buf, APP_TITLE, +		g_ctx.active_tab == g_ctx.help_tab ? a_active : a_normal); +	row_buffer_append (&buf, " ", a_normal); -	attrset (0); -	LIST_FOR_EACH (struct tab, it, g_ctx.tabs) +	LIST_FOR_EACH (struct tab, iter, g_ctx.tabs)  	{ -		indent += app_write_utf8 (it->name, -			it == g_ctx.active_tab ? APP_ATTR (TAB_ACTIVE) : APP_ATTR (TAB_BAR), -			MIN (COLS - indent, it->name_width)); +		row_buffer_append (&buf, iter->name, +			iter == g_ctx.active_tab ? a_active : a_normal);  	} +	app_flush_buffer (&buf, a_normal);  	refresh ();  } @@ -1015,7 +1004,7 @@ app_redraw_view (void)  			row_attrs = APP_ATTR (SELECTION);  		attrset (row_attrs); -		move (g_ctx.top_height + row, 0); +		mvwhline (stdscr, g_ctx.top_height + row, 0, ' ', COLS);  		struct row_buffer buf;  		row_buffer_init (&buf); @@ -1031,8 +1020,6 @@ app_redraw_view (void)  			row_buffer_ellipsis (&buf, view_width, row_attrs);  		row_buffer_flush (&buf); -		for (int i = buf.total_width; i < view_width; i++) -			addch (' ');  		row_buffer_free (&buf);  	}  	attrset (0); @@ -2047,7 +2034,8 @@ app_log_handler (void *user_data, const char *quote, const char *fmt,  		// TODO: remember the position and attributes and restore them  		attrset (A_REVERSE);  		mvwhline (stdscr, LINES - 1, 0, A_REVERSE, COLS); -		app_write_utf8 (message.str, 0, COLS); +		app_write_line (message.str, 0); +		attrset (0);  	}  	str_free (&message); | 
