Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
Win.txt544 linesDownload Raw Back to Adam
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