hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Windows"3#help_file "::/Doc/Windows"4 5CMsStateGlbls old_ms={{-1000,-1000,0},{-1000,-1000,0},{-1000,-1000,0},6 {0,0,0},{1.0,1.0,1.0},0.0,GetTSC,0.350,0,0,7 FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE8};9 10public CWinMgrGlbls winmgr={0,0,0,WINMGR_FPS,tS,NULL,FALSE,FALSE,FALSE};11winmgr.t=CAlloc(sizeof(CWinMgrTimingGlbls));12winmgr.t->last_calc_idle_time=tS;13 14U0 ProgressBarsRegTf(U8 *path=NULL)15{16 F64 t,p1,p2,p3,p4;17 if (path) {18 t=tS;19 if (progress1_t0) p1=t-progress1_t0; else p1=0;20 if (progress2_t0) p2=t-progress2_t0; else p2=0;21 if (progress3_t0) p3=t-progress3_t0; else p3=0;22 if (progress4_t0) p4=t-progress4_t0; else p4=0;23 RegWrite(path,"progress1_tf=%0.3f;progress2_tf=%0.3f;\n"24 "progress3_tf=%0.3f;progress4_tf=%0.3f;\n",p1,p2,p3,p4);25 }26}27 28#define PROGRESS_BAR_HEIGHT 2029#define PROGRESS_BAR_WIDTH (3*GR_WIDTH/4)30U0 DrawProgressBars(CDC *dc)31{32 I64 i,j,k,n,m;33 U8 *st,*st2;34 for (i=0;i<PROGRESS_BARS_NUM;i++) {35 if (m=sys_progresses[i].max) {36 dc->color=BLACK;37 GrRect(dc,38 (GR_WIDTH-PROGRESS_BAR_WIDTH)/2,39 (GR_HEIGHT-(PROGRESS_BARS_NUM*2-1-i*4)*PROGRESS_BAR_HEIGHT)/2,40 PROGRESS_BAR_WIDTH,PROGRESS_BAR_HEIGHT);41 42 dc->color=LTGREEN;43 n=sys_progresses[i].val;44 if (n>m)45 n=m;46 GrRect(dc,47 (GR_WIDTH-PROGRESS_BAR_WIDTH)/2+2,48 (GR_HEIGHT-(PROGRESS_BARS_NUM*2-1-i*4)*PROGRESS_BAR_HEIGHT)/2+2,49 n*(PROGRESS_BAR_WIDTH-4)/m,50 PROGRESS_BAR_HEIGHT-4);51 52 if (m>1) {53 dc->color=BLACK;54 k=m-1;55 if (k>19) k=19;56 for (j=0;j<=k;j++)57 GrLine(dc,58 (GR_WIDTH-PROGRESS_BAR_WIDTH)/2+1+j*59 (PROGRESS_BAR_WIDTH-4)/ToF64(k+1),60 (GR_HEIGHT-(PROGRESS_BARS_NUM*2-1-i*4)*61 PROGRESS_BAR_HEIGHT)/2+4,62 (GR_WIDTH-PROGRESS_BAR_WIDTH)/2+1+j*63 (PROGRESS_BAR_WIDTH-4)/ToF64(k+1),64 (GR_HEIGHT-(PROGRESS_BARS_NUM*2-3-i*4)*65 PROGRESS_BAR_HEIGHT)/2-4);66 }67 68 dc->color=GREEN;69 if (*sys_progresses[i].desc)70 st=StrNew(sys_progresses[i].desc);71 else72 st=MStrPrint("%d/%d",n,m);73 if (sys_progresses[i].t0) {74 st2=MStrPrint("%s %fs",st,tS-sys_progresses[i].t0);75 Free(st);76 } else77 st2=st;78 if (sys_progresses[i].tf) {79 st=MStrPrint("%s/%fs",st2,sys_progresses[i].tf);80 Free(st2);81 } else82 st=st2;83 GrPrint(dc,(GR_WIDTH-FONT_WIDTH*StrLen(st))/2,(GR_HEIGHT-FONT_HEIGHT-84 (PROGRESS_BARS_NUM*2-2-i*4)*PROGRESS_BAR_HEIGHT)/2,"%s",st);85 Free(st);86 }87 }88}89 90U0 DrawWinGrid(CDC *dc)91{92 F64 d;93 dc->color=BLACK;94 dc->thick=1;95 for (d=ms_grid.x_offset;d<GR_WIDTH; d+=ms_grid.x)96 GrLine(dc,d,0,d,GR_HEIGHT-1);97 for (d=ms_grid.y_offset;d<GR_HEIGHT;d+=ms_grid.y)98 GrLine(dc,0,d,GR_WIDTH-1,d);99}100 101U0 WinGrid(Bool val)102{103 CGridGlbls last_grid;104 MemCpy(&last_grid,&ms_grid,sizeof(CGridGlbls));105 if (!val || PopUpForm(&ms_grid)) {106 if (!val)107 GridInit;108 ms_hard.prescale.x*=last_grid.x_speed/ms_grid.x_speed;109 ms_hard.prescale.y*=last_grid.y_speed/ms_grid.y_speed;110 ms_hard.prescale.z*=last_grid.z_speed/ms_grid.z_speed;111 } else112 MemCpy(&ms_grid,&last_grid,sizeof(CGridGlbls));113}114U0 CtrlAltG(I64 sc)115{116 if (sc&SCF_SHIFT)117 PopUp("WinGrid(OFF);");118 else119 PopUp("WinGrid(ON);");120}121CtrlAltCBSet('G',&CtrlAltG,"Cmd /Grid On",122 "Cmd /Grid Off");123 124CTask *ext_ASCII_task;125U0 ExtendedASCII()126{127 I64 i;128 CDoc *doc=DocNew;129 DocPrint(doc,"Sel Char and Press <ESC>\n$LTBLUE$");130 for (i=0;i<256;i++) {131 if (i>=CH_SHIFT_SPACE && i!=0x7F) {132 if (i==CH_SHIFT_SPACE)133 DocPrint(doc,"$MU-UL,\"\\x1F\",LE=%d$",i);134 else if (i=='$')135 DocPrint(doc,"$MU-UL,\"\\x24\",LE=%d$",i);136 else if (i=='\"'||i=='\\')137 DocPrint(doc,"$MU-UL,\"\\%c\",LE=%d$",i,i);138 else139 DocPrint(doc,"$MU-UL,\"%c\",LE=%d$",i,i);140 } else141 DocPrint(doc," ");142 if (i&15==15)143 DocPrint(doc,"\n");144 }145 i=PopUpMenu(doc);146 DocDel(doc);147 if (i>=0)148 PostMsg(ext_ASCII_task,MSG_KEY_DOWN_UP,i,Char2ScanCode(i));149}150 151U0 CtrlAltA(I64)152{153 if (ext_ASCII_task=sys_focus_task)154 Spawn(&ExtendedASCII);155}156CtrlAltCBSet('A',&CtrlAltA,"Cmd /Extended ASCII");157 158public U0 WinScrollNull(CTask *task,CD3I64 *s)159{//If panning a window has been done, restore to zero.160 s->x=task->scroll_x;161 s->y=task->scroll_y;162 s->z=task->scroll_z;163 task->scroll_x=0;164 task->scroll_y=0;165 task->scroll_z=0;166}167 168public U0 WinScrollRestore(CTask *task,CD3I64 *s)169{//Set window pan value to stored value.170 task->scroll_x=s->x;171 task->scroll_y=s->y;172 task->scroll_z=s->z;173}174 175U0 DrawMs(CDC *dc)176{177 I64 x,y;178 PUSHFD179 CLI180 x=ms.pos.x;181 y=ms.pos.y;182 POPFD183 if (ms.show && ms_hard.installed) {184 if (!Bt(&sys_run_level,RLf_VGA)) //if text mode185 gr.text_base[ms.pos_text.x+ms.pos_text.y*TEXT_COLS]^=0x7F00;186 else {187 if (gr.fp_draw_ms) {188 if (ms.lb)189 dc->color=ROP_XOR+LTPURPLE^TRANSPARENT;190 else if (ms.rb)191 dc->color=ROP_XOR+LTCYAN^TRANSPARENT;192 else193 dc->color=ROP_XOR+BLACK^TRANSPARENT;194 if (winmgr.grab_scroll && gr.fp_draw_grab_ms)195 (*gr.fp_draw_grab_ms)(dc,x,y,winmgr.grab_scroll_closed);196 else197 (*gr.fp_draw_ms)(dc,x,y);198 }199 }200 }201}202 203U0 WinFinalUpdate(CDC *dc)204{205 if (ms_grid.show)206 DrawWinGrid(dc);207 if (ms_grid.coord)208 GrPrint(dc,GR_WIDTH-FONT_WIDTH*10,FONT_HEIGHT*3,209 "(%03d,%03d)",ms.pos.x,ms.pos.y);210 DrawProgressBars(dc);211 if (winmgr.show_menu)212 DrawMenu(dc);213 else214 sys_cur_submenu_entry=NULL;215 DrawMs(dc);216}217 218gr.fp_final_scrn_update=&WinFinalUpdate;219 220U0 WinMsUpdate()221{222 I64 dd;223 Bool set=FALSE;224 if (ms_hard.installed) {225 ms.has_wheel=ms_hard.has_wheel;226 if (ms_hard.evt) {227 MsUpdate(ms_hard.pos.x,ms_hard.pos.y,ms_hard.pos.z,228 ms_hard.bttns[0],ms_hard.bttns[1]);229 ms_hard.evt=FALSE;230 set=TRUE;231 }232 }233 234 if (set) {235 if (ms_hard.installed) {236 ms.speed=ms_hard.speed;237 ms.timestamp=ms_hard.timestamp;238 }239 } else240 ms.speed*=0.95;241 if (gr.scrn_zoom!=1) {242 if (gr.continuous_scroll)243 GrScaleZoom(1.0);244 else {245 dd=(ms.pos.x-gr.sx)*gr.scrn_zoom;246 if (!(8<=dd<GR_WIDTH-8))247 GrScaleZoom(1.0);248 else {249 dd=(ms.pos.y-gr.sy)*gr.scrn_zoom;250 if (!(8<=dd<GR_HEIGHT-8))251 GrScaleZoom(1.0);252 }253 }254 }255}256 257public CTask *WinRefocus(CTask *task=NULL)258{//Reset the focus task if NULL.259 PUSHFD260 CLI261 if (!task) {262 task=sys_winmgr_task->last_task;263 while (TaskValidate(task) && task!=sys_winmgr_task) {264 if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS)) {265 sys_focus_task=task;266 break;267 }268 task=task->last_task;269 }270 }271 POPFD272 return sys_focus_task;273}274 275I64 WinOnTopWindows()276{277 CTask *task,*task1,*first_moved_fwd=NULL;278 I64 res=0;279 PUSHFD280 CLI //TODO Multiprocessor safe281 task=sys_winmgr_task->next_task;282 while (task!=sys_winmgr_task && task!=first_moved_fwd) {283 task1=task->next_task;284 if (!TaskValidate(task)) {285 POPFD286 return res;287 }288 if (Bt(&task->display_flags,DISPLAYf_WIN_ON_TOP) &&289 task!=sys_winmgr_task->last_task) {290 TaskQueRem(task);291 TaskQueIns(task,sys_winmgr_task);292 res++;293 if (!first_moved_fwd)294 first_moved_fwd=task;295 }296 task=task1;297 }298 POPFD299 return res;300}301 302public I64 WinToTop(CTask *task=NULL,Bool update_z_buf=TRUE)303{//Put task's win on top of window stack.304 CTask *task1;305 I64 res=0;306 if (!task) task=Fs;307 if (!TaskValidate(task) || task->gs->num)308 return 0;309 TaskDerivedValsUpdate(task,FALSE);310 if (!sys_winmgr_task || task==sys_winmgr_task)311 return 0;312 PUSHFD313 CLI314 if (!TaskValidate(task)) {315 POPFD316 return 0;317 }318 if (task!=sys_winmgr_task->last_task) {319 TaskQueRem(task);320 TaskQueIns(task,sys_winmgr_task);321 res++;322 }323 if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS))324 sys_focus_task=task;325 if (res && !Bt(&task->display_flags,DISPLAYf_CHILDREN_NOT_ON_TOP)) {326 task1=task->next_child_task;327 while (task1!=&task->next_child_task) {328 if (!TaskValidate(task1))329 break;330 res+=WinToTop(task1,FALSE);331 task1=task1->next_sibling_task;332 }333 if (task->popup_task &&334 task->popup_task->parent_task==task)335 res+=WinToTop(task->popup_task,FALSE);336 }337 POPFD338 res+=WinOnTopWindows;339 if (res && update_z_buf)340 WinZBufUpdate;341 return res;342}343ext[EXT_WIN_TO_TOP]=&WinToTop;344 345public CTask *WinFocus(CTask *task=NULL)346{//Set task as focus task.347 if (!task) task=Fs;348 PUSHFD349 CLI350 if (!TaskValidate(task)||Bt(&task->win_inhibit,WIf_SELF_FOCUS))351 task=WinRefocus(sys_focus_task);352 WinToTop(sys_focus_task=task);353 POPFD354 return sys_focus_task;355}356ext[EXT_WIN_FOCUS]=&WinFocus;357 358public Bool WinHorz(I64 left,I64 right,CTask *task=NULL)359{//Set task's win left and right columns.360 I64 d=right-left;361 if (!task) task=Fs;362 if (!TaskValidate(task)) return FALSE;363 if (d<0) d=0;364 if (left>=TEXT_COLS) {365 left=TEXT_COLS-1;366 right=left+d;367 }368 if (right<0) {369 right=0;370 left=right-d;371 }372 if (left>right) {373 if (left>0)374 right=left;375 else376 left=right;377 }378 PUSHFD379 CLI //TODO Multiprocessor safe380 if (task->win_left!=left || task->win_right!=right) {381 task->win_left=left;382 task->win_right=right;383 TaskDerivedValsUpdate(task);384 POPFD385 return TRUE;386 } else {387 POPFD388 return FALSE;389 }390}391 392public Bool WinVert(I64 top,I64 bottom,CTask *task=NULL)393{//Set task's win top and bottom rows.394 I64 d=bottom-top;395 if (!task) task=Fs;396 if (!TaskValidate(task)) return FALSE;397 if (d<0) d=0;398 if (top>=TEXT_ROWS) {399 top=TEXT_ROWS-1;400 bottom=top+d;401 }402 if (bottom<=0) {403 bottom=1;404 top=bottom-d;405 }406 if (top>bottom) {407 if (top>=0)408 bottom=top;409 else410 top=bottom;411 }412 PUSHFD413 CLI //TODO Multiprocessor safe414 if (task->win_top!=top || task->win_bottom!=bottom) {415 task->win_top=top;416 task->win_bottom=bottom;417 TaskDerivedValsUpdate(task);418 POPFD419 return TRUE;420 } else {421 POPFD422 return FALSE;423 }424}425 426public U0 WinTileHorz()427{//Tile windows horizontally top-to-bottom.428 CTask *task,*last_task=Fs;429 I64 cnt,c,i,vert_size,no_border;430 431 PUSHFD432 CLI //TODO Multiprocessor safe433 task=sys_winmgr_task;434 cnt=0;435 do {436 if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS))437 cnt++;438 task=task->last_task;439 } while (task!=sys_winmgr_task);440 441 task=sys_winmgr_task;442 i=0;443 do {444 if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS)) {445 no_border=Bt(&task->display_flags,DISPLAYf_NO_BORDER);446 c=cnt- i&~3;447 if (!c)448 c=1;449 else if (c>4)450 c=4;451 vert_size=(TEXT_ROWS-1)/c;452 453 WinHorz(1-no_border,TEXT_COLS-2+no_border,task);454 WinVert((i&3)*vert_size+2-no_border,(i&3+1)*vert_size+no_border,task);455 last_task=task;456 if (i&3==3)457 WinVert(task->win_top,TEXT_ROWS-2,task);458 i++;459 }460 task=task->last_task;461 } while (task!=sys_winmgr_task);462 WinVert(last_task->win_top,TEXT_ROWS-2,last_task);463 POPFD464}465 466public U0 WinTileVert()467{//Tile windows vertically side-by-side.468 CTask *task,*last_task=Fs;469 I64 cnt,c,i,horz_size,no_border;470 PUSHFD471 CLI //TODO Multiprocessor safe472 task=sys_winmgr_task;473 cnt=0;474 do {475 if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS))476 cnt++;477 task=task->last_task;478 } while (task!=sys_winmgr_task);479 480 task=sys_winmgr_task;481 i=0;482 do {483 if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS)) {484 no_border=Bt(&task->display_flags,DISPLAYf_NO_BORDER);485 c=cnt- i&~3;486 if (!c)487 c=1;488 else if (c>4)489 c=4;490 horz_size=TEXT_COLS/c;491 WinHorz((i&3)*horz_size+1-no_border,(i&3+1)*horz_size-1+no_border,task);492 WinVert(2-no_border,TEXT_ROWS-2+no_border,task);493 last_task=task;494 if (i&3==3)495 WinHorz(task->win_left,TEXT_COLS-2,task);496 i++;497 }498 task=task->last_task;499 } while (task!=sys_winmgr_task);500 WinHorz(last_task->win_left,TEXT_COLS-2,last_task);501 POPFD502}503 504public U0 WinMax(CTask *task=NULL)505{//Maximize task's window506 I64 no_border;507 if (!task) task=Fs;508 if (!TaskValidate(task)) return;509 PUSHFD510 CLI //TODO Multiprocessor safe511 no_border=Bt(&task->display_flags,DISPLAYf_NO_BORDER);512 WinHorz(1-no_border,TEXT_COLS-2+no_border,task);513 WinVert(2-no_border,TEXT_ROWS-2+no_border,task);514 WinToTop(task);515 POPFD516}517 518public Bool WinBorder(Bool val=OFF,CTask *task=NULL)519{//Turn off (or on) window border.520 Bool old_has_border;521 if (!task) task=Fs;522 if (!TaskValidate(task)) return FALSE;523 PUSHFD524 CLI //TODO Multiprocessor safe525 old_has_border=!Bt(&task->display_flags,DISPLAYf_NO_BORDER);526 if (val) {527 if (!old_has_border) {528 LBtr(&task->display_flags,DISPLAYf_NO_BORDER);529 task->win_left++; task->win_right--;530 task->win_top++; task->win_bottom--;531 TaskDerivedValsUpdate(task,FALSE);532 }533 } else {534 if (old_has_border) {535 LBts(&task->display_flags,DISPLAYf_NO_BORDER);536 task->win_left--; task->win_right++;537 task->win_top--; task->win_bottom++;538 TaskDerivedValsUpdate(task,FALSE);539 }540 }541 POPFD542 return old_has_border;543}544 