/* * 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; }