From 4b3d25175f84ec6c17762df3d5760c88b0a01688 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sat, 11 Sep 2004 14:54:11 +0000 Subject: [PATCH] Display DCC progress in realtime, added selected DCC color config option, move into DCC list is ok (scroll) --- po/fr.po | 40 ++++++---- po/weechat.pot | 40 ++++++---- src/common/hotlist.c | 4 + src/common/weeconfig.c | 5 ++ src/common/weeconfig.h | 1 + src/gui/curses/gui-display.c | 34 +++++++-- src/gui/curses/gui-input.c | 49 +++++++++++- src/gui/gui-common.c | 4 + src/gui/gui.h | 22 ++++-- src/irc/irc-dcc.c | 110 +++++++++++++++++++++------ src/irc/irc.h | 5 +- weechat/po/fr.po | 40 ++++++---- weechat/po/weechat.pot | 40 ++++++---- weechat/src/common/hotlist.c | 4 + weechat/src/common/weeconfig.c | 5 ++ weechat/src/common/weeconfig.h | 1 + weechat/src/gui/curses/gui-display.c | 34 +++++++-- weechat/src/gui/curses/gui-input.c | 49 +++++++++++- weechat/src/gui/gui-common.c | 4 + weechat/src/gui/gui.h | 22 ++++-- weechat/src/irc/irc-dcc.c | 110 +++++++++++++++++++++------ weechat/src/irc/irc.h | 5 +- 22 files changed, 480 insertions(+), 148 deletions(-) diff --git a/po/fr.po b/po/fr.po index e18ed2fc1..79ee48763 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.0.8-pre2\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2004-09-09 23:11+0200\n" +"POT-Creation-Date: 2004-09-11 15:10+0200\n" "PO-Revision-Date: 2004-08-08 20:47+0200\n" "Last-Translator: FlashCode \n" "Language-Team: weechat-dev \n" @@ -1557,41 +1557,49 @@ msgstr "" "%s: tous les noms d'utilisateurs déclarés sont déjà en cours d'utilisation, " "fermeture de la connexion avec le serveur !\n" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Waiting" msgstr "Attente" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Connecting" msgstr "Connexion" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Active" msgstr "Actif" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Done" msgstr "Terminé" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Failed" msgstr "Echoué" -#: src/irc/irc-dcc.c:44 +#: src/irc/irc-dcc.c:45 msgid "Aborted" msgstr "Interrompu" -#: src/irc/irc-dcc.c:191 +#: src/irc/irc-dcc.c:219 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "%s pas assez de mémoire pour un nouveau DCC\n" -#: src/irc/irc-dcc.c:259 +#: src/irc/irc-dcc.c:244 +msgid "Incoming DCC file from " +msgstr "Réception fichier DCC de " + +#: src/irc/irc-dcc.c:269 +msgid " bytes\n" +msgstr "octets\n" + +#: src/irc/irc-dcc.c:323 #, c-format msgid "DCC: file \"%s\" received from \"%s\": ok!\n" msgstr "DCC: fichier \"%s\" reçu de \"%s\": ok !\n" -#: src/irc/irc-dcc.c:284 +#: src/irc/irc-dcc.c:350 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "abandon du DCC actif: \"%s\" de %s\n" @@ -1673,16 +1681,16 @@ msgstr "Mo" msgid "Gb" msgstr "Go" -#: src/gui/curses/gui-display.c:987 +#: src/gui/curses/gui-display.c:992 #, c-format msgid "%d:[not connected] " msgstr "%d:[non connecté] " -#: src/gui/curses/gui-display.c:995 +#: src/gui/curses/gui-display.c:1000 msgid "[Act: " msgstr "[Act: " -#: src/gui/curses/gui-display.c:1030 src/gui/curses/gui-display.c:1033 +#: src/gui/curses/gui-display.c:1039 src/gui/curses/gui-display.c:1042 msgid "-MORE-" msgstr "-PLUS-" @@ -1690,17 +1698,17 @@ msgstr "-PLUS-" msgid "server" msgstr "serveur" -#: src/gui/gui-common.c:304 +#: src/gui/gui-common.c:306 #, c-format msgid "%s not enough memory for infobar message\n" msgstr "%s pas assez de mémoire pour un message de la barre d'infos\n" -#: src/gui/gui-common.c:439 +#: src/gui/gui-common.c:441 #, c-format msgid "%s not enough memory for new line!\n" msgstr "%s pas assez de mémoire pour une nouvelle ligne !\n" -#: src/gui/gui-common.c:482 +#: src/gui/gui-common.c:484 msgid "not enough memory!\n" msgstr "pas assez de mémoire !\n" diff --git a/po/weechat.pot b/po/weechat.pot index 855d8ae8e..39f2eada5 100644 --- a/po/weechat.pot +++ b/po/weechat.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2004-09-09 23:11+0200\n" +"POT-Creation-Date: 2004-09-11 15:10+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1456,41 +1456,49 @@ msgid "" "server!\n" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Waiting" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Connecting" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Active" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Done" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Failed" msgstr "" -#: src/irc/irc-dcc.c:44 +#: src/irc/irc-dcc.c:45 msgid "Aborted" msgstr "" -#: src/irc/irc-dcc.c:191 +#: src/irc/irc-dcc.c:219 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "" -#: src/irc/irc-dcc.c:259 +#: src/irc/irc-dcc.c:244 +msgid "Incoming DCC file from " +msgstr "" + +#: src/irc/irc-dcc.c:269 +msgid " bytes\n" +msgstr "" + +#: src/irc/irc-dcc.c:323 #, c-format msgid "DCC: file \"%s\" received from \"%s\": ok!\n" msgstr "" -#: src/irc/irc-dcc.c:284 +#: src/irc/irc-dcc.c:350 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "" @@ -1566,16 +1574,16 @@ msgstr "" msgid "Gb" msgstr "" -#: src/gui/curses/gui-display.c:987 +#: src/gui/curses/gui-display.c:992 #, c-format msgid "%d:[not connected] " msgstr "" -#: src/gui/curses/gui-display.c:995 +#: src/gui/curses/gui-display.c:1000 msgid "[Act: " msgstr "" -#: src/gui/curses/gui-display.c:1030 src/gui/curses/gui-display.c:1033 +#: src/gui/curses/gui-display.c:1039 src/gui/curses/gui-display.c:1042 msgid "-MORE-" msgstr "" @@ -1583,17 +1591,17 @@ msgstr "" msgid "server" msgstr "" -#: src/gui/gui-common.c:304 +#: src/gui/gui-common.c:306 #, c-format msgid "%s not enough memory for infobar message\n" msgstr "" -#: src/gui/gui-common.c:439 +#: src/gui/gui-common.c:441 #, c-format msgid "%s not enough memory for new line!\n" msgstr "" -#: src/gui/gui-common.c:482 +#: src/gui/gui-common.c:484 msgid "not enough memory!\n" msgstr "" diff --git a/src/common/hotlist.c b/src/common/hotlist.c index b784fda11..a3b9cd9a9 100644 --- a/src/common/hotlist.c +++ b/src/common/hotlist.c @@ -83,6 +83,10 @@ hotlist_add (int priority, t_gui_buffer *buffer) if (!buffer) return; + /* do not highlight current buffer */ + if (buffer == gui_current_window->buffer) + return; + if ((pos_hotlist = hotlist_search (buffer))) { /* return if priority is greater or equal than the one to add */ diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c index 98d889330..b912d9a38 100644 --- a/src/common/weeconfig.c +++ b/src/common/weeconfig.c @@ -193,6 +193,7 @@ int cfg_col_nick_sep; int cfg_col_nick_self; int cfg_col_nick_private; int cfg_col_nick_bg; +int cfg_col_dcc_selected; int cfg_col_dcc_waiting; int cfg_col_dcc_connecting; int cfg_col_dcc_active; @@ -354,6 +355,10 @@ t_config_option weechat_options_colors[] = "default", NULL, &cfg_col_nick_bg, NULL, &config_change_color }, /* DCC */ + { "col_chat_dcc_selected", N_("color for selected DCC"), + N_("color for selected DCC (chat window)"), + OPTION_TYPE_COLOR, 0, 0, 0, + "white", NULL, &cfg_col_dcc_selected, NULL, &config_change_color }, { "col_dcc_waiting", N_("color for \"waiting\" dcc status"), N_("color for \"waiting\" dcc status"), OPTION_TYPE_COLOR, 0, 0, 0, diff --git a/src/common/weeconfig.h b/src/common/weeconfig.h index a94c5bb65..36ffb49eb 100644 --- a/src/common/weeconfig.h +++ b/src/common/weeconfig.h @@ -127,6 +127,7 @@ extern int cfg_col_nick_sep; extern int cfg_col_nick_self; extern int cfg_col_nick_private; extern int cfg_col_nick_bg; +extern int cfg_col_dcc_selected; extern int cfg_col_dcc_waiting; extern int cfg_col_dcc_connecting; extern int cfg_col_dcc_active; diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c index b978bb38d..15b229040 100644 --- a/src/gui/curses/gui-display.c +++ b/src/gui/curses/gui-display.c @@ -562,7 +562,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) { t_gui_window *ptr_win; t_gui_line *ptr_line; - t_dcc *ptr_dcc; + t_dcc *dcc_first, *dcc_selected, *ptr_dcc; char format_empty[32]; int i, j, lines_used, num_bars; char *unit_name[] = { N_("bytes"), N_("Kb"), N_("Mb"), N_("Gb") }; @@ -594,28 +594,38 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) if (buffer->dcc) { i = 0; - for (ptr_dcc = dcc_list; ptr_dcc; ptr_dcc = ptr_dcc->next_dcc) + dcc_first = (ptr_win->dcc_first) ? (t_dcc *) ptr_win->dcc_first : dcc_list; + dcc_selected = (ptr_win->dcc_selected) ? (t_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; if ((ptr_dcc->type == DCC_FILE_RECV) || (ptr_dcc->type == DCC_FILE_SEND)) { - gui_window_set_color (ptr_win->win_chat, COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i, 0, " %-16s %s", + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + mvwprintw (ptr_win->win_chat, i, 0, "%s %-16s %s", + (ptr_dcc == dcc_selected) ? ">>" : " ", ptr_dcc->nick, ptr_dcc->filename); if (ptr_dcc->filename_suffix > 0) wprintw (ptr_win->win_chat, " (.%d)", ptr_dcc->filename_suffix); - gui_window_set_color (ptr_win->win_chat, COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i + 1, 0, " %s ", + gui_window_set_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) ? ">>" : " ", (ptr_dcc->type == DCC_FILE_RECV) ? "--->" : "<---"); gui_window_set_color (ptr_win->win_chat, COLOR_DCC_WAITING + ptr_dcc->status); wprintw (ptr_win->win_chat, "%-10s", dcc_status_string[ptr_dcc->status]); - gui_window_set_color (ptr_win->win_chat, COLOR_WIN_CHAT); + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); wprintw (ptr_win->win_chat, " [", dcc_status_string[ptr_dcc->status]); if (ptr_dcc->size == 0) @@ -647,10 +657,10 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) unit_name[num_unit], ((long double) ptr_dcc->size) / ((long double)(unit_divide[num_unit])), unit_name[num_unit]); + ptr_win->dcc_last_displayed = ptr_dcc; i += 2; } } - move (ptr_win->win_y + 1, ptr_win->win_x); } else { @@ -1195,6 +1205,9 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase) snprintf (format, 32, "%%-%ds", input_width); mvwprintw (ptr_win->win_input, 0, 0, format, ""); wclrtoeol (ptr_win->win_input); + if (ptr_win == gui_current_window) + move (ptr_win->win_y + ptr_win->win_height - 1, + ptr_win->win_x); } else { @@ -1519,6 +1532,8 @@ gui_curses_resize_handler () /* TODO: manage when some windows are outside new term size */ for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) { + ptr_win->dcc_first = NULL; + ptr_win->dcc_selected = NULL; if (ptr_win->win_x + ptr_win->win_width == old_width) ptr_win->win_width = new_width - ptr_win->win_x; if (ptr_win->win_y + ptr_win->win_height == old_height) @@ -1720,6 +1735,8 @@ gui_init_colors () (color & A_BOLD) ? A_BOLD : 0; } + init_pair (COLOR_DCC_SELECTED, + cfg_col_dcc_selected & A_CHARTEXT, cfg_col_chat_bg); init_pair (COLOR_DCC_WAITING, cfg_col_dcc_waiting & A_CHARTEXT, cfg_col_chat_bg); init_pair (COLOR_DCC_CONNECTING, @@ -1763,6 +1780,7 @@ gui_init_colors () color_attr[COLOR_WIN_NICK_SEP - 1] = 0; color_attr[COLOR_WIN_NICK_SELF - 1] = cfg_col_nick_self & A_BOLD; color_attr[COLOR_WIN_NICK_PRIVATE - 1] = cfg_col_nick_private & A_BOLD; + color_attr[COLOR_DCC_SELECTED - 1] = cfg_col_dcc_selected & A_BOLD; color_attr[COLOR_DCC_WAITING - 1] = cfg_col_dcc_waiting & A_BOLD; color_attr[COLOR_DCC_CONNECTING - 1] = cfg_col_dcc_connecting & A_BOLD; color_attr[COLOR_DCC_ACTIVE - 1] = cfg_col_dcc_active & A_BOLD; diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c index 25c436dd4..b37d6c816 100644 --- a/src/gui/curses/gui-input.c +++ b/src/gui/curses/gui-input.c @@ -90,7 +90,24 @@ gui_read_keyb () break; /* cursor up */ case KEY_UP: - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->dcc) + { + if (dcc_list) + { + if (gui_current_window->dcc_selected + && ((t_dcc *)(gui_current_window->dcc_selected))->prev_dcc) + { + if (gui_current_window->dcc_selected == + gui_current_window->dcc_first) + gui_current_window->dcc_first = + ((t_dcc *)(gui_current_window->dcc_first))->prev_dcc; + gui_current_window->dcc_selected = + ((t_dcc *)(gui_current_window->dcc_selected))->prev_dcc; + gui_draw_buffer_chat (gui_current_window->buffer, 1); + } + } + } + else { if (gui_current_window->buffer->ptr_history) { @@ -118,7 +135,35 @@ gui_read_keyb () break; /* cursor down */ case KEY_DOWN: - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->dcc) + { + if (dcc_list) + { + if (!gui_current_window->dcc_selected + || ((t_dcc *)(gui_current_window->dcc_selected))->next_dcc) + { + if (gui_current_window->dcc_last_displayed + && (gui_current_window->dcc_selected == + gui_current_window->dcc_last_displayed)) + { + if (gui_current_window->dcc_first) + gui_current_window->dcc_first = + ((t_dcc *)(gui_current_window->dcc_first))->next_dcc; + else + gui_current_window->dcc_first = + dcc_list->next_dcc; + } + if (gui_current_window->dcc_selected) + gui_current_window->dcc_selected = + ((t_dcc *)(gui_current_window->dcc_selected))->next_dcc; + else + gui_current_window->dcc_selected = + dcc_list->next_dcc; + gui_draw_buffer_chat (gui_current_window->buffer, 1); + } + } + } + else { if (gui_current_window->buffer->ptr_history) { diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c index 04ff320c2..454dd02b6 100644 --- a/src/gui/gui-common.c +++ b/src/gui/gui-common.c @@ -99,6 +99,10 @@ gui_window_new (int x, int y, int width, int height) new_window->textview_nicklist = NULL; new_window->textbuffer_nicklist = NULL; + new_window->dcc_first = NULL; + new_window->dcc_selected = NULL; + new_window->dcc_last_displayed = NULL; + new_window->buffer = NULL; new_window->first_line_displayed = 0; diff --git a/src/gui/gui.h b/src/gui/gui.h index aca1d2620..8d9286a3a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -26,7 +26,7 @@ #define INPUT_BUFFER_BLOCK_SIZE 256 -#define NUM_COLORS 45 +#define NUM_COLORS 46 #define COLOR_WIN_TITLE 1 #define COLOR_WIN_CHAT 2 #define COLOR_WIN_CHAT_TIME 3 @@ -59,12 +59,13 @@ #define COLOR_WIN_NICK_FIRST 30 #define COLOR_WIN_NICK_LAST 39 #define COLOR_WIN_NICK_NUMBER (COLOR_WIN_NICK_LAST - COLOR_WIN_NICK_FIRST + 1) -#define COLOR_DCC_WAITING 40 -#define COLOR_DCC_CONNECTING 41 -#define COLOR_DCC_ACTIVE 42 -#define COLOR_DCC_DONE 43 -#define COLOR_DCC_FAILED 44 -#define COLOR_DCC_ABORTED 45 +#define COLOR_DCC_SELECTED 40 +#define COLOR_DCC_WAITING 41 +#define COLOR_DCC_CONNECTING 42 +#define COLOR_DCC_ACTIVE 43 +#define COLOR_DCC_DONE 44 +#define COLOR_DCC_FAILED 45 +#define COLOR_DCC_ABORTED 46 #define SERVER(buffer) ((t_irc_server *)(buffer->server)) #define CHANNEL(buffer) ((t_irc_channel *)(buffer->channel)) @@ -142,6 +143,8 @@ struct t_gui_buffer /* server/channel */ void *server; /* buffer's server */ void *channel; /* buffer's channel */ + + /* dcc buffer */ int dcc; /* buffer is dcc status */ /* chat content (lines, line is composed by many messages) */ @@ -210,6 +213,11 @@ struct t_gui_window /* windows for Qt GUI */ /* TODO: declare Qt window */ + /* DCC */ + void *dcc_first; /* first dcc displayed */ + void *dcc_selected; /* selected dcc */ + void *dcc_last_displayed; /* last dcc displayed (for scroll) */ + t_gui_buffer *buffer; /* buffer currently displayed in window */ int first_line_displayed; /* = 1 if first line is displayed */ diff --git a/src/irc/irc-dcc.c b/src/irc/irc-dcc.c index e5404e5de..d338bd82b 100644 --- a/src/irc/irc-dcc.c +++ b/src/irc/irc-dcc.c @@ -45,26 +45,41 @@ char *dcc_status_string[] = /* strings for DCC status */ N_("Aborted") }; +/* + * dcc_redraw: redraw DCC buffer (and add to hotlist) + */ + +void +dcc_redraw (int highlight) +{ + gui_draw_buffer_chat (gui_get_dcc_buffer (), 0); + if (highlight) + { + hotlist_add (1, gui_get_dcc_buffer ()); + gui_draw_buffer_status (gui_current_window->buffer, 0); + } +} + /* * dcc_connect: connect to another host */ void -dcc_connect (t_dcc *dcc) +dcc_connect (t_dcc *ptr_dcc) { struct sockaddr_in addr; - dcc->status = DCC_CONNECTING; + ptr_dcc->status = DCC_CONNECTING; - dcc->sock = socket (AF_INET, SOCK_STREAM, 0); - if (dcc->sock == -1) + ptr_dcc->sock = socket (AF_INET, SOCK_STREAM, 0); + if (ptr_dcc->sock == -1) return; memset (&addr, 0, sizeof (addr)); - addr.sin_port = htons (dcc->port); + addr.sin_port = htons (ptr_dcc->port); addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl (dcc->addr); - fcntl (dcc->sock, F_SETFL, O_NONBLOCK); - connect (dcc->sock, (struct sockaddr *) &addr, sizeof (addr)); + addr.sin_addr.s_addr = htonl (ptr_dcc->addr); + fcntl (ptr_dcc->sock, F_SETFL, O_NONBLOCK); + connect (ptr_dcc->sock, (struct sockaddr *) &addr, sizeof (addr)); } /* @@ -134,6 +149,7 @@ dcc_accept (t_dcc *ptr_dcc) if (!ptr_dcc->local_filename) { ptr_dcc->status = DCC_FAILED; + dcc_redraw (1); return; } if (cfg_dcc_download_path[0] == '~') @@ -156,6 +172,7 @@ dcc_accept (t_dcc *ptr_dcc) if (!cfg_dcc_auto_rename) { ptr_dcc->status = DCC_FAILED; + dcc_redraw (1); return; } @@ -163,6 +180,7 @@ dcc_accept (t_dcc *ptr_dcc) if (!filename2) { ptr_dcc->status = DCC_FAILED; + dcc_redraw (1); return; } ptr_dcc->filename_suffix = 0; @@ -183,6 +201,7 @@ dcc_accept (t_dcc *ptr_dcc) O_CREAT | O_TRUNC | O_WRONLY, 0644); } + dcc_redraw (1); } /* @@ -194,7 +213,6 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic unsigned int size) { t_dcc *new_dcc; - t_gui_buffer *dcc_buffer; if ((new_dcc = (t_dcc *) malloc (sizeof (t_dcc))) == NULL) { @@ -214,26 +232,52 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic new_dcc->filename_suffix = -1; new_dcc->size = size; new_dcc->pos = 0; + new_dcc->prev_dcc = NULL; new_dcc->next_dcc = dcc_list; + if (dcc_list) + dcc_list->prev_dcc = new_dcc; dcc_list = new_dcc; - gui_printf (NULL, "Incoming DCC file: from %s, address:%d.%d.%d.%d, " - "port=%d, name=%s, size=%lu bytes\n", - nick, - addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff, - port, filename, size); + gui_current_window->dcc_first = NULL; + gui_current_window->dcc_selected = NULL; - dcc_buffer = gui_get_dcc_buffer (); + if (type == DCC_FILE_RECV) + { + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Incoming DCC file from ")); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_NICK, + "%s", + nick); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_DARK, + " ("); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_DARK, + ")"); + gui_printf (server->buffer, ": "); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%s", + filename); + gui_printf (server->buffer, ", "); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%lu", + size); + gui_printf (server->buffer, _(" bytes\n")); + } if ( ( (type == DCC_CHAT_RECV) && (cfg_dcc_auto_accept_chats) ) || ( (type == DCC_FILE_RECV) && (cfg_dcc_auto_accept_files) ) ) - { dcc_accept (new_dcc); - hotlist_add (1, dcc_buffer); - } else - hotlist_add (2, dcc_buffer); - gui_draw_buffer_status (dcc_buffer, 0); + hotlist_add (2, gui_get_dcc_buffer ()); + gui_draw_buffer_status (gui_current_window->buffer, 0); return new_dcc; } @@ -260,12 +304,16 @@ dcc_handle () if (num != -1) { if (num == 0) + { dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + } else { if (write (ptr_dcc->file, buffer, num) == -1) { dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); return; } ptr_dcc->pos += (unsigned long) num; @@ -273,11 +321,27 @@ dcc_handle () send (ptr_dcc->sock, (char *) &pos, 4, 0); if (ptr_dcc->pos >= ptr_dcc->size) { - gui_printf (NULL, - _("DCC: file \"%s\" received from \"%s\": ok!\n"), - ptr_dcc->filename, ptr_dcc->nick); + irc_display_prefix (ptr_dcc->server->buffer, PREFIX_INFO); + gui_printf (ptr_dcc->server->buffer, _("DCC: file ")); + gui_printf_color (ptr_dcc->server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%s", + ptr_dcc->filename); + gui_printf (ptr_dcc->server->buffer, _(" (local filename: ")); + gui_printf_color (ptr_dcc->server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%s", + ptr_dcc->local_filename); + gui_printf (ptr_dcc->server->buffer, _(") from ")); + gui_printf_color (ptr_dcc->server->buffer, + COLOR_WIN_CHAT_NICK, + "%s", + ptr_dcc->nick); + gui_printf (ptr_dcc->server->buffer, _(": ok!\n")); dcc_close (ptr_dcc, DCC_DONE); + dcc_redraw (1); } + dcc_redraw (0); } } } diff --git a/src/irc/irc.h b/src/irc/irc.h index 0d1057e67..3d22fe5fb 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -186,11 +186,12 @@ struct t_dcc char *nick; /* remote nick */ int sock; /* socket for connection */ int file; /* local file (for reading or writing) */ - char *filename; /* filename */ - char *local_filename; /* local filename */ + char *filename; /* filename (given by sender) */ + char *local_filename; /* local filename (with path) */ int filename_suffix; /* suffix (.1 for ex) if renaming file */ unsigned long size; /* file size */ unsigned long pos; /* number of bytes received/sent */ + t_dcc *prev_dcc; /* link to previous dcc file/chat */ t_dcc *next_dcc; /* link to next dcc file/chat */ }; diff --git a/weechat/po/fr.po b/weechat/po/fr.po index e18ed2fc1..79ee48763 100644 --- a/weechat/po/fr.po +++ b/weechat/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.0.8-pre2\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2004-09-09 23:11+0200\n" +"POT-Creation-Date: 2004-09-11 15:10+0200\n" "PO-Revision-Date: 2004-08-08 20:47+0200\n" "Last-Translator: FlashCode \n" "Language-Team: weechat-dev \n" @@ -1557,41 +1557,49 @@ msgstr "" "%s: tous les noms d'utilisateurs déclarés sont déjà en cours d'utilisation, " "fermeture de la connexion avec le serveur !\n" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Waiting" msgstr "Attente" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Connecting" msgstr "Connexion" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Active" msgstr "Actif" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Done" msgstr "Terminé" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Failed" msgstr "Echoué" -#: src/irc/irc-dcc.c:44 +#: src/irc/irc-dcc.c:45 msgid "Aborted" msgstr "Interrompu" -#: src/irc/irc-dcc.c:191 +#: src/irc/irc-dcc.c:219 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "%s pas assez de mémoire pour un nouveau DCC\n" -#: src/irc/irc-dcc.c:259 +#: src/irc/irc-dcc.c:244 +msgid "Incoming DCC file from " +msgstr "Réception fichier DCC de " + +#: src/irc/irc-dcc.c:269 +msgid " bytes\n" +msgstr "octets\n" + +#: src/irc/irc-dcc.c:323 #, c-format msgid "DCC: file \"%s\" received from \"%s\": ok!\n" msgstr "DCC: fichier \"%s\" reçu de \"%s\": ok !\n" -#: src/irc/irc-dcc.c:284 +#: src/irc/irc-dcc.c:350 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "abandon du DCC actif: \"%s\" de %s\n" @@ -1673,16 +1681,16 @@ msgstr "Mo" msgid "Gb" msgstr "Go" -#: src/gui/curses/gui-display.c:987 +#: src/gui/curses/gui-display.c:992 #, c-format msgid "%d:[not connected] " msgstr "%d:[non connecté] " -#: src/gui/curses/gui-display.c:995 +#: src/gui/curses/gui-display.c:1000 msgid "[Act: " msgstr "[Act: " -#: src/gui/curses/gui-display.c:1030 src/gui/curses/gui-display.c:1033 +#: src/gui/curses/gui-display.c:1039 src/gui/curses/gui-display.c:1042 msgid "-MORE-" msgstr "-PLUS-" @@ -1690,17 +1698,17 @@ msgstr "-PLUS-" msgid "server" msgstr "serveur" -#: src/gui/gui-common.c:304 +#: src/gui/gui-common.c:306 #, c-format msgid "%s not enough memory for infobar message\n" msgstr "%s pas assez de mémoire pour un message de la barre d'infos\n" -#: src/gui/gui-common.c:439 +#: src/gui/gui-common.c:441 #, c-format msgid "%s not enough memory for new line!\n" msgstr "%s pas assez de mémoire pour une nouvelle ligne !\n" -#: src/gui/gui-common.c:482 +#: src/gui/gui-common.c:484 msgid "not enough memory!\n" msgstr "pas assez de mémoire !\n" diff --git a/weechat/po/weechat.pot b/weechat/po/weechat.pot index 855d8ae8e..39f2eada5 100644 --- a/weechat/po/weechat.pot +++ b/weechat/po/weechat.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2004-09-09 23:11+0200\n" +"POT-Creation-Date: 2004-09-11 15:10+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1456,41 +1456,49 @@ msgid "" "server!\n" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Waiting" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Connecting" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Active" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Done" msgstr "" -#: src/irc/irc-dcc.c:43 +#: src/irc/irc-dcc.c:44 msgid "Failed" msgstr "" -#: src/irc/irc-dcc.c:44 +#: src/irc/irc-dcc.c:45 msgid "Aborted" msgstr "" -#: src/irc/irc-dcc.c:191 +#: src/irc/irc-dcc.c:219 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "" -#: src/irc/irc-dcc.c:259 +#: src/irc/irc-dcc.c:244 +msgid "Incoming DCC file from " +msgstr "" + +#: src/irc/irc-dcc.c:269 +msgid " bytes\n" +msgstr "" + +#: src/irc/irc-dcc.c:323 #, c-format msgid "DCC: file \"%s\" received from \"%s\": ok!\n" msgstr "" -#: src/irc/irc-dcc.c:284 +#: src/irc/irc-dcc.c:350 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "" @@ -1566,16 +1574,16 @@ msgstr "" msgid "Gb" msgstr "" -#: src/gui/curses/gui-display.c:987 +#: src/gui/curses/gui-display.c:992 #, c-format msgid "%d:[not connected] " msgstr "" -#: src/gui/curses/gui-display.c:995 +#: src/gui/curses/gui-display.c:1000 msgid "[Act: " msgstr "" -#: src/gui/curses/gui-display.c:1030 src/gui/curses/gui-display.c:1033 +#: src/gui/curses/gui-display.c:1039 src/gui/curses/gui-display.c:1042 msgid "-MORE-" msgstr "" @@ -1583,17 +1591,17 @@ msgstr "" msgid "server" msgstr "" -#: src/gui/gui-common.c:304 +#: src/gui/gui-common.c:306 #, c-format msgid "%s not enough memory for infobar message\n" msgstr "" -#: src/gui/gui-common.c:439 +#: src/gui/gui-common.c:441 #, c-format msgid "%s not enough memory for new line!\n" msgstr "" -#: src/gui/gui-common.c:482 +#: src/gui/gui-common.c:484 msgid "not enough memory!\n" msgstr "" diff --git a/weechat/src/common/hotlist.c b/weechat/src/common/hotlist.c index b784fda11..a3b9cd9a9 100644 --- a/weechat/src/common/hotlist.c +++ b/weechat/src/common/hotlist.c @@ -83,6 +83,10 @@ hotlist_add (int priority, t_gui_buffer *buffer) if (!buffer) return; + /* do not highlight current buffer */ + if (buffer == gui_current_window->buffer) + return; + if ((pos_hotlist = hotlist_search (buffer))) { /* return if priority is greater or equal than the one to add */ diff --git a/weechat/src/common/weeconfig.c b/weechat/src/common/weeconfig.c index 98d889330..b912d9a38 100644 --- a/weechat/src/common/weeconfig.c +++ b/weechat/src/common/weeconfig.c @@ -193,6 +193,7 @@ int cfg_col_nick_sep; int cfg_col_nick_self; int cfg_col_nick_private; int cfg_col_nick_bg; +int cfg_col_dcc_selected; int cfg_col_dcc_waiting; int cfg_col_dcc_connecting; int cfg_col_dcc_active; @@ -354,6 +355,10 @@ t_config_option weechat_options_colors[] = "default", NULL, &cfg_col_nick_bg, NULL, &config_change_color }, /* DCC */ + { "col_chat_dcc_selected", N_("color for selected DCC"), + N_("color for selected DCC (chat window)"), + OPTION_TYPE_COLOR, 0, 0, 0, + "white", NULL, &cfg_col_dcc_selected, NULL, &config_change_color }, { "col_dcc_waiting", N_("color for \"waiting\" dcc status"), N_("color for \"waiting\" dcc status"), OPTION_TYPE_COLOR, 0, 0, 0, diff --git a/weechat/src/common/weeconfig.h b/weechat/src/common/weeconfig.h index a94c5bb65..36ffb49eb 100644 --- a/weechat/src/common/weeconfig.h +++ b/weechat/src/common/weeconfig.h @@ -127,6 +127,7 @@ extern int cfg_col_nick_sep; extern int cfg_col_nick_self; extern int cfg_col_nick_private; extern int cfg_col_nick_bg; +extern int cfg_col_dcc_selected; extern int cfg_col_dcc_waiting; extern int cfg_col_dcc_connecting; extern int cfg_col_dcc_active; diff --git a/weechat/src/gui/curses/gui-display.c b/weechat/src/gui/curses/gui-display.c index b978bb38d..15b229040 100644 --- a/weechat/src/gui/curses/gui-display.c +++ b/weechat/src/gui/curses/gui-display.c @@ -562,7 +562,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) { t_gui_window *ptr_win; t_gui_line *ptr_line; - t_dcc *ptr_dcc; + t_dcc *dcc_first, *dcc_selected, *ptr_dcc; char format_empty[32]; int i, j, lines_used, num_bars; char *unit_name[] = { N_("bytes"), N_("Kb"), N_("Mb"), N_("Gb") }; @@ -594,28 +594,38 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) if (buffer->dcc) { i = 0; - for (ptr_dcc = dcc_list; ptr_dcc; ptr_dcc = ptr_dcc->next_dcc) + dcc_first = (ptr_win->dcc_first) ? (t_dcc *) ptr_win->dcc_first : dcc_list; + dcc_selected = (ptr_win->dcc_selected) ? (t_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; if ((ptr_dcc->type == DCC_FILE_RECV) || (ptr_dcc->type == DCC_FILE_SEND)) { - gui_window_set_color (ptr_win->win_chat, COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i, 0, " %-16s %s", + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + mvwprintw (ptr_win->win_chat, i, 0, "%s %-16s %s", + (ptr_dcc == dcc_selected) ? ">>" : " ", ptr_dcc->nick, ptr_dcc->filename); if (ptr_dcc->filename_suffix > 0) wprintw (ptr_win->win_chat, " (.%d)", ptr_dcc->filename_suffix); - gui_window_set_color (ptr_win->win_chat, COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i + 1, 0, " %s ", + gui_window_set_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) ? ">>" : " ", (ptr_dcc->type == DCC_FILE_RECV) ? "--->" : "<---"); gui_window_set_color (ptr_win->win_chat, COLOR_DCC_WAITING + ptr_dcc->status); wprintw (ptr_win->win_chat, "%-10s", dcc_status_string[ptr_dcc->status]); - gui_window_set_color (ptr_win->win_chat, COLOR_WIN_CHAT); + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); wprintw (ptr_win->win_chat, " [", dcc_status_string[ptr_dcc->status]); if (ptr_dcc->size == 0) @@ -647,10 +657,10 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) unit_name[num_unit], ((long double) ptr_dcc->size) / ((long double)(unit_divide[num_unit])), unit_name[num_unit]); + ptr_win->dcc_last_displayed = ptr_dcc; i += 2; } } - move (ptr_win->win_y + 1, ptr_win->win_x); } else { @@ -1195,6 +1205,9 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase) snprintf (format, 32, "%%-%ds", input_width); mvwprintw (ptr_win->win_input, 0, 0, format, ""); wclrtoeol (ptr_win->win_input); + if (ptr_win == gui_current_window) + move (ptr_win->win_y + ptr_win->win_height - 1, + ptr_win->win_x); } else { @@ -1519,6 +1532,8 @@ gui_curses_resize_handler () /* TODO: manage when some windows are outside new term size */ for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) { + ptr_win->dcc_first = NULL; + ptr_win->dcc_selected = NULL; if (ptr_win->win_x + ptr_win->win_width == old_width) ptr_win->win_width = new_width - ptr_win->win_x; if (ptr_win->win_y + ptr_win->win_height == old_height) @@ -1720,6 +1735,8 @@ gui_init_colors () (color & A_BOLD) ? A_BOLD : 0; } + init_pair (COLOR_DCC_SELECTED, + cfg_col_dcc_selected & A_CHARTEXT, cfg_col_chat_bg); init_pair (COLOR_DCC_WAITING, cfg_col_dcc_waiting & A_CHARTEXT, cfg_col_chat_bg); init_pair (COLOR_DCC_CONNECTING, @@ -1763,6 +1780,7 @@ gui_init_colors () color_attr[COLOR_WIN_NICK_SEP - 1] = 0; color_attr[COLOR_WIN_NICK_SELF - 1] = cfg_col_nick_self & A_BOLD; color_attr[COLOR_WIN_NICK_PRIVATE - 1] = cfg_col_nick_private & A_BOLD; + color_attr[COLOR_DCC_SELECTED - 1] = cfg_col_dcc_selected & A_BOLD; color_attr[COLOR_DCC_WAITING - 1] = cfg_col_dcc_waiting & A_BOLD; color_attr[COLOR_DCC_CONNECTING - 1] = cfg_col_dcc_connecting & A_BOLD; color_attr[COLOR_DCC_ACTIVE - 1] = cfg_col_dcc_active & A_BOLD; diff --git a/weechat/src/gui/curses/gui-input.c b/weechat/src/gui/curses/gui-input.c index 25c436dd4..b37d6c816 100644 --- a/weechat/src/gui/curses/gui-input.c +++ b/weechat/src/gui/curses/gui-input.c @@ -90,7 +90,24 @@ gui_read_keyb () break; /* cursor up */ case KEY_UP: - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->dcc) + { + if (dcc_list) + { + if (gui_current_window->dcc_selected + && ((t_dcc *)(gui_current_window->dcc_selected))->prev_dcc) + { + if (gui_current_window->dcc_selected == + gui_current_window->dcc_first) + gui_current_window->dcc_first = + ((t_dcc *)(gui_current_window->dcc_first))->prev_dcc; + gui_current_window->dcc_selected = + ((t_dcc *)(gui_current_window->dcc_selected))->prev_dcc; + gui_draw_buffer_chat (gui_current_window->buffer, 1); + } + } + } + else { if (gui_current_window->buffer->ptr_history) { @@ -118,7 +135,35 @@ gui_read_keyb () break; /* cursor down */ case KEY_DOWN: - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->dcc) + { + if (dcc_list) + { + if (!gui_current_window->dcc_selected + || ((t_dcc *)(gui_current_window->dcc_selected))->next_dcc) + { + if (gui_current_window->dcc_last_displayed + && (gui_current_window->dcc_selected == + gui_current_window->dcc_last_displayed)) + { + if (gui_current_window->dcc_first) + gui_current_window->dcc_first = + ((t_dcc *)(gui_current_window->dcc_first))->next_dcc; + else + gui_current_window->dcc_first = + dcc_list->next_dcc; + } + if (gui_current_window->dcc_selected) + gui_current_window->dcc_selected = + ((t_dcc *)(gui_current_window->dcc_selected))->next_dcc; + else + gui_current_window->dcc_selected = + dcc_list->next_dcc; + gui_draw_buffer_chat (gui_current_window->buffer, 1); + } + } + } + else { if (gui_current_window->buffer->ptr_history) { diff --git a/weechat/src/gui/gui-common.c b/weechat/src/gui/gui-common.c index 04ff320c2..454dd02b6 100644 --- a/weechat/src/gui/gui-common.c +++ b/weechat/src/gui/gui-common.c @@ -99,6 +99,10 @@ gui_window_new (int x, int y, int width, int height) new_window->textview_nicklist = NULL; new_window->textbuffer_nicklist = NULL; + new_window->dcc_first = NULL; + new_window->dcc_selected = NULL; + new_window->dcc_last_displayed = NULL; + new_window->buffer = NULL; new_window->first_line_displayed = 0; diff --git a/weechat/src/gui/gui.h b/weechat/src/gui/gui.h index aca1d2620..8d9286a3a 100644 --- a/weechat/src/gui/gui.h +++ b/weechat/src/gui/gui.h @@ -26,7 +26,7 @@ #define INPUT_BUFFER_BLOCK_SIZE 256 -#define NUM_COLORS 45 +#define NUM_COLORS 46 #define COLOR_WIN_TITLE 1 #define COLOR_WIN_CHAT 2 #define COLOR_WIN_CHAT_TIME 3 @@ -59,12 +59,13 @@ #define COLOR_WIN_NICK_FIRST 30 #define COLOR_WIN_NICK_LAST 39 #define COLOR_WIN_NICK_NUMBER (COLOR_WIN_NICK_LAST - COLOR_WIN_NICK_FIRST + 1) -#define COLOR_DCC_WAITING 40 -#define COLOR_DCC_CONNECTING 41 -#define COLOR_DCC_ACTIVE 42 -#define COLOR_DCC_DONE 43 -#define COLOR_DCC_FAILED 44 -#define COLOR_DCC_ABORTED 45 +#define COLOR_DCC_SELECTED 40 +#define COLOR_DCC_WAITING 41 +#define COLOR_DCC_CONNECTING 42 +#define COLOR_DCC_ACTIVE 43 +#define COLOR_DCC_DONE 44 +#define COLOR_DCC_FAILED 45 +#define COLOR_DCC_ABORTED 46 #define SERVER(buffer) ((t_irc_server *)(buffer->server)) #define CHANNEL(buffer) ((t_irc_channel *)(buffer->channel)) @@ -142,6 +143,8 @@ struct t_gui_buffer /* server/channel */ void *server; /* buffer's server */ void *channel; /* buffer's channel */ + + /* dcc buffer */ int dcc; /* buffer is dcc status */ /* chat content (lines, line is composed by many messages) */ @@ -210,6 +213,11 @@ struct t_gui_window /* windows for Qt GUI */ /* TODO: declare Qt window */ + /* DCC */ + void *dcc_first; /* first dcc displayed */ + void *dcc_selected; /* selected dcc */ + void *dcc_last_displayed; /* last dcc displayed (for scroll) */ + t_gui_buffer *buffer; /* buffer currently displayed in window */ int first_line_displayed; /* = 1 if first line is displayed */ diff --git a/weechat/src/irc/irc-dcc.c b/weechat/src/irc/irc-dcc.c index e5404e5de..d338bd82b 100644 --- a/weechat/src/irc/irc-dcc.c +++ b/weechat/src/irc/irc-dcc.c @@ -45,26 +45,41 @@ char *dcc_status_string[] = /* strings for DCC status */ N_("Aborted") }; +/* + * dcc_redraw: redraw DCC buffer (and add to hotlist) + */ + +void +dcc_redraw (int highlight) +{ + gui_draw_buffer_chat (gui_get_dcc_buffer (), 0); + if (highlight) + { + hotlist_add (1, gui_get_dcc_buffer ()); + gui_draw_buffer_status (gui_current_window->buffer, 0); + } +} + /* * dcc_connect: connect to another host */ void -dcc_connect (t_dcc *dcc) +dcc_connect (t_dcc *ptr_dcc) { struct sockaddr_in addr; - dcc->status = DCC_CONNECTING; + ptr_dcc->status = DCC_CONNECTING; - dcc->sock = socket (AF_INET, SOCK_STREAM, 0); - if (dcc->sock == -1) + ptr_dcc->sock = socket (AF_INET, SOCK_STREAM, 0); + if (ptr_dcc->sock == -1) return; memset (&addr, 0, sizeof (addr)); - addr.sin_port = htons (dcc->port); + addr.sin_port = htons (ptr_dcc->port); addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl (dcc->addr); - fcntl (dcc->sock, F_SETFL, O_NONBLOCK); - connect (dcc->sock, (struct sockaddr *) &addr, sizeof (addr)); + addr.sin_addr.s_addr = htonl (ptr_dcc->addr); + fcntl (ptr_dcc->sock, F_SETFL, O_NONBLOCK); + connect (ptr_dcc->sock, (struct sockaddr *) &addr, sizeof (addr)); } /* @@ -134,6 +149,7 @@ dcc_accept (t_dcc *ptr_dcc) if (!ptr_dcc->local_filename) { ptr_dcc->status = DCC_FAILED; + dcc_redraw (1); return; } if (cfg_dcc_download_path[0] == '~') @@ -156,6 +172,7 @@ dcc_accept (t_dcc *ptr_dcc) if (!cfg_dcc_auto_rename) { ptr_dcc->status = DCC_FAILED; + dcc_redraw (1); return; } @@ -163,6 +180,7 @@ dcc_accept (t_dcc *ptr_dcc) if (!filename2) { ptr_dcc->status = DCC_FAILED; + dcc_redraw (1); return; } ptr_dcc->filename_suffix = 0; @@ -183,6 +201,7 @@ dcc_accept (t_dcc *ptr_dcc) O_CREAT | O_TRUNC | O_WRONLY, 0644); } + dcc_redraw (1); } /* @@ -194,7 +213,6 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic unsigned int size) { t_dcc *new_dcc; - t_gui_buffer *dcc_buffer; if ((new_dcc = (t_dcc *) malloc (sizeof (t_dcc))) == NULL) { @@ -214,26 +232,52 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic new_dcc->filename_suffix = -1; new_dcc->size = size; new_dcc->pos = 0; + new_dcc->prev_dcc = NULL; new_dcc->next_dcc = dcc_list; + if (dcc_list) + dcc_list->prev_dcc = new_dcc; dcc_list = new_dcc; - gui_printf (NULL, "Incoming DCC file: from %s, address:%d.%d.%d.%d, " - "port=%d, name=%s, size=%lu bytes\n", - nick, - addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff, - port, filename, size); + gui_current_window->dcc_first = NULL; + gui_current_window->dcc_selected = NULL; - dcc_buffer = gui_get_dcc_buffer (); + if (type == DCC_FILE_RECV) + { + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Incoming DCC file from ")); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_NICK, + "%s", + nick); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_DARK, + " ("); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_DARK, + ")"); + gui_printf (server->buffer, ": "); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%s", + filename); + gui_printf (server->buffer, ", "); + gui_printf_color (server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%lu", + size); + gui_printf (server->buffer, _(" bytes\n")); + } if ( ( (type == DCC_CHAT_RECV) && (cfg_dcc_auto_accept_chats) ) || ( (type == DCC_FILE_RECV) && (cfg_dcc_auto_accept_files) ) ) - { dcc_accept (new_dcc); - hotlist_add (1, dcc_buffer); - } else - hotlist_add (2, dcc_buffer); - gui_draw_buffer_status (dcc_buffer, 0); + hotlist_add (2, gui_get_dcc_buffer ()); + gui_draw_buffer_status (gui_current_window->buffer, 0); return new_dcc; } @@ -260,12 +304,16 @@ dcc_handle () if (num != -1) { if (num == 0) + { dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + } else { if (write (ptr_dcc->file, buffer, num) == -1) { dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); return; } ptr_dcc->pos += (unsigned long) num; @@ -273,11 +321,27 @@ dcc_handle () send (ptr_dcc->sock, (char *) &pos, 4, 0); if (ptr_dcc->pos >= ptr_dcc->size) { - gui_printf (NULL, - _("DCC: file \"%s\" received from \"%s\": ok!\n"), - ptr_dcc->filename, ptr_dcc->nick); + irc_display_prefix (ptr_dcc->server->buffer, PREFIX_INFO); + gui_printf (ptr_dcc->server->buffer, _("DCC: file ")); + gui_printf_color (ptr_dcc->server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%s", + ptr_dcc->filename); + gui_printf (ptr_dcc->server->buffer, _(" (local filename: ")); + gui_printf_color (ptr_dcc->server->buffer, + COLOR_WIN_CHAT_CHANNEL, + "%s", + ptr_dcc->local_filename); + gui_printf (ptr_dcc->server->buffer, _(") from ")); + gui_printf_color (ptr_dcc->server->buffer, + COLOR_WIN_CHAT_NICK, + "%s", + ptr_dcc->nick); + gui_printf (ptr_dcc->server->buffer, _(": ok!\n")); dcc_close (ptr_dcc, DCC_DONE); + dcc_redraw (1); } + dcc_redraw (0); } } } diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index 0d1057e67..3d22fe5fb 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -186,11 +186,12 @@ struct t_dcc char *nick; /* remote nick */ int sock; /* socket for connection */ int file; /* local file (for reading or writing) */ - char *filename; /* filename */ - char *local_filename; /* local filename */ + char *filename; /* filename (given by sender) */ + char *local_filename; /* local filename (with path) */ int filename_suffix; /* suffix (.1 for ex) if renaming file */ unsigned long size; /* file size */ unsigned long pos; /* number of bytes received/sent */ + t_dcc *prev_dcc; /* link to previous dcc file/chat */ t_dcc *next_dcc; /* link to next dcc file/chat */ };