summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/curses/gui-display.c3966
-rw-r--r--src/gui/gtk/gui-display.c2339
2 files changed, 0 insertions, 6305 deletions
diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c
deleted file mode 100644
index c19b0742a..000000000
--- a/src/gui/curses/gui-display.c
+++ /dev/null
@@ -1,3966 +0,0 @@
-/*
- * 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-display.c: display functions for Curses GUI */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <signal.h>
-#include <time.h>
-#include <ctype.h>
-#include <libgen.h>
-
-#ifdef HAVE_NCURSESW_CURSES_H
-#include <ncursesw/ncurses.h>
-#else
-#include <ncurses.h>
-#endif
-
-#include "../../common/weechat.h"
-#include "../gui.h"
-#include "../../common/weeconfig.h"
-#include "../../common/hotlist.h"
-#include "../../common/log.h"
-#include "../../common/utf8.h"
-#include "../../irc/irc.h"
-
-
-/* shift ncurses colors for compatibility with colors
- in IRC messages (same as other IRC clients) */
-
-#define WEECHAT_COLOR_BLACK COLOR_BLACK
-#define WEECHAT_COLOR_RED COLOR_BLUE
-#define WEECHAT_COLOR_GREEN COLOR_GREEN
-#define WEECHAT_COLOR_YELLOW COLOR_CYAN
-#define WEECHAT_COLOR_BLUE COLOR_RED
-#define WEECHAT_COLOR_MAGENTA COLOR_MAGENTA
-#define WEECHAT_COLOR_CYAN COLOR_YELLOW
-#define WEECHAT_COLOR_WHITE COLOR_WHITE
-
-t_gui_color gui_weechat_colors[] =
-{ { -1, 0, 0, "default" },
- { WEECHAT_COLOR_BLACK, 0, 0, "black" },
- { WEECHAT_COLOR_RED, 0, 0, "red" },
- { WEECHAT_COLOR_RED, 0, A_BOLD, "lightred" },
- { WEECHAT_COLOR_GREEN, 0, 0, "green" },
- { WEECHAT_COLOR_GREEN, 0, A_BOLD, "lightgreen" },
- { WEECHAT_COLOR_YELLOW, 0, 0, "brown" },
- { WEECHAT_COLOR_YELLOW, 0, A_BOLD, "yellow" },
- { WEECHAT_COLOR_BLUE, 0, 0, "blue" },
- { WEECHAT_COLOR_BLUE, 0, A_BOLD, "lightblue" },
- { WEECHAT_COLOR_MAGENTA, 0, 0, "magenta" },
- { WEECHAT_COLOR_MAGENTA, 0, A_BOLD, "lightmagenta" },
- { WEECHAT_COLOR_CYAN, 0, 0, "cyan" },
- { WEECHAT_COLOR_CYAN, 0, A_BOLD, "lightcyan" },
- { WEECHAT_COLOR_WHITE, 0, A_BOLD, "white" },
- { 0, 0, 0, NULL }
-};
-
-int gui_irc_colors[GUI_NUM_IRC_COLORS][2] =
-{ { /* 0 */ WEECHAT_COLOR_WHITE, A_BOLD },
- { /* 1 */ WEECHAT_COLOR_BLACK, 0 },
- { /* 2 */ WEECHAT_COLOR_BLUE, 0 },
- { /* 3 */ WEECHAT_COLOR_GREEN, 0 },
- { /* 4 */ WEECHAT_COLOR_RED, A_BOLD },
- { /* 5 */ WEECHAT_COLOR_RED, 0 },
- { /* 6 */ WEECHAT_COLOR_MAGENTA, 0 },
- { /* 7 */ WEECHAT_COLOR_YELLOW, 0 },
- { /* 8 */ WEECHAT_COLOR_YELLOW, A_BOLD },
- { /* 9 */ WEECHAT_COLOR_GREEN, A_BOLD },
- { /* 10 */ WEECHAT_COLOR_CYAN, 0 },
- { /* 11 */ WEECHAT_COLOR_CYAN, A_BOLD },
- { /* 12 */ WEECHAT_COLOR_BLUE, A_BOLD },
- { /* 13 */ WEECHAT_COLOR_MAGENTA, A_BOLD },
- { /* 14 */ WEECHAT_COLOR_WHITE, 0 },
- { /* 15 */ WEECHAT_COLOR_WHITE, A_BOLD }
-};
-
-t_gui_color *gui_color[GUI_NUM_COLORS];
-
-
-/*
- * gui_assign_color: assign a WeeChat color (read from config)
- */
-
-int
-gui_assign_color (int *color, char *color_name)
-{
- int i;
-
- /* look for curses colors in table */
- i = 0;
- while (gui_weechat_colors[i].string)
- {
- if (ascii_strcasecmp (gui_weechat_colors[i].string, color_name) == 0)
- {
- *color = i;
- return 1;
- }
- i++;
- }
-
- /* color not found */
- return 0;
-}
-
-/*
- * gui_get_color_name: get color name
- */
-
-char *
-gui_get_color_name (int num_color)
-{
- return gui_weechat_colors[num_color].string;
-}
-
-/*
- * gui_color_decode: parses a message (coming from IRC server),
- * and according:
- * - remove any color/style in message
- * or:
- * - change colors by codes to be compatible with
- * other IRC clients
- * After use, string returned has to be free()
- */
-
-unsigned char *
-gui_color_decode (unsigned char *string, int keep_colors)
-{
- unsigned char *out;
- int out_length, out_pos;
- char str_fg[3], str_bg[3];
- int fg, bg, attr;
-
- out_length = (strlen ((char *)string) * 2) + 1;
- out = (unsigned char *)malloc (out_length);
- if (!out)
- return NULL;
-
- out_pos = 0;
- while (string[0] && (out_pos < out_length - 1))
- {
- switch (string[0])
- {
- case GUI_ATTR_BOLD_CHAR:
- case GUI_ATTR_RESET_CHAR:
- case GUI_ATTR_FIXED_CHAR:
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- case GUI_ATTR_ITALIC_CHAR:
- case GUI_ATTR_UNDERLINE_CHAR:
- if (keep_colors)
- out[out_pos++] = string[0];
- string++;
- break;
- case GUI_ATTR_COLOR_CHAR:
- string++;
- str_fg[0] = '\0';
- str_bg[0] = '\0';
- 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 (keep_colors)
- {
- if (!str_fg[0] && !str_bg[0])
- out[out_pos++] = GUI_ATTR_COLOR_CHAR;
- else
- {
- attr = 0;
- if (str_fg[0])
- {
- sscanf (str_fg, "%d", &fg);
- fg %= GUI_NUM_IRC_COLORS;
- attr |= gui_irc_colors[fg][1];
- }
- if (str_bg[0])
- {
- sscanf (str_bg, "%d", &bg);
- bg %= GUI_NUM_IRC_COLORS;
- attr |= gui_irc_colors[bg][1];
- }
- if (attr & A_BOLD)
- {
- out[out_pos++] = GUI_ATTR_WEECHAT_SET_CHAR;
- out[out_pos++] = GUI_ATTR_BOLD_CHAR;
- }
- else
- {
- out[out_pos++] = GUI_ATTR_WEECHAT_REMOVE_CHAR;
- out[out_pos++] = GUI_ATTR_BOLD_CHAR;
- }
- out[out_pos++] = GUI_ATTR_COLOR_CHAR;
- if (str_fg[0])
- {
- out[out_pos++] = (gui_irc_colors[fg][0] / 10) + '0';
- out[out_pos++] = (gui_irc_colors[fg][0] % 10) + '0';
- }
- if (str_bg[0])
- {
- out[out_pos++] = ',';
- out[out_pos++] = (gui_irc_colors[bg][0] / 10) + '0';
- out[out_pos++] = (gui_irc_colors[bg][0] % 10) + '0';
- }
- }
- }
- break;
- case GUI_ATTR_WEECHAT_COLOR_CHAR:
- string++;
- if (isdigit (string[0]) && isdigit (string[1]))
- {
- if (keep_colors)
- {
- out[out_pos++] = string[0];
- out[out_pos++] = string[1];
- }
- string += 2;
- }
- break;
- case GUI_ATTR_WEECHAT_SET_CHAR:
- case GUI_ATTR_WEECHAT_REMOVE_CHAR:
- string++;
- if (string[0])
- {
- if (keep_colors)
- {
- out[out_pos++] = *(string - 1);
- out[out_pos++] = string[0];
- }
- string++;
- }
- break;
- default:
- out[out_pos++] = string[0];
- string++;
- }
- }
- out[out_pos] = '\0';
- return out;
-}
-
-/*
- * gui_color_decode_for_user_entry: parses a message (coming from IRC server),
- * and replaces colors/bold/.. by %C, %B, ..
- * After use, string returned has to be free()
- */
-
-unsigned char *
-gui_color_decode_for_user_entry (unsigned char *string)
-{
- unsigned char *out;
- int out_length, out_pos;
-
- out_length = (strlen ((char *)string) * 2) + 1;
- out = (unsigned char *)malloc (out_length);
- if (!out)
- return NULL;
-
- out_pos = 0;
- while (string[0] && (out_pos < out_length - 1))
- {
- switch (string[0])
- {
- case GUI_ATTR_BOLD_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'B';
- string++;
- break;
- case GUI_ATTR_FIXED_CHAR:
- string++;
- break;
- case GUI_ATTR_RESET_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'O';
- string++;
- break;
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'R';
- string++;
- break;
- case GUI_ATTR_ITALIC_CHAR:
- string++;
- break;
- case GUI_ATTR_UNDERLINE_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'R';
- string++;
- break;
- case GUI_ATTR_COLOR_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'C';
- string++;
- break;
- default:
- out[out_pos++] = string[0];
- string++;
- }
- }
- out[out_pos] = '\0';
- return out;
-}
-
-/*
- * gui_color_encode: parses a message (entered by user), and
- * encode special chars (%B, %C, ..) in IRC colors
- * After use, string returned has to be free()
- */
-
-unsigned char *
-gui_color_encode (unsigned char *string)
-{
- unsigned char *out;
- int out_length, out_pos;
-
- out_length = (strlen ((char *)string) * 2) + 1;
- out = (unsigned char *)malloc (out_length);
- if (!out)
- return NULL;
-
- out_pos = 0;
- while (string[0] && (out_pos < out_length - 1))
- {
- switch (string[0])
- {
- case '%':
- string++;
- switch (string[0])
- {
- case '\0':
- out[out_pos++] = '%';
- break;
- case '%': /* double '%' replaced by single '%' */
- out[out_pos++] = string[0];
- string++;
- break;
- case 'B': /* bold */
- out[out_pos++] = GUI_ATTR_BOLD_CHAR;
- string++;
- break;
- case 'C': /* color */
- out[out_pos++] = GUI_ATTR_COLOR_CHAR;
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- }
- }
- if (string[0] == ',')
- {
- out[out_pos++] = ',';
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- }
- }
- }
- break;
- case 'O': /* reset */
- out[out_pos++] = GUI_ATTR_RESET_CHAR;
- string++;
- break;
- case 'R': /* reverse */
- out[out_pos++] = GUI_ATTR_REVERSE_CHAR;
- string++;
- break;
- case 'U': /* underline */
- out[out_pos++] = GUI_ATTR_UNDERLINE_CHAR;
- string++;
- break;
- default:
- out[out_pos++] = '%';
- out[out_pos++] = string[0];
- string++;
- }
- break;
- default:
- out[out_pos++] = string[0];
- string++;
- }
- }
- out[out_pos] = '\0';
- return out;
-}
-
-/*
- * gui_color_build: build a WeeChat color with foreground,
- * background and attributes (attributes are
- * given with foreground color, with a OR)
- */
-
-t_gui_color *
-gui_color_build (int number, int foreground, int background)
-{
- t_gui_color *new_color;
-
- new_color = (t_gui_color *)malloc (sizeof (t_gui_color));
- if (!new_color)
- return NULL;
-
- new_color->foreground = gui_weechat_colors[foreground].foreground;
- new_color->background = gui_weechat_colors[background].foreground;
- new_color->attributes = gui_weechat_colors[foreground].attributes;
- new_color->string = (char *)malloc (4);
- if (new_color->string)
- snprintf (new_color->string, 4,
- "%s%02d",
- GUI_ATTR_WEECHAT_COLOR_STR, number);
-
- return new_color;
-}
-
-/*
- * gui_color_get_pair: get color pair with a WeeChat color number
- */
-
-int
-gui_color_get_pair (int num_color)
-{
- int fg, bg;
-
- if ((num_color < 0) || (num_color > GUI_NUM_COLORS - 1))
- return WEECHAT_COLOR_WHITE;
-
- fg = gui_color[num_color]->foreground;
- bg = gui_color[num_color]->background;
-
- if (((fg == -1) || (fg == 99))
- && ((bg == -1) || (bg == 99)))
- return 63;
- if ((fg == -1) || (fg == 99))
- fg = WEECHAT_COLOR_WHITE;
- if ((bg == -1) || (bg == 99))
- bg = 0;
-
- return (bg * 8) + fg;
-}
-
-/*
- * gui_window_set_weechat_color: set WeeChat color for window
- */
-
-void
-gui_window_set_weechat_color (WINDOW *window, int num_color)
-{
- if ((num_color >= 0) && (num_color <= GUI_NUM_COLORS - 1))
- {
- wattroff (window, A_BOLD | A_UNDERLINE | A_REVERSE);
- wattron (window, COLOR_PAIR(gui_color_get_pair (num_color)) |
- gui_color[num_color]->attributes);
- }
-}
-
-/*
- * gui_window_chat_set_style: set style (bold, underline, ..)
- * for a chat window
- */
-
-void
-gui_window_chat_set_style (t_gui_window *window, int style)
-{
- wattron (window->win_chat, style);
-}
-
-/*
- * gui_window_chat_remove_style: remove style (bold, underline, ..)
- * for a chat window
- */
-
-void
-gui_window_chat_remove_style (t_gui_window *window, int style)
-{
- wattroff (window->win_chat, style);
-}
-
-/*
- * gui_window_chat_toggle_style: toggle a style (bold, underline, ..)
- * for a chat window
- */
-
-void
-gui_window_chat_toggle_style (t_gui_window *window, int style)
-{
- window->current_style_attr ^= style;
- if (window->current_style_attr & style)
- gui_window_chat_set_style (window, style);
- else
- gui_window_chat_remove_style (window, style);
-}
-
-/*
- * gui_window_chat_reset_style: reset style (color and attr)
- * for a chat window
- */
-
-void
-gui_window_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;
-
- gui_window_set_weechat_color (window->win_chat, COLOR_WIN_CHAT);
- gui_window_chat_remove_style (window,
- A_BOLD | A_UNDERLINE | A_REVERSE);
-}
-
-/*
- * gui_window_chat_set_color_style: set style for color
- */
-
-void
-gui_window_chat_set_color_style (t_gui_window *window, int style)
-{
- window->current_color_attr |= style;
- wattron (window->win_chat, style);
-}
-
-/*
- * gui_window_chat_remove_color_style: remove style for color
- */
-
-void
-gui_window_chat_remove_color_style (t_gui_window *window, int style)
-{
- window->current_color_attr &= !style;
- wattroff (window->win_chat, style);
-}
-
-/*
- * gui_window_chat_reset_color_style: reset style for color
- */
-
-void
-gui_window_chat_reset_color_style (t_gui_window *window)
-{
- wattroff (window->win_chat, window->current_color_attr);
- window->current_color_attr = 0;
-}
-
-/*
- * gui_window_chat_set_color: set color for a chat window
- */
-
-void
-gui_window_chat_set_color (t_gui_window *window, int fg, int bg)
-{
- 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));
- }
-}
-
-/*
- * gui_window_chat_set_weechat_color: set a WeeChat color for a chat window
- */
-
-void
-gui_window_chat_set_weechat_color (t_gui_window *window, int weechat_color)
-{
- gui_window_chat_reset_style (window);
- gui_window_chat_set_style (window,
- gui_color[weechat_color]->attributes);
- gui_window_chat_set_color (window,
- gui_color[weechat_color]->foreground,
- gui_color[weechat_color]->background);
-}
-
-/*
- * gui_window_input_set_color: set color for an input window
- */
-
-void
-gui_window_input_set_color (t_gui_window *window, int irc_color)
-{
- int fg, bg;
-
- fg = gui_irc_colors[irc_color][0];
- bg = gui_color[COLOR_WIN_INPUT]->background;
-
- irc_color %= GUI_NUM_IRC_COLORS;
- if (gui_irc_colors[irc_color][1] & A_BOLD)
- wattron (window->win_input, A_BOLD);
-
- if (((fg == -1) || (fg == 99))
- && ((bg == -1) || (bg == 99)))
- wattron (window->win_input, COLOR_PAIR(63));
- else
- {
- if ((fg == -1) || (fg == 99))
- fg = WEECHAT_COLOR_WHITE;
- if ((bg == -1) || (bg == 99))
- bg = 0;
- wattron (window->win_input, COLOR_PAIR((bg * 8) + fg));
- }
-}
-
-/*
- * gui_calculate_pos_size: calculate position and size for a buffer & subwindows
- * return 1 if pos/size changed, 0 if no change
- */
-
-int
-gui_calculate_pos_size (t_gui_window *window, int force_calculate)
-{
- int max_length, max_height, lines;
- int num_nicks, num_op, num_halfop, num_voice, num_normal;
-
- if (!gui_ok)
- return 0;
-
- /* init chat & nicklist settings */
- if (cfg_look_nicklist && BUFFER_IS_CHANNEL(window->buffer))
- {
- max_length = nick_get_max_length (CHANNEL(window->buffer));
-
- lines = 0;
-
- if ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_LEFT) ||
- (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_RIGHT))
- {
- if ((cfg_look_nicklist_min_size > 0)
- && (max_length < cfg_look_nicklist_min_size))
- max_length = cfg_look_nicklist_min_size;
- else if ((cfg_look_nicklist_max_size > 0)
- && (max_length > cfg_look_nicklist_max_size))
- max_length = cfg_look_nicklist_max_size;
- if (!force_calculate && (window->win_nick_width == max_length + 2))
- return 0;
- }
- else
- {
- nick_count (CHANNEL(window->buffer), &num_nicks, &num_op,
- &num_halfop, &num_voice, &num_normal);
- if (((max_length + 2) * num_nicks) % window->win_width == 0)
- lines = ((max_length + 2) * num_nicks) / window->win_width;
- else
- lines = (((max_length + 2) * num_nicks) / window->win_width) + 1;
- if ((cfg_look_nicklist_max_size > 0) && (lines > cfg_look_nicklist_max_size))
- lines = cfg_look_nicklist_max_size;
- if ((cfg_look_nicklist_min_size > 0) && (lines < cfg_look_nicklist_min_size))
- lines = cfg_look_nicklist_min_size;
- max_height = (cfg_look_infobar) ?
- window->win_height - 3 - 4 : window->win_height - 2 - 4;
- if (lines > max_height)
- lines = max_height;
- if (!force_calculate && (window->win_nick_height == lines + 1))
- return 0;
- }
-
- switch (cfg_look_nicklist_position)
- {
- case CFG_LOOK_NICKLIST_LEFT:
- window->win_chat_x = window->win_x + max_length + 2;
- window->win_chat_y = window->win_y + 1;
- window->win_chat_width = window->win_width - max_length - 2;
- window->win_nick_x = window->win_x + 0;
- window->win_nick_y = window->win_y + 1;
- window->win_nick_width = max_length + 2;
- if (cfg_look_infobar)
- {
- window->win_chat_height = window->win_height - 4;
- window->win_nick_height = window->win_height - 4;
- }
- else
- {
- window->win_chat_height = window->win_height - 3;
- window->win_nick_height = window->win_height - 3;
- }
- window->win_nick_num_max = window->win_nick_height;
- break;
- case CFG_LOOK_NICKLIST_RIGHT:
- window->win_chat_x = window->win_x;
- window->win_chat_y = window->win_y + 1;
- window->win_chat_width = window->win_width - max_length - 2;
- window->win_nick_x = window->win_x + window->win_width - max_length - 2;
- window->win_nick_y = window->win_y + 1;
- window->win_nick_width = max_length + 2;
- if (cfg_look_infobar)
- {
- window->win_chat_height = window->win_height - 4;
- window->win_nick_height = window->win_height - 4;
- }
- else
- {
- window->win_chat_height = window->win_height - 3;
- window->win_nick_height = window->win_height - 3;
- }
- window->win_nick_num_max = window->win_nick_height;
- break;
- case CFG_LOOK_NICKLIST_TOP:
- window->win_chat_x = window->win_x;
- window->win_chat_y = window->win_y + 1 + (lines + 1);
- window->win_chat_width = window->win_width;
- if (cfg_look_infobar)
- window->win_chat_height = window->win_height - 3 - (lines + 1) - 1;
- else
- window->win_chat_height = window->win_height - 3 - (lines + 1);
- window->win_nick_x = window->win_x;
- window->win_nick_y = window->win_y + 1;
- window->win_nick_width = window->win_width;
- window->win_nick_height = lines + 1;
- window->win_nick_num_max = lines * (window->win_nick_width / (max_length + 2));
- break;
- case CFG_LOOK_NICKLIST_BOTTOM:
- window->win_chat_x = window->win_x;
- window->win_chat_y = window->win_y + 1;
- window->win_chat_width = window->win_width;
- if (cfg_look_infobar)
- window->win_chat_height = window->win_height - 3 - (lines + 1) - 1;
- else
- window->win_chat_height = window->win_height - 3 - (lines + 1);
- window->win_nick_x = window->win_x;
- if (cfg_look_infobar)
- window->win_nick_y = window->win_y + window->win_height - 2 - (lines + 1) - 1;
- else
- window->win_nick_y = window->win_y + window->win_height - 2 - (lines + 1);
- window->win_nick_width = window->win_width;
- window->win_nick_height = lines + 1;
- window->win_nick_num_max = lines * (window->win_nick_width / (max_length + 2));
- break;
- }
-
- window->win_chat_cursor_x = window->win_x;
- window->win_chat_cursor_y = window->win_y;
- }
- else
- {
- window->win_chat_x = window->win_x;
- window->win_chat_y = window->win_y + 1;
- window->win_chat_width = window->win_width;
- if (cfg_look_infobar)
- window->win_chat_height = window->win_height - 4;
- else
- window->win_chat_height = window->win_height - 3;
- window->win_chat_cursor_x = window->win_x;
- window->win_chat_cursor_y = window->win_y;
- window->win_nick_x = -1;
- window->win_nick_y = -1;
- window->win_nick_width = -1;
- window->win_nick_height = -1;
- window->win_nick_num_max = -1;
- }
-
- return 1;
-}
-
-/*
- * gui_curses_window_clear: clear a window
- */
-
-void
-gui_curses_window_clear (WINDOW *window, int num_color)
-{
- if (!gui_ok)
- return;
-
- wbkgdset(window, ' ' | COLOR_PAIR (gui_color_get_pair (num_color)));
- werase (window);
- wmove (window, 0, 0);
-}
-
-/*
- * gui_draw_window_separator: draw window separation
- */
-
-void
-gui_draw_window_separator (t_gui_window *window)
-{
- if (window->win_separator)
- delwin (window->win_separator);
-
- if (window->win_x > 0)
- {
- window->win_separator = newwin (window->win_height,
- 1,
- window->win_y,
- window->win_x - 1);
- gui_window_set_weechat_color (window->win_separator, COLOR_WIN_SEPARATOR);
- wborder (window->win_separator, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
- wnoutrefresh (window->win_separator);
- refresh ();
- }
-}
-
-/*
- * gui_draw_buffer_title: draw title window for a buffer
- */
-
-void
-gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
-{
- t_gui_window *ptr_win;
- char format[32], *buf, *buf2;
-
- if (!gui_ok)
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (ptr_win->buffer == buffer)
- {
- if (erase)
- gui_curses_window_clear (ptr_win->win_title, COLOR_WIN_TITLE);
-
- gui_window_set_weechat_color (ptr_win->win_title, COLOR_WIN_TITLE);
- snprintf (format, 32, "%%-%ds", ptr_win->win_width);
- if (CHANNEL(buffer))
- {
- if (CHANNEL(buffer)->topic)
- {
- buf = (char *)gui_color_decode ((unsigned char *)(CHANNEL(buffer)->topic), 0);
- buf2 = channel_iconv_decode (SERVER(buffer),
- CHANNEL(buffer),
- (buf) ? buf : CHANNEL(buffer)->topic);
- mvwprintw (ptr_win->win_title, 0, 0, format, (buf2) ? buf2 : CHANNEL(buffer)->topic);
- if (buf)
- free (buf);
- if (buf2)
- free (buf2);
- }
- else
- mvwprintw (ptr_win->win_title, 0, 0, format, " ");
- }
- else
- {
- if (buffer->type == BUFFER_TYPE_STANDARD)
- {
- mvwprintw (ptr_win->win_title, 0, 0,
- format,
- PACKAGE_STRING " " WEECHAT_COPYRIGHT_DATE " - "
- WEECHAT_WEBSITE);
- }
- else
- mvwprintw (ptr_win->win_title, 0, 0, format, " ");
- }
- wnoutrefresh (ptr_win->win_title);
- refresh ();
- }
- }
-}
-
-/*
- * gui_curses_display_new_line: display a new line
- */
-
-void
-gui_curses_display_new_line (t_gui_window *window, int num_lines, int count,
- int *lines_displayed, int simulate)
-{
- if ((count == 0) || (*lines_displayed >= num_lines - count))
- {
- if ((!simulate) && (window->win_chat_cursor_x <= window->win_chat_width - 1))
- {
- wmove (window->win_chat,
- window->win_chat_cursor_y,
- window->win_chat_cursor_x);
- wclrtoeol (window->win_chat);
- }
- window->win_chat_cursor_y++;
- }
- window->win_chat_cursor_x = 0;
- (*lines_displayed)++;
-}
-
-/*
- * gui_word_get_next_char: returns next char of a word
- * special chars like colors, bold, .. are skipped
- */
-
-char *
-gui_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_window_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_window_chat_reset_color_style (window);
- window->current_style_fg = fg;
- window->current_style_bg = bg;
- gui_window_chat_set_color (window, fg, bg);
- }
- break;
- case GUI_ATTR_RESET_CHAR:
- string++;
- if (apply_style)
- gui_window_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_window_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_window_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_window_chat_set_color_style (window, A_BOLD);
- break;
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- string++;
- if (apply_style)
- gui_window_chat_set_color_style (window, A_REVERSE);
- break;
- case GUI_ATTR_UNDERLINE_CHAR:
- string++;
- if (apply_style)
- gui_window_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_window_chat_remove_color_style (window, A_BOLD);
- break;
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- string++;
- if (apply_style)
- gui_window_chat_remove_color_style (window, A_REVERSE);
- break;
- case GUI_ATTR_UNDERLINE_CHAR:
- string++;
- if (apply_style)
- gui_window_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_window_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_display_word_raw: display word on chat buffer, letter by letter
- * special chars like color, bold, .. are interpreted
- */
-
-void
-gui_display_word_raw (t_gui_window *window, char *string)
-{
- char *prev_char, *next_char, saved_char;
-
- wmove (window->win_chat,
- window->win_chat_cursor_y,
- window->win_chat_cursor_x);
-
- while (string && string[0])
- {
- next_char = gui_word_get_next_char (window, (unsigned char *)string, 1);
- if (!next_char)
- return;
-
- prev_char = utf8_prev_char (string, next_char);
- if (prev_char)
- {
- saved_char = next_char[0];
- next_char[0] = '\0';
- wprintw (window->win_chat, "%s", prev_char);
- next_char[0] = saved_char;
- }
-
- string = next_char;
- }
-}
-
-/*
- * gui_display_word: display a word on chat buffer
- */
-
-void
-gui_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;
-
- if (!data ||
- ((!simulate) && (window->win_chat_cursor_y >= window->win_chat_height)))
- return;
-
- end_line = data + strlen (data);
-
- if (end_offset[0])
- {
- saved_char_end = end_offset[1];
- end_offset[1] = '\0';
- }
- else
- {
- end_offset = NULL;
- saved_char_end = '\0';
- }
-
- while (data && data[0])
- {
- /* insert spaces for align text under time/nick */
- if ((line->length_align > 0) &&
- (window->win_chat_cursor_x == 0) &&
- (*lines_displayed > 0) &&
- /* TODO: modify arbitraty value for non aligning messages on time/nick? */
- (line->length_align < (window->win_chat_width - 5)))
- {
- if (!simulate)
- {
- wmove (window->win_chat,
- window->win_chat_cursor_y,
- window->win_chat_cursor_x);
- wclrtoeol (window->win_chat);
- }
- window->win_chat_cursor_x += line->length_align;
- }
-
- chars_to_display = gui_word_strlen (window, data);
-
- /* too long for current line */
- if (window->win_chat_cursor_x + chars_to_display > window->win_chat_width)
- {
- num_displayed = window->win_chat_width - window->win_chat_cursor_x;
- pos_saved_char = gui_word_real_pos (window, data, num_displayed);
- saved_char = data[pos_saved_char];
- data[pos_saved_char] = '\0';
- if ((!simulate) &&
- ((count == 0) || (*lines_displayed >= num_lines - count)))
- gui_display_word_raw (window, data);
- data[pos_saved_char] = saved_char;
- data += pos_saved_char;
- }
- else
- {
- num_displayed = chars_to_display;
- if ((!simulate) &&
- ((count == 0) || (*lines_displayed >= num_lines - count)))
- gui_display_word_raw (window, data);
- data += strlen (data);
- }
-
- window->win_chat_cursor_x += num_displayed;
-
- /* display new line? */
- if ((data >= end_line) ||
- (((simulate) ||
- (window->win_chat_cursor_y <= window->win_chat_height - 1)) &&
- (window->win_chat_cursor_x > (window->win_chat_width - 1))))
- gui_curses_display_new_line (window, num_lines, count,
- lines_displayed, simulate);
-
- if ((data >= end_line) ||
- ((!simulate) && (window->win_chat_cursor_y >= window->win_chat_height)))
- data = NULL;
- }
-
- if (end_offset)
- end_offset[1] = saved_char_end;
-}
-
-/*
- * gui_get_word_info: returns info about next word: beginning, end, length
- */
-
-void
-gui_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_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_curses_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_curses_display_line (t_gui_window *window, t_gui_line *line, int count,
- int simulate)
-{
- int num_lines, x, y, lines_displayed;
- int read_marker_x, read_marker_y;
- int word_start_offset, word_end_offset;
- int word_length_with_spaces, word_length;
- char *ptr_data, *ptr_end_offset, *next_char, *prev_char;
- char *ptr_style, saved_char;
-
- if (simulate)
- {
- x = window->win_chat_cursor_x;
- y = window->win_chat_cursor_y;
- window->win_chat_cursor_x = 0;
- window->win_chat_cursor_y = 0;
- num_lines = 0;
- }
- else
- {
- if (window->win_chat_cursor_y > window->win_chat_height - 1)
- return 0;
- x = window->win_chat_cursor_x;
- y = window->win_chat_cursor_y;
- num_lines = gui_curses_display_line (window, line, 0, 1);
- window->win_chat_cursor_x = x;
- window->win_chat_cursor_y = y;
- }
-
- /* calculate marker position (maybe not used for this line!) */
- if (line->ofs_after_date > 0)
- {
- saved_char = line->data[line->ofs_after_date - 1];
- line->data[line->ofs_after_date - 1] = '\0';
- read_marker_x = x + gui_word_strlen (NULL, line->data);
- line->data[line->ofs_after_date - 1] = saved_char;
- }
- else
- read_marker_x = x;
- read_marker_y = y;
-
- /* reset color & style for a new line */
- gui_window_chat_reset_style (window);
-
- lines_displayed = 0;
- ptr_data = line->data;
- while (ptr_data && ptr_data[0])
- {
- gui_get_word_info (window,
- ptr_data,
- &word_start_offset,
- &word_end_offset,
- &word_length_with_spaces, &word_length);
-
- ptr_end_offset = ptr_data + word_end_offset;
-
- if (word_length > 0)
- {
- /* spaces + word too long for current line but ok for next line */
- if ((window->win_chat_cursor_x + word_length_with_spaces > window->win_chat_width)
- && (word_length <= window->win_chat_width - line->length_align))
- {
- gui_curses_display_new_line (window, num_lines, count,
- &lines_displayed, simulate);
- /* apply styles before jumping to start of word */
- if (!simulate && (word_start_offset > 0))
- {
- saved_char = ptr_data[word_start_offset];
- ptr_data[word_start_offset] = '\0';
- ptr_style = ptr_data;
- while ((ptr_style = gui_word_get_next_char (window, (unsigned char *)ptr_style, 1)) != NULL)
- {
- /* loop until no style/char available */
- }
- ptr_data[word_start_offset] = saved_char;
- }
- /* jump to start of word */
- ptr_data += word_start_offset;
- }
-
- /* display word */
- gui_display_word (window, line, ptr_data,
- ptr_end_offset,
- num_lines, count, &lines_displayed, simulate);
-
- if ((!simulate) && (window->win_chat_cursor_y >= window->win_chat_height))
- ptr_data = NULL;
- else
- {
- /* move pointer after end of word */
- ptr_data = ptr_end_offset + 1;
- if (*(ptr_data - 1) == '\0')
- ptr_data = NULL;
-
- if (window->win_chat_cursor_x == 0)
- {
- while (ptr_data && (ptr_data[0] == ' '))
- {
- next_char = gui_word_get_next_char (window,
- (unsigned char *)ptr_data, 0);
- if (!next_char)
- break;
- prev_char = utf8_prev_char (ptr_data, next_char);
- if (prev_char && (prev_char[0] == ' '))
- ptr_data = next_char;
- else
- break;
- }
- }
- }
- }
- else
- {
- gui_curses_display_new_line (window, num_lines, count,
- &lines_displayed, simulate);
- ptr_data = NULL;
- }
- }
-
- if (simulate)
- {
- window->win_chat_cursor_x = x;
- window->win_chat_cursor_y = y;
- }
- else
- {
- /* display read marker if needed */
- if (cfg_look_read_marker && cfg_look_read_marker[0] &&
- window->buffer->last_read_line &&
- (window->buffer->last_read_line == line->prev_line))
- {
- gui_window_chat_set_weechat_color (window, COLOR_WIN_CHAT_READ_MARKER);
- mvwprintw (window->win_chat, read_marker_y, read_marker_x,
- "%c", cfg_look_read_marker[0]);
- }
- }
-
- return lines_displayed;
-}
-
-/*
- * gui_calculate_line_diff: returns pointer to line & offset for a difference
- * with given line
- */
-
-void
-gui_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_curses_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_curses_display_line (window, *line, 0, 1);
- }
- }
- else
- current_size = gui_curses_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_curses_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_curses_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_draw_buffer_chat: draw chat window for a buffer
- */
-
-void
-gui_draw_buffer_chat (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;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (ptr_win->buffer == buffer)
- {
- if (erase)
- {
- gui_window_set_weechat_color (ptr_win->win_chat, COLOR_WIN_CHAT);
-
- snprintf (format_empty, 32, "%%-%ds", ptr_win->win_chat_width);
- for (i = 0; i < ptr_win->win_chat_height; i++)
- {
- mvwprintw (ptr_win->win_chat, i, 0, format_empty, " ");
- }
- }
-
- gui_window_set_weechat_color (ptr_win->win_chat, COLOR_WIN_CHAT);
-
- if (buffer->type == BUFFER_TYPE_DCC)
- {
- i = 0;
- dcc_first = (ptr_win->dcc_first) ? (t_irc_dcc *) ptr_win->dcc_first : dcc_list;
- dcc_selected = (ptr_win->dcc_selected) ? (t_irc_dcc *) ptr_win->dcc_selected : dcc_list;
- for (ptr_dcc = dcc_first; ptr_dcc; ptr_dcc = ptr_dcc->next_dcc)
- {
- if (i >= ptr_win->win_chat_height - 1)
- break;
-
- /* nickname and filename */
- gui_window_set_weechat_color (ptr_win->win_chat,
- (ptr_dcc == dcc_selected) ?
- COLOR_DCC_SELECTED : COLOR_WIN_CHAT);
- mvwprintw (ptr_win->win_chat, i, 0, "%s %-16s ",
- (ptr_dcc == dcc_selected) ? "***" : " ",
- ptr_dcc->nick);
- buf = channel_iconv_decode (SERVER(buffer),
- CHANNEL(buffer),
- (DCC_IS_CHAT(ptr_dcc->type)) ?
- _(ptr_dcc->filename) : ptr_dcc->filename);
- wprintw (ptr_win->win_chat, "%s", buf);
- free (buf);
- if (DCC_IS_FILE(ptr_dcc->type))
- {
- if (ptr_dcc->filename_suffix > 0)
- wprintw (ptr_win->win_chat, " (.%d)",
- ptr_dcc->filename_suffix);
- }
-
- /* status */
- gui_window_set_weechat_color (ptr_win->win_chat,
- (ptr_dcc == dcc_selected) ?
- COLOR_DCC_SELECTED : COLOR_WIN_CHAT);
- mvwprintw (ptr_win->win_chat, i + 1, 0, "%s %s ",
- (ptr_dcc == dcc_selected) ? "***" : " ",
- (DCC_IS_RECV(ptr_dcc->type)) ? "-->>" : "<<--");
- gui_window_set_weechat_color (ptr_win->win_chat,
- COLOR_DCC_WAITING + ptr_dcc->status);
- buf = channel_iconv_decode (SERVER(buffer),
- CHANNEL(buffer),
- _(dcc_status_string[ptr_dcc->status]));
- wprintw (ptr_win->win_chat, "%-10s", buf);
- free (buf);
-
- /* other infos */
- gui_window_set_weechat_color (ptr_win->win_chat,
- (ptr_dcc == dcc_selected) ?
- COLOR_DCC_SELECTED : COLOR_WIN_CHAT);
- if (DCC_IS_FILE(ptr_dcc->type))
- {
- wprintw (ptr_win->win_chat, " [");
- if (ptr_dcc->size == 0)
- num_bars = 10;
- else
- num_bars = (int)((((long double)(ptr_dcc->pos)/(long double)(ptr_dcc->size))*100) / 10);
- for (j = 0; j < num_bars - 1; j++)
- wprintw (ptr_win->win_chat, "=");
- if (num_bars > 0)
- wprintw (ptr_win->win_chat, ">");
- for (j = 0; j < 10 - num_bars; j++)
- wprintw (ptr_win->win_chat, " ");
-
- if (ptr_dcc->size < 1024*10)
- num_unit = 0;
- else if (ptr_dcc->size < 1024*1024)
- num_unit = 1;
- else if (ptr_dcc->size < 1024*1024*1024)
- num_unit = 2;
- else
- num_unit = 3;
- wprintw (ptr_win->win_chat, "] %3lu%% ",
- (unsigned long)(((long double)(ptr_dcc->pos)/(long double)(ptr_dcc->size))*100));
- sprintf (format, "%s %%s / %s %%s",
- unit_format[num_unit],
- unit_format[num_unit]);
- wprintw (ptr_win->win_chat, format,
- ((long double)(ptr_dcc->pos)) / ((long double)(unit_divide[num_unit])),
- unit_name[num_unit],
- ((long double)(ptr_dcc->size)) / ((long double)(unit_divide[num_unit])),
- unit_name[num_unit]);
-
- if (ptr_dcc->bytes_per_sec < 1024*1024)
- num_unit = 1;
- else if (ptr_dcc->bytes_per_sec < 1024*1024*1024)
- num_unit = 2;
- else
- num_unit = 3;
- wprintw (ptr_win->win_chat, " (");
- if (ptr_dcc->status == DCC_ACTIVE)
- {
- wprintw (ptr_win->win_chat, _("ETA"));
- wprintw (ptr_win->win_chat, ": %.2lu:%.2lu:%.2lu - ",
- ptr_dcc->eta / 3600,
- (ptr_dcc->eta / 60) % 60,
- ptr_dcc->eta % 60);
- }
- sprintf (format, "%s %%s/s)", unit_format[num_unit]);
- buf = channel_iconv_decode (SERVER(buffer),
- CHANNEL(buffer),
- unit_name[num_unit]);
- wprintw (ptr_win->win_chat, format,
- ((long double) ptr_dcc->bytes_per_sec) / ((long double)(unit_divide[num_unit])),
- buf);
- free (buf);
- }
- else
- {
- date_tmp = localtime (&(ptr_dcc->start_time));
- strftime (date, sizeof (date) - 1, "%a, %d %b %Y %H:%M:%S", date_tmp);
- wprintw (ptr_win->win_chat, " %s", date);
- }
-
- wclrtoeol (ptr_win->win_chat);
-
- ptr_win->dcc_last_displayed = ptr_dcc;
- i += 2;
- }
- }
- else
- {
- ptr_win->win_chat_cursor_x = 0;
- ptr_win->win_chat_cursor_y = 0;
-
- /* display at position of scrolling */
- if (ptr_win->start_line)
- {
- ptr_line = ptr_win->start_line;
- line_pos = ptr_win->start_line_pos;
- }
- else
- {
- /* look for first line to display, starting from last line */
- ptr_line = NULL;
- line_pos = 0;
- gui_calculate_line_diff (ptr_win, &ptr_line, &line_pos,
- (-1) * (ptr_win->win_chat_height - 1));
- }
-
- if (line_pos > 0)
- {
- /* display end of first line at top of screen */
- gui_curses_display_line (ptr_win, ptr_line,
- gui_curses_display_line (ptr_win,
- ptr_line,
- 0, 1) -
- line_pos, 0);
- ptr_line = ptr_line->next_line;
- ptr_win->first_line_displayed = 0;
- }
- else
- ptr_win->first_line_displayed =
- (ptr_line == ptr_win->buffer->lines);
-
- /* display lines */
- count = 0;
- while (ptr_line && (ptr_win->win_chat_cursor_y <= ptr_win->win_chat_height - 1))
- {
- count = gui_curses_display_line (ptr_win, ptr_line, 0, 0);
- ptr_line = ptr_line->next_line;
- }
-
- ptr_win->scroll = (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1);
-
- /* check if last line of buffer is entirely displayed and scrolling */
- /* if so, disable scroll indicator */
- if (!ptr_line && ptr_win->scroll)
- {
- if (count == gui_curses_display_line (ptr_win, ptr_win->buffer->last_line, 0, 1))
- {
- ptr_win->scroll = 0;
- ptr_win->start_line = NULL;
- ptr_win->start_line_pos = 0;
- }
- }
-
- if (!ptr_win->scroll && (ptr_win->start_line == ptr_win->buffer->lines))
- {
- ptr_win->start_line = NULL;
- ptr_win->start_line_pos = 0;
- }
-
- /* cursor is below end line of chat window? */
- if (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1)
- {
- ptr_win->win_chat_cursor_x = 0;
- ptr_win->win_chat_cursor_y = ptr_win->win_chat_height - 1;
- }
- }
- wnoutrefresh (ptr_win->win_chat);
- refresh ();
- }
- }
-}
-
-/*
- * gui_draw_buffer_chat_line: add a line to chat window for a buffer
- */
-
-void
-gui_draw_buffer_chat_line (t_gui_buffer *buffer, t_gui_line *line)
-{
- /* This function does nothing in Curses GUI,
- line will be displayed by gui_buffer_draw_chat() */
- (void) buffer;
- (void) line;
-}
-
-/*
- * gui_draw_buffer_nick: draw nick window for a buffer
- */
-
-void
-gui_draw_buffer_nick (t_gui_buffer *buffer, int erase)
-{
- t_gui_window *ptr_win;
- int i, j, x, y, x2, column, max_length, nicks_displayed;
- char format[32], format_empty[32];
- t_irc_nick *ptr_nick;
-
- if (!gui_ok || !BUFFER_HAS_NICKLIST(buffer))
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if ((ptr_win->buffer == buffer) && (buffer->num_displayed > 0))
- {
- max_length = nick_get_max_length (CHANNEL(buffer));
-
- if (gui_calculate_pos_size (ptr_win, 0))
- {
- delwin (ptr_win->win_chat);
- delwin (ptr_win->win_nick);
- ptr_win->win_chat = newwin (ptr_win->win_chat_height,
- ptr_win->win_chat_width,
- ptr_win->win_chat_y,
- ptr_win->win_chat_x);
- ptr_win->win_nick = newwin (ptr_win->win_nick_height,
- ptr_win->win_nick_width,
- ptr_win->win_nick_y,
- ptr_win->win_nick_x);
- gui_draw_buffer_chat (buffer, 1);
- erase = 1;
- }
-
- if (erase)
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK);
-
- snprintf (format_empty, 32, "%%-%ds", ptr_win->win_nick_width);
- for (i = 0; i < ptr_win->win_nick_height; i++)
- {
- mvwprintw (ptr_win->win_nick, i, 0, format_empty, " ");
- }
- }
-
- if ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) ||
- (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM))
- snprintf (format, 32, "%%.%ds", max_length);
- else
- snprintf (format, 32, "%%.%ds",
- ((cfg_look_nicklist_min_size > 0)
- && (max_length < cfg_look_nicklist_min_size)) ?
- cfg_look_nicklist_min_size :
- (((cfg_look_nicklist_max_size > 0)
- && (max_length > cfg_look_nicklist_max_size)) ?
- cfg_look_nicklist_max_size : max_length));
-
- if (has_colors ())
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK_SEP);
- switch (cfg_look_nicklist_position)
- {
- case CFG_LOOK_NICKLIST_LEFT:
- mvwvline (ptr_win->win_nick,
- 0, ptr_win->win_nick_width - 1, ACS_VLINE,
- ptr_win->win_chat_height);
- break;
- case CFG_LOOK_NICKLIST_RIGHT:
- mvwvline (ptr_win->win_nick,
- 0, 0, ACS_VLINE,
- ptr_win->win_chat_height);
- break;
- case CFG_LOOK_NICKLIST_TOP:
- mvwhline (ptr_win->win_nick,
- ptr_win->win_nick_height - 1, 0, ACS_HLINE,
- ptr_win->win_chat_width);
- break;
- case CFG_LOOK_NICKLIST_BOTTOM:
- mvwhline (ptr_win->win_nick,
- 0, 0, ACS_HLINE,
- ptr_win->win_chat_width);
- break;
- }
- }
-
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK);
- x = 0;
- y = (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM) ? 1 : 0;
- column = 0;
-
- if ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) ||
- (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM))
- nicks_displayed = (ptr_win->win_width / (max_length + 2)) * (ptr_win->win_nick_height - 1);
- else
- nicks_displayed = ptr_win->win_nick_height;
-
- ptr_nick = CHANNEL(buffer)->nicks;
- for (i = 0; i < ptr_win->win_nick_start; i++)
- {
- if (!ptr_nick)
- break;
- ptr_nick = ptr_nick->next_nick;
- }
- if (ptr_nick)
- {
- for (i = 0; i < nicks_displayed; i++)
- {
- switch (cfg_look_nicklist_position)
- {
- case CFG_LOOK_NICKLIST_LEFT:
- x = 0;
- break;
- case CFG_LOOK_NICKLIST_RIGHT:
- x = 1;
- break;
- case CFG_LOOK_NICKLIST_TOP:
- case CFG_LOOK_NICKLIST_BOTTOM:
- x = column;
- break;
- }
- if ( ((i == 0) && (ptr_win->win_nick_start > 0))
- || ((i == nicks_displayed - 1) && (ptr_nick->next_nick)) )
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK_MORE);
- j = (max_length + 1) >= 4 ? 4 : max_length + 1;
- for (x2 = 1; x2 <= j; x2++)
- mvwprintw (ptr_win->win_nick, y, x + x2, "+");
- }
- else
- {
- if (ptr_nick->flags & NICK_CHANOWNER)
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK_CHANOWNER);
- mvwprintw (ptr_win->win_nick, y, x, "~");
- x++;
- }
- else if (ptr_nick->flags & NICK_CHANADMIN)
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK_CHANADMIN);
- mvwprintw (ptr_win->win_nick, y, x, "&");
- x++;
- }
- else if (ptr_nick->flags & NICK_OP)
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK_OP);
- mvwprintw (ptr_win->win_nick, y, x, "@");
- x++;
- }
- else if (ptr_nick->flags & NICK_HALFOP)
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK_HALFOP);
- mvwprintw (ptr_win->win_nick, y, x, "%%");
- x++;
- }
- else if (ptr_nick->flags & NICK_VOICE)
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK_VOICE);
- mvwprintw (ptr_win->win_nick, y, x, "+");
- x++;
- }
- else
- {
- gui_window_set_weechat_color (ptr_win->win_nick, COLOR_WIN_NICK);
- mvwprintw (ptr_win->win_nick, y, x, " ");
- x++;
- }
- gui_window_set_weechat_color (ptr_win->win_nick,
- ((cfg_irc_away_check > 0) && (ptr_nick->flags & NICK_AWAY)) ?
- COLOR_WIN_NICK_AWAY : COLOR_WIN_NICK);
- mvwprintw (ptr_win->win_nick, y, x, format, ptr_nick->nick);
-
- ptr_nick = ptr_nick->next_nick;
-
- if (!ptr_nick)
- break;
- }
- y++;
- if ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) ||
- (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM))
- {
- if (y - ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM) ? 1 : 0) >= ptr_win->win_nick_height - 1)
- {
- column += max_length + 2;
- y = (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) ?
- 0 : 1;
- }
- }
- }
- }
- wnoutrefresh (ptr_win->win_nick);
- refresh ();
- }
- }
-}
-
-/*
- * gui_draw_buffer_status: draw status window for a buffer
- */
-
-void
-gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
-{
- t_gui_window *ptr_win;
- t_weechat_hotlist *ptr_hotlist;
- char format[32], str_nicks[32], *more;
- int i, first_mode, x, server_pos, server_total;
- int display_name, names_count;
-
- /* make gcc happy */
- (void) buffer;
-
- if (!gui_ok)
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (erase)
- gui_curses_window_clear (ptr_win->win_status, COLOR_WIN_STATUS);
-
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS);
-
- /* display number of buffers */
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- mvwprintw (ptr_win->win_status, 0, 0, "[");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%d",
- (last_gui_buffer) ? last_gui_buffer->number : 0);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "] ");
-
- /* display "<servers>" or current server */
- if (ptr_win->buffer->all_servers)
- {
- wprintw (ptr_win->win_status, "[");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, _("<servers>"));
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "] ");
- }
- else if (SERVER(ptr_win->buffer) && SERVER(ptr_win->buffer)->name)
- {
- wprintw (ptr_win->win_status, "[");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%s", SERVER(ptr_win->buffer)->name);
- if (SERVER(ptr_win->buffer)->is_away)
- wprintw (ptr_win->win_status, _("(away)"));
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "] ");
- }
-
- /* infos about current server buffer */
- if (SERVER(ptr_win->buffer) && !CHANNEL(ptr_win->buffer))
- {
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%d",
- ptr_win->buffer->number);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ":");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_CHANNEL);
- if (SERVER(ptr_win->buffer)->is_connected)
- wprintw (ptr_win->win_status, "[%s] ",
- SERVER(ptr_win->buffer)->name);
- else
- wprintw (ptr_win->win_status, "(%s) ",
- SERVER(ptr_win->buffer)->name);
- if (ptr_win->buffer->all_servers)
- {
- server_get_number_buffer (SERVER(ptr_win->buffer),
- &server_pos,
- &server_total);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "(");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%d", server_pos);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "/");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%d", server_total);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ") ");
-
- }
- }
-
- /* infos about current channel/pv buffer */
- if (SERVER(ptr_win->buffer) && CHANNEL(ptr_win->buffer))
- {
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%d",
- ptr_win->buffer->number);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ":");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_CHANNEL);
- if (((CHANNEL(ptr_win->buffer)->type != CHANNEL_TYPE_PRIVATE)
- && (CHANNEL(ptr_win->buffer)->type != CHANNEL_TYPE_DCC_CHAT)
- && (!CHANNEL(ptr_win->buffer)->nicks))
- || ((CHANNEL(ptr_win->buffer)->type == CHANNEL_TYPE_DCC_CHAT)
- && (CHANNEL(ptr_win->buffer)->dcc_chat)
- && (((t_irc_dcc *)(CHANNEL(ptr_win->buffer)->dcc_chat))->sock < 0)))
- wprintw (ptr_win->win_status, "(%s)",
- CHANNEL(ptr_win->buffer)->name);
- else
- wprintw (ptr_win->win_status, "%s",
- CHANNEL(ptr_win->buffer)->name);
- if (ptr_win->buffer == CHANNEL(ptr_win->buffer)->buffer)
- {
- /* display channel modes */
- if (CHANNEL(ptr_win->buffer)->type == CHANNEL_TYPE_CHANNEL)
- {
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "(");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- i = 0;
- first_mode = 1;
- while (CHANNEL(ptr_win->buffer)->modes[i])
- {
- if (CHANNEL(ptr_win->buffer)->modes[i] != ' ')
- {
- if (first_mode)
- {
- wprintw (ptr_win->win_status, "+");
- first_mode = 0;
- }
- wprintw (ptr_win->win_status, "%c",
- CHANNEL(ptr_win->buffer)->modes[i]);
- }
- i++;
- }
- if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_KEY] != ' ')
- wprintw (ptr_win->win_status, ",%s",
- CHANNEL(ptr_win->buffer)->key);
- if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_LIMIT] != ' ')
- wprintw (ptr_win->win_status, ",%d",
- CHANNEL(ptr_win->buffer)->limit);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ")");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- }
-
- /* display DCC if private is DCC CHAT */
- if (CHANNEL(ptr_win->buffer)->type == CHANNEL_TYPE_DCC_CHAT)
- {
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "(");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_CHANNEL);
- wprintw (ptr_win->win_status, "DCC");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ")");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- }
- }
- wprintw (ptr_win->win_status, " ");
- }
- if (!SERVER(ptr_win->buffer))
- {
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%d",
- ptr_win->buffer->number);
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ":");
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS_CHANNEL);
- switch (ptr_win->buffer->type)
- {
- case BUFFER_TYPE_STANDARD:
- wprintw (ptr_win->win_status, _("[not connected] "));
- break;
- case BUFFER_TYPE_DCC:
- wprintw (ptr_win->win_status, "<DCC> ");
- break;
- case BUFFER_TYPE_RAW_DATA:
- wprintw (ptr_win->win_status, _("<RAW_IRC> "));
- break;
- }
- }
-
- /* display list of other active windows (if any) with numbers */
- if (hotlist)
- {
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "[");
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, _("Act: "));
-
- names_count = 0;
- for (ptr_hotlist = hotlist; ptr_hotlist;
- ptr_hotlist = ptr_hotlist->next_hotlist)
- {
- switch (ptr_hotlist->priority)
- {
- case HOTLIST_LOW:
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DATA_OTHER);
- display_name = ((cfg_look_hotlist_names_level & 1) != 0);
- break;
- case HOTLIST_MSG:
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DATA_MSG);
- display_name = ((cfg_look_hotlist_names_level & 2) != 0);
- break;
- case HOTLIST_PRIVATE:
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DATA_PRIVATE);
- display_name = ((cfg_look_hotlist_names_level & 4) != 0);
- break;
- case HOTLIST_HIGHLIGHT:
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DATA_HIGHLIGHT);
- display_name = ((cfg_look_hotlist_names_level & 8) != 0);
- break;
- default:
- display_name = 0;
- break;
- }
- switch (ptr_hotlist->buffer->type)
- {
- case BUFFER_TYPE_STANDARD:
- wprintw (ptr_win->win_status, "%d",
- ptr_hotlist->buffer->number);
-
- if (display_name && (cfg_look_hotlist_names_count != 0)
- && (names_count < cfg_look_hotlist_names_count))
- {
- names_count++;
-
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ":");
-
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- if (cfg_look_hotlist_names_length == 0)
- snprintf (format, sizeof (format) - 1, "%%s");
- else
- snprintf (format, sizeof (format) - 1, "%%.%ds", cfg_look_hotlist_names_length);
- if (BUFFER_IS_SERVER(ptr_hotlist->buffer))
- wprintw (ptr_win->win_status, format,
- (ptr_hotlist->server) ?
- ptr_hotlist->server->name :
- SERVER(ptr_hotlist->buffer)->name);
- else if (BUFFER_IS_CHANNEL(ptr_hotlist->buffer)
- || BUFFER_IS_PRIVATE(ptr_hotlist->buffer))
- wprintw (ptr_win->win_status, format, CHANNEL(ptr_hotlist->buffer)->name);
- }
- break;
- case BUFFER_TYPE_DCC:
- wprintw (ptr_win->win_status, "%d",
- ptr_hotlist->buffer->number);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ":");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "DCC");
- break;
- case BUFFER_TYPE_RAW_DATA:
- wprintw (ptr_win->win_status, "%d",
- ptr_hotlist->buffer->number);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, ":");
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, _("RAW_IRC"));
- break;
- }
-
- if (ptr_hotlist->next_hotlist)
- wprintw (ptr_win->win_status, ",");
- }
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "] ");
- }
-
- /* display lag */
- if (SERVER(ptr_win->buffer))
- {
- if (SERVER(ptr_win->buffer)->lag / 1000 >= cfg_irc_lag_min_show)
- {
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "[");
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, _("Lag: %.1f"),
- ((float)(SERVER(ptr_win->buffer)->lag)) / 1000);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "]");
- }
- }
-
- /* display "-MORE-" (if last line is not displayed) & nicks count */
- if (BUFFER_HAS_NICKLIST(ptr_win->buffer))
- {
- snprintf (str_nicks, sizeof (str_nicks) - 1, "%d", CHANNEL(ptr_win->buffer)->nicks_count);
- x = ptr_win->win_width - strlen (str_nicks) - 4;
- }
- else
- x = ptr_win->win_width - 2;
- more = strdup (_("-MORE-"));
- x -= strlen (more) - 1;
- if (x < 0)
- x = 0;
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS_MORE);
- if (ptr_win->scroll)
- mvwprintw (ptr_win->win_status, 0, x, "%s", more);
- else
- {
- snprintf (format, sizeof (format) - 1, "%%-%ds", (int)(strlen (more)));
- mvwprintw (ptr_win->win_status, 0, x, format, " ");
- }
- if (BUFFER_HAS_NICKLIST(ptr_win->buffer))
- {
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, " [");
- gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS);
- wprintw (ptr_win->win_status, "%s", str_nicks);
- gui_window_set_weechat_color (ptr_win->win_status,
- COLOR_WIN_STATUS_DELIMITERS);
- wprintw (ptr_win->win_status, "]");
- }
- free (more);
-
- wnoutrefresh (ptr_win->win_status);
- refresh ();
- }
-}
-
-/*
- * gui_draw_buffer_infobar_time: draw time in infobar window
- */
-
-void
-gui_draw_buffer_infobar_time (t_gui_buffer *buffer)
-{
- t_gui_window *ptr_win;
- time_t time_seconds;
- struct tm *local_time;
-
- /* make gcc happy */
- (void) buffer;
-
- if (!gui_ok)
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- time_seconds = time (NULL);
- local_time = localtime (&time_seconds);
- if (local_time)
- {
- gui_window_set_weechat_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
- mvwprintw (ptr_win->win_infobar,
- 0, 1,
- "%02d:%02d",
- local_time->tm_hour, local_time->tm_min);
- if (cfg_look_infobar_seconds)
- wprintw (ptr_win->win_infobar,
- ":%02d",
- local_time->tm_sec);
- }
- wnoutrefresh (ptr_win->win_infobar);
- }
-}
-
-/*
- * gui_draw_buffer_infobar: draw infobar window for a buffer
- */
-
-void
-gui_draw_buffer_infobar (t_gui_buffer *buffer, int erase)
-{
- t_gui_window *ptr_win;
- time_t time_seconds;
- struct tm *local_time;
- char text_time[1024 + 1];
-
- /* make gcc happy */
- (void) buffer;
-
- if (!gui_ok)
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (erase)
- gui_curses_window_clear (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
-
- gui_window_set_weechat_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
-
- time_seconds = time (NULL);
- local_time = localtime (&time_seconds);
- if (local_time)
- {
- strftime (text_time, 1024, cfg_look_infobar_timestamp, local_time);
- gui_window_set_weechat_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
- wprintw (ptr_win->win_infobar, "[");
- gui_window_set_weechat_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
- wprintw (ptr_win->win_infobar,
- "%02d:%02d",
- local_time->tm_hour, local_time->tm_min);
- if (cfg_look_infobar_seconds)
- wprintw (ptr_win->win_infobar,
- ":%02d",
- local_time->tm_sec);
- gui_window_set_weechat_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
- wprintw (ptr_win->win_infobar, "]");
- gui_window_set_weechat_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR);
- wprintw (ptr_win->win_infobar,
- " %s", text_time);
- }
- if (gui_infobar)
- {
- gui_window_set_weechat_color (ptr_win->win_infobar, COLOR_WIN_INFOBAR_DELIMITERS);
- wprintw (ptr_win->win_infobar, " | ");
- gui_window_set_weechat_color (ptr_win->win_infobar, gui_infobar->color);
- wprintw (ptr_win->win_infobar, "%s", gui_infobar->text);
- }
-
- wnoutrefresh (ptr_win->win_infobar);
- refresh ();
- }
-}
-
-/*
- * gui_get_input_prompt_length: return input prompt length
- */
-
-int
-gui_get_input_prompt_length (t_gui_window *window, char *nick)
-{
- char *pos, *modes;
- int length, mode_found;
-
- length = 0;
- pos = cfg_look_input_format;
- while (pos && pos[0])
- {
- switch (pos[0])
- {
- case '%':
- pos++;
- switch (pos[0])
- {
- case 'c':
- if (CHANNEL(window->buffer))
- length += utf8_strlen (CHANNEL(window->buffer)->name);
- else
- {
- if (SERVER(window->buffer))
- length += utf8_strlen (SERVER(window->buffer)->name);
- }
- pos++;
- break;
- case 'm':
- if (SERVER(window->buffer))
- {
- mode_found = 0;
- for (modes = SERVER(window->buffer)->nick_modes;
- modes && modes[0]; modes++)
- {
- if (modes[0] != ' ')
- {
- length++;
- mode_found = 1;
- }
- }
- if (mode_found)
- length++;
- }
- pos++;
- break;
- case 'n':
- length += utf8_strlen (nick);
- pos++;
- break;
- default:
- length++;
- if (pos[0])
- {
- if (pos[0] == '%')
- pos++;
- else
- {
- length++;
- pos += utf8_char_size (pos);
- }
- }
- break;
- }
- break;
- default:
- length++;
- pos += utf8_char_size (pos);
- break;
- }
- }
- return length;
-}
-
-/*
- * gui_draw_buffer_input_prompt: display input prompt
- */
-
-void
-gui_draw_buffer_input_prompt (t_gui_window *window, char *nick)
-{
- char *pos, saved_char, *modes;
- int char_size, mode_found;
-
- wmove (window->win_input, 0, 0);
- pos = cfg_look_input_format;
- while (pos && pos[0])
- {
- switch (pos[0])
- {
- case '%':
- pos++;
- switch (pos[0])
- {
- case 'c':
- if (CHANNEL(window->buffer))
- {
- gui_window_set_weechat_color (window->win_input,
- COLOR_WIN_INPUT_CHANNEL);
- wprintw (window->win_input, "%s",
- CHANNEL(window->buffer)->name);
- }
- else
- {
- if (SERVER(window->buffer))
- {
- gui_window_set_weechat_color (window->win_input,
- COLOR_WIN_INPUT_SERVER);
- wprintw (window->win_input, "%s",
- SERVER(window->buffer)->name);
- }
- }
- pos++;
- break;
- case 'm':
- if (SERVER(window->buffer))
- {
- mode_found = 0;
- for (modes = SERVER(window->buffer)->nick_modes;
- modes && modes[0]; modes++)
- {
- if (modes[0] != ' ')
- mode_found = 1;
- }
- if (mode_found)
- {
- gui_window_set_weechat_color (window->win_input,
- COLOR_WIN_INPUT);
- wprintw (window->win_input, "+");
- for (modes = SERVER(window->buffer)->nick_modes;
- modes && modes[0]; modes++)
- {
- if (modes[0] != ' ')
- wprintw (window->win_input, "%c",
- modes[0]);
- }
- }
- }
- pos++;
- break;
- case 'n':
- gui_window_set_weechat_color (window->win_input,
- COLOR_WIN_INPUT_NICK);
- wprintw (window->win_input, "%s", nick);
- pos++;
- break;
- default:
- if (pos[0])
- {
- char_size = utf8_char_size (pos);
- saved_char = pos[char_size];
- pos[char_size] = '\0';
- gui_window_set_weechat_color (window->win_input,
- COLOR_WIN_INPUT_DELIMITERS);
- wprintw (window->win_input, "%%%s", pos);
- pos[char_size] = saved_char;
- pos += char_size;
- }
- else
- {
- wprintw (window->win_input, "%%");
- pos++;
- }
- break;
- }
- break;
- default:
- char_size = utf8_char_size (pos);
- saved_char = pos[char_size];
- pos[char_size] = '\0';
- gui_window_set_weechat_color (window->win_input,
- COLOR_WIN_INPUT_DELIMITERS);
- wprintw (window->win_input, "%s", pos);
- pos[char_size] = saved_char;
- pos += char_size;
- break;
- }
- }
-}
-
-/*
- * gui_draw_buffer_input_text: display text in input buffer, according to color mask
- */
-
-void
-gui_draw_buffer_input_text (t_gui_window *window, int input_width)
-{
- char *ptr_start, *ptr_next, saved_char;
- int pos_mask, size, last_color, color;
-
- ptr_start = utf8_add_offset (window->buffer->input_buffer,
- window->buffer->input_buffer_1st_display);
- pos_mask = ptr_start - window->buffer->input_buffer;
- last_color = -1;
- while ((input_width > 0) && ptr_start && ptr_start[0])
- {
- ptr_next = utf8_next_char (ptr_start);
- if (ptr_next)
- {
- saved_char = ptr_next[0];
- ptr_next[0] = '\0';
- size = ptr_next - ptr_start;
- if (window->buffer->input_buffer_color_mask[pos_mask] != ' ')
- color = window->buffer->input_buffer_color_mask[pos_mask] - '0';
- else
- color = -1;
- if (color != last_color)
- {
- if (color == -1)
- gui_window_set_weechat_color (window->win_input, COLOR_WIN_INPUT);
- else
- gui_window_input_set_color (window, color);
- }
- last_color = color;
- wprintw (window->win_input, "%s", ptr_start);
- ptr_next[0] = saved_char;
- ptr_start = ptr_next;
- pos_mask += size;
- }
- else
- ptr_start = NULL;
- input_width--;
- }
-}
-
-/*
- * gui_draw_buffer_input: draw input window for a buffer
- */
-
-void
-gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
-{
- t_gui_window *ptr_win;
- char format[32];
- char *ptr_nickname;
- int prompt_length, display_prompt;
- t_irc_dcc *dcc_selected;
-
- if (!gui_ok)
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (ptr_win->buffer == buffer)
- {
- if (erase)
- gui_curses_window_clear (ptr_win->win_input, COLOR_WIN_INPUT);
-
- switch (buffer->type)
- {
- case BUFFER_TYPE_STANDARD:
- if (buffer->has_input)
- {
- if (buffer->input_buffer_length == 0)
- buffer->input_buffer[0] = '\0';
-
- if (SERVER(buffer))
- ptr_nickname = (SERVER(buffer)->nick) ?
- SERVER(buffer)->nick : SERVER(buffer)->nick1;
- else
- ptr_nickname = cfg_look_no_nickname;
-
- prompt_length = gui_get_input_prompt_length (ptr_win, ptr_nickname);
-
- if (ptr_win->win_width - prompt_length < 3)
- {
- prompt_length = 0;
- display_prompt = 0;
- }
- else
- display_prompt = 1;
-
- if (buffer->input_buffer_pos - buffer->input_buffer_1st_display + 1 >
- ptr_win->win_width - prompt_length)
- buffer->input_buffer_1st_display = buffer->input_buffer_pos -
- (ptr_win->win_width - prompt_length) + 1;
- else
- {
- if (buffer->input_buffer_pos < buffer->input_buffer_1st_display)
- buffer->input_buffer_1st_display = buffer->input_buffer_pos;
- else
- {
- if ((buffer->input_buffer_1st_display > 0) &&
- (buffer->input_buffer_pos -
- buffer->input_buffer_1st_display + 1)
- < ptr_win->win_width - prompt_length)
- {
- buffer->input_buffer_1st_display =
- buffer->input_buffer_pos -
- (ptr_win->win_width - prompt_length) + 1;
- if (buffer->input_buffer_1st_display < 0)
- buffer->input_buffer_1st_display = 0;
- }
- }
- }
- if (display_prompt)
- gui_draw_buffer_input_prompt (ptr_win, ptr_nickname);
-
- gui_window_set_weechat_color (ptr_win->win_input, COLOR_WIN_INPUT);
- snprintf (format, 32, "%%-%ds", ptr_win->win_width - prompt_length);
- if (ptr_win == gui_current_window)
- gui_draw_buffer_input_text (ptr_win, ptr_win->win_width - prompt_length);
- else
- wprintw (ptr_win->win_input, format, "");
- wclrtoeol (ptr_win->win_input);
- ptr_win->win_input_x = prompt_length +
- (buffer->input_buffer_pos - buffer->input_buffer_1st_display);
- if (ptr_win == gui_current_window)
- move (ptr_win->win_y + ptr_win->win_height - 1,
- ptr_win->win_x + ptr_win->win_input_x);
- }
- break;
- case BUFFER_TYPE_DCC:
- dcc_selected = (ptr_win->dcc_selected) ? (t_irc_dcc *) ptr_win->dcc_selected : dcc_list;
- wmove (ptr_win->win_input, 0, 0);
- if (dcc_selected)
- {
- switch (dcc_selected->status)
- {
- case DCC_WAITING:
- if (DCC_IS_RECV(dcc_selected->type))
- wprintw (ptr_win->win_input, _(" [A] Accept"));
- wprintw (ptr_win->win_input, _(" [C] Cancel"));
- break;
- case DCC_CONNECTING:
- case DCC_ACTIVE:
- wprintw (ptr_win->win_input, _(" [C] Cancel"));
- break;
- case DCC_DONE:
- case DCC_FAILED:
- case DCC_ABORTED:
- wprintw (ptr_win->win_input, _(" [R] Remove"));
- break;
- }
- }
- wprintw (ptr_win->win_input, _(" [P] Purge old DCC"));
- wprintw (ptr_win->win_input, _(" [Q] Close DCC view"));
- wclrtoeol (ptr_win->win_input);
- ptr_win->win_input_x = 0;
- if (ptr_win == gui_current_window)
- move (ptr_win->win_y + ptr_win->win_height - 1,
- ptr_win->win_x);
- break;
- case BUFFER_TYPE_RAW_DATA:
- mvwprintw (ptr_win->win_input, 0, 0, _(" [Q] Close raw data view"));
- wclrtoeol (ptr_win->win_input);
- ptr_win->win_input_x = 0;
- if (ptr_win == gui_current_window)
- move (ptr_win->win_y + ptr_win->win_height - 1,
- ptr_win->win_x);
- break;
- }
- doupdate ();
- wrefresh (ptr_win->win_input);
- refresh ();
- }
- }
-}
-
-/*
- * gui_redraw_buffer: redraw a buffer
- */
-
-void
-gui_redraw_buffer (t_gui_buffer *buffer)
-{
- t_gui_window *ptr_win;
-
- if (!gui_ok)
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (ptr_win->buffer == buffer)
- {
- gui_draw_buffer_title (buffer, 1);
- gui_draw_buffer_chat (buffer, 1);
- if (ptr_win->win_nick)
- gui_draw_buffer_nick (buffer, 1);
- gui_draw_buffer_status (buffer, 1);
- if (cfg_look_infobar)
- gui_draw_buffer_infobar (buffer, 1);
- gui_draw_buffer_input (buffer, 1);
- }
- }
-}
-
-/*
- * gui_switch_to_buffer: switch to another buffer
- */
-
-void
-gui_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
-{
- if (!gui_ok)
- return;
-
- if (window->buffer->num_displayed > 0)
- window->buffer->num_displayed--;
-
- if (window->buffer != buffer)
- {
- window->buffer->last_read_line = window->buffer->last_line;
- if (buffer->last_read_line == buffer->last_line)
- buffer->last_read_line = NULL;
- }
-
- window->buffer = buffer;
- window->win_nick_start = 0;
- gui_calculate_pos_size (window, 1);
-
- /* destroy Curses windows */
- if (window->win_title)
- {
- delwin (window->win_title);
- window->win_title = NULL;
- }
- if (window->win_nick)
- {
- delwin (window->win_nick);
- window->win_nick = NULL;
- }
- if (window->win_status)
- {
- delwin (window->win_status);
- window->win_status = NULL;
- }
- if (window->win_infobar)
- {
- delwin (window->win_infobar);
- window->win_infobar = NULL;
- }
- if (window->win_input)
- {
- delwin (window->win_input);
- window->win_input = NULL;
- }
-
- /* create Curses windows */
- window->win_title = newwin (1,
- window->win_width,
- window->win_y,
- window->win_x);
- window->win_input = newwin (1,
- window->win_width,
- window->win_y + window->win_height - 1,
- window->win_x);
- if (BUFFER_IS_CHANNEL(buffer))
- {
- if (window->win_chat)
- delwin (window->win_chat);
- window->win_chat = newwin (window->win_chat_height,
- window->win_chat_width,
- window->win_chat_y,
- window->win_chat_x);
- if (cfg_look_nicklist)
- window->win_nick = newwin (window->win_nick_height,
- window->win_nick_width,
- window->win_nick_y,
- window->win_nick_x);
- else
- window->win_nick = NULL;
- }
- if (!(BUFFER_IS_CHANNEL(buffer)))
- {
- if (window->win_chat)
- delwin (window->win_chat);
- window->win_chat = newwin (window->win_chat_height,
- window->win_chat_width,
- window->win_chat_y,
- window->win_chat_x);
- }
-
- /* create status/infobar windows */
- if (cfg_look_infobar)
- {
- window->win_infobar = newwin (1, window->win_width,
- window->win_y + window->win_height - 2,
- window->win_x);
- window->win_status = newwin (1, window->win_width,
- window->win_y + window->win_height - 3,
- window->win_x);
- }
- else
- window->win_status = newwin (1, window->win_width,
- window->win_y + window->win_height - 2,
- window->win_x);
-
- window->start_line = NULL;
- window->start_line_pos = 0;
-
- buffer->num_displayed++;
-
- hotlist_remove_buffer (buffer);
-}
-
-/*
- * gui_window_page_up: display previous page on buffer
- */
-
-void
-gui_window_page_up (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (!window->first_line_displayed)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- (window->start_line) ?
- (-1) * (window->win_chat_height - 1) :
- (-1) * ((window->win_chat_height - 1) * 2));
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_page_down: display next page on buffer
- */
-
-void
-gui_window_page_down (t_gui_window *window)
-{
- t_gui_line *ptr_line;
- int line_pos;
-
- if (!gui_ok)
- return;
-
- if (window->start_line)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- window->win_chat_height - 1);
-
- /* check if we can display all */
- ptr_line = window->start_line;
- line_pos = window->start_line_pos;
- gui_calculate_line_diff (window, &ptr_line,
- &line_pos,
- window->win_chat_height - 1);
- if (!ptr_line)
- {
- window->start_line = NULL;
- window->start_line_pos = 0;
- }
-
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_up: display previous few lines in buffer
- */
-
-void
-gui_window_scroll_up (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (!window->first_line_displayed)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- (window->start_line) ?
- (-1) * cfg_look_scroll_amount :
- (-1) * ( (window->win_chat_height - 1) + cfg_look_scroll_amount));
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_down: display next few lines in buffer
- */
-
-void
-gui_window_scroll_down (t_gui_window *window)
-{
- t_gui_line *ptr_line;
- int line_pos;
-
- if (!gui_ok)
- return;
-
- if (window->start_line)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- cfg_look_scroll_amount);
-
- /* check if we can display all */
- ptr_line = window->start_line;
- line_pos = window->start_line_pos;
- gui_calculate_line_diff (window, &ptr_line,
- &line_pos,
- window->win_chat_height - 1);
-
- if (!ptr_line)
- {
- window->start_line = NULL;
- window->start_line_pos = 0;
- }
-
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_top: scroll to top of buffer
- */
-
-void
-gui_window_scroll_top (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (!window->first_line_displayed)
- {
- window->start_line = window->buffer->lines;
- window->start_line_pos = 0;
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_bottom: scroll to bottom of buffer
- */
-
-void
-gui_window_scroll_bottom (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (window->start_line)
- {
- window->start_line = NULL;
- window->start_line_pos = 0;
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_nick_beginning: go to beginning of nicklist
- */
-
-void
-gui_window_nick_beginning (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- if (window->win_nick_start > 0)
- {
- window->win_nick_start = 0;
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_nick_end: go to the end of nicklist
- */
-
-void
-gui_window_nick_end (t_gui_window *window)
-{
- int new_start;
-
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- new_start =
- CHANNEL(window->buffer)->nicks_count - window->win_nick_num_max;
- if (new_start < 0)
- new_start = 0;
- else if (new_start >= 1)
- new_start++;
-
- if (new_start != window->win_nick_start)
- {
- window->win_nick_start = new_start;
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_nick_page_up: scroll one page up in nicklist
- */
-
-void
-gui_window_nick_page_up (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- if (window->win_nick_start > 0)
- {
- window->win_nick_start -= (window->win_nick_num_max - 1);
- if (window->win_nick_start <= 1)
- window->win_nick_start = 0;
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_nick_page_down: scroll one page down in nicklist
- */
-
-void
-gui_window_nick_page_down (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- if ((CHANNEL(window->buffer)->nicks_count > window->win_nick_num_max)
- && (window->win_nick_start + window->win_nick_num_max - 1
- < CHANNEL(window->buffer)->nicks_count))
- {
- if (window->win_nick_start == 0)
- window->win_nick_start += (window->win_nick_num_max - 1);
- else
- window->win_nick_start += (window->win_nick_num_max - 2);
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_init_subwindows: init subviews for a WeeChat window
- */
-
-void
-gui_window_init_subwindows (t_gui_window *window)
-{
- window->win_title = NULL;
- window->win_chat = NULL;
- window->win_nick = NULL;
- window->win_status = NULL;
- window->win_infobar = NULL;
- window->win_input = NULL;
-}
-
-/*
- * gui_window_auto_resize: auto-resize all windows, according to % of global size
- * This function is called after a terminal resize.
- * Returns 0 if ok, -1 if all window should be merged
- * (not enough space according to windows %)
- */
-
-int
-gui_window_auto_resize (t_gui_window_tree *tree,
- int x, int y, int width, int height,
- int simulate)
-{
- int size1, size2;
-
- if (tree)
- {
- if (tree->window)
- {
- if ((width < WINDOW_MIN_WIDTH) || (height < WINDOW_MIN_HEIGHT))
- return -1;
- if (!simulate)
- {
- tree->window->win_x = x;
- tree->window->win_y = y;
- tree->window->win_width = width;
- tree->window->win_height = height;
- }
- }
- else
- {
- if (tree->split_horiz)
- {
- size1 = (height * tree->split_pct) / 100;
- size2 = height - size1;
- if (gui_window_auto_resize (tree->child1, x, y + size1,
- width, size2, simulate) < 0)
- return -1;
- if (gui_window_auto_resize (tree->child2, x, y,
- width, size1, simulate) < 0)
- return -1;
- }
- else
- {
- size1 = (width * tree->split_pct) / 100;
- size2 = width - size1 - 1;
- if (gui_window_auto_resize (tree->child1, x, y,
- size1, height, simulate) < 0)
- return -1;
- if (gui_window_auto_resize (tree->child2, x + size1 + 1, y,
- size2, height, simulate) < 0)
- return -1;
- }
- }
- }
- return 0;
-}
-
-/*
- * gui_refresh_windows: auto resize and refresh all windows
- */
-
-void
-gui_refresh_windows ()
-{
- t_gui_window *ptr_win, *old_current_window;
-
- if (gui_ok)
- {
- old_current_window = gui_current_window;
-
- if (gui_window_auto_resize (gui_windows_tree, 0, 0, COLS, LINES, 0) < 0)
- gui_window_merge_all (gui_current_window);
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- gui_switch_to_buffer (ptr_win, ptr_win->buffer);
- gui_redraw_buffer (ptr_win->buffer);
- gui_draw_window_separator (ptr_win);
- }
-
- gui_current_window = old_current_window;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- }
-}
-
-/*
- * gui_window_split_horiz: split a window horizontally
- */
-
-void
-gui_window_split_horiz (t_gui_window *window, int pourcentage)
-{
- t_gui_window *new_window;
- int height1, height2;
-
- if (!gui_ok)
- return;
-
- height1 = (window->win_height * pourcentage) / 100;
- height2 = window->win_height - height1;
-
- if ((height1 >= WINDOW_MIN_HEIGHT) && (height2 >= WINDOW_MIN_HEIGHT)
- && (pourcentage > 0) && (pourcentage <= 100))
- {
- if ((new_window = gui_window_new (window,
- window->win_x, window->win_y,
- window->win_width, height1,
- 100, pourcentage)))
- {
- /* reduce old window height (bottom window) */
- window->win_y = new_window->win_y + new_window->win_height;
- window->win_height = height2;
- window->win_height_pct = 100 - pourcentage;
-
- /* assign same buffer for new window (top window) */
- new_window->buffer = window->buffer;
- new_window->buffer->num_displayed++;
-
- gui_switch_to_buffer (window, window->buffer);
-
- gui_current_window = new_window;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- }
- }
-}
-
-/*
- * gui_window_split_vertic: split a window vertically
- */
-
-void
-gui_window_split_vertic (t_gui_window *window, int pourcentage)
-{
- t_gui_window *new_window;
- int width1, width2;
-
- if (!gui_ok)
- return;
-
- width1 = (window->win_width * pourcentage) / 100;
- width2 = window->win_width - width1 - 1;
-
- if ((width1 >= WINDOW_MIN_WIDTH) && (width2 >= WINDOW_MIN_WIDTH)
- && (pourcentage > 0) && (pourcentage <= 100))
- {
- if ((new_window = gui_window_new (window,
- window->win_x + width1 + 1, window->win_y,
- width2, window->win_height,
- pourcentage, 100)))
- {
- /* reduce old window height (left window) */
- window->win_width = width1;
- window->win_width_pct = 100 - pourcentage;
-
- /* assign same buffer for new window (right window) */
- new_window->buffer = window->buffer;
- new_window->buffer->num_displayed++;
-
- gui_switch_to_buffer (window, window->buffer);
-
- gui_current_window = new_window;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
-
- /* create & draw separator */
- gui_draw_window_separator (gui_current_window);
- }
- }
-}
-
-/*
- * gui_window_resize: resize window
- */
-
-void
-gui_window_resize (t_gui_window *window, int pourcentage)
-{
- t_gui_window_tree *parent;
- int old_split_pct;
-
- parent = window->ptr_tree->parent_node;
- if (parent)
- {
- old_split_pct = parent->split_pct;
- if (((parent->split_horiz) && (window->ptr_tree == parent->child2))
- || ((!(parent->split_horiz)) && (window->ptr_tree == parent->child1)))
- parent->split_pct = pourcentage;
- else
- parent->split_pct = 100 - pourcentage;
- if (gui_window_auto_resize (gui_windows_tree, 0, 0, COLS, LINES, 1) < 0)
- parent->split_pct = old_split_pct;
- else
- gui_refresh_windows ();
- }
-}
-
-/*
- * gui_window_merge: merge window with its sister
- */
-
-int
-gui_window_merge (t_gui_window *window)
-{
- t_gui_window_tree *parent, *sister;
-
- parent = window->ptr_tree->parent_node;
- if (parent)
- {
- sister = (parent->child1->window == window) ?
- parent->child2 : parent->child1;
-
- if (!(sister->window))
- return 0;
-
- if (window->win_y == sister->window->win_y)
- {
- /* horizontal merge */
- window->win_width += sister->window->win_width + 1;
- window->win_width_pct += sister->window->win_width_pct;
- }
- else
- {
- /* vertical merge */
- window->win_height += sister->window->win_height;
- window->win_height_pct += sister->window->win_height_pct;
- }
- if (sister->window->win_x < window->win_x)
- window->win_x = sister->window->win_x;
- if (sister->window->win_y < window->win_y)
- window->win_y = sister->window->win_y;
-
- gui_window_free (sister->window);
- gui_window_tree_node_to_leaf (parent, window);
-
- gui_switch_to_buffer (window, window->buffer);
- gui_redraw_buffer (window->buffer);
- return 1;
- }
- return 0;
-}
-
-/*
- * gui_window_merge_all: merge all windows into only one
- */
-
-void
-gui_window_merge_all (t_gui_window *window)
-{
- while (gui_windows->next_window)
- {
- gui_window_free ((gui_windows == window) ? gui_windows->next_window : gui_windows);
- }
- gui_window_tree_free (&gui_windows_tree);
- gui_window_tree_init (window);
- window->ptr_tree = gui_windows_tree;
- window->win_x = 0;
- window->win_y = 0;
- window->win_width = COLS;
- window->win_height = LINES;
- window->win_width_pct = 100;
- window->win_height_pct = 100;
- gui_switch_to_buffer (window, window->buffer);
- gui_redraw_buffer (window->buffer);
-}
-
-/*
- * gui_window_side_by_side: return a code about position of 2 windows:
- * 0 = they're not side by side
- * 1 = side by side (win2 is over the win1)
- * 2 = side by side (win2 on the right)
- * 3 = side by side (win2 below win1)
- * 4 = side by side (win2 on the left)
- */
-
-int
-gui_window_side_by_side (t_gui_window *win1, t_gui_window *win2)
-{
- /* win2 over win1 ? */
- if (win2->win_y + win2->win_height == win1->win_y)
- {
- if (win2->win_x >= win1->win_x + win1->win_width)
- return 0;
- if (win2->win_x + win2->win_width <= win1->win_x)
- return 0;
- return 1;
- }
-
- /* win2 on the right ? */
- if (win2->win_x == win1->win_x + win1->win_width + 1)
- {
- if (win2->win_y >= win1->win_y + win1->win_height)
- return 0;
- if (win2->win_y + win2->win_height <= win1->win_y)
- return 0;
- return 2;
- }
-
- /* win2 below win1 ? */
- if (win2->win_y == win1->win_y + win1->win_height)
- {
- if (win2->win_x >= win1->win_x + win1->win_width)
- return 0;
- if (win2->win_x + win2->win_width <= win1->win_x)
- return 0;
- return 3;
- }
-
- /* win2 on the left ? */
- if (win2->win_x + win2->win_width + 1 == win1->win_x)
- {
- if (win2->win_y >= win1->win_y + win1->win_height)
- return 0;
- if (win2->win_y + win2->win_height <= win1->win_y)
- return 0;
- return 4;
- }
-
- return 0;
-}
-
-/*
- * gui_window_switch_up: search and switch to a window over current window
- */
-
-void
-gui_window_switch_up (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 1))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_window_switch_down: search and switch to a window below current window
- */
-
-void
-gui_window_switch_down (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 3))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_window_switch_left: search and switch to a window on the left of current window
- */
-
-void
-gui_window_switch_left (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 4))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_window_switch_right: search and switch to a window on the right of current window
- */
-
-void
-gui_window_switch_right (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 2))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_refresh_screen: called when term size is modified
- */
-
-void
-gui_refresh_screen ()
-{
- int new_height, new_width;
-
- endwin ();
- refresh ();
-
- getmaxyx (stdscr, new_height, new_width);
-
- gui_ok = ((new_width > WINDOW_MIN_WIDTH) && (new_height > WINDOW_MIN_HEIGHT));
-
- if (gui_ok)
- gui_refresh_windows ();
-}
-
-/*
- * gui_refresh_screen_sigwinch: called when signal SIGWINCH is received
- */
-
-void
-gui_refresh_screen_sigwinch ()
-{
- gui_refresh_screen ();
- signal (SIGWINCH, gui_refresh_screen_sigwinch);
-}
-
-/*
- * gui_pre_init: pre-initialize GUI (called before gui_init)
- */
-
-void
-gui_pre_init (int *argc, char **argv[])
-{
- /* nothing for Curses interface */
- (void) argc;
- (void) argv;
-}
-
-/*
- * gui_init_color_pairs: init color pairs
- */
-
-void
-gui_init_color_pairs ()
-{
- int i;
- char shift_colors[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
-
- if (has_colors ())
- {
- for (i = 1; i < COLOR_PAIRS; i++)
- init_pair (i, shift_colors[i % 8], (i < 8) ? -1 : shift_colors[i / 8]);
-
- /* disable white on white, replaced by black on white */
- init_pair (63, -1, -1);
-
- /* white on default bg is default (-1) */
- if (!cfg_col_real_white)
- init_pair (WEECHAT_COLOR_WHITE, -1, -1);
- }
-}
-
-/*
- * gui_init_weechat_colors: init WeeChat colors
- */
-
-void
-gui_init_weechat_colors ()
-{
- int i;
-
- /* init WeeChat colors */
- gui_color[COLOR_WIN_SEPARATOR] = gui_color_build (COLOR_WIN_SEPARATOR, cfg_col_separator, cfg_col_separator);
- gui_color[COLOR_WIN_TITLE] = gui_color_build (COLOR_WIN_TITLE, cfg_col_title, cfg_col_title_bg);
- gui_color[COLOR_WIN_CHAT] = gui_color_build (COLOR_WIN_CHAT, cfg_col_chat, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_TIME] = gui_color_build (COLOR_WIN_CHAT_TIME, cfg_col_chat_time, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_TIME_SEP] = gui_color_build (COLOR_WIN_CHAT_TIME_SEP, cfg_col_chat_time_sep, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_PREFIX1] = gui_color_build (COLOR_WIN_CHAT_PREFIX1, cfg_col_chat_prefix1, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_PREFIX2] = gui_color_build (COLOR_WIN_CHAT_PREFIX2, cfg_col_chat_prefix2, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_SERVER] = gui_color_build (COLOR_WIN_CHAT_SERVER, cfg_col_chat_server, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_JOIN] = gui_color_build (COLOR_WIN_CHAT_JOIN, cfg_col_chat_join, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_PART] = gui_color_build (COLOR_WIN_CHAT_PART, cfg_col_chat_part, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_NICK] = gui_color_build (COLOR_WIN_CHAT_NICK, cfg_col_chat_nick, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_HOST] = gui_color_build (COLOR_WIN_CHAT_HOST, cfg_col_chat_host, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_CHANNEL] = gui_color_build (COLOR_WIN_CHAT_CHANNEL, cfg_col_chat_channel, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_DARK] = gui_color_build (COLOR_WIN_CHAT_DARK, cfg_col_chat_dark, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_HIGHLIGHT] = gui_color_build (COLOR_WIN_CHAT_HIGHLIGHT, cfg_col_chat_highlight, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_READ_MARKER] = gui_color_build (COLOR_WIN_CHAT_READ_MARKER, cfg_col_chat_read_marker, cfg_col_chat_read_marker_bg);
- gui_color[COLOR_WIN_STATUS] = gui_color_build (COLOR_WIN_STATUS, cfg_col_status, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DELIMITERS] = gui_color_build (COLOR_WIN_STATUS_DELIMITERS, cfg_col_status_delimiters, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_CHANNEL] = gui_color_build (COLOR_WIN_STATUS_CHANNEL, cfg_col_status_channel, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_MSG] = gui_color_build (COLOR_WIN_STATUS_DATA_MSG, cfg_col_status_data_msg, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_PRIVATE] = gui_color_build (COLOR_WIN_STATUS_DATA_PRIVATE, cfg_col_status_data_private, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_HIGHLIGHT] = gui_color_build (COLOR_WIN_STATUS_DATA_HIGHLIGHT, cfg_col_status_data_highlight, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_OTHER] = gui_color_build (COLOR_WIN_STATUS_DATA_OTHER, cfg_col_status_data_other, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_MORE] = gui_color_build (COLOR_WIN_STATUS_MORE, cfg_col_status_more, cfg_col_status_bg);
- gui_color[COLOR_WIN_INFOBAR] = gui_color_build (COLOR_WIN_INFOBAR, cfg_col_infobar, cfg_col_infobar_bg);
- gui_color[COLOR_WIN_INFOBAR_DELIMITERS] = gui_color_build (COLOR_WIN_INFOBAR_DELIMITERS, cfg_col_infobar_delimiters, cfg_col_infobar_bg);
- gui_color[COLOR_WIN_INFOBAR_HIGHLIGHT] = gui_color_build (COLOR_WIN_INFOBAR_HIGHLIGHT, cfg_col_infobar_highlight, cfg_col_infobar_bg);
- gui_color[COLOR_WIN_INPUT] = gui_color_build (COLOR_WIN_INPUT, cfg_col_input, cfg_col_input_bg);
- gui_color[COLOR_WIN_INPUT_SERVER] = gui_color_build (COLOR_WIN_INPUT_SERVER, cfg_col_input_server, cfg_col_input_bg);
- gui_color[COLOR_WIN_INPUT_CHANNEL] = gui_color_build (COLOR_WIN_INPUT_CHANNEL, cfg_col_input_channel, cfg_col_input_bg);
- gui_color[COLOR_WIN_INPUT_NICK] = gui_color_build (COLOR_WIN_INPUT_NICK, cfg_col_input_nick, cfg_col_input_bg);
- gui_color[COLOR_WIN_INPUT_DELIMITERS] = gui_color_build (COLOR_WIN_INPUT_DELIMITERS, cfg_col_input_delimiters, cfg_col_input_bg);
- gui_color[COLOR_WIN_NICK] = gui_color_build (COLOR_WIN_NICK, cfg_col_nick, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_AWAY] = gui_color_build (COLOR_WIN_NICK_AWAY, cfg_col_nick_away, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_CHANOWNER] = gui_color_build (COLOR_WIN_NICK_CHANOWNER, cfg_col_nick_chanowner, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_CHANADMIN] = gui_color_build (COLOR_WIN_NICK_CHANADMIN, cfg_col_nick_chanadmin, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_OP] = gui_color_build (COLOR_WIN_NICK_OP, cfg_col_nick_op, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_HALFOP] = gui_color_build (COLOR_WIN_NICK_HALFOP, cfg_col_nick_halfop, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_VOICE] = gui_color_build (COLOR_WIN_NICK_VOICE, cfg_col_nick_voice, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_MORE] = gui_color_build (COLOR_WIN_NICK_MORE, cfg_col_nick_more, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_SEP] = gui_color_build (COLOR_WIN_NICK_SEP, cfg_col_nick_sep, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_SELF] = gui_color_build (COLOR_WIN_NICK_SELF, cfg_col_nick_self, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_PRIVATE] = gui_color_build (COLOR_WIN_NICK_PRIVATE, cfg_col_nick_private, cfg_col_nick_bg);
-
- for (i = 0; i < COLOR_WIN_NICK_NUMBER; i++)
- {
- gui_color[COLOR_WIN_NICK_1 + i] = gui_color_build (COLOR_WIN_NICK_1 + i, cfg_col_nick_colors[i], cfg_col_chat_bg);
- }
-
- gui_color[COLOR_DCC_SELECTED] = gui_color_build (COLOR_DCC_SELECTED, cfg_col_dcc_selected, cfg_col_chat_bg);
- gui_color[COLOR_DCC_WAITING] = gui_color_build (COLOR_DCC_WAITING, cfg_col_dcc_waiting, cfg_col_chat_bg);
- gui_color[COLOR_DCC_CONNECTING] = gui_color_build (COLOR_DCC_CONNECTING, cfg_col_dcc_connecting, cfg_col_chat_bg);
- gui_color[COLOR_DCC_ACTIVE] = gui_color_build (COLOR_DCC_ACTIVE, cfg_col_dcc_active, cfg_col_chat_bg);
- gui_color[COLOR_DCC_DONE] = gui_color_build (COLOR_DCC_DONE, cfg_col_dcc_done, cfg_col_chat_bg);
- gui_color[COLOR_DCC_FAILED] = gui_color_build (COLOR_DCC_FAILED, cfg_col_dcc_failed, cfg_col_chat_bg);
- gui_color[COLOR_DCC_ABORTED] = gui_color_build (COLOR_DCC_ABORTED, cfg_col_dcc_aborted, cfg_col_chat_bg);
-}
-
-/*
- * gui_rebuild_weechat_colors: rebuild WeeChat colors
- */
-
-void
-gui_rebuild_weechat_colors ()
-{
- int i;
-
- if (has_colors ())
- {
- for (i = 0; i < GUI_NUM_COLORS; i++)
- {
- if (gui_color[i])
- {
- if (gui_color[i]->string)
- free (gui_color[i]->string);
- free (gui_color[i]);
- gui_color[i] = NULL;
- }
- }
- gui_init_weechat_colors ();
- }
-}
-
-/*
- * gui_init_colors: init GUI colors
- */
-
-void
-gui_init_colors ()
-{
- if (has_colors ())
- {
- start_color ();
- use_default_colors ();
- }
- gui_init_color_pairs ();
- gui_init_weechat_colors ();
-}
-
-/*
- * gui_set_window_title: set terminal title
- */
-
-void
-gui_set_window_title ()
-{
- char *envterm = getenv ("TERM");
-
- if (envterm)
- {
- if (strcmp( envterm, "sun-cmd") == 0)
- printf ("\033]l%s %s\033\\", PACKAGE_NAME, PACKAGE_VERSION);
- else if (strcmp(envterm, "hpterm") == 0)
- printf ("\033&f0k%dD%s %s", strlen(PACKAGE_NAME) +
- strlen(PACKAGE_VERSION) + 1,
- PACKAGE_NAME, PACKAGE_VERSION);
- /* the following term supports the xterm excapes */
- else if (strncmp (envterm, "xterm", 5) == 0
- || strncmp (envterm, "rxvt", 4) == 0
- || strcmp (envterm, "Eterm") == 0
- || strcmp (envterm, "aixterm") == 0
- || strcmp (envterm, "iris-ansi") == 0
- || strcmp (envterm, "dtterm") == 0)
- printf ("\33]0;%s %s\7", PACKAGE_NAME, PACKAGE_VERSION);
- else if (strcmp (envterm, "screen") == 0)
- {
- printf ("\033k%s %s\033\\", PACKAGE_NAME, PACKAGE_VERSION);
- /* tryning to set the title of a backgrounded xterm like terminal */
- printf ("\33]0;%s %s\7", PACKAGE_NAME, PACKAGE_VERSION);
- }
- }
-}
-
-/*
- * gui_reset_window_title: reset terminal title
- */
-
-void
-gui_reset_window_title ()
-{
- char *envterm = getenv ("TERM");
- char *envshell = getenv ("SHELL");
-
- if (envterm)
- {
- if (strcmp( envterm, "sun-cmd") == 0)
- printf ("\033]l%s\033\\", "Terminal");
- else if (strcmp( envterm, "hpterm") == 0)
- printf ("\033&f0k%dD%s", strlen("Terminal"), "Terminal");
- /* the following term supports the xterm excapes */
- else if (strncmp (envterm, "xterm", 5) == 0
- || strncmp (envterm, "rxvt", 4) == 0
- || strcmp (envterm, "Eterm") == 0
- || strcmp( envterm, "aixterm") == 0
- || strcmp( envterm, "iris-ansi") == 0
- || strcmp( envterm, "dtterm") == 0)
- printf ("\33]0;%s\7", "Terminal");
- else if (strcmp (envterm, "screen") == 0)
- {
- char *shell, *shellname;
- if (envshell)
- {
- shell = strdup (envterm);
- shellname = basename(shell);
- if (shell)
- {
- printf ("\033k%s\033\\", shellname);
- free (shell);
- }
- else
- printf ("\033k%s\033\\", envterm);
- }
- else
- printf ("\033k%s\033\\", envterm);
- /* tryning to reset the title of a backgrounded xterm like terminal */
- printf ("\33]0;%s\7", "Terminal");
- }
- }
-}
-
-/*
- * gui_init: init GUI
- */
-
-void
-gui_init ()
-{
- initscr ();
-
- curs_set (1);
- noecho ();
- nodelay (stdscr, TRUE);
-
- gui_init_colors ();
-
- gui_infobar = NULL;
-
- gui_ok = ((COLS > 5) && (LINES > 5));
-
- refresh ();
-
- /* init clipboard buffer */
- gui_input_clipboard = NULL;
-
- /* create new window/buffer */
- if (gui_window_new (NULL, 0, 0, COLS, LINES, 100, 100))
- {
- gui_current_window = gui_windows;
- gui_buffer_new (gui_windows, NULL, NULL, BUFFER_TYPE_STANDARD, 1);
-
- signal (SIGWINCH, gui_refresh_screen_sigwinch);
-
- if (cfg_look_set_title)
- gui_set_window_title ();
-
- gui_init_ok = 1;
- }
-}
-
-/*
- * gui_end: GUI end
- */
-
-void
-gui_end ()
-{
- t_gui_window *ptr_win;
-
- /* free clipboard buffer */
- if (gui_input_clipboard)
- free(gui_input_clipboard);
-
- /* delete all windows */
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (ptr_win->win_title)
- delwin (ptr_win->win_title);
- if (ptr_win->win_chat)
- delwin (ptr_win->win_chat);
- if (ptr_win->win_nick)
- delwin (ptr_win->win_nick);
- if (ptr_win->win_status)
- delwin (ptr_win->win_status);
- if (ptr_win->win_infobar)
- delwin (ptr_win->win_infobar);
- if (ptr_win->win_input)
- delwin (ptr_win->win_input);
- }
-
- /* delete all buffers */
- while (gui_buffers)
- gui_buffer_free (gui_buffers, 0);
-
- /* delete all windows */
- while (gui_windows)
- gui_window_free (gui_windows);
- gui_window_tree_free (&gui_windows_tree);
-
- /* delete global history */
- history_global_free ();
-
- /* delete infobar messages */
- while (gui_infobar)
- gui_infobar_remove ();
-
- /* reset title */
- if (cfg_look_set_title)
- gui_reset_window_title ();
-
- /* end of curses output */
- refresh ();
- endwin ();
-}
diff --git a/src/gui/gtk/gui-display.c b/src/gui/gtk/gui-display.c
deleted file mode 100644
index a332fb39c..000000000
--- a/src/gui/gtk/gui-display.c
+++ /dev/null
@@ -1,2339 +0,0 @@
-/*
- * 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-display.c: display functions for Gtk GUI */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <signal.h>
-#include <time.h>
-#include <ctype.h>
-#include <gtk/gtk.h>
-
-#include "../../common/weechat.h"
-#include "../gui.h"
-#include "../../common/weeconfig.h"
-#include "../../common/hotlist.h"
-#include "../../common/log.h"
-#include "../../common/utf8.h"
-#include "../../irc/irc.h"
-
-
-/* TODO: remove these temporary defines */
-
-#define A_BOLD 1
-#define A_UNDERLINE 2
-#define A_REVERSE 4
-
-#define COLOR_BLACK 0
-#define COLOR_BLUE 1
-#define COLOR_GREEN 2
-#define COLOR_CYAN 3
-#define COLOR_RED 4
-#define COLOR_MAGENTA 5
-#define COLOR_YELLOW 6
-#define COLOR_WHITE 7
-
-
-/* shift ncurses colors for compatibility with colors
- in IRC messages (same as other IRC clients) */
-
-#define WEECHAT_COLOR_BLACK COLOR_BLACK
-#define WEECHAT_COLOR_RED COLOR_BLUE
-#define WEECHAT_COLOR_GREEN COLOR_GREEN
-#define WEECHAT_COLOR_YELLOW COLOR_CYAN
-#define WEECHAT_COLOR_BLUE COLOR_RED
-#define WEECHAT_COLOR_MAGENTA COLOR_MAGENTA
-#define WEECHAT_COLOR_CYAN COLOR_YELLOW
-#define WEECHAT_COLOR_WHITE COLOR_WHITE
-
-t_gui_color gui_weechat_colors[] =
-{ { -1, 0, 0, "default" },
- { WEECHAT_COLOR_BLACK, 0, 0, "black" },
- { WEECHAT_COLOR_RED, 0, 0, "red" },
- { WEECHAT_COLOR_RED, 0, A_BOLD, "lightred" },
- { WEECHAT_COLOR_GREEN, 0, 0, "green" },
- { WEECHAT_COLOR_GREEN, 0, A_BOLD, "lightgreen" },
- { WEECHAT_COLOR_YELLOW, 0, 0, "brown" },
- { WEECHAT_COLOR_YELLOW, 0, A_BOLD, "yellow" },
- { WEECHAT_COLOR_BLUE, 0, 0, "blue" },
- { WEECHAT_COLOR_BLUE, 0, A_BOLD, "lightblue" },
- { WEECHAT_COLOR_MAGENTA, 0, 0, "magenta" },
- { WEECHAT_COLOR_MAGENTA, 0, A_BOLD, "lightmagenta" },
- { WEECHAT_COLOR_CYAN, 0, 0, "cyan" },
- { WEECHAT_COLOR_CYAN, 0, A_BOLD, "lightcyan" },
- { WEECHAT_COLOR_WHITE, 0, A_BOLD, "white" },
- { 0, 0, 0, NULL }
-};
-
-int gui_irc_colors[GUI_NUM_IRC_COLORS][2] =
-{ { /* 0 */ WEECHAT_COLOR_WHITE, A_BOLD },
- { /* 1 */ WEECHAT_COLOR_BLACK, 0 },
- { /* 2 */ WEECHAT_COLOR_BLUE, 0 },
- { /* 3 */ WEECHAT_COLOR_GREEN, 0 },
- { /* 4 */ WEECHAT_COLOR_RED, A_BOLD },
- { /* 5 */ WEECHAT_COLOR_RED, 0 },
- { /* 6 */ WEECHAT_COLOR_MAGENTA, 0 },
- { /* 7 */ WEECHAT_COLOR_YELLOW, 0 },
- { /* 8 */ WEECHAT_COLOR_YELLOW, A_BOLD },
- { /* 9 */ WEECHAT_COLOR_GREEN, A_BOLD },
- { /* 10 */ WEECHAT_COLOR_CYAN, 0 },
- { /* 11 */ WEECHAT_COLOR_CYAN, A_BOLD },
- { /* 12 */ WEECHAT_COLOR_BLUE, A_BOLD },
- { /* 13 */ WEECHAT_COLOR_MAGENTA, A_BOLD },
- { /* 14 */ WEECHAT_COLOR_WHITE, 0 },
- { /* 15 */ WEECHAT_COLOR_WHITE, A_BOLD }
-};
-
-t_gui_color *gui_color[GUI_NUM_COLORS];
-
-GtkWidget *gtk_main_window;
-GtkWidget *vbox1;
-GtkWidget *entry_topic;
-GtkWidget *notebook1;
-GtkWidget *vbox2;
-GtkWidget *hbox1;
-GtkWidget *hpaned1;
-GtkWidget *scrolledwindow_chat;
-GtkWidget *scrolledwindow_nick;
-GtkWidget *entry_input;
-GtkWidget *label1;
-
-
-/*
- * gui_assign_color: assign a WeeChat color (read from config)
- */
-
-int
-gui_assign_color (int *color, char *color_name)
-{
- int i;
-
- /* look for curses colors in table */
- i = 0;
- while (gui_weechat_colors[i].string)
- {
- if (ascii_strcasecmp (gui_weechat_colors[i].string, color_name) == 0)
- {
- *color = i;
- return 1;
- }
- i++;
- }
-
- /* color not found */
- return 0;
-}
-
-/*
- * gui_get_color_name: get color name
- */
-
-char *
-gui_get_color_name (int num_color)
-{
- return gui_weechat_colors[num_color].string;
-}
-
-/*
- * gui_color_decode: parses a message (coming from IRC server),
- * and according:
- * - remove any color/style in message
- * or:
- * - change colors by codes to be compatible with
- * other IRC clients
- * After use, string returned has to be free()
- */
-
-unsigned char *
-gui_color_decode (unsigned char *string, int keep_colors)
-{
- unsigned char *out;
- int out_length, out_pos;
- char str_fg[3], str_bg[3];
- int fg, bg, attr;
-
- out_length = (strlen ((char *)string) * 2) + 1;
- out = (unsigned char *)malloc (out_length);
- if (!out)
- return NULL;
-
- out_pos = 0;
- while (string[0] && (out_pos < out_length - 1))
- {
- switch (string[0])
- {
- case GUI_ATTR_BOLD_CHAR:
- case GUI_ATTR_RESET_CHAR:
- case GUI_ATTR_FIXED_CHAR:
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- case GUI_ATTR_ITALIC_CHAR:
- case GUI_ATTR_UNDERLINE_CHAR:
- if (keep_colors)
- out[out_pos++] = string[0];
- string++;
- break;
- case GUI_ATTR_COLOR_CHAR:
- string++;
- str_fg[0] = '\0';
- str_bg[0] = '\0';
- 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 (keep_colors)
- {
- if (!str_fg[0] && !str_bg[0])
- out[out_pos++] = GUI_ATTR_COLOR_CHAR;
- else
- {
- attr = 0;
- if (str_fg[0])
- {
- sscanf (str_fg, "%d", &fg);
- fg %= 16;
- attr |= gui_irc_colors[fg][1];
- }
- if (str_bg[0])
- {
- sscanf (str_bg, "%d", &bg);
- bg %= 16;
- attr |= gui_irc_colors[bg][1];
- }
- if (attr & A_BOLD)
- {
- out[out_pos++] = GUI_ATTR_WEECHAT_SET_CHAR;
- out[out_pos++] = GUI_ATTR_BOLD_CHAR;
- }
- else
- {
- out[out_pos++] = GUI_ATTR_WEECHAT_REMOVE_CHAR;
- out[out_pos++] = GUI_ATTR_BOLD_CHAR;
- }
- out[out_pos++] = GUI_ATTR_COLOR_CHAR;
- if (str_fg[0])
- {
- out[out_pos++] = (gui_irc_colors[fg][0] / 10) + '0';
- out[out_pos++] = (gui_irc_colors[fg][0] % 10) + '0';
- }
- if (str_bg[0])
- {
- out[out_pos++] = ',';
- out[out_pos++] = (gui_irc_colors[bg][0] / 10) + '0';
- out[out_pos++] = (gui_irc_colors[bg][0] % 10) + '0';
- }
- }
- }
- break;
- case GUI_ATTR_WEECHAT_COLOR_CHAR:
- string++;
- if (isdigit (string[0]) && isdigit (string[1]))
- {
- if (keep_colors)
- {
- out[out_pos++] = string[0];
- out[out_pos++] = string[1];
- }
- string += 2;
- }
- break;
- case GUI_ATTR_WEECHAT_SET_CHAR:
- case GUI_ATTR_WEECHAT_REMOVE_CHAR:
- string++;
- if (string[0])
- {
- if (keep_colors)
- {
- out[out_pos++] = *(string - 1);
- out[out_pos++] = string[0];
- }
- string++;
- }
- break;
- default:
- out[out_pos++] = string[0];
- string++;
- }
- }
- out[out_pos] = '\0';
- return out;
-}
-
-/*
- * gui_color_decode_for_user_entry: parses a message (coming from IRC server),
- * and replaces colors/bold/.. by %C, %B, ..
- * After use, string returned has to be free()
- */
-
-unsigned char *
-gui_color_decode_for_user_entry (unsigned char *string)
-{
- unsigned char *out;
- int out_length, out_pos;
-
- out_length = (strlen ((char *)string) * 2) + 1;
- out = (unsigned char *)malloc (out_length);
- if (!out)
- return NULL;
-
- out_pos = 0;
- while (string[0] && (out_pos < out_length - 1))
- {
- switch (string[0])
- {
- case GUI_ATTR_BOLD_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'B';
- string++;
- break;
- case GUI_ATTR_FIXED_CHAR:
- string++;
- break;
- case GUI_ATTR_RESET_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'O';
- string++;
- break;
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'R';
- string++;
- break;
- case GUI_ATTR_ITALIC_CHAR:
- string++;
- break;
- case GUI_ATTR_UNDERLINE_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'R';
- string++;
- break;
- case GUI_ATTR_COLOR_CHAR:
- out[out_pos++] = '%';
- out[out_pos++] = 'C';
- string++;
- break;
- default:
- out[out_pos++] = string[0];
- string++;
- }
- }
- out[out_pos] = '\0';
- return out;
-}
-
-/*
- * gui_color_encode: parses a message (entered by user), and
- * encode special chars (%B, %C, ..) in IRC colors
- * After use, string returned has to be free()
- */
-
-unsigned char *
-gui_color_encode (unsigned char *string)
-{
- unsigned char *out;
- int out_length, out_pos;
-
- out_length = (strlen ((char *)string) * 2) + 1;
- out = (unsigned char *)malloc (out_length);
- if (!out)
- return NULL;
-
- out_pos = 0;
- while (string[0] && (out_pos < out_length - 1))
- {
- switch (string[0])
- {
- case '%':
- string++;
- switch (string[0])
- {
- case '\0':
- out[out_pos++] = '%';
- break;
- case '%': /* double '%' replaced by single '%' */
- out[out_pos++] = string[0];
- string++;
- break;
- case 'B': /* bold */
- out[out_pos++] = GUI_ATTR_BOLD_CHAR;
- string++;
- break;
- case 'C': /* color */
- out[out_pos++] = GUI_ATTR_COLOR_CHAR;
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- }
- }
- if (string[0] == ',')
- {
- out[out_pos++] = ',';
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- if (isdigit (string[0]))
- {
- out[out_pos++] = string[0];
- string++;
- }
- }
- }
- break;
- case 'O': /* reset */
- out[out_pos++] = GUI_ATTR_RESET_CHAR;
- string++;
- break;
- case 'R': /* reverse */
- out[out_pos++] = GUI_ATTR_REVERSE_CHAR;
- string++;
- break;
- case 'U': /* underline */
- out[out_pos++] = GUI_ATTR_UNDERLINE_CHAR;
- string++;
- break;
- default:
- out[out_pos++] = '%';
- out[out_pos++] = string[0];
- string++;
- }
- break;
- default:
- out[out_pos++] = string[0];
- string++;
- }
- }
- out[out_pos] = '\0';
- return out;
-}
-
-/*
- * gui_color_build: build a WeeChat color with foreground,
- * background and attributes (attributes are
- * given with foreground color, with a OR)
- */
-
-t_gui_color *
-gui_color_build (int number, int foreground, int background)
-{
- t_gui_color *new_color;
-
- new_color = (t_gui_color *)malloc (sizeof (t_gui_color));
- if (!new_color)
- return NULL;
-
- new_color->foreground = gui_weechat_colors[foreground].foreground;
- new_color->background = gui_weechat_colors[background].foreground;
- new_color->attributes = gui_weechat_colors[foreground].attributes;
- new_color->string = (char *)malloc (4);
- if (new_color->string)
- snprintf (new_color->string, 4,
- "%s%02d",
- GUI_ATTR_WEECHAT_COLOR_STR, number);
-
- return new_color;
-}
-
-/*
- * gui_color_get_pair: get color pair with a WeeChat color number
- */
-
-int
-gui_color_get_pair (int num_color)
-{
- int fg, bg;
-
- if ((num_color < 0) || (num_color > GUI_NUM_COLORS - 1))
- return WEECHAT_COLOR_WHITE;
-
- fg = gui_color[num_color]->foreground;
- bg = gui_color[num_color]->background;
-
- if (((fg == -1) || (fg == 99))
- && ((bg == -1) || (bg == 99)))
- return 63;
- if ((fg == -1) || (fg == 99))
- fg = WEECHAT_COLOR_WHITE;
- if ((bg == -1) || (bg == 99))
- bg = 0;
-
- return (bg * 8) + fg;
-}
-
-/*
- * gui_window_set_weechat_color: set WeeChat color for window
- */
-
-/* TODO: write this function for Gtk */
-/*void
-gui_window_set_weechat_color (WINDOW *window, int num_color)
-{
- if ((num_color >= 0) && (num_color <= GUI_NUM_COLORS - 1))
- {
- wattroff (window, A_BOLD | A_UNDERLINE | A_REVERSE);
- wattron (window, COLOR_PAIR(gui_color_get_pair (num_color)) |
- gui_color[num_color]->attributes);
- }
-}*/
-
-/*
- * gui_window_chat_set_style: set style (bold, underline, ..)
- * for a chat window
- */
-
-void
-gui_window_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_window_chat_remove_style: remove style (bold, underline, ..)
- * for a chat window
- */
-
-void
-gui_window_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_window_chat_toggle_style: toggle a style (bold, underline, ..)
- * for a chat window
- */
-
-void
-gui_window_chat_toggle_style (t_gui_window *window, int style)
-{
- window->current_style_attr ^= style;
- if (window->current_style_attr & style)
- gui_window_chat_set_style (window, style);
- else
- gui_window_chat_remove_style (window, style);
-}
-
-/*
- * gui_window_chat_reset_style: reset style (color and attr)
- * for a chat window
- */
-
-void
-gui_window_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_window_chat_remove_style (window,
- A_BOLD | A_UNDERLINE | A_REVERSE);
-}
-
-/*
- * gui_window_chat_set_color_style: set style for color
- */
-
-void
-gui_window_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_window_chat_remove_color_style: remove style for color
- */
-
-void
-gui_window_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_window_chat_reset_color_style: reset style for color
- */
-
-void
-gui_window_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_window_chat_set_color: set color for a chat window
- */
-
-void
-gui_window_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_window_chat_set_weechat_color: set a WeeChat color for a chat window
- */
-
-void
-gui_window_chat_set_weechat_color (t_gui_window *window, int weechat_color)
-{
- gui_window_chat_reset_style (window);
- gui_window_chat_set_style (window,
- gui_color[weechat_color]->attributes);
- gui_window_chat_set_color (window,
- gui_color[weechat_color]->foreground,
- gui_color[weechat_color]->background);
-}
-
-/*
- * gui_calculate_pos_size: calculate position and size for a window & sub-win
- */
-
-int
-gui_calculate_pos_size (t_gui_window *window, int force_calculate)
-{
- /* TODO: write this function for Gtk */
- (void) window;
- (void) force_calculate;
-
- return 0;
-}
-
-/*
- * gui_draw_window_separator: draw window separation
- */
-
-void
-gui_draw_window_separator (t_gui_window *window)
-{
- /* TODO: write this function for Gtk */
- /*if (window->win_separator)
- delwin (window->win_separator);
-
- if (window->win_x > 0)
- {
- window->win_separator = newwin (window->win_height,
- 1,
- window->win_y,
- window->win_x - 1);
- gui_window_set_weechat_color (window->win_separator, COLOR_WIN_SEPARATOR);
- wborder (window->win_separator, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
- wnoutrefresh (window->win_separator);
- refresh ();
- }*/
- (void) window;
-}
-
-/*
- * gui_draw_buffer_title: draw title window for a buffer
- */
-
-void
-gui_draw_buffer_title (t_gui_buffer *buffer, int erase)
-{
- /* TODO: write this function for Gtk */
- (void) buffer;
- (void) erase;
-}
-
-/*
- * gui_word_get_next_char: returns next char of a word
- * special chars like colors, bold, .. are skipped
- */
-
-char *
-gui_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_window_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_window_chat_reset_color_style (window);
- window->current_style_fg = fg;
- window->current_style_bg = bg;
- gui_window_chat_set_color (window, fg, bg);
- }
- break;
- case GUI_ATTR_RESET_CHAR:
- string++;
- if (apply_style)
- gui_window_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_window_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_window_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_window_chat_set_color_style (window, A_BOLD);
- break;
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- string++;
- if (apply_style)
- gui_window_chat_set_color_style (window, A_REVERSE);
- break;
- case GUI_ATTR_UNDERLINE_CHAR:
- string++;
- if (apply_style)
- gui_window_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_window_chat_remove_color_style (window, A_BOLD);
- break;
- case GUI_ATTR_REVERSE_CHAR:
- case GUI_ATTR_REVERSE2_CHAR:
- string++;
- if (apply_style)
- gui_window_chat_remove_color_style (window, A_REVERSE);
- break;
- case GUI_ATTR_UNDERLINE_CHAR:
- string++;
- if (apply_style)
- gui_window_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_window_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_display_word_raw: display word on chat buffer, letter by letter
- * special chars like color, bold, .. are interpreted
- */
-
-void
-gui_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_display_word: display a word on chat buffer
- */
-
-void
-gui_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_get_word_info: returns info about next word: beginning, end, length
- */
-
-void
-gui_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_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_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_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_calculate_line_diff: returns pointer to line & offset for a difference
- * with given line
- */
-
-void
-gui_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_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_display_line (window, *line, 0, 1);
- }
- }
- else
- current_size = gui_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_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_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_draw_buffer_chat: draw chat window for a buffer
- */
-
-void
-gui_draw_buffer_chat (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_draw_buffer_chat_line: add a line to chat window for a buffer
- */
-
-void
-gui_draw_buffer_chat_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 (ptr_win->textbuffer_chat,
- (char *)text_without_color, -1);
- gtk_text_buffer_insert_at_cursor (ptr_win->textbuffer_chat,
- "\n", -1);
- gtk_text_buffer_get_bounds (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);
- }
- }
-}
-
-/*
- * gui_draw_buffer_nick: draw nick window for a buffer
- */
-
-void
-gui_draw_buffer_nick (t_gui_buffer *buffer, int erase)
-{
- /*t_gui_window *ptr_win;
- int i, j, x, y, column, max_length, nicks_displayed;
- char format[32], format_empty[32];
- t_irc_nick *ptr_nick;*/
-
- if (!gui_ok || !BUFFER_HAS_NICKLIST(buffer))
- return;
-
- /* TODO: write this function for Gtk */
- (void) buffer;
- (void) erase;
-}
-
-/*
- * gui_draw_buffer_status: draw status window for a buffer
- */
-
-void
-gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
-{
- /*t_gui_window *ptr_win;
- t_weechat_hotlist *ptr_hotlist;
- char format[32], str_nicks[32], *more;
- int i, first_mode, x, server_pos, server_total;
- int display_name, names_count;*/
-
- /* make gcc happy */
- (void) buffer;
-
- if (!gui_ok)
- return;
-
- /* TODO: write this function for Gtk */
- (void) buffer;
- (void) erase;
-}
-
-/*
- * gui_draw_buffer_infobar_time: draw time in infobar window
- */
-
-void
-gui_draw_buffer_infobar_time (t_gui_buffer *buffer)
-{
- /*t_gui_window *ptr_win;
- time_t time_seconds;
- struct tm *local_time;*/
-
- /* make gcc happy */
- (void) buffer;
-
- if (!gui_ok)
- return;
-
- /* TODO: write this function for Gtk */
- (void) buffer;
-}
-
-/*
- * gui_draw_buffer_infobar: draw infobar window for a buffer
- */
-
-void
-gui_draw_buffer_infobar (t_gui_buffer *buffer, int erase)
-{
- /*t_gui_window *ptr_win;
- time_t time_seconds;
- struct tm *local_time;
- char text_time[1024 + 1];*/
-
- /* make gcc happy */
- (void) buffer;
-
- if (!gui_ok)
- return;
-
- /* TODO: write this function for Gtk */
- (void) buffer;
- (void) erase;
-}
-
-/*
- * gui_get_input_width: return input width (max # chars displayed)
- */
-
-int
-gui_get_input_width (t_gui_window *window, char *nick)
-{
- if (CHANNEL(window->buffer))
- return (window->win_width - strlen (CHANNEL(window->buffer)->name) -
- strlen (nick) - 4);
- else
- return (window->win_width - strlen (nick) - 3);
-}
-
-/*
- * gui_draw_buffer_input: draw input window for a buffer
- */
-
-void
-gui_draw_buffer_input (t_gui_buffer *buffer, int erase)
-{
- /*t_gui_window *ptr_win;
- char format[32];
- char *ptr_nickname;
- int input_width;
- t_irc_dcc *dcc_selected;*/
-
- if (!gui_ok)
- return;
-
- /* TODO: write this function for Gtk */
- (void) buffer;
- (void) erase;
-}
-
-/*
- * gui_redraw_buffer: redraw a buffer
- */
-
-void
-gui_redraw_buffer (t_gui_buffer *buffer)
-{
- t_gui_window *ptr_win;
-
- if (!gui_ok)
- return;
-
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- if (ptr_win->buffer == buffer)
- {
- gui_draw_buffer_title (buffer, 1);
- gui_draw_buffer_chat (buffer, 1);
- if (ptr_win->win_nick)
- gui_draw_buffer_nick (buffer, 1);
- gui_draw_buffer_status (buffer, 1);
- if (cfg_look_infobar)
- gui_draw_buffer_infobar (buffer, 1);
- gui_draw_buffer_input (buffer, 1);
- }
- }
-}
-
-/*
- * gui_switch_to_buffer: switch to another buffer
- */
-
-void
-gui_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
-{
- GtkTextIter start, end;
-
- if (window->buffer->num_displayed > 0)
- window->buffer->num_displayed--;
-
- if (window->buffer != buffer)
- {
- window->buffer->last_read_line = window->buffer->last_line;
- if (buffer->last_read_line == buffer->last_line)
- buffer->last_read_line = NULL;
- }
-
- window->buffer = buffer;
- window->win_nick_start = 0;
- gui_calculate_pos_size (window, 1);
-
- if (!window->textview_chat)
- {
- window->textview_chat = gtk_text_view_new ();
- gtk_widget_show (window->textview_chat);
- gtk_container_add (GTK_CONTAINER (scrolledwindow_chat), window->textview_chat);
- gtk_widget_set_size_request (window->textview_chat, 300, -1);
- gtk_text_view_set_editable (GTK_TEXT_VIEW (window->textview_chat), FALSE);
- gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (window->textview_chat), FALSE);
-
- window->textbuffer_chat = gtk_text_buffer_new (NULL);
- gtk_text_view_set_buffer (GTK_TEXT_VIEW (window->textview_chat), window->textbuffer_chat);
-
- /*window->texttag_chat = gtk_text_buffer_create_tag(window->textbuffer_chat, "courier", "font_family", "lucida");*/
- gtk_text_buffer_get_bounds (window->textbuffer_chat, &start, &end);
- gtk_text_buffer_apply_tag (window->textbuffer_chat, window->texttag_chat, &start, &end);
- }
- if (BUFFER_IS_CHANNEL(buffer) && !window->textbuffer_nicklist)
- {
- window->textview_nicklist = gtk_text_view_new ();
- gtk_widget_show (window->textview_nicklist);
- gtk_container_add (GTK_CONTAINER (scrolledwindow_nick), window->textview_nicklist);
- gtk_text_view_set_editable (GTK_TEXT_VIEW (window->textview_nicklist), FALSE);
- gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (window->textview_nicklist), FALSE);
-
- window->textbuffer_nicklist = gtk_text_buffer_new (NULL);
- gtk_text_view_set_buffer (GTK_TEXT_VIEW (window->textview_nicklist), window->textbuffer_nicklist);
- }
-
- window->start_line = NULL;
- window->start_line_pos = 0;
-
- buffer->num_displayed++;
-
- hotlist_remove_buffer (buffer);
-}
-
-/*
- * gui_window_page_up: display previous page on buffer
- */
-
-void
-gui_window_page_up (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (!window->first_line_displayed)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- (window->start_line) ?
- (-1) * (window->win_chat_height - 1) :
- (-1) * ((window->win_chat_height - 1) * 2));
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_page_down: display next page on buffer
- */
-
-void
-gui_window_page_down (t_gui_window *window)
-{
- t_gui_line *ptr_line;
- int line_pos;
-
- if (!gui_ok)
- return;
-
- if (window->start_line)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- window->win_chat_height - 1);
-
- /* check if we can display all */
- ptr_line = window->start_line;
- line_pos = window->start_line_pos;
- gui_calculate_line_diff (window, &ptr_line,
- &line_pos,
- window->win_chat_height - 1);
- if (!ptr_line)
- {
- window->start_line = NULL;
- window->start_line_pos = 0;
- }
-
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_up: display previous few lines in buffer
- */
-
-void
-gui_window_scroll_up (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (!window->first_line_displayed)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- (window->start_line) ?
- (-1) * cfg_look_scroll_amount :
- (-1) * ( (window->win_chat_height - 1) + cfg_look_scroll_amount));
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_down: display next few lines in buffer
- */
-
-void
-gui_window_scroll_down (t_gui_window *window)
-{
- t_gui_line *ptr_line;
- int line_pos;
-
- if (!gui_ok)
- return;
-
- if (window->start_line)
- {
- gui_calculate_line_diff (window, &window->start_line,
- &window->start_line_pos,
- cfg_look_scroll_amount);
-
- /* check if we can display all */
- ptr_line = window->start_line;
- line_pos = window->start_line_pos;
- gui_calculate_line_diff (window, &ptr_line,
- &line_pos,
- window->win_chat_height - 1);
-
- if (!ptr_line)
- {
- window->start_line = NULL;
- window->start_line_pos = 0;
- }
-
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_top: scroll to top of buffer
- */
-
-void
-gui_window_scroll_top (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (!window->first_line_displayed)
- {
- window->start_line = window->buffer->lines;
- window->start_line_pos = 0;
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_scroll_bottom: scroll to bottom of buffer
- */
-
-void
-gui_window_scroll_bottom (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (window->start_line)
- {
- window->start_line = NULL;
- window->start_line_pos = 0;
- gui_draw_buffer_chat (window->buffer, 0);
- gui_draw_buffer_status (window->buffer, 0);
- }
-}
-
-/*
- * gui_window_nick_beginning: go to beginning of nicklist
- */
-
-void
-gui_window_nick_beginning (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- if (window->win_nick_start > 0)
- {
- window->win_nick_start = 0;
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_nick_end: go to the end of nicklist
- */
-
-void
-gui_window_nick_end (t_gui_window *window)
-{
- int new_start;
-
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- new_start =
- CHANNEL(window->buffer)->nicks_count - window->win_nick_height;
- if (new_start < 0)
- new_start = 0;
- else if (new_start >= 1)
- new_start++;
-
- if (new_start != window->win_nick_start)
- {
- window->win_nick_start = new_start;
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_nick_page_up: scroll one page up in nicklist
- */
-
-void
-gui_window_nick_page_up (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- if (window->win_nick_start > 0)
- {
- window->win_nick_start -= (window->win_nick_height - 1);
- if (window->win_nick_start <= 1)
- window->win_nick_start = 0;
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_nick_page_down: scroll one page down in nicklist
- */
-
-void
-gui_window_nick_page_down (t_gui_window *window)
-{
- if (!gui_ok)
- return;
-
- if (BUFFER_HAS_NICKLIST(window->buffer))
- {
- if ((CHANNEL(window->buffer)->nicks_count > window->win_nick_height)
- && (window->win_nick_start + window->win_nick_height - 1
- < CHANNEL(window->buffer)->nicks_count))
- {
- if (window->win_nick_start == 0)
- window->win_nick_start += (window->win_nick_height - 1);
- else
- window->win_nick_start += (window->win_nick_height - 2);
- gui_draw_buffer_nick (window->buffer, 1);
- }
- }
-}
-
-/*
- * gui_window_init_subwindows: init subwindows for a WeeChat window
- */
-
-void
-gui_window_init_subwindows (t_gui_window *window)
-{
- window->textview_chat = NULL;
- window->textbuffer_chat = NULL;
- window->texttag_chat = NULL;
- window->textview_nicklist = NULL;
- window->textbuffer_nicklist = NULL;
-}
-
-/*
- * gui_window_auto_resize: auto-resize all windows, according to % of global size
- * This function is called after a terminal resize.
- * Returns 0 if ok, -1 if all window should be merged
- * (not enough space according to windows %)
- */
-
-int
-gui_window_auto_resize (t_gui_window_tree *tree,
- int x, int y, int width, int height,
- int simulate)
-{
- int size1, size2;
-
- if (tree)
- {
- if (tree->window)
- {
- if ((width < WINDOW_MIN_WIDTH) || (height < WINDOW_MIN_HEIGHT))
- return -1;
- if (!simulate)
- {
- tree->window->win_x = x;
- tree->window->win_y = y;
- tree->window->win_width = width;
- tree->window->win_height = height;
- }
- }
- else
- {
- if (tree->split_horiz)
- {
- size1 = (height * tree->split_pct) / 100;
- size2 = height - size1;
- if (gui_window_auto_resize (tree->child1, x, y + size1,
- width, size2, simulate) < 0)
- return -1;
- if (gui_window_auto_resize (tree->child2, x, y,
- width, size1, simulate) < 0)
- return -1;
- }
- else
- {
- size1 = (width * tree->split_pct) / 100;
- size2 = width - size1 - 1;
- if (gui_window_auto_resize (tree->child1, x, y,
- size1, height, simulate) < 0)
- return -1;
- if (gui_window_auto_resize (tree->child2, x + size1 + 1, y,
- size2, height, simulate) < 0)
- return -1;
- }
- }
- }
- return 0;
-}
-
-/*
- * gui_refresh_windows: auto resize and refresh all windows
- */
-
-void
-gui_refresh_windows ()
-{
- /*t_gui_window *ptr_win, *old_current_window;*/
-
- if (gui_ok)
- {
- /* TODO: write this function for Gtk */
- }
-}
-
-/*
- * gui_window_split_horiz: split a window horizontally
- */
-
-void
-gui_window_split_horiz (t_gui_window *window, int pourcentage)
-{
- t_gui_window *new_window;
- int height1, height2;
-
- if (!gui_ok)
- return;
-
- height1 = (window->win_height * pourcentage) / 100;
- height2 = window->win_height - height1;
-
- if ((height1 >= WINDOW_MIN_HEIGHT) && (height2 >= WINDOW_MIN_HEIGHT)
- && (pourcentage > 0) && (pourcentage <= 100))
- {
- if ((new_window = gui_window_new (window,
- window->win_x, window->win_y,
- window->win_width, height1,
- 100, pourcentage)))
- {
- /* reduce old window height (bottom window) */
- window->win_y = new_window->win_y + new_window->win_height;
- window->win_height = height2;
- window->win_height_pct = 100 - pourcentage;
-
- /* assign same buffer for new window (top window) */
- new_window->buffer = window->buffer;
- new_window->buffer->num_displayed++;
-
- gui_switch_to_buffer (window, window->buffer);
-
- gui_current_window = new_window;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- }
- }
-}
-
-/*
- * gui_window_split_vertic: split a window vertically
- */
-
-void
-gui_window_split_vertic (t_gui_window *window, int pourcentage)
-{
- t_gui_window *new_window;
- int width1, width2;
-
- if (!gui_ok)
- return;
-
- width1 = (window->win_width * pourcentage) / 100;
- width2 = window->win_width - width1 - 1;
-
- if ((width1 >= WINDOW_MIN_WIDTH) && (width2 >= WINDOW_MIN_WIDTH)
- && (pourcentage > 0) && (pourcentage <= 100))
- {
- if ((new_window = gui_window_new (window,
- window->win_x + width1 + 1, window->win_y,
- width2, window->win_height,
- pourcentage, 100)))
- {
- /* reduce old window height (left window) */
- window->win_width = width1;
- window->win_width_pct = 100 - pourcentage;
-
- /* assign same buffer for new window (right window) */
- new_window->buffer = window->buffer;
- new_window->buffer->num_displayed++;
-
- gui_switch_to_buffer (window, window->buffer);
-
- gui_current_window = new_window;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
-
- /* create & draw separator */
- gui_draw_window_separator (gui_current_window);
- }
- }
-}
-
-/*
- * gui_window_resize: resize window
- */
-
-void
-gui_window_resize (t_gui_window *window, int pourcentage)
-{
- /* TODO: write this function for Gtk */
- (void) window;
- (void) pourcentage;
-}
-
-/*
- * gui_window_merge: merge window with its sister
- */
-
-int
-gui_window_merge (t_gui_window *window)
-{
- t_gui_window_tree *parent, *sister;
-
- parent = window->ptr_tree->parent_node;
- if (parent)
- {
- sister = (parent->child1->window == window) ?
- parent->child2 : parent->child1;
-
- if (!(sister->window))
- return 0;
-
- if (window->win_y == sister->window->win_y)
- {
- /* horizontal merge */
- window->win_width += sister->window->win_width + 1;
- window->win_width_pct += sister->window->win_width_pct;
- }
- else
- {
- /* vertical merge */
- window->win_height += sister->window->win_height;
- window->win_height_pct += sister->window->win_height_pct;
- }
- if (sister->window->win_x < window->win_x)
- window->win_x = sister->window->win_x;
- if (sister->window->win_y < window->win_y)
- window->win_y = sister->window->win_y;
-
- gui_window_free (sister->window);
- gui_window_tree_node_to_leaf (parent, window);
-
- gui_switch_to_buffer (window, window->buffer);
- gui_redraw_buffer (window->buffer);
- return 1;
- }
- return 0;
-}
-
-/*
- * gui_window_merge_all: merge all windows into only one
- */
-
-void
-gui_window_merge_all (t_gui_window *window)
-{
- /* TODO: write this function for Gtk */
- (void) window;
-}
-
-/*
- * gui_window_side_by_side: return a code about position of 2 windows:
- * 0 = they're not side by side
- * 1 = side by side (win2 is over the win1)
- * 2 = side by side (win2 on the right)
- * 3 = side by side (win2 below win1)
- * 4 = side by side (win2 on the left)
- */
-
-int
-gui_window_side_by_side (t_gui_window *win1, t_gui_window *win2)
-{
- /* win2 over win1 ? */
- if (win2->win_y + win2->win_height == win1->win_y)
- {
- if (win2->win_x >= win1->win_x + win1->win_width)
- return 0;
- if (win2->win_x + win2->win_width <= win1->win_x)
- return 0;
- return 1;
- }
-
- /* win2 on the right ? */
- if (win2->win_x == win1->win_x + win1->win_width + 1)
- {
- if (win2->win_y >= win1->win_y + win1->win_height)
- return 0;
- if (win2->win_y + win2->win_height <= win1->win_y)
- return 0;
- return 2;
- }
-
- /* win2 below win1 ? */
- if (win2->win_y == win1->win_y + win1->win_height)
- {
- if (win2->win_x >= win1->win_x + win1->win_width)
- return 0;
- if (win2->win_x + win2->win_width <= win1->win_x)
- return 0;
- return 3;
- }
-
- /* win2 on the left ? */
- if (win2->win_x + win2->win_width + 1 == win1->win_x)
- {
- if (win2->win_y >= win1->win_y + win1->win_height)
- return 0;
- if (win2->win_y + win2->win_height <= win1->win_y)
- return 0;
- return 4;
- }
-
- return 0;
-}
-
-/*
- * gui_window_switch_up: search and switch to a window over current window
- */
-
-void
-gui_window_switch_up (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 1))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_window_switch_down: search and switch to a window below current window
- */
-
-void
-gui_window_switch_down (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 3))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_window_switch_left: search and switch to a window on the left of current window
- */
-
-void
-gui_window_switch_left (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 4))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_window_switch_right: search and switch to a window on the right of current window
- */
-
-void
-gui_window_switch_right (t_gui_window *window)
-{
- t_gui_window *ptr_win;
-
- for (ptr_win = gui_windows; ptr_win;
- ptr_win = ptr_win->next_window)
- {
- if ((ptr_win != window) &&
- (gui_window_side_by_side (window, ptr_win) == 2))
- {
- gui_current_window = ptr_win;
- gui_switch_to_buffer (gui_current_window, gui_current_window->buffer);
- gui_redraw_buffer (gui_current_window->buffer);
- return;
- }
- }
-}
-
-/*
- * gui_refresh_screen: called when term size is modified
- */
-
-void
-gui_refresh_screen ()
-{
- /* TODO: write this function for Gtk */
-}
-
-/*
- * gui_refresh_screen_sigwinch: called when signal SIGWINCH is received
- */
-
-void
-gui_refresh_screen_sigwinch ()
-{
- gui_refresh_screen ();
- signal (SIGWINCH, gui_refresh_screen_sigwinch);
-}
-
-/*
- * gui_pre_init: pre-initialize GUI (called before gui_init)
- */
-
-void
-gui_pre_init (int *argc, char **argv[])
-{
- /* Initialise Gtk */
- gtk_init (argc, argv);
-}
-
-/*
- * gui_init_color_pairs: init color pairs
- */
-
-void
-gui_init_color_pairs ()
-{
- /* This function does nothing in Gtk GUI */
-}
-
-/*
- * gui_init_weechat_colors: init WeeChat colors
- */
-
-void
-gui_init_weechat_colors ()
-{
- int i;
-
- /* init WeeChat colors */
- gui_color[COLOR_WIN_SEPARATOR] = gui_color_build (COLOR_WIN_SEPARATOR, cfg_col_separator, cfg_col_separator);
- gui_color[COLOR_WIN_TITLE] = gui_color_build (COLOR_WIN_TITLE, cfg_col_title, cfg_col_title_bg);
- gui_color[COLOR_WIN_CHAT] = gui_color_build (COLOR_WIN_CHAT, cfg_col_chat, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_TIME] = gui_color_build (COLOR_WIN_CHAT_TIME, cfg_col_chat_time, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_TIME_SEP] = gui_color_build (COLOR_WIN_CHAT_TIME_SEP, cfg_col_chat_time_sep, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_PREFIX1] = gui_color_build (COLOR_WIN_CHAT_PREFIX1, cfg_col_chat_prefix1, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_PREFIX2] = gui_color_build (COLOR_WIN_CHAT_PREFIX2, cfg_col_chat_prefix2, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_SERVER] = gui_color_build (COLOR_WIN_CHAT_SERVER, cfg_col_chat_server, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_JOIN] = gui_color_build (COLOR_WIN_CHAT_JOIN, cfg_col_chat_join, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_PART] = gui_color_build (COLOR_WIN_CHAT_PART, cfg_col_chat_part, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_NICK] = gui_color_build (COLOR_WIN_CHAT_NICK, cfg_col_chat_nick, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_HOST] = gui_color_build (COLOR_WIN_CHAT_HOST, cfg_col_chat_host, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_CHANNEL] = gui_color_build (COLOR_WIN_CHAT_CHANNEL, cfg_col_chat_channel, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_DARK] = gui_color_build (COLOR_WIN_CHAT_DARK, cfg_col_chat_dark, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_HIGHLIGHT] = gui_color_build (COLOR_WIN_CHAT_HIGHLIGHT, cfg_col_chat_highlight, cfg_col_chat_bg);
- gui_color[COLOR_WIN_CHAT_READ_MARKER] = gui_color_build (COLOR_WIN_CHAT_READ_MARKER, cfg_col_chat_read_marker, cfg_col_chat_read_marker_bg);
- gui_color[COLOR_WIN_STATUS] = gui_color_build (COLOR_WIN_STATUS, cfg_col_status, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DELIMITERS] = gui_color_build (COLOR_WIN_STATUS_DELIMITERS, cfg_col_status_delimiters, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_CHANNEL] = gui_color_build (COLOR_WIN_STATUS_CHANNEL, cfg_col_status_channel, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_MSG] = gui_color_build (COLOR_WIN_STATUS_DATA_MSG, cfg_col_status_data_msg, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_PRIVATE] = gui_color_build (COLOR_WIN_STATUS_DATA_PRIVATE, cfg_col_status_data_private, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_HIGHLIGHT] = gui_color_build (COLOR_WIN_STATUS_DATA_HIGHLIGHT, cfg_col_status_data_highlight, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_DATA_OTHER] = gui_color_build (COLOR_WIN_STATUS_DATA_OTHER, cfg_col_status_data_other, cfg_col_status_bg);
- gui_color[COLOR_WIN_STATUS_MORE] = gui_color_build (COLOR_WIN_STATUS_MORE, cfg_col_status_more, cfg_col_status_bg);
- gui_color[COLOR_WIN_INFOBAR] = gui_color_build (COLOR_WIN_INFOBAR, cfg_col_infobar, cfg_col_infobar_bg);
- gui_color[COLOR_WIN_INFOBAR_DELIMITERS] = gui_color_build (COLOR_WIN_INFOBAR_DELIMITERS, cfg_col_infobar_delimiters, cfg_col_infobar_bg);
- gui_color[COLOR_WIN_INFOBAR_HIGHLIGHT] = gui_color_build (COLOR_WIN_INFOBAR_HIGHLIGHT, cfg_col_infobar_highlight, cfg_col_infobar_bg);
- gui_color[COLOR_WIN_INPUT] = gui_color_build (COLOR_WIN_INPUT, cfg_col_input, cfg_col_input_bg);
- gui_color[COLOR_WIN_INPUT_CHANNEL] = gui_color_build (COLOR_WIN_INPUT_CHANNEL, cfg_col_input_channel, cfg_col_input_bg);
- gui_color[COLOR_WIN_INPUT_NICK] = gui_color_build (COLOR_WIN_INPUT_NICK, cfg_col_input_nick, cfg_col_input_bg);
- gui_color[COLOR_WIN_INPUT_DELIMITERS] = gui_color_build (COLOR_WIN_INPUT_DELIMITERS, cfg_col_input_delimiters, cfg_col_input_bg);
- gui_color[COLOR_WIN_NICK] = gui_color_build (COLOR_WIN_NICK, cfg_col_nick, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_AWAY] = gui_color_build (COLOR_WIN_NICK_AWAY, cfg_col_nick_away, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_CHANOWNER] = gui_color_build (COLOR_WIN_NICK_CHANOWNER, cfg_col_nick_chanowner, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_CHANADMIN] = gui_color_build (COLOR_WIN_NICK_CHANADMIN, cfg_col_nick_chanadmin, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_OP] = gui_color_build (COLOR_WIN_NICK_OP, cfg_col_nick_op, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_HALFOP] = gui_color_build (COLOR_WIN_NICK_HALFOP, cfg_col_nick_halfop, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_VOICE] = gui_color_build (COLOR_WIN_NICK_VOICE, cfg_col_nick_voice, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_MORE] = gui_color_build (COLOR_WIN_NICK_MORE, cfg_col_nick_more, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_SEP] = gui_color_build (COLOR_WIN_NICK_SEP, cfg_col_nick_sep, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_SELF] = gui_color_build (COLOR_WIN_NICK_SELF, cfg_col_nick_self, cfg_col_nick_bg);
- gui_color[COLOR_WIN_NICK_PRIVATE] = gui_color_build (COLOR_WIN_NICK_PRIVATE, cfg_col_nick_private, cfg_col_nick_bg);
-
- for (i = 0; i < COLOR_WIN_NICK_NUMBER; i++)
- {
- gui_color[COLOR_WIN_NICK_1 + i] = gui_color_build (COLOR_WIN_NICK_1 + i, cfg_col_nick_colors[i], cfg_col_chat_bg);
- }
-
- gui_color[COLOR_DCC_SELECTED] = gui_color_build (COLOR_DCC_SELECTED, cfg_col_dcc_selected, cfg_col_chat_bg);
- gui_color[COLOR_DCC_WAITING] = gui_color_build (COLOR_DCC_WAITING, cfg_col_dcc_waiting, cfg_col_chat_bg);
- gui_color[COLOR_DCC_CONNECTING] = gui_color_build (COLOR_DCC_CONNECTING, cfg_col_dcc_connecting, cfg_col_chat_bg);
- gui_color[COLOR_DCC_ACTIVE] = gui_color_build (COLOR_DCC_ACTIVE, cfg_col_dcc_active, cfg_col_chat_bg);
- gui_color[COLOR_DCC_DONE] = gui_color_build (COLOR_DCC_DONE, cfg_col_dcc_done, cfg_col_chat_bg);
- gui_color[COLOR_DCC_FAILED] = gui_color_build (COLOR_DCC_FAILED, cfg_col_dcc_failed, cfg_col_chat_bg);
- gui_color[COLOR_DCC_ABORTED] = gui_color_build (COLOR_DCC_ABORTED, cfg_col_dcc_aborted, cfg_col_chat_bg);
-}
-
-/*
- * gui_rebuild_weechat_colors: rebuild WeeChat colors
- */
-
-void
-gui_rebuild_weechat_colors ()
-{
- int i;
-
- for (i = 0; i < GUI_NUM_COLORS; i++)
- {
- if (gui_color[i])
- {
- if (gui_color[i]->string)
- free (gui_color[i]->string);
- free (gui_color[i]);
- gui_color[i] = NULL;
- }
- }
- gui_init_weechat_colors ();
-}
-
-/*
- * gui_init_colors: init GUI colors
- */
-
-void
-gui_init_colors ()
-{
- gui_init_color_pairs ();
- gui_init_weechat_colors ();
-}
-
-/*
- * gui_set_window_title: set terminal title
- */
-
-void
-gui_set_window_title ()
-{
- char *envterm = getenv ("TERM");
-
- if (envterm)
- {
- if (strcmp( envterm, "sun-cmd") == 0)
- printf ("\033]l%s %s\033\\", PACKAGE_NAME, PACKAGE_VERSION);
- else if (strcmp(envterm, "hpterm") == 0)
- printf ("\033&f0k%dD%s %s", strlen(PACKAGE_NAME) +
- strlen(PACKAGE_VERSION) + 1,
- PACKAGE_NAME, PACKAGE_VERSION);
- /* the following term supports the xterm excapes */
- else if (strncmp (envterm, "xterm", 5) == 0
- || strncmp (envterm, "rxvt", 4) == 0
- || strcmp (envterm, "Eterm") == 0
- || strcmp (envterm, "aixterm") == 0
- || strcmp (envterm, "iris-ansi") == 0
- || strcmp (envterm, "dtterm") == 0)
- printf ("\33]0;%s %s\7", PACKAGE_NAME, PACKAGE_VERSION);
- else if (strcmp (envterm, "screen") == 0)
- {
- printf ("\033k%s %s\033\\", PACKAGE_NAME, PACKAGE_VERSION);
- /* tryning to set the title of a backgrounded xterm like terminal */
- printf ("\33]0;%s %s\7", PACKAGE_NAME, PACKAGE_VERSION);
- }
- }
-}
-
-/*
- * gui_reset_window_title: reset terminal title
- */
-
-void
-gui_reset_window_title ()
-{
- /* This function does nothing in Gtk GUI */
-}
-
-/*
- * gui_init: init GUI
- */
-
-void
-gui_init ()
-{
- GdkColor color_fg, color_bg;
-
- gui_init_colors ();
-
- gui_infobar = NULL;
-
- gui_ok = 1;
-
- /* init clipboard buffer */
- gui_input_clipboard = NULL;
-
- /* create Gtk widgets */
-
- gdk_color_parse ("white", &color_fg);
- gdk_color_parse ("black", &color_bg);
-
- gtk_main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (gtk_main_window), PACKAGE_STRING);
-
- g_signal_connect (G_OBJECT (gtk_main_window), "destroy", gtk_main_quit, NULL);
-
- vbox1 = gtk_vbox_new (FALSE, 0);
- gtk_widget_show (vbox1);
- gtk_container_add (GTK_CONTAINER (gtk_main_window), vbox1);
-
- entry_topic = gtk_entry_new ();
- gtk_widget_show (entry_topic);
- gtk_box_pack_start (GTK_BOX (vbox1), entry_topic, FALSE, FALSE, 0);
- gtk_widget_modify_text (entry_topic, GTK_STATE_NORMAL, &color_fg);
- gtk_widget_modify_base (entry_topic, GTK_STATE_NORMAL, &color_bg);
-
- notebook1 = gtk_notebook_new ();
- gtk_widget_show (notebook1);
- gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0);
- gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_BOTTOM);
-
- vbox2 = gtk_vbox_new (FALSE, 0);
- gtk_widget_show (vbox2);
- gtk_container_add (GTK_CONTAINER (notebook1), vbox2);
-
- hbox1 = gtk_hbox_new (FALSE, 0);
- gtk_widget_show (hbox1);
- gtk_box_pack_start (GTK_BOX (vbox2), hbox1, TRUE, TRUE, 0);
-
- hpaned1 = gtk_hpaned_new ();
- gtk_widget_show (hpaned1);
- gtk_box_pack_start (GTK_BOX (hbox1), hpaned1, TRUE, TRUE, 0);
- gtk_paned_set_position (GTK_PANED (hpaned1), 0);
-
- scrolledwindow_chat = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_show (scrolledwindow_chat);
- gtk_paned_pack1 (GTK_PANED (hpaned1), scrolledwindow_chat, FALSE, TRUE);
- //gtk_box_pack_start (GTK_PANED (hpaned1), scrolledwindow_chat, TRUE, TRUE, 0);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_chat), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
- gtk_widget_modify_text (scrolledwindow_chat, GTK_STATE_NORMAL, &color_fg);
- gtk_widget_modify_base (scrolledwindow_chat, GTK_STATE_NORMAL, &color_bg);
-
- scrolledwindow_nick = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_show (scrolledwindow_nick);
- gtk_paned_pack2 (GTK_PANED (hpaned1), scrolledwindow_nick, FALSE, TRUE);
- //gtk_box_pack_start (GTK_PANED (hpaned1), scrolledwindow_nick, TRUE, TRUE, 0);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_nick), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
- gtk_widget_modify_text (scrolledwindow_nick, GTK_STATE_NORMAL, &color_fg);
- gtk_widget_modify_base (scrolledwindow_nick, GTK_STATE_NORMAL, &color_bg);
-
- entry_input = gtk_entry_new ();
- gtk_widget_show (entry_input);
- gtk_box_pack_start (GTK_BOX (vbox2), entry_input, FALSE, FALSE, 0);
- gtk_widget_modify_text (entry_input, GTK_STATE_NORMAL, &color_fg);
- gtk_widget_modify_base (entry_input, GTK_STATE_NORMAL, &color_bg);
-
- label1 = gtk_label_new (_("server"));
- gtk_widget_show (label1);
- gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), label1);
- gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
-
- gtk_widget_show_all (gtk_main_window);
-
- /* create new window/buffer */
- if (gui_window_new (NULL, 0, 0, 0, 0, 100, 100))
- {
- gui_current_window = gui_windows;
- gui_buffer_new (gui_windows, NULL, NULL, 0, 1);
-
- signal (SIGWINCH, gui_refresh_screen_sigwinch);
-
- if (cfg_look_set_title)
- gui_set_window_title ();
-
- gui_init_ok = 1;
- }
-}
-
-/*
- * gui_end: GUI end
- */
-
-void
-gui_end ()
-{
- t_gui_window *ptr_win;
-
- /* free clipboard buffer */
- if (gui_input_clipboard)
- free(gui_input_clipboard);
-
- /* delete all windows */
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
- {
- /* TODO: destroy Gtk widgets */
- }
-
- /* delete all buffers */
- while (gui_buffers)
- gui_buffer_free (gui_buffers, 0);
-
- /* delete all windows */
- while (gui_windows)
- gui_window_free (gui_windows);
- gui_window_tree_free (&gui_windows_tree);
-
- /* delete global history */
- history_global_free ();
-
- /* delete infobar messages */
- while (gui_infobar)
- gui_infobar_remove ();
-
- /* reset title */
- if (cfg_look_set_title)
- gui_reset_window_title ();
-}