diff options
Diffstat (limited to 'channel-buffer.c')
-rw-r--r-- | channel-buffer.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/channel-buffer.c b/channel-buffer.c new file mode 100644 index 0000000..5390439 --- /dev/null +++ b/channel-buffer.c @@ -0,0 +1,132 @@ +/* + * This data structure purpose in life is to maintain a GtkTextBuffer + * with these properies: + * + * - The channel is not editable: + * + * - There is an area after channel area where the user can enter new + * messages + * + * - You can add messages, and they will be displayed in gray in the + * channel area. + * + * - You can /commit/ messages which means they will turn black + * + * - Messages will be added to the channel area in the order they + * are committed + * + * - The user displays as either + * + * - The users nickname, followed by a colon, followed by a space, + * followed by the text that the user has entered in a normal + * typeface + * + * or + * + * - The users nickname in italic, followed by a apsce, followed + * by the text the user has entered, in italics + * + * The first style is used for nomal messages, the second for + * 'third person messages', ie. 'ssp thinks blah blah .... ' + * as opposed to 'ssp: blaah blah blah' + * + * The channel buffer also maintains a topic + * + */ +#include "channel-buffer.h" + +struct ChannelBuffer +{ + const char *user_nick; + + GtkTextBuffer *text_buffer; + GtkTextTag *nick_tag; + + GtkTextMark *mid_point; + GtkTextMark *nick_end; +}; + +static void +set_mid_point_gravity (ChannelBuffer *buffer, + gboolean left_gravity) +{ + GtkTextIter iter; + + if (gtk_text_mark_get_left_gravity (buffer->mid_point) == left_gravity) + return; + + gtk_text_buffer_get_iter_at_mark (buffer->text_buffer, &iter, + buffer->mid_point); + gtk_text_buffer_delete_mark (buffer->text_buffer, buffer->midpoint); + buffer->mid_point = gtk_text_buffer_create_mark ( + buffer->text_buffer, "mid_point", &iter, lelft_gravity); +} + +static void +channel_buffer_change_nick_text (ChannelBuffer *buffer, + const char *text, + gboolean italic) +{ + + gtk_text_buffer_insert (buffer->text_buffer, &iter, + buffer->user_nick, -1); +} + +ChannelBuffer * +channel_buffer_new (const char *user_nick) +{ + ChannelBuffer *buffer = g_new (ChannelBuffer, 1); + GtkTextIter iter; + + g_return_val_if_fail (g_utf8_validate (user_nick, -1, NULL), NULL); + + buffer->user_nick = g_strdup (user_nick); + + /* TextBuffer stuff */ + buffer->text_buffer = gtk_text_buffer_new (NULL); + buffer->nick_tag = + gtk_text_buffer_create_tag (buffer->text_buffer, "nick", + "weight", PANGO_WEIGHT_BOLD, + NULL); + + gtk_text_buffer_get_start_iter (buffer->text_buffer, &iter); + + buffer->mid_point = gtk_text_buffer_create_mark ( + buffer->text_buffer, "nick_begin", &iter, FALSE); + + buffer->nick_end = gtk_text_buffer_create_mark ( + buffer->text_buffer, "nick_end", &iter, TRUE); + + gtk_text_buffer_get_start_iter (buffer->text_buffer, &iter); + + buffer->channel_area_begin = gtk_text_buffer_create_mark ( + buffer->text_buffer, "channel_area_begin", &iter, TRUE); + + buffer->channel_area_end = gtk_text_buffer_create_mark ( + buffer->text_buffer, "channel_area_end", &iter, FALSE); + + return buffer; +} + +void channel_buffer_free (ChannelBuffer *buffer); +ChannelMessage *channel_buffer_add_message (ChannelBuffer *buffer, + const char *nick, + const char *message); +void channel_buffer_commit_message (ChannelMessage *message); +void channel_buffer_set_user_nick (ChannelBuffer *buffer, + const char *nick); +const char * channel_buffer_get_user_text (ChannelBuffer *buffer); +void channel_buffer_set_action_mode (ChannelBuffer *buffer, + gboolean action_mode); +gboolean channel_buffer_get_action_mode (ChannelBuffer *buffer); +#if 0 +void channel_buffer_set_topic (ChannelBuffer *buffer, + const char *topic); +const char * channel_buffer_get_topic (ChannelBuffer *buffer); +#endif + +GtkTextBuffer * +channel_buffer_get_text_buffer (ChannelBuffer *buffer) +{ + return buffer->text_buffer; +} |