#define SAPHIR_WIN_UP 0 #define SAPHIR_WIN_DOWN 1 #define SAPHIR_WIN_LEFT 2 #define SAPHIR_WIN_RIGHT 3 CDoc *SAPHIR_BORDER_DOC = DocNew; CTask *@is_task_windowed(CTask *task) { if ((task->display_flags & 1 << DISPLAYf_SHOW) && ((task->display_flags & 1 << DISPLAYf_NOT_RAW))) return task; return NULL; } I64 @windowed_task_count() { CTask *task; I64 count = 0; task = adam_task->next_task; while (task != adam_task) { if (@is_task_windowed(task)) count++; task = task->next_task; } return count; } CTask *@windowed_task_index(I64 index) { CTask *task; I64 count = 0; task = adam_task->next_task; while (task != adam_task) { if (@is_task_windowed(task)) { if (count == index) return task; count++; } task = task->next_task; } return NULL; } U0 @set_border_doc_for_win(CTask *task) { task->border_doc = SAPHIR_BORDER_DOC; } U0 @draw_saphir_border_for_win(CTask *task) { I64 color = LTGRAY; if (task == sys_focus_task) color = LTRED; I64 x; I64 y; I64 wl = task->win_left - 1; I64 wr = task->win_right + 1; I64 wt = task->win_top - 1; I64 wb = task->win_bottom + 1; for (x = wl; x < wr + 1; x++) { gr.text_base[(wt * TEXT_COLS) + x].u8[1] = color; gr.text_base[(wb * TEXT_COLS) + x].u8[1] = color; } for (y = wt; y < wb + 1; y++) { gr.text_base[(y * TEXT_COLS) + wl].u8[1] = color; gr.text_base[(y * TEXT_COLS) + wr].u8[1] = color; } } U0 @ensure_win_no_overlap_status_bar(CTask *task) { task->win_bottom = MinI64(task->win_bottom, TEXT_ROWS - 3); } U0 @set_cursor_for_focused_win(CTask *task) { if (task == sys_focus_task) { task->put_doc->flags &= ~(1 << DOCf_HIDE_CURSOR); } else { task->put_doc->flags |= (1 << DOCf_HIDE_CURSOR); } } U0 @saphir_win_select(I64 dir) { CTask *task = sys_focus_task; I64 wt = task->win_top; I64 wl = task->win_left; I64 i; I64 j; switch (dir) { case SAPHIR_WIN_UP: i = wt - 1; j = -1; break; case SAPHIR_WIN_DOWN: i = wt + 1; j = 1; break; case SAPHIR_WIN_LEFT: i = wl - 1; j = -1; break; case SAPHIR_WIN_RIGHT: i = wl + 1; j = 1; break; } CTask *task1; switch (dir) { case SAPHIR_WIN_UP: case SAPHIR_WIN_DOWN: for (i = i; i > 0 && i < TEXT_ROWS + 1; i += j) { task1 = adam_task->next_task; while (task1 != adam_task) { if (@is_task_windowed(task1)) { if (task1->win_top == i && task1->win_left == wl) { WinFocus(task1); return; } } task1 = task1->next_task; } } break; case SAPHIR_WIN_LEFT: case SAPHIR_WIN_RIGHT: for (i = i; i > 0 && i < TEXT_COLS + 1; i += j) { task1 = adam_task->next_task; while (task1 != adam_task) { if (@is_task_windowed(task1)) { if (task1->win_left == i) { WinFocus(task1); return; } } task1 = task1->next_task; } } break; default: break; } } U0 @saphir_split_horz() { CTask *task1 = sys_focus_task; I64 wt = task1->win_top; I64 wl = task1->win_left; I64 wb = task1->win_bottom; I64 wr = task1->win_right; task1->win_bottom = wb / 2; CTask *task2 = User; task2->win_top = (wb / 2) + 2; task2->win_bottom = wb; task2->win_left = wl; task2->win_right = wr; WinZBufUpdate; } U0 @saphir_split_vert() { CTask *task1 = sys_focus_task; I64 wt = task1->win_top; I64 wb = task1->win_bottom; I64 wr = task1->win_right; task1->win_right = wr / 2; CTask *task2 = User; task2->win_top = wt; task2->win_bottom = wb; task2->win_left = (wr / 2) + 2; task2->win_right = wr; WinZBufUpdate; }