fix channel switching order
This commit is contained in:
@@ -425,9 +425,38 @@ static void chan_sort_users(Channel *ch) {
|
||||
|
||||
/* next/prev channel index that is NOT a *status* channel (unless it's the
|
||||
only kind), skipping nothing — just a linear wrap */
|
||||
/* Build the visual order of channels (same traversal as draw_channels).
|
||||
Returns the count; fills idx[] with g_chans indices in display order. */
|
||||
static int visual_order(int *idx, int max) {
|
||||
int n = 0;
|
||||
for (int si = 0; si < g_srv_count && n < max; si++) {
|
||||
/* *status* first */
|
||||
for (int ci = 0; ci < g_chan_count && n < max; ci++) {
|
||||
if (g_chans[ci].srv != si) continue;
|
||||
if (strcmp(g_chans[ci].name, "*status*") == 0)
|
||||
idx[n++] = ci;
|
||||
}
|
||||
/* then regular channels */
|
||||
for (int ci = 0; ci < g_chan_count && n < max; ci++) {
|
||||
if (g_chans[ci].srv != si) continue;
|
||||
if (strcmp(g_chans[ci].name, "*status*") != 0)
|
||||
idx[n++] = ci;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
static int chan_next(int cur, int dir) {
|
||||
if (g_chan_count <= 1) return cur;
|
||||
return (cur + dir + g_chan_count) % g_chan_count;
|
||||
int idx[MAX_CHANS_TOTAL];
|
||||
int n = visual_order(idx, MAX_CHANS_TOTAL);
|
||||
if (n == 0) return cur;
|
||||
/* find cur in visual order */
|
||||
int pos = 0;
|
||||
for (int i = 0; i < n; i++)
|
||||
if (idx[i] == cur) { pos = i; break; }
|
||||
pos = (pos + dir + n) % n;
|
||||
return idx[pos];
|
||||
}
|
||||
|
||||
/* ── ignore list ───────────────────────────────────────────────────────────── */
|
||||
|
||||
Reference in New Issue
Block a user