543 lines
12 KiB
HolyC
543 lines
12 KiB
HolyC
|
#help_index "Windows"
|
|||
|
#help_file "::/Doc/Windows"
|
|||
|
|
|||
|
CMsStateGlbls old_ms={{-1000,-1000,0},{-1000,-1000,0},{-1000,-1000,0},
|
|||
|
{0,0,0},{1.0,1.0,1.0},0.0,GetTSC,0.350,0,0,
|
|||
|
FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE
|
|||
|
};
|
|||
|
|
|||
|
public CWinMgrGlbls winmgr={0,0,0,WINMGR_FPS,tS,tS,NULL,FALSE,FALSE,FALSE};
|
|||
|
winmgr.t=CAlloc(sizeof(CWinMgrTimingGlbls));
|
|||
|
winmgr.t->last_calc_idle_time=tS;
|
|||
|
|
|||
|
U0 ProgressBarsRegTf(U8 *path=NULL)
|
|||
|
{
|
|||
|
F64 t,p1,p2,p3,p4;
|
|||
|
if (path) {
|
|||
|
t=tS;
|
|||
|
if (progress1_t0) p1=t-progress1_t0; else p1=0;
|
|||
|
if (progress2_t0) p2=t-progress2_t0; else p2=0;
|
|||
|
if (progress3_t0) p3=t-progress3_t0; else p3=0;
|
|||
|
if (progress4_t0) p4=t-progress4_t0; else p4=0;
|
|||
|
RegWrite(path,"progress1_tf=%0.3f;progress2_tf=%0.3f;\n"
|
|||
|
"progress3_tf=%0.3f;progress4_tf=%0.3f;\n",p1,p2,p3,p4);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#define PROGRESS_BAR_HEIGHT 20
|
|||
|
#define PROGRESS_BAR_WIDTH (3*GR_WIDTH/4)
|
|||
|
U0 DrawProgressBars(CDC *dc)
|
|||
|
{
|
|||
|
I64 i,j,k,n,m;
|
|||
|
U8 *st,*st2;
|
|||
|
for (i=0;i<PROGRESS_BARS_NUM;i++) {
|
|||
|
if (m=sys_progresses[i].max) {
|
|||
|
dc->color=BLACK;
|
|||
|
GrRect(dc,
|
|||
|
(GR_WIDTH-PROGRESS_BAR_WIDTH)/2,
|
|||
|
(GR_HEIGHT-(PROGRESS_BARS_NUM*2-1-i*4)*PROGRESS_BAR_HEIGHT)/2,
|
|||
|
PROGRESS_BAR_WIDTH,PROGRESS_BAR_HEIGHT);
|
|||
|
|
|||
|
dc->color=LTGREEN;
|
|||
|
n=sys_progresses[i].val;
|
|||
|
if (n>m)
|
|||
|
n=m;
|
|||
|
GrRect(dc,
|
|||
|
(GR_WIDTH-PROGRESS_BAR_WIDTH)/2+2,
|
|||
|
(GR_HEIGHT-(PROGRESS_BARS_NUM*2-1-i*4)*PROGRESS_BAR_HEIGHT)/2+2,
|
|||
|
n*(PROGRESS_BAR_WIDTH-4)/m,
|
|||
|
PROGRESS_BAR_HEIGHT-4);
|
|||
|
|
|||
|
if (m>1) {
|
|||
|
dc->color=BLACK;
|
|||
|
k=m-1;
|
|||
|
if (k>19) k=19;
|
|||
|
for (j=0;j<=k;j++)
|
|||
|
GrLine(dc,
|
|||
|
(GR_WIDTH-PROGRESS_BAR_WIDTH)/2+1+j*
|
|||
|
(PROGRESS_BAR_WIDTH-4)/ToF64(k+1),
|
|||
|
(GR_HEIGHT-(PROGRESS_BARS_NUM*2-1-i*4)*
|
|||
|
PROGRESS_BAR_HEIGHT)/2+4,
|
|||
|
(GR_WIDTH-PROGRESS_BAR_WIDTH)/2+1+j*
|
|||
|
(PROGRESS_BAR_WIDTH-4)/ToF64(k+1),
|
|||
|
(GR_HEIGHT-(PROGRESS_BARS_NUM*2-3-i*4)*
|
|||
|
PROGRESS_BAR_HEIGHT)/2-4);
|
|||
|
}
|
|||
|
|
|||
|
dc->color=GREEN;
|
|||
|
if (*sys_progresses[i].desc)
|
|||
|
st=StrNew(sys_progresses[i].desc);
|
|||
|
else
|
|||
|
st=MStrPrint("%d/%d",n,m);
|
|||
|
if (sys_progresses[i].t0) {
|
|||
|
st2=MStrPrint("%s%fs",st,tS-sys_progresses[i].t0);
|
|||
|
Free(st);
|
|||
|
} else
|
|||
|
st2=st;
|
|||
|
if (sys_progresses[i].tf) {
|
|||
|
st=MStrPrint("%s/%fs",st2,sys_progresses[i].tf);
|
|||
|
Free(st2);
|
|||
|
} else
|
|||
|
st=st2;
|
|||
|
GrPrint(dc,(GR_WIDTH-FONT_WIDTH*StrLen(st))/2,(GR_HEIGHT-FONT_HEIGHT-
|
|||
|
(PROGRESS_BARS_NUM*2-2-i*4)*PROGRESS_BAR_HEIGHT)/2,"%s",st);
|
|||
|
Free(st);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
U0 DrawWinGrid(CDC *dc)
|
|||
|
{
|
|||
|
F64 d;
|
|||
|
dc->color=BLACK;
|
|||
|
dc->thick=1;
|
|||
|
for (d=ms_grid.x_offset;d<GR_WIDTH; d+=ms_grid.x)
|
|||
|
GrLine(dc,d,0,d,GR_HEIGHT-1);
|
|||
|
for (d=ms_grid.y_offset;d<GR_HEIGHT;d+=ms_grid.y)
|
|||
|
GrLine(dc,0,d,GR_WIDTH-1,d);
|
|||
|
}
|
|||
|
|
|||
|
U0 WinGrid(Bool val)
|
|||
|
{
|
|||
|
CGridGlbls last_grid;
|
|||
|
MemCpy(&last_grid,&ms_grid,sizeof(CGridGlbls));
|
|||
|
if (!val || PopUpForm(&ms_grid)) {
|
|||
|
if (!val)
|
|||
|
GridInit;
|
|||
|
ms_hard.prescale.x*=last_grid.x_speed/ms_grid.x_speed;
|
|||
|
ms_hard.prescale.y*=last_grid.y_speed/ms_grid.y_speed;
|
|||
|
ms_hard.prescale.z*=last_grid.z_speed/ms_grid.z_speed;
|
|||
|
} else
|
|||
|
MemCpy(&ms_grid,&last_grid,sizeof(CGridGlbls));
|
|||
|
}
|
|||
|
U0 CtrlAltG(I64 sc)
|
|||
|
{
|
|||
|
if (sc&SCF_SHIFT)
|
|||
|
PopUp("WinGrid(OFF);");
|
|||
|
else
|
|||
|
PopUp("WinGrid(ON);");
|
|||
|
}
|
|||
|
CtrlAltCBSet('G',&CtrlAltG,"Cmd/Grid On",
|
|||
|
"Cmd/Grid Off");
|
|||
|
|
|||
|
CTask *ext_ASCII_task;
|
|||
|
U0 ExtendedASCII()
|
|||
|
{
|
|||
|
I64 i;
|
|||
|
CDoc *doc=DocNew;
|
|||
|
DocPrint(doc,"Sel Char and Press <ESC>\n$$LTBLUE$$");
|
|||
|
for (i=0;i<256;i++) {
|
|||
|
if (i>=CH_SHIFT_SPACE && i!=0x7F) {
|
|||
|
if (i==CH_SHIFT_SPACE)
|
|||
|
DocPrint(doc,"$$MU-UL,\"\\x1F\",LE=%d$$",i);
|
|||
|
else if (i=='$$')
|
|||
|
DocPrint(doc,"$$MU-UL,\"\\x24\",LE=%d$$",i);
|
|||
|
else if (i=='\"'||i=='\\')
|
|||
|
DocPrint(doc,"$$MU-UL,\"\\%c\",LE=%d$$",i,i);
|
|||
|
else
|
|||
|
DocPrint(doc,"$$MU-UL,\"%c\",LE=%d$$",i,i);
|
|||
|
} else
|
|||
|
DocPrint(doc,"");
|
|||
|
if (i&15==15)
|
|||
|
DocPrint(doc,"\n");
|
|||
|
}
|
|||
|
i=PopUpMenu(doc);
|
|||
|
DocDel(doc);
|
|||
|
if (i>=0)
|
|||
|
PostMsg(ext_ASCII_task,MSG_KEY_DOWN_UP,i,Char2ScanCode(i));
|
|||
|
}
|
|||
|
|
|||
|
U0 CtrlAltA(I64)
|
|||
|
{
|
|||
|
if (ext_ASCII_task=sys_focus_task)
|
|||
|
Spawn(&ExtendedASCII);
|
|||
|
}
|
|||
|
CtrlAltCBSet('A',&CtrlAltA,"Cmd/Extended ASCII");
|
|||
|
|
|||
|
public U0 WinScrollNull(CTask *task,CD3I64 *s)
|
|||
|
{//If panning a window has been done, restore to zero.
|
|||
|
s->x=task->scroll_x;
|
|||
|
s->y=task->scroll_y;
|
|||
|
s->z=task->scroll_z;
|
|||
|
task->scroll_x=0;
|
|||
|
task->scroll_y=0;
|
|||
|
task->scroll_z=0;
|
|||
|
}
|
|||
|
|
|||
|
public U0 WinScrollRestore(CTask *task,CD3I64 *s)
|
|||
|
{//Set window pan value to stored value.
|
|||
|
task->scroll_x=s->x;
|
|||
|
task->scroll_y=s->y;
|
|||
|
task->scroll_z=s->z;
|
|||
|
}
|
|||
|
|
|||
|
U0 DrawMs(CDC *dc)
|
|||
|
{
|
|||
|
I64 x,y;
|
|||
|
PUSHFD
|
|||
|
CLI
|
|||
|
x=ms.pos.x;
|
|||
|
y=ms.pos.y;
|
|||
|
POPFD
|
|||
|
if (ms.show && ms_hard.installed) {
|
|||
|
if (!Bt(&sys_run_level,RLf_VGA)) //if text mode
|
|||
|
gr.text_base[ms.pos_text.x+ms.pos_text.y*TEXT_COLS]^=0x7F00;
|
|||
|
else {
|
|||
|
if (gr.fp_draw_ms) {
|
|||
|
if (ms.lb)
|
|||
|
dc->color=ROP_XOR+LTPURPLE^TRANSPARENT;
|
|||
|
else if (ms.rb)
|
|||
|
dc->color=ROP_XOR+LTCYAN^TRANSPARENT;
|
|||
|
else
|
|||
|
dc->color=ROP_XOR+BLACK^TRANSPARENT;
|
|||
|
if (winmgr.grab_scroll && gr.fp_draw_grab_ms)
|
|||
|
(*gr.fp_draw_grab_ms)(dc,x,y,winmgr.grab_scroll_closed);
|
|||
|
else
|
|||
|
(*gr.fp_draw_ms)(dc,x,y);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
U0 WinFinalUpdate(CDC *dc)
|
|||
|
{
|
|||
|
if (ms_grid.show)
|
|||
|
DrawWinGrid(dc);
|
|||
|
if (ms_grid.coord)
|
|||
|
GrPrint(dc,GR_WIDTH-FONT_WIDTH*10,FONT_HEIGHT*3,
|
|||
|
"(%03d,%03d)",ms.pos.x,ms.pos.y);
|
|||
|
DrawProgressBars(dc);
|
|||
|
if (winmgr.show_menu)
|
|||
|
DrawMenu(dc);
|
|||
|
else
|
|||
|
sys_cur_submenu_entry=NULL;
|
|||
|
DrawMs(dc);
|
|||
|
}
|
|||
|
|
|||
|
gr.fp_final_scrn_update=&WinFinalUpdate;
|
|||
|
|
|||
|
U0 WinMsUpdate()
|
|||
|
{
|
|||
|
I64 dd;
|
|||
|
Bool set=FALSE;
|
|||
|
if (ms_hard.installed) {
|
|||
|
ms.has_wheel=ms_hard.has_wheel;
|
|||
|
if (ms_hard.evt) {
|
|||
|
MsUpdate(ms_hard.pos.x,ms_hard.pos.y,ms_hard.pos.z,
|
|||
|
ms_hard.bttns[0],ms_hard.bttns[1]);
|
|||
|
ms_hard.evt=FALSE;
|
|||
|
set=TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (set) {
|
|||
|
if (ms_hard.installed) {
|
|||
|
ms.speed=ms_hard.speed;
|
|||
|
ms.timestamp=ms_hard.timestamp;
|
|||
|
}
|
|||
|
} else
|
|||
|
ms.speed*=0.95;
|
|||
|
if (gr.scrn_zoom!=1) {
|
|||
|
if (gr.continuous_scroll)
|
|||
|
GrScaleZoom(1.0);
|
|||
|
else {
|
|||
|
dd=(ms.pos.x-gr.sx)*gr.scrn_zoom;
|
|||
|
if (!(8<=dd<GR_WIDTH-8))
|
|||
|
GrScaleZoom(1.0);
|
|||
|
else {
|
|||
|
dd=(ms.pos.y-gr.sy)*gr.scrn_zoom;
|
|||
|
if (!(8<=dd<GR_HEIGHT-8))
|
|||
|
GrScaleZoom(1.0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public CTask *WinRefocus(CTask *task=NULL)
|
|||
|
{//Reset the focus task if NULL.
|
|||
|
PUSHFD
|
|||
|
CLI
|
|||
|
if (!task) {
|
|||
|
task=sys_winmgr_task->last_task;
|
|||
|
while (TaskValidate(task) && task!=sys_winmgr_task) {
|
|||
|
if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS)) {
|
|||
|
sys_focus_task=task;
|
|||
|
break;
|
|||
|
}
|
|||
|
task=task->last_task;
|
|||
|
}
|
|||
|
}
|
|||
|
POPFD
|
|||
|
return sys_focus_task;
|
|||
|
}
|
|||
|
|
|||
|
I64 WinOnTopWindows()
|
|||
|
{
|
|||
|
CTask *task,*task1,*first_moved_fwd=NULL;
|
|||
|
I64 res=0;
|
|||
|
PUSHFD
|
|||
|
CLI //TODO Multiprocessor safe
|
|||
|
task=sys_winmgr_task->next_task;
|
|||
|
while (task!=sys_winmgr_task &&task!=first_moved_fwd) {
|
|||
|
task1=task->next_task;
|
|||
|
if (!TaskValidate(task)) {
|
|||
|
POPFD
|
|||
|
return res;
|
|||
|
}
|
|||
|
if (Bt(&task->display_flags,DISPLAYf_WIN_ON_TOP) &&
|
|||
|
task!=sys_winmgr_task->last_task) {
|
|||
|
TaskQueRem(task);
|
|||
|
TaskQueIns(task,sys_winmgr_task);
|
|||
|
res++;
|
|||
|
if (!first_moved_fwd)
|
|||
|
first_moved_fwd=task;
|
|||
|
}
|
|||
|
task=task1;
|
|||
|
}
|
|||
|
POPFD
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
public I64 WinToTop(CTask *task=NULL,Bool update_z_buf=TRUE)
|
|||
|
{//Put task's win on top of window stack.
|
|||
|
CTask *task1;
|
|||
|
I64 res=0;
|
|||
|
if (!task) task=Fs;
|
|||
|
if (!TaskValidate(task) || task->gs->num)
|
|||
|
return 0;
|
|||
|
TaskDerivedValsUpdate(task,FALSE);
|
|||
|
if (!sys_winmgr_task || task==sys_winmgr_task)
|
|||
|
return 0;
|
|||
|
PUSHFD
|
|||
|
CLI
|
|||
|
if (!TaskValidate(task)) {
|
|||
|
POPFD
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if (task!=sys_winmgr_task->last_task) {
|
|||
|
TaskQueRem(task);
|
|||
|
TaskQueIns(task,sys_winmgr_task);
|
|||
|
res++;
|
|||
|
}
|
|||
|
if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS))
|
|||
|
sys_focus_task=task;
|
|||
|
if (res && !Bt(&task->display_flags,DISPLAYf_CHILDREN_NOT_ON_TOP)) {
|
|||
|
task1=task->next_child_task;
|
|||
|
while (task1!=&task->next_child_task) {
|
|||
|
if (!TaskValidate(task1))
|
|||
|
break;
|
|||
|
res+=WinToTop(task1,FALSE);
|
|||
|
task1=task1->next_sibling_task;
|
|||
|
}
|
|||
|
if (task->popup_task &&
|
|||
|
task->popup_task->parent_task==task)
|
|||
|
res+=WinToTop(task->popup_task,FALSE);
|
|||
|
}
|
|||
|
POPFD
|
|||
|
res+=WinOnTopWindows;
|
|||
|
if (res && update_z_buf)
|
|||
|
WinZBufUpdate;
|
|||
|
return res;
|
|||
|
}
|
|||
|
ext[EXT_WIN_TO_TOP]=&WinToTop;
|
|||
|
|
|||
|
public CTask *WinFocus(CTask *task=NULL)
|
|||
|
{//Set task as focus task.
|
|||
|
if (!task) task=Fs;
|
|||
|
PUSHFD
|
|||
|
CLI
|
|||
|
if (!TaskValidate(task)||Bt(&task->win_inhibit,WIf_SELF_FOCUS))
|
|||
|
task=WinRefocus(sys_focus_task);
|
|||
|
WinToTop(sys_focus_task=task);
|
|||
|
POPFD
|
|||
|
return sys_focus_task;
|
|||
|
}
|
|||
|
ext[EXT_WIN_FOCUS]=&WinFocus;
|
|||
|
|
|||
|
public Bool WinHorz(I64 left,I64 right,CTask *task=NULL)
|
|||
|
{//Set task's win left and right columns.
|
|||
|
I64 d=right-left;
|
|||
|
if (!task) task=Fs;
|
|||
|
if (!TaskValidate(task)) return FALSE;
|
|||
|
if (d<0) d=0;
|
|||
|
if (left>=TEXT_COLS) {
|
|||
|
left=TEXT_COLS-1;
|
|||
|
right=left+d;
|
|||
|
}
|
|||
|
if (right<0) {
|
|||
|
right=0;
|
|||
|
left=right-d;
|
|||
|
}
|
|||
|
if (left>right) {
|
|||
|
if (left>0)
|
|||
|
right=left;
|
|||
|
else
|
|||
|
left=right;
|
|||
|
}
|
|||
|
PUSHFD
|
|||
|
CLI //TODO Multiprocessor safe
|
|||
|
if (task->win_left!=left || task->win_right!=right) {
|
|||
|
task->win_left=left;
|
|||
|
task->win_right=right;
|
|||
|
TaskDerivedValsUpdate(task);
|
|||
|
POPFD
|
|||
|
return TRUE;
|
|||
|
} else {
|
|||
|
POPFD
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public Bool WinVert(I64 top,I64 bottom,CTask *task=NULL)
|
|||
|
{//Set task's win top and bottom rows.
|
|||
|
I64 d=bottom-top;
|
|||
|
if (!task) task=Fs;
|
|||
|
if (!TaskValidate(task)) return FALSE;
|
|||
|
if (d<0) d=0;
|
|||
|
if (top>=TEXT_ROWS) {
|
|||
|
top=TEXT_ROWS-1;
|
|||
|
bottom=top+d;
|
|||
|
}
|
|||
|
if (bottom<=0) {
|
|||
|
bottom=1;
|
|||
|
top=bottom-d;
|
|||
|
}
|
|||
|
if (top>bottom) {
|
|||
|
if (top>=0)
|
|||
|
bottom=top;
|
|||
|
else
|
|||
|
top=bottom;
|
|||
|
}
|
|||
|
PUSHFD
|
|||
|
CLI //TODO Multiprocessor safe
|
|||
|
if (task->win_top!=top || task->win_bottom!=bottom) {
|
|||
|
task->win_top=top;
|
|||
|
task->win_bottom=bottom;
|
|||
|
TaskDerivedValsUpdate(task);
|
|||
|
POPFD
|
|||
|
return TRUE;
|
|||
|
} else {
|
|||
|
POPFD
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public U0 WinTileHorz()
|
|||
|
{//Tile windows horizontally top-to-bottom.
|
|||
|
CTask *task,*last_task=Fs;
|
|||
|
I64 cnt,c,i,vert_size,no_border;
|
|||
|
|
|||
|
PUSHFD
|
|||
|
CLI //TODO Multiprocessor safe
|
|||
|
task=sys_winmgr_task;
|
|||
|
cnt=0;
|
|||
|
do {
|
|||
|
if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS))
|
|||
|
cnt++;
|
|||
|
task=task->last_task;
|
|||
|
} while (task!=sys_winmgr_task);
|
|||
|
|
|||
|
task=sys_winmgr_task;
|
|||
|
i=0;
|
|||
|
do {
|
|||
|
if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS)) {
|
|||
|
no_border=Bt(&task->display_flags,DISPLAYf_NO_BORDER);
|
|||
|
c=cnt- i&~3;
|
|||
|
if (!c)
|
|||
|
c=1;
|
|||
|
else if (c>4)
|
|||
|
c=4;
|
|||
|
vert_size=(TEXT_ROWS-1)/c;
|
|||
|
|
|||
|
WinHorz(1-no_border,TEXT_COLS-2+no_border,task);
|
|||
|
WinVert((i&3)*vert_size+2-no_border,(i&3+1)*vert_size+no_border,task);
|
|||
|
last_task=task;
|
|||
|
if (i&3==3)
|
|||
|
WinVert(task->win_top,TEXT_ROWS-2,task);
|
|||
|
i++;
|
|||
|
}
|
|||
|
task=task->last_task;
|
|||
|
} while (task!=sys_winmgr_task);
|
|||
|
WinVert(last_task->win_top,TEXT_ROWS-2,last_task);
|
|||
|
POPFD
|
|||
|
}
|
|||
|
|
|||
|
public U0 WinTileVert()
|
|||
|
{//Tile windows vertically side-by-side.
|
|||
|
CTask *task,*last_task=Fs;
|
|||
|
I64 cnt,c,i,horz_size,no_border;
|
|||
|
PUSHFD
|
|||
|
CLI //TODO Multiprocessor safe
|
|||
|
task=sys_winmgr_task;
|
|||
|
cnt=0;
|
|||
|
do {
|
|||
|
if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS))
|
|||
|
cnt++;
|
|||
|
task=task->last_task;
|
|||
|
} while (task!=sys_winmgr_task);
|
|||
|
|
|||
|
task=sys_winmgr_task;
|
|||
|
i=0;
|
|||
|
do {
|
|||
|
if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS)) {
|
|||
|
no_border=Bt(&task->display_flags,DISPLAYf_NO_BORDER);
|
|||
|
c=cnt- i&~3;
|
|||
|
if (!c)
|
|||
|
c=1;
|
|||
|
else if (c>4)
|
|||
|
c=4;
|
|||
|
horz_size=TEXT_COLS/c;
|
|||
|
WinHorz((i&3)*horz_size+1-no_border,(i&3+1)*horz_size-1+no_border,task);
|
|||
|
WinVert(2-no_border,TEXT_ROWS-2+no_border,task);
|
|||
|
last_task=task;
|
|||
|
if (i&3==3)
|
|||
|
WinHorz(task->win_left,TEXT_COLS-2,task);
|
|||
|
i++;
|
|||
|
}
|
|||
|
task=task->last_task;
|
|||
|
} while (task!=sys_winmgr_task);
|
|||
|
WinHorz(last_task->win_left,TEXT_COLS-2,last_task);
|
|||
|
POPFD
|
|||
|
}
|
|||
|
|
|||
|
public U0 WinMax(CTask *task=NULL)
|
|||
|
{//Maximize task's window
|
|||
|
I64 no_border;
|
|||
|
if (!task) task=Fs;
|
|||
|
if (!TaskValidate(task)) return;
|
|||
|
PUSHFD
|
|||
|
CLI //TODO Multiprocessor safe
|
|||
|
no_border=Bt(&task->display_flags,DISPLAYf_NO_BORDER);
|
|||
|
WinHorz(1-no_border,TEXT_COLS-2+no_border,task);
|
|||
|
WinVert(2-no_border,TEXT_ROWS-2+no_border,task);
|
|||
|
WinToTop(task);
|
|||
|
POPFD
|
|||
|
}
|
|||
|
|
|||
|
public Bool WinBorder(Bool val=OFF,CTask *task=NULL)
|
|||
|
{//Turn off (or on) window border.
|
|||
|
Bool old_has_border;
|
|||
|
if (!task) task=Fs;
|
|||
|
if (!TaskValidate(task)) return FALSE;
|
|||
|
PUSHFD
|
|||
|
CLI //TODO Multiprocessor safe
|
|||
|
old_has_border=!Bt(&task->display_flags,DISPLAYf_NO_BORDER);
|
|||
|
if (val) {
|
|||
|
if (!old_has_border) {
|
|||
|
LBtr(&task->display_flags,DISPLAYf_NO_BORDER);
|
|||
|
task->win_left++; task->win_right--;
|
|||
|
task->win_top++; task->win_bottom--;
|
|||
|
TaskDerivedValsUpdate(task,FALSE);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (old_has_border) {
|
|||
|
LBts(&task->display_flags,DISPLAYf_NO_BORDER);
|
|||
|
task->win_left--; task->win_right++;
|
|||
|
task->win_top--; task->win_bottom++;
|
|||
|
TaskDerivedValsUpdate(task,FALSE);
|
|||
|
}
|
|||
|
}
|
|||
|
POPFD
|
|||
|
return old_has_border;
|
|||
|
}
|