#help_index "Windows" public void RefocusWin() { TssStruct *tss_focus=sys_cur_focus_task; if (!tss_focus) { tss_focus=sys_update_screen_tss->last_tss; while (tss_focus!=sys_update_screen_tss) { if (Bt(&tss_focus->task_flags,TSSf_LOCAL_USER)) { sys_cur_focus_task=tss_focus; break; } tss_focus=tss_focus->last_tss; } } } I8 old_ipx=-1000,old_ipy=-1000,old_ipz=0; BoolU4 old_ip_lb=FALSE,old_ip_rb=FALSE; U8 left_ip_double_time=0; BoolU4 left_double=FALSE,left_down_sent=FALSE; U8 right_ip_double_time=0; BoolU4 right_double=FALSE,right_down_sent=FALSE; public U8 double_click_mS=350; public I8 win_min_refresh=15, win_max_refresh=50, win_updates=0; public double win_refresh=win_min_refresh; BoolU4 win_first_after_startup_complete=FALSE; void PlotInputPointer(GrBitMap *base) { I8 x,y; U8 old_flags=GetFlags; Cli; x=ipx; y=ipy; SetFlags(old_flags); if (ip_on && ip_pointer_type!=IP_NULL) { base->color=ROP_XOR+WHITE; GrLine4(base,x,y,x+10,y+10); GrLine4(base,x+2,y+1,x+11,y+10); GrLine4(base,x+1,y+2,x+10,y+11); GrLine4(base,x,y,x+5,y); GrLine4(base,x,y,x,y+5); } } void UpdateOdes(TssStruct *tss) { I8 i,timeout_time=GetTimeStamp+time_stamp_freq/win_min_refresh; double t_desired=GetTimeStamp*1.0/time_stamp_freq, t_initial,interpolation; Ode *o=tss->next_ode; while (o!=&tss->next_ode) { MemCpy(o->internal_state,o->state,o->n*sizeof(double)); o->tolerance=o->tolerance_start; o->derivative(o,o->t+o->base_t,o->internal_state,o->DstateDt); for (i=0;in;i++) o->state_scale[i]=Abs(o->internal_state[i])+Abs(o->DstateDt[i]*o->h)+1e-4; t_initial=o->t+o->base_t; MemCpy(o->initial_state,o->internal_state,o->n*sizeof(double)); do { while (o->t+o->base_ttimeout_time) o->base_t=t_desired-o->t; } if (interpolation=(o->t+o->base_t-t_initial)) interpolation=(t_desired-t_initial)/interpolation; else interpolation=1.0; if (interpolation>.1 || o->tolerance<1e-64) break; else { MemCpy(o->internal_state,o->initial_state,sizeof(double)*o->n); o->t=t_initial-o->base_t; o->tolerance/=10; } } while (TRUE); for (i=0;in;i++) o->internal_state[i]=(o->internal_state[i]-o->initial_state[i])*interpolation+o->initial_state[i]; o->t=t_desired-o->base_t; MemCpy(o->state,o->internal_state,o->n*sizeof(double)); o=o->next; } } void WinUpdateIP() { I8 dd; U8 temp,temp2; BoolU8 set=FALSE; double speed=0; if (ip_pointer_type==IP_MOUSE) { ip_has_wheel=mouse_has_wheel; if (mouse_evt) { ipx=mxx/ipx_snap*ipx_snap+ipx_snap_offset; ipy=myy/ipy_snap*ipy_snap+ipy_snap_offset; ip_throttle+=(mzz-ipz)*0x10000000; if (ip_throttle>MAX_I4) ip_throttle=MAX_I4; if (ip_throttlejoymax[3]-joymin[3]) ip_throttle=0x100000000*(joyv[2]-joyrest[2])/(joymax[2]-joymin[2]+1); else ip_throttle=0x100000000*(joyv[3]-joyrest[3])/(joymax[3]-joymin[3]+1); if (ip_throttle>MAX_I4) ip_throttle=MAX_I4; if (ip_throttle0) { temp2=GetTimeStamp; temp=temp2-last_ip_move_time; last_ip_move_time=temp2; if (!temp) temp=1; speed=Sqrt(dd)/(temp/(1.0*time_stamp_freq)); } iptx=ipx/FONT_WIDTH; ipty=ipy/FONT_HEIGHT; } if (ip_speed<10.0) ip_speed=speed; else ip_speed=0.75*ip_speed+0.25*speed; //digital filter for mouse speed } U8 last_idle_point_hits[MP_MAX_PROCESSORS]={0,0,0,0}; U8 last_swap_cnter[MP_MAX_PROCESSORS]={0,0,0,0}; I8 last_refresh_time=GetTimeStamp, last_refresh_start_time=0, last_refresh_end_time=0, refresh_time,refresh_delta_time; U8 win_calc_refresh_cnt=0, win_calc_refresh_skips=0; U8 WinCalcRefreshTimeout() { double d=Gs->idle_factor,d1; I8 i,k; U8 old_flags=GetFlags; U8 idle_point_hits[MP_MAX_PROCESSORS]; CPUStruct *c; win_calc_refresh_skips++; if (GetTimeStamp-last_refresh_time>time_stamp_freq>>2) { refresh_time=GetTimeStamp; Cli; for (i=0;iidle_point_hits; } SetFlags(old_flags); refresh_delta_time=refresh_time-last_refresh_time; for (i=0;i0) { k=idle_point_hits[i]-last_idle_point_hits[i]; if (k>=0) c->idle_factor= k*time_stamp_freq*1.0 /(JIFFY_FREQ*refresh_delta_time); } last_idle_point_hits[i]=idle_point_hits[i]; if (c->idle_factor<.01) c->idle_factor=0.01; if (c->idle_factor>.99) c->idle_factor=0.99; } last_refresh_time=refresh_time; if (win_first_after_startup_complete) { d1=(last_refresh_end_time-last_refresh_start_time)*1.0/ (refresh_delta_time/win_calc_refresh_skips); if (d1<0.2) win_refresh*=1.25; else if (d<=0.0) win_refresh=win_min_refresh; else if (d<0.02) { d=win_min_refresh/win_refresh; win_refresh=d*win_min_refresh+0.5*(1.0-d)*win_refresh; } else if (d<0.99) { if (d=(1.0-d)`0.25) win_refresh*=(0.8`0.25)/d; } else win_refresh=win_max_refresh; win_calc_refresh_cnt++; win_calc_refresh_skips=0; } else { win_refresh=win_max_refresh; win_first_after_startup_complete=TRUE; } } if (win_refreshwin_max_refresh) win_refresh=win_max_refresh; return GetTimeStamp+time_stamp_freq/win_refresh; } U8 WinQueueKbdMouseMsgs() { U8 jiffies=Jiffies,cmd=0; I8 p1,p2; TssStruct *tss_focus=sys_cur_focus_task; if (tss_focus) { while (U8FifoRemove(scan_code_fifo,&p2)) { p1=ScanCodeToASCII(p2); if (p2 & SCF_KEY_UP) { QueueMsg(tss_focus,0, MSG_KEY_UP,p1,p2,0); cmd=MSG_KEY_UP; } else { QueueMsg(tss_focus,0, MSG_KEY_DOWN,p1,p2,0); cmd=MSG_KEY_DOWN; } } p1=ipx-tss_focus->win_left*FONT_WIDTH; p2=ipy-tss_focus->win_top*FONT_HEIGHT; if (old_ipx!=ipx || old_ipy!=ipy) { QueueMsg(tss_focus,0, MSG_IP_MOVE,p1,p2,0); cmd=MSG_IP_MOVE; } //TODO queue msg for ipz? if (left_ip_double_time) { if (jiffies>left_ip_double_time) { if (left_double) { if (!left_down_sent) { QueueMsg(tss_focus,0, MSG_IP_L_D_DOWN,p1,p2,0); left_down_sent=TRUE; cmd=MSG_IP_L_D_DOWN; } if (!ip_lb) { QueueMsg(tss_focus,0, MSG_IP_L_D_UP,p1,p2,0); left_ip_double_time=0; cmd=MSG_IP_L_D_UP; } } else { if (!left_down_sent) { QueueMsg(tss_focus,0, MSG_IP_L_DOWN,p1,p2,0); left_down_sent=TRUE; cmd=MSG_IP_L_DOWN; } if (!ip_lb) { QueueMsg(tss_focus,0, MSG_IP_L_UP,p1,p2,0); left_ip_double_time=0; cmd=MSG_IP_L_UP; } } } else { if (ip_lb && !ip_lb_last) { left_ip_double_time=jiffies; left_double=TRUE; } } } else { if (Bt(&tss_focus->crt_flags,CRTf_NO_DOUBLE_CLICK)) { if (ip_lb && !ip_lb_last) { QueueMsg(tss_focus,0, MSG_IP_L_DOWN,p1,p2,0); cmd=MSG_IP_L_DOWN; } else if (!ip_lb && ip_lb_last) { QueueMsg(tss_focus,0, MSG_IP_L_UP,p1,p2,0); cmd=MSG_IP_L_UP; } } else { if (ip_lb && !ip_lb_last) { left_double=FALSE; left_down_sent=FALSE; left_ip_double_time=jiffies+ double_click_mS*JIFFY_FREQ/1000; } } } if (right_ip_double_time) { if (jiffies>right_ip_double_time) { if (right_double) { if (!right_down_sent) { QueueMsg(tss_focus,0, MSG_IP_R_D_DOWN,p1,p2,0); right_down_sent=TRUE; cmd=MSG_IP_R_D_DOWN; } if (!ip_rb) { QueueMsg(tss_focus,0, MSG_IP_R_D_UP,p1,p2,0); right_ip_double_time=0; cmd=MSG_IP_R_D_UP; } } else { if (!right_down_sent) { QueueMsg(tss_focus,0, MSG_IP_R_DOWN,p1,p2,0); right_down_sent=TRUE; cmd=MSG_IP_R_DOWN; } if (!ip_rb) { QueueMsg(tss_focus,0, MSG_IP_R_UP,p1,p2,0); right_ip_double_time=0; cmd=MSG_IP_R_UP; } } } else { if (ip_rb && !ip_rb_last) { right_ip_double_time=jiffies; right_double=TRUE; } } } else { if (Bt(&tss_focus->crt_flags,CRTf_NO_DOUBLE_CLICK)) { if (ip_rb && !ip_rb_last) { QueueMsg(tss_focus,0, MSG_IP_R_DOWN,p1,p2,0); cmd=MSG_IP_R_DOWN; } else if (!ip_rb && ip_rb_last) { QueueMsg(tss_focus,0, MSG_IP_R_UP,p1,p2,0); cmd=MSG_IP_R_UP; } } else { if (ip_rb && !ip_rb_last) { right_double=FALSE; right_down_sent=FALSE; right_ip_double_time=jiffies+ double_click_mS*JIFFY_FREQ/1000; } } } ip_lb_last=ip_lb; ip_rb_last=ip_rb; old_ip_lb=ip_lb; old_ip_rb=ip_rb; old_ipx=ipx; old_ipy=ipy; old_ipz=ipz; } return cmd; } U8 WinPointAndSleep() { U8 timeout_val,timeout_val2,cmd=0; if (sys_cur_focus_task) cmd=WinQueueKbdMouseMsgs; else { RefocusWin; if (!sys_cur_focus_task) U8FifoFlush(scan_code_fifo); } if (sys_cur_focus_task) Btr(&sys_cur_focus_task->task_flags,TSSf_HAS_SONG); timeout_val=WinCalcRefreshTimeout; WinUpdateIP; last_refresh_start_time=TssTotalTime; GrUpdateScreen(gr_merge_base,grbase2,textbase); last_refresh_end_time=TssTotalTime; if (sys_cur_focus_task) { if (!Bt(&sys_cur_focus_task->task_flags,TSSf_HAS_SONG)) { AFree(cur_song); cur_song=NULL; } } if (cur_song) { if (!cur_song_tss) cur_song_tss=Spawn(&CurSongTsk,"Current Song"); } else { if (cur_song_tss) { Kill(cur_song_tss); cur_song_tss=NULL; } } win_updates++; if (!mouse_install_attempts) { Fs->task_flags|=1<time_slice_starttask_flags&=~(1<timeout_val) timeout_val2=timeout_val; Fs->task_flags|=1<time_slice_starttask_flags&=~(1<time_slice_starttask_flags,TSSf_IDLE); if (full_update) { if (Fs->cur_ltf) old_full_update=Bts(&Fs->cur_ltf->flags,LTFf_DO_FULL_UPDATE); } //We might catch it in the middle of an update //If do full update, set cur position update_cnt=win_updates; gr_update_cnt=gr_win_updates; while (update_cnt==win_updates || gr_update_cnt==gr_win_updates) SwapInNext; if (full_update) { //Do update with cur position update_cnt=win_updates; gr_update_cnt=gr_win_updates; while (update_cnt==win_updates || gr_update_cnt==gr_win_updates) SwapInNext; if (Fs->cur_ltf) AssignBit(&Fs->cur_ltf->flags,LTFf_DO_FULL_UPDATE,old_full_update); } AssignBit(&Fs->task_flags,TSSf_IDLE,old_idle); } #help_index "Windows" public BoolU8 WinToTop(TssStruct *tss=NULL) { BoolU4 result=FALSE,old_flags=GetFlags; TssStruct *next,*last; if (!tss) tss=Fs; //REMOVE Cli; //TODO Multiprocessor safe if (!ValidateTss(tss)) { SetFlags(old_flags); return result; } if (sys_update_screen_tss->last_tss!=tss) { next=tss->next_tss; last=tss->last_tss; next->last_tss=last; last->next_tss=next; AddTaskToQueue(tss,sys_update_screen_tss); result=TRUE; } if (Bt(&tss->task_flags,TSSf_LOCAL_USER)) sys_cur_focus_task=tss; SetFlags(old_flags); return result; } ext[EXT_WIN_TO_TOP]=&WinToTop; void SetWinHorz(TssStruct *tss,I8 i,I8 j) { I8 d=j-i; if (d<0) d=0; if (i>=TEXT_COLS) { i=TEXT_COLS-1; j=i+d; } if (j<0) { j=0; i=j-d; } if (i>j) { if (i>0) j=i; else i=j; } if (tss->win_left!=i || tss->win_right!=j) { Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED); Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED2); } tss->win_left=i; tss->win_right=j; } void SetWinVert(TssStruct *tss,I8 i,I8 j) { I8 d=j-i; if (d<0) d=0; if (i>=TEXT_ROWS) { i=TEXT_ROWS-1; j=i+d; } if (j<=0) { j=1; i=j-d; } if (i>j) { if (i>=0) j=i; else i=j; } if (tss->win_top!=i || tss->win_bottom!=j) { Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED); Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED2); } tss->win_top=i; tss->win_bottom=j; } BoolU8 SetCursorPosition(TssStruct *tss,I8 iptx,I8 ipty,BoolU4 set_cursor=TRUE) { Ltf *l; if (tss->win_top<=ipty && tss->win_bottom>=ipty && tss->win_left<=iptx && tss->win_right>=iptx) { if (l=tss->aux_ltf) { if (set_cursor) { //set top line l->recalc_start=l; LtfUpdateWinJoin(l,FALSE,TRUE,TRUE,FALSE,OFF); l->x=iptx-tss->win_left+l->line_start_col; l->y=ipty-tss->win_top+l->cur_top_line_num; LtfUpdateWinJoin(l,FALSE,FALSE,FALSE,TRUE,OFF); if (!l->best_d) goto done; } } if (l=tss->cur_ltf) { if (set_cursor) { //set top line l->recalc_start=l; LtfUpdateWinJoin(l,FALSE,TRUE,TRUE,FALSE,OFF); l->x=iptx-tss->win_left+l->line_start_col; l->y=ipty-tss->win_top+l->cur_top_line_num; LtfUpdateWinJoin(l,FALSE,FALSE,FALSE,TRUE,OFF); } } done: WinToTop(tss); return TRUE; } return FALSE; } void UpdateDerivedTssValues(TssStruct *tss) { //Inside the Border tss->win_pixel_left =FONT_WIDTH*tss->win_left; tss->win_pixel_right =FONT_WIDTH*(tss->win_right+1)-1; tss->win_pixel_top =FONT_HEIGHT*tss->win_top; tss->win_pixel_bottom=FONT_HEIGHT*(tss->win_bottom+1)-1; //Outside the border if (Bt(&tss->crt_flags,CRTf_NO_BORDER)) { tss->win_border_pixel_left =tss->win_pixel_left; tss->win_border_pixel_right =tss->win_pixel_right; tss->win_border_pixel_top =tss->win_pixel_top; tss->win_border_pixel_bottom=tss->win_pixel_bottom; } else { tss->win_border_pixel_left =tss->win_pixel_left-FONT_WIDTH; tss->win_border_pixel_right =tss->win_pixel_right+FONT_WIDTH; tss->win_border_pixel_top =tss->win_pixel_top-FONT_HEIGHT; tss->win_border_pixel_bottom=tss->win_pixel_bottom+FONT_HEIGHT; } } public void WinTileHorz() { TssStruct *tss,*last_tss=Fs; I8 cnt,c,i,vert_size; BoolU4 old_preempt=Preempt(OFF); tss=sys_update_screen_tss; cnt=0; do { if (Bt(&tss->task_flags,TSSf_LOCAL_USER)) cnt++; tss=tss->last_tss; } while (tss!=sys_update_screen_tss); tss=sys_update_screen_tss; i=0; do { if (Bt(&tss->task_flags,TSSf_LOCAL_USER)) { c=cnt-(i&~3); if (!c) c=1; else if (c>4) c=4; vert_size=(TEXT_ROWS-1)/c; tss->win_right=TEXT_COLS-2; tss->win_left=1; tss->win_top=(i&3)*vert_size+2; tss->win_bottom=((i&3)+1)*vert_size; last_tss=tss; if ((i&3)==3) tss->win_bottom=TEXT_ROWS-2; i++; UpdateDerivedTssValues(tss); } tss=tss->last_tss; } while (tss!=sys_update_screen_tss); last_tss->win_bottom=TEXT_ROWS-2; LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); Preempt(old_preempt); } public void WinTileVert() { TssStruct *tss,*last_tss=Fs; I8 cnt,c,i,horz_size; BoolU4 old_preempt=Preempt(OFF); tss=sys_update_screen_tss; cnt=0; do { if (Bt(&tss->task_flags,TSSf_LOCAL_USER)) cnt++; tss=tss->last_tss; } while (tss!=sys_update_screen_tss); tss=sys_update_screen_tss; i=0; do { if (Bt(&tss->task_flags,TSSf_LOCAL_USER)) { c=cnt-(i&~3); if (!c) c=1; else if (c>4) c=4; horz_size=TEXT_COLS/c; tss->win_top=2; tss->win_bottom=TEXT_ROWS-2; tss->win_left=(i&3)*horz_size+1; tss->win_right=((i&3)+1)*horz_size-1; last_tss=tss; if ((i&3)==3) tss->win_right=TEXT_COLS-2; i++; UpdateDerivedTssValues(tss); } tss=tss->last_tss; } while (tss!=sys_update_screen_tss); last_tss->win_right=TEXT_COLS-2; LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); Preempt(old_preempt); } public void WinMax(TssStruct *tss=NULL) { BoolU4 old_preempt=Preempt(OFF); if (!tss) tss=Fs; if (Bt(&tss->crt_flags,CRTf_NO_BORDER)) { tss->win_right=TEXT_COLS-1; tss->win_left=0; tss->win_top=1; tss->win_bottom=TEXT_ROWS-1; } else { tss->win_right=TEXT_COLS-2; tss->win_left=1; tss->win_top=2; tss->win_bottom=TEXT_ROWS-2; } UpdateDerivedTssValues(tss); WinToTop(tss); Preempt(old_preempt); } public BoolU8 WinBorder(BoolU4 val,TssStruct *tss=NULL) { BoolU4 old_has_border, old_preempt=Preempt(OFF); if (!tss) tss=Fs; old_has_border=!Bt(&tss->crt_flags,CRTf_NO_BORDER); if (val) { if (!old_has_border) { Btr(&tss->crt_flags,CRTf_NO_BORDER); tss->win_right--; tss->win_left++; tss->win_top++; tss->win_bottom--; UpdateDerivedTssValues(tss); } } else { if (old_has_border) { Bts(&tss->crt_flags,CRTf_NO_BORDER); tss->win_right++; tss->win_left--; tss->win_top--; tss->win_bottom++; UpdateDerivedTssValues(tss); } } Preempt(old_preempt); return old_has_border; } void WinManagerTsk() { TssStruct *tss=Fs; I8 x,y,cmd; Ltf *l; LtfEntry *ll; I8 my_ipz=0; BoolU4 has_border; U8 old_flags=GetFlags; InitCrt; Fs->win_left=0; Fs->win_right=TEXT_COLS-1; Fs->win_top=0; Fs->win_bottom=TEXT_ROWS-1; UpdateDerivedTssValues(Fs); Bts(&Fs->crt_flags,CRTf_NO_BORDER); Bts(&Fs->crt_flags,CRTf_SHOW); LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); Raw(OFF); GrSetupTable(grbase2); ext[EXT_SCAN_KEY]=&WinScanKey; while (TRUE) { try { wmt_start: Fs->update_win=ext[EXT_WALLPAPER]; do { Cli; if (ValidateTss(tss)) tss=tss->last_tss; else tss=Fs->last_tss; SetFlags(old_flags); if (tss==Fs) { WinPointAndSleep; FinishOffDyingTsses; } } while (!ValidateTss(tss) || tss==Fs || !Bt(&tss->crt_flags,CRTf_SHOW)); UpdateDerivedTssValues(tss); if (ip_inhibit_win_operations) goto wmt_start; if (Bt(&tss->crt_flags,CRTf_NO_BORDER)) has_border=FALSE; else has_border=TRUE; if (!old_ip_lb && ip_lb) { if (SetCursorPosition(tss,iptx,ipty)) { if (l=tss->aux_ltf) { if (!l->best_d) { ll=l->cur_entry; if (ll!=l) { if (ll->flags & LTFLF_HAS_BORDER) ll->flags|=LTFLF_SOLID_BORDER; } old_ip_lb=TRUE; goto wmt_start; } } if (l=tss->cur_ltf) { ll=l->cur_entry; if (ll!=l) { if (ll->flags & LTFLF_HAS_BORDER) ll->flags|=LTFLF_SOLID_BORDER; } } old_ip_lb=TRUE; goto wmt_start; } } if (old_ip_lb && !ip_lb) { if (ipty==tss->win_top-1) { if (iptx>=tss->win_left && iptxwin_left+4) { if (Bt(&tss->crt_flags,CRTf_HAS_MENU)) { QueueMsg(tss,0,MSG_KEY_DOWN,0,SC_GUI,0); old_ip_lb=FALSE; goto wmt_start; } } else if (iptx>=tss->win_right-2 && iptx<=tss->win_right) { if (Bt(&tss->crt_flags,CRTf_HAS_CLOSE_WIN)) { if (tss->cur_ltf) QueueMsg(tss,0,MSG_KEY_DOWN,CH_CTRLQ,0,0); else Kill(tss,FALSE); old_ip_lb=FALSE; goto wmt_start; } } } else if (SetCursorPosition(tss,iptx,ipty,FALSE)) { if (l=tss->aux_ltf) { if (!l->best_d) { do cmd=WinPointAndSleep; while (ValidateTss(tss) && (ip_lb || left_ip_double_time)); if (ValidateTss(tss)) { if (cmd==MSG_IP_L_UP) { l=tss->aux_ltf; ll=l->cur_entry; if (ll!=l) { if (ll->flags & LTFLF_HAS_BORDER) ll->flags&=~LTFLF_SOLID_BORDER; if (ll->btype==LTFT_CHECK_BOX || ll->btype==LTFT_HIDE_START || (ll->flags & (LTFLF_TREE | LTFLF_LINK | LTFLF_LEFT_CB | LTFLF_LEFT_MACRO | LTFLF_LEFT_EXP))) QueueMsg(tss,0,MSG_KEY_DOWN,CH_SPACE,0,0); } } else if (cmd==MSG_IP_L_D_UP) QueueMsg(tss,0,MSG_KEY_DOWN,CH_ESC,0,0); } old_ip_lb=FALSE; goto wmt_start; } } if (l=tss->cur_ltf) { do cmd=WinPointAndSleep; while (ValidateTss(tss) && (ip_lb || left_ip_double_time)); if (ValidateTss(tss)) { if (cmd==MSG_IP_L_UP) { l=tss->cur_ltf; ll=l->cur_entry; if (ll!=l) { if (ll->flags & LTFLF_HAS_BORDER) ll->flags&=~LTFLF_SOLID_BORDER; if (ll->btype==LTFT_CHECK_BOX || ll->btype==LTFT_HIDE_START || (ll->flags & (LTFLF_TREE | LTFLF_LINK | LTFLF_LEFT_CB | LTFLF_LEFT_MACRO | LTFLF_LEFT_EXP))) QueueMsg(tss,0,MSG_KEY_DOWN,CH_SPACE,0,0); } } else if (cmd==MSG_IP_L_D_UP) QueueMsg(tss,0,MSG_KEY_DOWN,CH_ESC,0,0); } } old_ip_lb=FALSE; goto wmt_start; } } if (ip_has_wheel) { if (my_ipz!=ipz && tss==sys_cur_focus_task) { tss->scroll_y+=ipz-my_ipz; my_ipz=ipz; if (tss->scroll_y<0) tss->scroll_y=0; if (tss->scroll_y>tss->win_bottom+1-tss->win_top) tss->scroll_y=tss->win_bottom+1-tss->win_top; Bts(&tss->crt_flags,CRTf_SCROLL_Y); if (tss->cur_ltf) { while (ValidateTss(tss) && Bt(&tss->crt_flags,CRTf_SCROLL_Y)) WinPointAndSleep; } if (ValidateTss(tss)) SetCursorPosition(tss, ((tss->win_left+tss->win_right)>>1), (tss->win_top+tss->win_bottom)>>1); goto wmt_start; } } if (old_ip_rb && !ip_rb) { if (SetCursorPosition(tss,iptx,ipty,FALSE)) { if (l=tss->aux_ltf) { if (!l->best_d) { do cmd=WinPointAndSleep; while (ValidateTss(tss) && (ip_rb || right_ip_double_time)); if (ValidateTss(tss)) { if (cmd==MSG_IP_R_UP) { if (SetCursorPosition(tss,iptx,ipty)) { if (l=tss->aux_ltf) { ll=l->cur_entry; if (ll!=l) { if (ll->btype==LTFT_LINK || (ll->flags & (LTFLF_RIGHT_CB | LTFLF_RIGHT_MACRO | LTFLF_RIGHT_EXP))) QueueMsg(tss,0,MSG_KEY_DOWN,CH_CR,0,0); } } } } else if (cmd==MSG_IP_R_D_UP) QueueMsg(tss,0,MSG_KEY_DOWN,CH_CTRLQ,0,0); } old_ip_rb=FALSE; goto wmt_start; } } if (l=tss->cur_ltf) { do cmd=WinPointAndSleep; while (ValidateTss(tss) && (ip_rb || right_ip_double_time)); if (ValidateTss(tss)) { if (cmd==MSG_IP_R_UP) { if (SetCursorPosition(tss,iptx,ipty)) { if (l=tss->cur_ltf) { ll=l->cur_entry; if (ll!=l) { if (ll->btype==LTFT_LINK || (ll->flags & (LTFLF_RIGHT_CB | LTFLF_RIGHT_MACRO | LTFLF_RIGHT_EXP))) QueueMsg(tss,0,MSG_KEY_DOWN,CH_CR,0,0); } } } } else if (cmd==MSG_IP_R_D_UP) QueueMsg(tss,0,MSG_KEY_DOWN,CH_CTRLQ,0,0); } } old_ip_rb=FALSE; goto wmt_start; } } if (ip_lb && !old_ip_lb) { if (has_border && tss->win_top==ipty+1 && iptx>=tss->win_left-1 && iptx<=tss->win_right+1) { if (iptx>=tss->win_left && iptxwin_left+4 && Bt(&tss->crt_flags,CRTf_HAS_MENU)) { old_ip_lb=TRUE; goto wmt_start; } if (iptx>=tss->win_right-2 && iptx<=tss->win_right && Bt(&tss->crt_flags,CRTf_HAS_CLOSE_WIN)) { old_ip_lb=TRUE; goto wmt_start; } x=iptx-tss->win_left; if (ip_lb) { WinToTop(tss); while (ip_lb && ValidateTss(tss)) { SetWinHorz(tss,iptx-x,tss->win_right+(iptx-x)-tss->win_left); SetWinVert(tss,ipty+1,tss->win_bottom+ipty+1-tss->win_top); LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); UpdateDerivedTssValues(tss); WinPointAndSleep; } } old_ip_lb=FALSE; goto wmt_start; } if (has_border && tss->win_left==iptx+1 && (ipty>=tss->win_top-1 && ipty<=tss->win_bottom+1)) { y=ipty-tss->win_top; if (ip_lb) { WinToTop(tss); while (ip_lb && ValidateTss(tss)) { SetWinHorz(tss,iptx+1,tss->win_right+iptx+1-tss->win_left); SetWinVert(tss,ipty-y,tss->win_bottom+(ipty-y)-tss->win_top); LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); UpdateDerivedTssValues(tss); WinPointAndSleep; } } old_ip_lb=FALSE; goto wmt_start; } if (has_border && tss->win_right+1==iptx && tss->win_bottom+1==ipty) { if (ip_lb) { WinToTop(tss); while (ip_lb && ValidateTss(tss)) { SetWinHorz(tss,tss->win_left,iptx-1); SetWinVert(tss,tss->win_top,ipty-1); LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); UpdateDerivedTssValues(tss); WinPointAndSleep; } } old_ip_lb=FALSE; goto wmt_start; } if (has_border && tss->win_bottom==ipty-1 && iptx>=tss->win_left && iptx<=tss->win_right) { if (iptx==(tss->scroll_x+tss->win_left)) { while (ip_lb && ValidateTss(tss)) { tss->scroll_x=iptx-tss->win_left; Bts(&tss->crt_flags,CRTf_SCROLL_X); WinPointAndSleep; SetCursorPosition(tss, ((tss->win_left+tss->win_right)>>1), (tss->win_top+tss->win_bottom)>>1); } } else { if (ip_lb) { WinToTop(tss); while (ip_lb && ValidateTss(tss)) { SetWinVert(tss,tss->win_top,ipty-1); LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); UpdateDerivedTssValues(tss); WinPointAndSleep; } } } old_ip_lb=FALSE; goto wmt_start; } if (has_border && tss->win_right==iptx-1 && ipty>=tss->win_top && ipty<=tss->win_bottom) { if (ipty==(tss->scroll_y+tss->win_top)) { while (ip_lb && ValidateTss(tss)) { tss->scroll_y=ipty-tss->win_top; Bts(&tss->crt_flags,CRTf_SCROLL_Y); WinPointAndSleep; SetCursorPosition(tss, ((tss->win_left+tss->win_right)>>1), (tss->win_top+tss->win_bottom)>>1); } } else { if (ip_lb) { WinToTop(tss); while (ip_lb && ValidateTss(tss)) { SetWinHorz(tss,tss->win_left,iptx-1); LBts(&sys_semas[SYS_SEMA_CLEAR_SCREEN_TEXT],0); UpdateDerivedTssValues(tss); WinPointAndSleep; } } } old_ip_lb=FALSE; goto wmt_start; } } } catch { Beep; Fs->catch_except=TRUE; tss=Fs; } } } #help_index ""