degesch: more buffer-related stuff

This commit is contained in:
Přemysl Eric Janouch 2015-04-15 16:54:05 +02:00
parent 51ca5c79e4
commit 08c0027397
1 changed files with 53 additions and 8 deletions

View File

@ -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;
}