diff --git a/Saphir/Cmd.HC b/Saphir/Cmd.HC index c4391d3..d5bea74 100644 --- a/Saphir/Cmd.HC +++ b/Saphir/Cmd.HC @@ -28,66 +28,55 @@ U0 saphir_split_col() WinZBufUpdate; } +I64 saphir_win_select_CR(I64 dir) +{ + if (dir & 1) { + return TEXT_COLS + 1; + } + return TEXT_ROWS + 1; +} + +I64 saphir_win_select_XY(I64 wt, I64 wl, I64 dir) +{ + if (dir & 1) { + return wl; + } + return wt; +} + +I64 saphir_win_select_pos(I64 dir) +{ + return 1 - (2 * (dir < SC_CURSOR_RIGHT)); +} + +Bool saphir_task_should_focus(CTask* task1, I64 i, I64 wl, I64 dir) +{ + if (dir & 1) { + return task1->win_left == i; + } + return task1->win_top == i && task1->win_left == wl; +} + U0 saphir_win_select(I64 dir) { CTask* task = sys_focus_task; CTask* task1; I64 wt = task->win_top; I64 wl = task->win_left; - I64 i; - I64 j; + I64 i, j, k; - switch (dir) { - case SC_CURSOR_UP: - i = wt - 1; - j = -1; - break; - case SC_CURSOR_DOWN: - i = wt + 1; - j = 1; - break; - case SC_CURSOR_LEFT: - i = wl - 1; - j = -1; - break; - case SC_CURSOR_RIGHT: - i = wl + 1; - j = 1; - break; - } + i = j = saphir_win_select_pos(dir); + i += saphir_win_select_XY(wt, wl, dir); + k = saphir_win_select_CR(dir); - switch (dir) { - case SC_CURSOR_UP: - case SC_CURSOR_DOWN: - for (i = i; i > 0 && i < TEXT_ROWS + 1; i += j) { - task1 = adam_task->next_task; - while (task1 != adam_task) { - if (saphir_task_is_windowed(task1)) { - if (task1->win_top == i && task1->win_left == wl) { - WinFocus(task1); - return; - } - } - task1 = task1->next_task; + for (i = i; i > 0 && i < k; i += j) { + task1 = adam_task->next_task; + while (task1 != adam_task) { + if (saphir_task_is_windowed(task1) && saphir_task_should_focus(task1, i, wl, dir)) { + WinFocus(task1); + return; } + task1 = task1->next_task; } - break; - case SC_CURSOR_LEFT: - case SC_CURSOR_RIGHT: - for (i = i; i > 0 && i < TEXT_COLS + 1; i += j) { - task1 = adam_task->next_task; - while (task1 != adam_task) { - if (saphir_task_is_windowed(task1)) { - if (task1->win_left == i) { - WinFocus(task1); - return; - } - } - task1 = task1->next_task; - } - } - break; - default: - break; } } \ No newline at end of file