gboolean chan_remove (chan *ch, gboolean force) { chan *new_ch; int i, num; extern int hexchat_is_quitting; if (hexchat_is_quitting) /* avoid lots of looping on exit */ return TRUE; /* is this ch allowed to be closed while still having children? */ if (!force && gtk_tree_model_iter_has_child (GTK_TREE_MODEL (ch->cv->store), &ch->iter) && !ch->allow_closure) return FALSE; chan_emancipate_children (ch); ch->cv->func_remove (ch); /* is it the focused one? */ if (ch->cv->focused == ch) { ch->cv->focused = NULL; /* try to move the focus to some other valid channel */ num = cv_find_number_of_chan (ch->cv, ch); /* move to the one left of the closing tab */ new_ch = cv_find_chan_by_number (ch->cv, num - 1); if (new_ch && new_ch != ch) { chan_focus (new_ch); /* this'll will set ch->cv->focused for us too */ } else { /* if it fails, try focus from tab 0 and up */ for (i = 0; i < ch->cv->size; i++) { new_ch = cv_find_chan_by_number (ch->cv, i); if (new_ch && new_ch != ch) { chan_focus (new_ch); /* this'll will set ch->cv->focused for us too */ break; } } } } ch->cv->size--; gtk_tree_store_remove (ch->cv->store, &ch->iter); free (ch); return TRUE; }
static void cv_tree_move_focus(chanview * cv, gboolean relative, int num) { chan *ch; if (relative) { num += cv_find_number_of_chan(cv, cv->focused); num %= cv->size; /* make it wrap around at both ends */ if (num < 0) num = cv->size - 1; } ch = cv_find_chan_by_number(cv, num); if (ch) cv_tree_focus(ch); }