summaryrefslogtreecommitdiff
path: root/src/gui/gtk/gui-gtk-chat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/gtk/gui-gtk-chat.c')
-rw-r--r--src/gui/gtk/gui-gtk-chat.c631
1 files changed, 631 insertions, 0 deletions
diff --git a/src/gui/gtk/gui-gtk-chat.c b/src/gui/gtk/gui-gtk-chat.c
new file mode 100644
index 000000000..15ed9dc63
--- /dev/null
+++ b/src/gui/gtk/gui-gtk-chat.c
@@ -0,0 +1,631 @@
+/*
+ * Copyright (c) 2003-2006 by FlashCode <flashcode@flashtux.org>
+ * See README for License detail, AUTHORS for developers list.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/* gui-gtk-chat.c: chat display functions for Gtk GUI */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "../../common/weechat.h"
+#include "../gui.h"
+#include "../../common/utf8.h"
+#include "../../common/weeconfig.h"
+#include "../../irc/irc.h"
+#include "gui-gtk.h"
+
+
+/*
+ * gui_chat_set_style: set style (bold, underline, ..)
+ * for a chat window
+ */
+
+void
+gui_chat_set_style (t_gui_window *window, int style)
+{
+ /* TODO: write this function for Gtk */
+ /*wattron (window->win_chat, style);*/
+ (void) window;
+ (void) style;
+}
+
+/*
+ * gui_chat_remove_style: remove style (bold, underline, ..)
+ * for a chat window
+ */
+
+void
+gui_chat_remove_style (t_gui_window *window, int style)
+{
+ /* TODO: write this function for Gtk */
+ /*wattroff (window->win_chat, style);*/
+ (void) window;
+ (void) style;
+}
+
+/*
+ * gui_chat_toggle_style: toggle a style (bold, underline, ..)
+ * for a chat window
+ */
+
+void
+gui_chat_toggle_style (t_gui_window *window, int style)
+{
+ window->current_style_attr ^= style;
+ if (window->current_style_attr & style)
+ gui_chat_set_style (window, style);
+ else
+ gui_chat_remove_style (window, style);
+}
+
+/*
+ * gui_chat_reset_style: reset style (color and attr)
+ * for a chat window
+ */
+
+void
+gui_chat_reset_style (t_gui_window *window)
+{
+ window->current_style_fg = -1;
+ window->current_style_bg = -1;
+ window->current_style_attr = 0;
+ window->current_color_attr = 0;
+
+ /* TODO: change following function call */
+ /*gui_window_set_weechat_color (window->win_chat, COLOR_WIN_CHAT);*/
+ gui_chat_remove_style (window,
+ A_BOLD | A_UNDERLINE | A_REVERSE);
+}
+
+/*
+ * gui_chat_set_color_style: set style for color
+ */
+
+void
+gui_chat_set_color_style (t_gui_window *window, int style)
+{
+ window->current_color_attr |= style;
+ /* TODO: change following function call */
+ /*wattron (window->win_chat, style);*/
+}
+
+/*
+ * gui_chat_remove_color_style: remove style for color
+ */
+
+void
+gui_chat_remove_color_style (t_gui_window *window, int style)
+{
+ window->current_color_attr &= !style;
+ /* TODO: change following function call */
+ /*wattroff (window->win_chat, style);*/
+}
+
+/*
+ * gui_chat_reset_color_style: reset style for color
+ */
+
+void
+gui_chat_reset_color_style (t_gui_window *window)
+{
+ /* TODO: change following function call */
+ /*wattroff (window->win_chat, window->current_color_attr);*/
+ window->current_color_attr = 0;
+}
+
+/*
+ * gui_chat_set_color: set color for a chat window
+ */
+
+void
+gui_chat_set_color (t_gui_window *window, int fg, int bg)
+{
+ /* TODO: write this function for Gtk */
+ /*if (((fg == -1) || (fg == 99))
+ && ((bg == -1) || (bg == 99)))
+ wattron (window->win_chat, COLOR_PAIR(63));
+ else
+ {
+ if ((fg == -1) || (fg == 99))
+ fg = WEECHAT_COLOR_WHITE;
+ if ((bg == -1) || (bg == 99))
+ bg = 0;
+ wattron (window->win_chat, COLOR_PAIR((bg * 8) + fg));
+ }*/
+ (void) window;
+ (void) fg;
+ (void) bg;
+}
+
+/*
+ * gui_chat_set_weechat_color: set a WeeChat color for a chat window
+ */
+
+void
+gui_chat_set_weechat_color (t_gui_window *window, int weechat_color)
+{
+ gui_chat_reset_style (window);
+ gui_chat_set_style (window,
+ gui_color[weechat_color]->attributes);
+ gui_chat_set_color (window,
+ gui_color[weechat_color]->foreground,
+ gui_color[weechat_color]->background);
+}
+
+/*
+ * gui_chat_draw_title: draw title window for a buffer
+ */
+
+void
+gui_chat_draw_title (t_gui_buffer *buffer, int erase)
+{
+ /* TODO: write this function for Gtk */
+ (void) buffer;
+ (void) erase;
+}
+
+/*
+ * gui_chat_word_get_next_char: returns next char of a word
+ * special chars like colors, bold, .. are skipped
+ */
+
+char *
+gui_chat_word_get_next_char (t_gui_window *window, unsigned char *string, int apply_style)
+{
+ char str_fg[3], str_bg[3];
+ int fg, bg, weechat_color;
+
+ while (string[0])
+ {
+ switch (string[0])
+ {
+ case GUI_ATTR_BOLD_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_toggle_style (window, A_BOLD);
+ break;
+ case GUI_ATTR_COLOR_CHAR:
+ string++;
+ str_fg[0] = '\0';
+ str_bg[0] = '\0';
+ fg = 99;
+ bg = 99;
+ if (isdigit (string[0]))
+ {
+ str_fg[0] = string[0];
+ str_fg[1] = '\0';
+ string++;
+ if (isdigit (string[0]))
+ {
+ str_fg[1] = string[0];
+ str_fg[2] = '\0';
+ string++;
+ }
+ }
+ if (string[0] == ',')
+ {
+ string++;
+ if (isdigit (string[0]))
+ {
+ str_bg[0] = string[0];
+ str_bg[1] = '\0';
+ string++;
+ if (isdigit (string[0]))
+ {
+ str_bg[1] = string[0];
+ str_bg[2] = '\0';
+ string++;
+ }
+ }
+ }
+ if (apply_style)
+ {
+ if (str_fg[0] || str_bg[0])
+ {
+ if (str_fg[0])
+ sscanf (str_fg, "%d", &fg);
+ else
+ fg = window->current_style_fg;
+ if (str_bg[0])
+ sscanf (str_bg, "%d", &bg);
+ else
+ bg = window->current_style_bg;
+ }
+ if (!str_fg[0] && !str_bg[0])
+ gui_chat_reset_color_style (window);
+ window->current_style_fg = fg;
+ window->current_style_bg = bg;
+ gui_chat_set_color (window, fg, bg);
+ }
+ break;
+ case GUI_ATTR_RESET_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_reset_style (window);
+ break;
+ case GUI_ATTR_FIXED_CHAR:
+ string++;
+ break;
+ case GUI_ATTR_REVERSE_CHAR:
+ case GUI_ATTR_REVERSE2_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_toggle_style (window, A_REVERSE);
+ break;
+ case GUI_ATTR_WEECHAT_COLOR_CHAR:
+ string++;
+ if (isdigit (string[0]) && isdigit (string[1]))
+ {
+ str_fg[0] = string[0];
+ str_fg[1] = string[1];
+ str_fg[2] = '\0';
+ string += 2;
+ if (apply_style)
+ {
+ sscanf (str_fg, "%d", &weechat_color);
+ gui_chat_set_weechat_color (window, weechat_color);
+ }
+ }
+ break;
+ case GUI_ATTR_WEECHAT_SET_CHAR:
+ string++;
+ switch (string[0])
+ {
+ case GUI_ATTR_BOLD_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_set_color_style (window, A_BOLD);
+ break;
+ case GUI_ATTR_REVERSE_CHAR:
+ case GUI_ATTR_REVERSE2_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_set_color_style (window, A_REVERSE);
+ break;
+ case GUI_ATTR_UNDERLINE_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_set_color_style (window, A_UNDERLINE);
+ break;
+ }
+ break;
+ case GUI_ATTR_WEECHAT_REMOVE_CHAR:
+ string++;
+ switch (string[0])
+ {
+ case GUI_ATTR_BOLD_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_remove_color_style (window, A_BOLD);
+ break;
+ case GUI_ATTR_REVERSE_CHAR:
+ case GUI_ATTR_REVERSE2_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_remove_color_style (window, A_REVERSE);
+ break;
+ case GUI_ATTR_UNDERLINE_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_remove_color_style (window, A_UNDERLINE);
+ break;
+ }
+ break;
+ case GUI_ATTR_ITALIC_CHAR:
+ string++;
+ break;
+ case GUI_ATTR_UNDERLINE_CHAR:
+ string++;
+ if (apply_style)
+ gui_chat_toggle_style (window, A_UNDERLINE);
+ break;
+ default:
+ if (string[0] < 32)
+ string++;
+ else
+ return utf8_next_char ((char *)string);
+ }
+
+ }
+
+ /* nothing found except color/attrib codes, so return NULL */
+ return NULL;
+}
+
+/*
+ * gui_chat_display_word_raw: display word on chat buffer, letter by letter
+ * special chars like color, bold, .. are interpreted
+ */
+
+void
+gui_chat_display_word_raw (t_gui_window *window, char *string)
+{
+ /*char *prev_char, *next_char, saved_char;*/
+
+ /* TODO: write this function for Gtk */
+ (void) window;
+ (void) string;
+}
+
+/*
+ * gui_chat_display_word: display a word on chat buffer
+ */
+
+void
+gui_chat_display_word (t_gui_window *window,
+ t_gui_line *line,
+ char *data,
+ char *end_offset,
+ int num_lines, int count, int *lines_displayed, int simulate)
+{
+ /*char *end_line, saved_char_end, saved_char;
+ int pos_saved_char, chars_to_display, num_displayed;*/
+
+ /* TODO: write this function for Gtk */
+ (void) window;
+ (void) line;
+ (void) data;
+ (void) end_offset;
+ (void) num_lines;
+ (void) count;
+ (void) lines_displayed;
+ (void) simulate;
+}
+
+/*
+ * gui_chat_get_word_info: returns info about next word: beginning, end, length
+ */
+
+void
+gui_chat_get_word_info (t_gui_window *window,
+ char *data,
+ int *word_start_offset, int *word_end_offset,
+ int *word_length_with_spaces, int *word_length)
+{
+ char *start_data, *prev_char, *next_char;
+ int leading_spaces, char_size;
+
+ *word_start_offset = 0;
+ *word_end_offset = 0;
+ *word_length_with_spaces = 0;
+ *word_length = 0;
+
+ start_data = data;
+
+ leading_spaces = 1;
+ while (data && data[0])
+ {
+ next_char = gui_chat_word_get_next_char (window, (unsigned char *)data, 0);
+ if (next_char)
+ {
+ prev_char = utf8_prev_char (data, next_char);
+ if (prev_char)
+ {
+ if (prev_char[0] != ' ')
+ {
+ if (leading_spaces)
+ *word_start_offset = prev_char - start_data;
+ leading_spaces = 0;
+ char_size = next_char - prev_char;
+ *word_end_offset = next_char - start_data - 1;
+ (*word_length_with_spaces) += char_size;
+ (*word_length) += char_size;
+ }
+ else
+ {
+ if (leading_spaces)
+ (*word_length_with_spaces)++;
+ else
+ {
+ *word_end_offset = prev_char - start_data - 1;
+ return;
+ }
+ }
+ data = next_char;
+ }
+ }
+ else
+ {
+ *word_end_offset = data + strlen (data) - start_data - 1;
+ return;
+ }
+ }
+}
+
+/*
+ * gui_chat_display_line: display a line in the chat window
+ * if count == 0, display whole line
+ * if count > 0, display 'count' lines (beginning from the end)
+ * if simulate == 1, nothing is displayed (for counting how
+ * many lines would have been lines displayed)
+ * returns: number of lines displayed (or simulated)
+ */
+
+int
+gui_chat_display_line (t_gui_window *window, t_gui_line *line, int count,
+ int simulate)
+{
+ /* TODO: write this function for Gtk */
+ (void) window;
+ (void) line;
+ (void) count;
+ (void) simulate;
+ return 1;
+}
+
+/*
+ * gui_chat_calculate_line_diff: returns pointer to line & offset for a difference
+ * with given line
+ */
+
+void
+gui_chat_calculate_line_diff (t_gui_window *window, t_gui_line **line,
+ int *line_pos, int difference)
+{
+ int backward, current_size;
+
+ if (!line || !line_pos)
+ return;
+
+ backward = (difference < 0);
+
+ if (!(*line))
+ {
+ /* if looking backward, start at last line of buffer */
+ if (backward)
+ {
+ *line = window->buffer->last_line;
+ if (!(*line))
+ return;
+ current_size = gui_chat_display_line (window, *line, 0, 1);
+ if (current_size == 0)
+ current_size = 1;
+ *line_pos = current_size - 1;
+ }
+ /* if looking forward, start at first line of buffer */
+ else
+ {
+ *line = window->buffer->lines;
+ if (!(*line))
+ return;
+ *line_pos = 0;
+ current_size = gui_chat_display_line (window, *line, 0, 1);
+ }
+ }
+ else
+ current_size = gui_chat_display_line (window, *line, 0, 1);
+
+ while ((*line) && (difference != 0))
+ {
+ /* looking backward */
+ if (backward)
+ {
+ if (*line_pos > 0)
+ (*line_pos)--;
+ else
+ {
+ *line = (*line)->prev_line;
+ if (*line)
+ {
+ current_size = gui_chat_display_line (window, *line, 0, 1);
+ if (current_size == 0)
+ current_size = 1;
+ *line_pos = current_size - 1;
+ }
+ }
+ difference++;
+ }
+ /* looking forward */
+ else
+ {
+ if (*line_pos < current_size - 1)
+ (*line_pos)++;
+ else
+ {
+ *line = (*line)->next_line;
+ if (*line)
+ {
+ current_size = gui_chat_display_line (window, *line, 0, 1);
+ if (current_size == 0)
+ current_size = 1;
+ *line_pos = 0;
+ }
+ }
+ difference--;
+ }
+ }
+
+ /* first or last line reached */
+ if (!(*line))
+ {
+ if (backward)
+ {
+ /* first line reached */
+ *line = window->buffer->lines;
+ *line_pos = 0;
+ }
+ else
+ {
+ /* last line reached => consider we'll display all until the end */
+ *line_pos = 0;
+ }
+ }
+}
+
+/*
+ * gui_chat_draw: draw chat window for a buffer
+ */
+
+void
+gui_chat_draw (t_gui_buffer *buffer, int erase)
+{
+ /*t_gui_window *ptr_win;
+ t_gui_line *ptr_line;
+ t_irc_dcc *dcc_first, *dcc_selected, *ptr_dcc;
+ char format_empty[32];
+ int i, j, line_pos, count, num_bars;
+ char *unit_name[] = { N_("bytes"), N_("Kb"), N_("Mb"), N_("Gb") };
+ char *unit_format[] = { "%.0Lf", "%.1Lf", "%.02Lf", "%.02Lf" };
+ long unit_divide[] = { 1, 1024, 1024*1024, 1024*1024,1024 };
+ int num_unit;
+ char format[32], date[128], *buf;
+ struct tm *date_tmp;*/
+
+ if (!gui_ok)
+ return;
+
+ /* TODO: write this function for Gtk */
+ (void) buffer;
+ (void) erase;
+}
+
+/*
+ * gui_chat_draw_line: add a line to chat window for a buffer
+ */
+
+void
+gui_chat_draw_line (t_gui_buffer *buffer, t_gui_line *line)
+{
+ t_gui_window *ptr_win;
+ unsigned char *text_without_color;
+ GtkTextIter start, end;
+
+ ptr_win = gui_buffer_find_window (buffer);
+ if (ptr_win)
+ {
+ text_without_color = gui_color_decode ((unsigned char *)(line->data), 0);
+ if (text_without_color)
+ {
+ gtk_text_buffer_insert_at_cursor (GUI_GTK(ptr_win)->textbuffer_chat,
+ (char *)text_without_color, -1);
+ gtk_text_buffer_insert_at_cursor (GUI_GTK(ptr_win)->textbuffer_chat,
+ "\n", -1);
+ gtk_text_buffer_get_bounds (GUI_GTK(ptr_win)->textbuffer_chat,
+ &start, &end);
+ /* TODO */
+ /*gtk_text_buffer_apply_tag (ptr_win->textbuffer_chat, ptr_win->texttag_chat, &start, &end);*/
+ free (text_without_color);
+ }
+ }
+}