saphir/Win.HC

175 lines
No EOL
3.6 KiB
HolyC

#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;
}