diff -uNr sent-upstream/as-sent-last/include/config.h ircii-pana-1.0-0c15/include/config.h --- sent-upstream/as-sent-last/include/config.h Sat Jan 8 04:19:04 2000 +++ ircii-pana-1.0-0c15/include/config.h Sun Jan 9 06:40:56 2000 @@ -571,7 +571,7 @@ #define WANT_DETACH ON /* this is here for the detach/re-attach code which is essentially a mini-screen */ #define ALLOW_DETACH ON - +#define DEFAULT_DETACH_ON_HUP ON #undef OLD_RANDOM_BEHAVIOR /* semi randomness for randm() */ diff -uNr sent-upstream/as-sent-last/include/modval.h ircii-pana-1.0-0c15/include/modval.h --- sent-upstream/as-sent-last/include/modval.h Tue Jan 4 01:54:48 2000 +++ ircii-pana-1.0-0c15/include/modval.h Sun Jan 9 06:01:54 2000 @@ -306,6 +306,7 @@ #define get_window_server(x) ((int) (global[GET_WINDOW_SERVER]((unsigned int)x))) #define set_window_server(x, y, z) ((void) (global[SET_WINDOW_SERVER]((int)x, (int)y, (int)z))) #define window_check_servers ((void (*)())global[WINDOW_CHECK_SERVERS]) +#define window_close_server ((void (*)(int))global[WINDOW_CHECK_SERVERS]) #define change_window_server(x, y) ((void) (global[CHANGE_WINDOW_SERVER]((int)x, (int)y))) #define set_level_by_refnum(x, y) ((void) (global[SET_LEVEL_BY_REFNUM]((unsigned int)x, (int)y))) #define message_to(x) ((void) (global[MESSAGE_TO]((unsigned int)x))) diff -uNr sent-upstream/as-sent-last/include/struct.h ircii-pana-1.0-0c15/include/struct.h --- sent-upstream/as-sent-last/include/struct.h Tue Jan 4 02:27:26 2000 +++ ircii-pana-1.0-0c15/include/struct.h Sun Jan 9 06:13:17 2000 @@ -593,6 +593,7 @@ unsigned int refnum; /* the unique reference number, * assigned by IRCII */ int server; /* server index */ + int last_server; /* previous server index */ int top; /* The top line of the window, screen * coordinates */ int bottom; /* The botton line of the window, screen diff -uNr sent-upstream/as-sent-last/include/vars.h ircii-pana-1.0-0c15/include/vars.h --- sent-upstream/as-sent-last/include/vars.h Tue Jan 4 02:27:26 2000 +++ ircii-pana-1.0-0c15/include/vars.h Sun Jan 9 06:41:24 2000 @@ -103,6 +103,7 @@ DEOPFLOOD_TIME_VAR, DEOP_ON_DEOPFLOOD_VAR, DEOP_ON_KICKFLOOD_VAR, + DETACH_ON_HUP, DISPATCH_UNKNOWN_COMMANDS_VAR, DISPLAY_VAR , DISPLAY_ANSI_VAR, diff -uNr sent-upstream/as-sent-last/include/window.h ircii-pana-1.0-0c15/include/window.h --- sent-upstream/as-sent-last/include/window.h Fri Oct 22 01:48:21 1999 +++ ircii-pana-1.0-0c15/include/window.h Sun Jan 9 06:03:52 2000 @@ -31,6 +31,10 @@ #define ON 1 #define TOGGLE 2 +#define WINDOW_NO_SERVER -1 +#define WINDOW_DLL -2 +#define WINDOW_SERVER_CLOSED -3 + Window *new_window (struct ScreenStru *); void delete_window (Window *); void add_to_invisible_list (Window *); @@ -71,7 +75,6 @@ char *get_bound_channel (Window *); int get_window_server (unsigned); void set_window_server (int, int, int); - void window_check_servers (void); void set_level_by_refnum (unsigned, unsigned long); void message_to (unsigned long); @@ -145,6 +148,7 @@ const char *query_host (void); const char *query_cmd (void); void window_check_servers(void); + void window_close_server(int old_server); void window_change_server(int, int); void make_window_current_by_winref(int); void make_window_current_by_desc(char *); diff -uNr sent-upstream/as-sent-last/source/commands.c ircii-pana-1.0-0c15/source/commands.c --- sent-upstream/as-sent-last/source/commands.c Tue Jan 4 01:43:35 2000 +++ ircii-pana-1.0-0c15/source/commands.c Sun Jan 9 06:05:49 2000 @@ -1075,7 +1075,7 @@ set_server_reconnect(from_server, 1); close_server(from_server,(args && *args) ? args : "Reconnecting"); clean_server_queues(from_server); - window_check_servers(); + window_close_server(from_server); servercmd(NULL, scommnd, empty_string, NULL); } diff -uNr sent-upstream/as-sent-last/source/irc.c ircii-pana-1.0-0c15/source/irc.c --- sent-upstream/as-sent-last/source/irc.c Sat Jan 8 04:19:04 2000 +++ ircii-pana-1.0-0c15/source/irc.c Sun Jan 9 06:49:38 2000 @@ -543,6 +543,14 @@ detachcmd(NULL, NULL, NULL, NULL); } +void set_detach_on_hup(Window *dummy, char *unused, int value) +{ + if(value) + my_signal(SIGHUP, sig_detach, 0); + else + my_signal(SIGHUP, irc_exit_old, 0); +} + /* shows the version of irc */ static void versionreply(void) { @@ -1506,7 +1514,7 @@ #endif my_signal(SIGQUIT, SIG_IGN, 0); #ifdef WANT_DETACH - my_signal(SIGHUP, sig_detach, 0); + set_detach_on_hup(NULL, NULL, DEFAULT_DETACH_ON_HUP); #else my_signal(SIGHUP, irc_exit_old, 0); #endif diff -uNr sent-upstream/as-sent-last/source/numbers.c ircii-pana-1.0-0c15/source/numbers.c --- sent-upstream/as-sent-last/source/numbers.c Sat Jan 1 19:24:50 2000 +++ ircii-pana-1.0-0c15/source/numbers.c Sun Jan 9 06:06:34 2000 @@ -1105,7 +1105,7 @@ if (do_hook(current_numeric, "%s %s", from, *ArgList)) display_msg(from, ArgList); close_server(from_server, empty_string); - window_check_servers(); + window_close_server(from_server); if (from_server == primary_server) get_connected(from_server + 1, from_server); break; @@ -1149,7 +1149,7 @@ display_msg(from, ArgList); close_server(from_server, empty_string); - window_check_servers(); + window_close_server(from_server); if (server_list_size() > 1) remove_from_server_list(klined); if (klined == primary_server && (server_list_size() > 0)) diff -uNr sent-upstream/as-sent-last/source/parse.c ircii-pana-1.0-0c15/source/parse.c --- sent-upstream/as-sent-last/source/parse.c Tue Jan 4 02:30:07 2000 +++ ircii-pana-1.0-0c15/source/parse.c Sun Jan 9 06:06:48 2000 @@ -1166,7 +1166,7 @@ close_server(from_server,empty_string); clean_server_queues(from_server); - window_check_servers(); + window_close_server(from_server); set_input_prompt(current_window, get_string_var(INPUT_PROMPT_VAR), 0); if (strchr(from, '.')) { diff -uNr sent-upstream/as-sent-last/source/server.c ircii-pana-1.0-0c15/source/server.c --- sent-upstream/as-sent-last/source/server.c Tue Jan 4 01:43:35 2000 +++ ircii-pana-1.0-0c15/source/server.c Sun Jan 9 06:25:16 2000 @@ -257,6 +257,7 @@ times = 1; i++; } + window_close_server(i); get_connected(i, old_serv); break; } @@ -1162,7 +1163,7 @@ return; } close_server(i, "closing server"); - window_check_servers(); + window_close_server(i); } else get_connected(from_server - 1, from_server); @@ -2100,6 +2101,7 @@ clear_channel_list(i); close_server(i, message); server_list[i].eof = 1; + window_close_server(i); } done: window_check_servers(); diff -uNr sent-upstream/as-sent-last/source/vars.c ircii-pana-1.0-0c15/source/vars.c --- sent-upstream/as-sent-last/source/vars.c Tue Jan 4 02:27:26 2000 +++ ircii-pana-1.0-0c15/source/vars.c Sun Jan 9 06:52:18 2000 @@ -95,6 +95,8 @@ static void set_nat_address (Window *, char *, int); extern void debug_window (Window *, char *, int); +extern void set_detach_on_hup (Window *, char *, int); + /* * irc_variable: all the irc variables used. Note that the integer and * boolean defaults are set here, which the string default value are set in @@ -199,6 +201,7 @@ { "DEOPFLOOD_TIME",0, INT_TYPE_VAR, DEFAULT_DEOPFLOOD_TIME, NULL, NULL, 0, VIF_BITCHX }, { "DEOP_ON_DEOPFLOOD",0, INT_TYPE_VAR, DEFAULT_DEOP_ON_DEOPFLOOD, NULL, NULL, 0, VIF_BITCHX }, { "DEOP_ON_KICKFLOOD",0, INT_TYPE_VAR, DEFAULT_DEOP_ON_KICKFLOOD, NULL, NULL, 0, VIF_BITCHX }, + { "DETACH_ON_HUP",0, BOOL_TYPE_VAR, DEFAULT_DETACH_ON_HUP, NULL, set_detach_on_hup, 0, 0 }, { "DISPATCH_UNKNOWN_COMMANDS",0,BOOL_TYPE_VAR, DEFAULT_DISPATCH_UNKNOWN_COMMANDS, NULL, NULL, 0, 0 }, { "DISPLAY",0, BOOL_TYPE_VAR, DEFAULT_DISPLAY, NULL, NULL, 0, 0 }, { "DISPLAY_ANSI",0, BOOL_TYPE_VAR, DEFAULT_DISPLAY_ANSI, NULL, toggle_reverse_status, 0, 0 }, diff -uNr sent-upstream/as-sent-last/source/window.c ircii-pana-1.0-0c15/source/window.c --- sent-upstream/as-sent-last/source/window.c Tue Jan 4 02:27:26 2000 +++ ircii-pana-1.0-0c15/source/window.c Sun Jan 9 06:18:15 2000 @@ -1784,7 +1784,7 @@ if ((window = get_window_by_refnum(refnum)) == NULL) window = current_window; old = window->server; - if (misc) + if (misc || old == WINDOW_SERVER_CLOSED) { while ((traverse_all_windows(&tmp))) { @@ -1850,6 +1850,30 @@ } update_all_status(current_window, NULL, 0); cursor_to_input(); +} + +/* + * window_close_server: this is like window_check_servers but it gets called + * with old_server as the refnum of a server that just got closed. It marks + * every window that used to be connected to old_server as WINDOW_SERVER_CLOSED + * and sets last_server for those windows. It doesn't touch windows that + * already had no server. + */ + +void window_close_server(int old_server) +{ + Window *tmp; + int cnt, max, i, not_connected, prime = -1; + + tmp = NULL; + while ((traverse_all_windows(&tmp))) + { + if (tmp->server == old_server) + { + tmp->server = WINDOW_SERVER_CLOSED; + tmp->last_server = old_server; + } + } } /*