degesch: more buffer-related stuff
This commit is contained in:
		
							
								
								
									
										61
									
								
								degesch.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								degesch.c
									
									
									
									
									
								
							@@ -200,6 +200,7 @@ struct buffer
 | 
			
		||||
 | 
			
		||||
	// Channel information:
 | 
			
		||||
 | 
			
		||||
	char *mode;                         ///< Channel mode
 | 
			
		||||
	char *topic;                        ///< Channel topic
 | 
			
		||||
	struct str_map nicks;               ///< Maps nicks to "nick_info"
 | 
			
		||||
};
 | 
			
		||||
@@ -220,6 +221,7 @@ buffer_destroy (struct buffer *self)
 | 
			
		||||
	free (self->name);
 | 
			
		||||
	// Can't really free "history" here
 | 
			
		||||
	free (self->saved_line);
 | 
			
		||||
	free (self->mode);
 | 
			
		||||
	free (self->topic);
 | 
			
		||||
	str_map_free (&self->nicks);
 | 
			
		||||
	free (self);
 | 
			
		||||
@@ -253,6 +255,13 @@ struct app_context
 | 
			
		||||
	SSL_CTX *ssl_ctx;                   ///< SSL context
 | 
			
		||||
	SSL *ssl;                           ///< SSL connection
 | 
			
		||||
 | 
			
		||||
	// TODO: initialize and update these two values
 | 
			
		||||
	// TODO: probably issue a USERHOST message for ourselves after connecting
 | 
			
		||||
	//   to enable proper word-wrapping; then store it here also, separately,
 | 
			
		||||
	//   without the nickname at the beginning; also could just use WHOIS
 | 
			
		||||
	char *irc_nickname;                 ///< Current nickname
 | 
			
		||||
	char *irc_user_mode;                ///< Current user mode
 | 
			
		||||
 | 
			
		||||
	// Events:
 | 
			
		||||
 | 
			
		||||
	struct poller_fd tty_event;         ///< Terminal input event
 | 
			
		||||
@@ -353,6 +362,9 @@ app_context_free (struct app_context *self)
 | 
			
		||||
	if (self->ssl_ctx)
 | 
			
		||||
		SSL_CTX_free (self->ssl_ctx);
 | 
			
		||||
 | 
			
		||||
	free (self->irc_nickname);
 | 
			
		||||
	free (self->irc_user_mode);
 | 
			
		||||
 | 
			
		||||
	LIST_FOR_EACH (struct buffer, iter, self->buffers)
 | 
			
		||||
		buffer_destroy (iter);
 | 
			
		||||
	str_map_free (&self->buffers_by_name);
 | 
			
		||||
@@ -1251,8 +1263,9 @@ refresh_prompt (struct app_context *ctx)
 | 
			
		||||
 | 
			
		||||
	if (!ctx->irc_ready)
 | 
			
		||||
		str_append (&prompt, "(disconnected)");
 | 
			
		||||
	else
 | 
			
		||||
	else if (soft_assert (ctx->current_buffer))
 | 
			
		||||
	{
 | 
			
		||||
		struct buffer *buffer = ctx->current_buffer;
 | 
			
		||||
		str_append_c (&prompt, '[');
 | 
			
		||||
 | 
			
		||||
		char *unseen_prefix = get_unseen_prefix (ctx);
 | 
			
		||||
@@ -1260,10 +1273,14 @@ refresh_prompt (struct app_context *ctx)
 | 
			
		||||
			str_append_printf (&prompt, "(%s) ", unseen_prefix);
 | 
			
		||||
		free (unseen_prefix);
 | 
			
		||||
 | 
			
		||||
		// TODO: name of the current buffer
 | 
			
		||||
		// TODO: the channel user mode
 | 
			
		||||
		str_append (&prompt, str_map_find (&ctx->config, "nickname"));
 | 
			
		||||
		// TODO: user mode in parenthesis
 | 
			
		||||
		str_append (&prompt, buffer->name);
 | 
			
		||||
		if (buffer->type == BUFFER_CHANNEL)
 | 
			
		||||
			str_append_printf (&prompt, "(%s)", buffer->mode);
 | 
			
		||||
		str_append_c (&prompt, ' ');
 | 
			
		||||
 | 
			
		||||
		str_append (&prompt, ctx->irc_nickname);
 | 
			
		||||
		str_append_printf (&prompt, "(%s)", ctx->irc_user_mode);
 | 
			
		||||
 | 
			
		||||
		str_append_c (&prompt, ']');
 | 
			
		||||
	}
 | 
			
		||||
	str_append (&prompt, " ");
 | 
			
		||||
@@ -1303,7 +1320,19 @@ on_readline_goto_buffer (int count, int key)
 | 
			
		||||
	if (n < 0 || n > 9)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	// TODO: switch to the n-th buffer
 | 
			
		||||
	// There's no zero-th buffer
 | 
			
		||||
	if (n == 0)
 | 
			
		||||
		n = 10;
 | 
			
		||||
 | 
			
		||||
	// Activate the n-th buffer
 | 
			
		||||
	int i = 0;
 | 
			
		||||
	struct app_context *ctx = g_ctx;
 | 
			
		||||
	LIST_FOR_EACH (struct buffer, iter, ctx->buffers)
 | 
			
		||||
		if (++i == n)
 | 
			
		||||
		{
 | 
			
		||||
			buffer_activate (ctx, iter);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1312,7 +1341,15 @@ on_readline_previous_buffer (int count, int key)
 | 
			
		||||
{
 | 
			
		||||
	(void) key;
 | 
			
		||||
 | 
			
		||||
	// TODO: switch "count" times to the previous buffer
 | 
			
		||||
	struct app_context *ctx = g_ctx;
 | 
			
		||||
	if (!ctx->current_buffer)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	struct buffer *new_buffer = ctx->current_buffer;
 | 
			
		||||
	while (count-- > 0)
 | 
			
		||||
		if (!(new_buffer = new_buffer->prev))
 | 
			
		||||
			new_buffer = ctx->buffers_tail;
 | 
			
		||||
	buffer_activate (ctx, new_buffer);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1321,7 +1358,15 @@ on_readline_next_buffer (int count, int key)
 | 
			
		||||
{
 | 
			
		||||
	(void) key;
 | 
			
		||||
 | 
			
		||||
	// TODO: switch "count" times to the next buffer
 | 
			
		||||
	struct app_context *ctx = g_ctx;
 | 
			
		||||
	if (!ctx->current_buffer)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	struct buffer *new_buffer = ctx->current_buffer;
 | 
			
		||||
	while (count-- > 0)
 | 
			
		||||
		if (!(new_buffer = new_buffer->next))
 | 
			
		||||
			new_buffer = ctx->buffers;
 | 
			
		||||
	buffer_activate (ctx, new_buffer);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user