175 lines
No EOL
3.6 KiB
HolyC
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;
|
|
} |