summaryrefslogtreecommitdiff
path: root/channel-buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'channel-buffer.c')
-rw-r--r--channel-buffer.c132
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;
+}