session * new_ircwindow (server *serv, char *name, int type, int focus) { session *sess; switch (type) { case SESS_SERVER: serv = server_new (); if (prefs.hex_gui_tab_server) sess = session_new (serv, name, SESS_SERVER, focus); else sess = session_new (serv, name, SESS_CHANNEL, focus); serv->server_session = sess; serv->front_session = sess; break; case SESS_DIALOG: sess = session_new (serv, name, type, focus); log_open_or_close (sess); break; default: /* case SESS_CHANNEL: case SESS_NOTICES: case SESS_SNOTICES:*/ sess = session_new (serv, name, type, focus); break; } irc_init (sess); chanopt_load (sess); scrollback_load (sess); plugin_emit_dummy_print (sess, "Open Context"); return sess; }
session * new_ircwindow (server *serv, char *name, int type, int focus) { session *sess; switch (type) { case SESS_SERVER: serv = server_new (); if (prefs.hex_gui_tab_server) sess = session_new (serv, name, SESS_SERVER, focus); else sess = session_new (serv, name, SESS_CHANNEL, focus); serv->server_session = sess; serv->front_session = sess; break; case SESS_DIALOG: sess = session_new (serv, name, type, focus); break; default: /* case SESS_CHANNEL: case SESS_NOTICES: case SESS_SNOTICES:*/ sess = session_new (serv, name, type, focus); break; } irc_init (sess); chanopt_load (sess); scrollback_load (sess); if (sess->scrollwritten && sess->scrollback_replay_marklast) sess->scrollback_replay_marklast (sess); if (type == SESS_DIALOG) { struct User *user; log_open_or_close (sess); user = userlist_find_global (serv, name); if (user && user->hostname) set_topic (sess, user->hostname, user->hostname); } plugin_emit_dummy_print (sess, "Open Context"); return sess; }
session * new_ircwindow (server *serv, char *name, int type) { session *sess; switch (type) { case SESS_SERVER: serv = new_server (); if (prefs.use_server_tab) { register unsigned int oldh = prefs.hideuserlist; prefs.hideuserlist = 1; sess = new_session (serv, name, SESS_SERVER); prefs.hideuserlist = oldh; } else { sess = new_session (serv, name, SESS_CHANNEL); } serv->server_session = sess; serv->front_session = sess; break; case SESS_DIALOG: sess = new_session (serv, name, type); if (prefs.logging) log_open (sess); break; default: /* case SESS_CHANNEL: case SESS_NOTICES: case SESS_SNOTICES:*/ sess = new_session (serv, name, type); break; } irc_init (sess); plugin_emit_dummy_print (sess, "Open Context"); return sess; }
void fe_set_current (session *sess) { // If find bar is open, hide it find_bar_close (FIND_BAR (gui.find_bar)); gui.current_session = sess; // Notify parts of the UI that the current session has changed conversation_panel_set_current (CONVERSATION_PANEL (gui.conversation_panel), sess); topic_label_set_current (TOPIC_LABEL (gui.topic_label), sess); text_entry_set_current (TEXT_ENTRY (gui.text_entry), sess); status_bar_set_current (STATUS_BAR (gui.status_bar), sess->server); navigation_model_set_current (gui.tree_model, sess); // Change the window name if (sess->server->network == NULL) { rename_main_window (NULL, sess->channel); } else { ircnet *net = sess->server->network; rename_main_window (net->name, sess->channel); } // Set nickname button set_nickname_label (sess->server, NULL); // Set the label of the user list button userlist_set_user_button (u, sess); gtk_widget_set_sensitive (GTK_WIDGET (gui.userlist_toggle), sess->type == SESS_CHANNEL); // FIXME: Userlist should be more encapsulated gtk_tree_view_set_model (GTK_TREE_VIEW (gui.userlist), GTK_TREE_MODEL (userlist_get_store (u, sess))); // Emit "focus tab" event for plugins that rely on it plugin_emit_dummy_print (sess, "Focus Tab"); gtk_widget_grab_focus (GTK_WIDGET (gui.text_entry)); }
void kill_session_callback (session * killsess) { server *killserv = killsess->server; session *sess; GSList *list; plugin_emit_dummy_print (killsess, "Close Context"); if (current_tab == killsess) current_tab = NULL; if (killserv->server_session == killsess) killserv->server_session = NULL; if (killserv->front_session == killsess) { /* front_session is closed, find a valid replacement */ killserv->front_session = NULL; list = sess_list; while (list) { sess = (session *) list->data; if (sess != killsess && sess->server == killserv) { killserv->front_session = sess; if (!killserv->server_session) killserv->server_session = sess; break; } list = list->next; } } if (!killserv->server_session) killserv->server_session = killserv->front_session; sess_list = g_slist_remove (sess_list, killsess); if (killsess->type == SESS_CHANNEL) free_userlist (killsess); exec_notify_kill (killsess); log_close (killsess); send_quit_or_part (killsess); history_free (&killsess->history); if (killsess->topic) free (killsess->topic); if (killsess->current_modes) free (killsess->current_modes); fe_session_callback (killsess); if (current_sess == killsess && sess_list) current_sess = sess_list->data; free (killsess); if (!sess_list && !in_xchat_exit) xchat_exit (); /* sess_list is empty, quit! */ list = sess_list; while (list) { sess = (session *) list->data; if (sess->server == killserv) return; /* this server is still being used! */ list = list->next; } kill_server_callback (killserv); }
void session_free (session *killsess) { server *killserv = killsess->server; session *sess; GSList *list; int oldidx; plugin_emit_dummy_print (killsess, "Close Context"); if (current_tab == killsess) current_tab = NULL; if (killserv->server_session == killsess) killserv->server_session = NULL; if (killserv->front_session == killsess) { /* front_session is closed, find a valid replacement */ killserv->front_session = NULL; list = sess_list; while (list) { sess = (session *) list->data; if (sess != killsess && sess->server == killserv) { killserv->front_session = sess; if (!killserv->server_session) killserv->server_session = sess; break; } list = list->next; } } if (!killserv->server_session) killserv->server_session = killserv->front_session; sess_list = g_slist_remove (sess_list, killsess); if (killsess->type == SESS_CHANNEL) userlist_free (killsess); oldidx = killsess->lastact_idx; if (oldidx != LACT_NONE) sess_list_by_lastact[oldidx] = g_list_remove(sess_list_by_lastact[oldidx], killsess); exec_notify_kill (killsess); log_close (killsess); scrollback_close (killsess); chanopt_save (killsess); send_quit_or_part (killsess); history_free (&killsess->history); if (killsess->topic) free (killsess->topic); if (killsess->current_modes) free (killsess->current_modes); fe_session_callback (killsess); if (current_sess == killsess) { current_sess = NULL; if (sess_list) current_sess = sess_list->data; } free (killsess); if (!sess_list && !in_hexchat_exit) hexchat_exit (); /* sess_list is empty, quit! */ list = sess_list; while (list) { sess = (session *) list->data; if (sess->server == killserv) return; /* this server is still being used! */ list = list->next; } server_free (killserv); }