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
|
/* next/prev channel index that is NOT a *status* channel (unless it's the
|
||||||
only kind), skipping nothing — just a linear wrap */
|
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) {
|
static int chan_next(int cur, int dir) {
|
||||||
if (g_chan_count <= 1) return cur;
|
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 ───────────────────────────────────────────────────────────── */
|
/* ── ignore list ───────────────────────────────────────────────────────────── */
|
||||||
|
|||||||
Reference in New Issue
Block a user