ZealOS/src/System/WinMgr.ZC
TomAwezome a25b7fd03f Add verbose TaskRep functionality.
Add ST_WIN_INHIBIT_FLAGS, ST_TASK_FLAGS, ST_DISPLAY_FLAGS, WIf_FLAGS_NUM, TASKf_FLAGS_NUM, DISPLAYf_FLAGS_NUM.
Add verbose Bool default arg to TaskRep and verbose Task report logic in TaskRepTask.
2022-04-01 00:41:35 -04:00

1038 lines
26 KiB
Plaintext
Executable File

#help_index "Windows;Task/Delay"
public U0 Refresh(I64 count = 1, Bool force = FALSE)
{//Wait for 60fps WinMgr to start & finish screen refresh.
//0,FALSE Count Sync to WinMgr.
//0,TRUE Pump Messages.
//1 Count Wait and Pump Messages.
//2 Count Make Sure to do a Full Refresh
//and Set Cur Pos.
Bool old_full_refresh, old_idle = LBts(&Fs->task_flags, TASKf_IDLE);
CDoc *old_doc = DocPut;
I64 update_count;
if (!count && force)
LBts(&sys_semas[SEMA_JUST_PUMP_MESSAGES], 0);
while (Bt(&sys_semas[SEMA_REFRESH_IN_PROGRESS], 0))
{
if (force && sys_winmgr_task)
sys_winmgr_task->wake_jiffy = counts.jiffies;
Yield;
}
if (count > 1 && old_doc)
old_full_refresh = LBts(&old_doc->flags, DOCf_DO_FULL_REFRESH);
update_count = winmgr.updates+count;
while (winmgr.updates < update_count)
{
if (force && sys_winmgr_task)
sys_winmgr_task->wake_jiffy = counts.jiffies;
Sleep(1);
}
if (old_doc)
LBEqual(&old_doc->flags, DOCf_DO_FULL_REFRESH, old_full_refresh);
LBEqual(&Fs->task_flags, TASKf_IDLE, old_idle);
}
#help_index "Windows"
I64 WinQueueIPMessages(Bool que)
{
static CD3I64 single_mouse = {0, 0, 0};
F64 time = tS;
I64 message_code = 0, arg1, arg2, single_arg1, single_arg2;
CTask *task_focus = sys_focus_task;
if (task_focus && !winmgr.grab_scroll)
{
arg1 = mouse.pos.x - task_focus->pix_left - task_focus->scroll_x;
arg2 = mouse.pos.y - task_focus->pix_top - task_focus->scroll_y;
single_arg1 = single_mouse.x - task_focus->pix_left - task_focus->scroll_x;
single_arg2 = single_mouse.y - task_focus->pix_top - task_focus->scroll_y;
if (old_mouse.presnap.x != mouse.presnap.x || old_mouse.presnap.y != mouse.presnap.y)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_MOVE, arg1, arg2, 0);
message_code = MESSAGE_MS_MOVE;
}
//TODO que message for mouse.pos.z?
if (mouse.left_dbl_time)
{
if (time > mouse.left_dbl_time)
{
if (mouse.left_dbl)
{
if (!mouse.left_down_sent)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_L_D_DOWN, arg1, arg2, 0);
mouse.left_down_sent = TRUE;
message_code = MESSAGE_MS_L_D_DOWN;
}
if (!mouse.lb)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_L_D_UP, arg1, arg2, 0);
mouse.left_dbl_time = 0;
message_code = MESSAGE_MS_L_D_UP;
}
}
else
{
if (!mouse.left_down_sent)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_L_DOWN, single_arg1, single_arg2, 0);
mouse.left_down_sent = TRUE;
message_code = MESSAGE_MS_L_DOWN;
}
if (!mouse.lb)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_L_UP, arg1, arg2, 0);
mouse.left_dbl_time = 0;
message_code = MESSAGE_MS_L_UP;
}
}
}
else
{
if (mouse.lb && !mouse_last.lb) {
mouse.left_dbl_time = time;
mouse.left_dbl = TRUE;
}
}
}
else
{
if (TaskValidate(task_focus) && Bt(&task_focus->win_inhibit, WIf_FOCUS_TASK_MS_L_D))
{
if (mouse.lb && !mouse_last.lb)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_L_DOWN, arg1, arg2, 0);
message_code = MESSAGE_MS_L_DOWN;
}
else if (!mouse.lb && mouse_last.lb)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_L_UP, arg1, arg2, 0);
message_code = MESSAGE_MS_L_UP;
}
}
else
{
if (mouse.lb && !mouse_last.lb)
{
mouse.left_dbl = FALSE;
mouse.left_down_sent = FALSE;
mouse.left_dbl_time = time + mouse.dbl_time;
single_mouse.x = mouse.pos.x;
single_mouse.y = mouse.pos.y;
}
}
}
if (mouse.right_dbl_time)
{
if (time > mouse.right_dbl_time)
{
if (mouse.right_dbl)
{
if (!mouse.right_down_sent)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_R_D_DOWN, arg1, arg2, 0);
mouse.right_down_sent = TRUE;
message_code = MESSAGE_MS_R_D_DOWN;
}
if (!mouse.rb)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_R_D_UP, arg1, arg2, 0);
mouse.right_dbl_time = 0;
message_code = MESSAGE_MS_R_D_UP;
}
}
else
{
if (!mouse.right_down_sent)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_R_DOWN, single_arg1, single_arg2, 0);
mouse.right_down_sent = TRUE;
message_code = MESSAGE_MS_R_DOWN;
}
if (!mouse.rb)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_R_UP, arg1, arg2, 0);
mouse.right_dbl_time = 0;
message_code = MESSAGE_MS_R_UP;
}
}
}
else
{
if (mouse.rb && !mouse_last.rb)
{
mouse.right_dbl_time = time;
mouse.right_dbl = TRUE;
}
}
}
else
{
if (TaskValidate(task_focus) && Bt(&task_focus->win_inhibit, WIf_FOCUS_TASK_MS_R_D))
{
if (mouse.rb && !mouse_last.rb) {
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_R_DOWN, arg1, arg2, 0);
message_code = MESSAGE_MS_R_DOWN;
}
else if (!mouse.rb && mouse_last.rb)
{
if (que)
TaskMessage(task_focus, 0, MESSAGE_MS_R_UP, arg1, arg2, 0);
message_code = MESSAGE_MS_R_UP;
}
}
else
{
if (mouse.rb && !mouse_last.rb) {
mouse.right_dbl = FALSE;
mouse.right_down_sent = FALSE;
mouse.right_dbl_time = time + mouse.dbl_time;
single_mouse.x = mouse.pos.x;
single_mouse.y = mouse.pos.y;
}
}
}
MemCopy(&mouse_last, &mouse, sizeof(CMouseStateGlobals));
MemCopy(&old_mouse, &mouse, sizeof(CMouseStateGlobals));
}
return message_code;
}
U0 WinCalcIdles()
{
F64 calc_idle_time;
I64 i, k, total_jiffies, total_jiffies_delta, idle_pt_hits[MP_PROCESSORS_NUM];
CCPU *c;
CWinMgrTimingGlobals *t = winmgr.t;
if ((t->calc_idle_delta_time = (calc_idle_time = tS) - t->last_calc_idle_time) > .25)
{
PUSHFD
CLI
total_jiffies = cpu_structs[0].total_jiffies;
for (i = 0; i < mp_count; i++)
idle_pt_hits[i] = cpu_structs[i].idle_pt_hits;
POPFD
total_jiffies_delta = total_jiffies - t->last_total_jiffies;
for (i = 0; i < mp_count; i++)
{
c = &cpu_structs[i];
if (total_jiffies_delta && (k = idle_pt_hits[i] - t->last_idle_pt_hits[i]) >= 0)
c->idle_factor = Clamp(ToF64(k) / total_jiffies_delta, 0.01, 0.99);
else
c->idle_factor = 0.01;
t->last_idle_pt_hits[i] = idle_pt_hits[i];
}
t->last_total_jiffies = total_jiffies;
t->last_calc_idle_time = calc_idle_time;
t->calc_idle_count++;
}
}
I64 WinMgrSleep(Bool flush_messages = FALSE)
{
I64 timeout_val, message_code=0;
CCtrl *c;
Bool que;
F64 t, t_delta;
U8 *st;
CDC *diff;
CDate cdt;
TimeCal;
if ((t_delta = (t = tS) - winmgr.last_refresh_tS) > 0.01)
winmgr.fps = Max(1.0 / t_delta, 1);
else
winmgr.fps = 99;
winmgr.last_refresh_tS = t;
WinCalcIdles;
if (flush_messages)
FifoI64Flush(kbd.scan_code_fifo);
else if (TaskValidate(sys_focus_task))
{
KbdMessagesQueue;
que = TRUE;
if (TaskValidate(sys_focus_task) && !Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_CTRLS)) {
c = sys_focus_task->next_ctrl;
while (c != &sys_focus_task->next_ctrl)
{
if (CtrlInside(c, mouse.pos.x, mouse.pos.y))
{
que = FALSE;
break;
}
c = c->next;
}
}
message_code = WinQueueIPMessages(que);
}
else
{
WinRefocus(sys_focus_task);
if (!TaskValidate(sys_focus_task))
FifoI64Flush(kbd.scan_code_fifo);
}
if (sys_focus_task)
LBtr(&sys_focus_task->task_flags, TASKf_HAS_SONG);
WinMouseUpdate;
if (!LBtr(&sys_semas[SEMA_JUST_PUMP_MESSAGES], 0))
{
t = tS + WINMGR_PERIOD / 8;
while (winmgr.ideal_refresh_tS < t)
winmgr.ideal_refresh_tS += WINMGR_PERIOD;
timeout_val = counts.jiffies + (winmgr.ideal_refresh_tS - tS) * JIFFY_FREQ;
LBts(&sys_semas[SEMA_REFRESH_IN_PROGRESS], 0);
GrUpdateScreen;
LBtr(&sys_semas[SEMA_REFRESH_IN_PROGRESS], 0);
if (screencast.record && !screencast.just_audio)
{
cdt = screencast.t0_now(I64) + ToI64(CDATE_FREQ * (tS - screencast.t0_tS));
if (!screencast.dc)
{
screencast.dc = DCCopy(screencast.dc2_alias);
screencast.dc->cdt = cdt;
st = MStrPrint(screencast.print_format, cdt);
GRWrite(st, screencast.dc);
Free(st);
}
else if (MemCompare(screencast.dc->body,
screencast.dc2_alias->body, MSize(screencast.dc2_alias->body)))
{
diff = DCDiff(screencast.dc, screencast.dc2_alias);
diff->cdt = cdt;
st = MStrPrint(screencast.print_format, cdt);
GRWrite(st, diff);
Free(st);
DCDel(diff);
Free(screencast.dc->body);
screencast.dc->body = MAllocIdent(screencast.dc2_alias->body);
}
}
else if (screencast.dc)
{
DCDel(screencast.dc); //TODO: $LK,"MemRep",A="MN:MemRep"$ can crash.
screencast.dc = NULL;
}
if (sys_focus_task && !Bt(&sys_focus_task->task_flags, TASKf_HAS_SONG))
{
Free(music.cur_song);
music.cur_song = NULL;
}
if (music.cur_song)
{
if (!music.cur_song_task)
music.cur_song_task = Spawn(&CurSongTask, NULL, "Song");
}
else if (music.cur_song_task)
{
Kill(music.cur_song_task);
music.cur_song_task = NULL;
}
winmgr.updates++;
if (mouse_hard.install_attempts) //Don't call before boot mouse install attempt
KbdMouseHandler(FALSE, TRUE);
SleepUntil(timeout_val);
}
return message_code;
}
CDoc *WinCursorPosSet(CTask *task, I64 mouse_x, I64 mouse_y, Bool set_cursor = TRUE)
{
CDoc *res = NULL;
Bool unlock;
I64 x0, y0;
if (!task)
task = Fs;
if (WinInside(mouse_x, mouse_y, task))
{
if ((res = DocDisplay(task)) && res->flags & DOCF_DONT_SHOW)
res = NULL;
else if (set_cursor)
{
unlock = DocLock(res);
if (res->doc_signature != DOC_SIGNATURE_VAL)
res = NULL;
else
{
x0 = res->line_start_col;
y0 = res->top_line_num;
DocRecalc(res, RECALCF_HAS_CURSOR);
res->x = (mouse_x-task->pix_left - task->scroll_x) / FONT_WIDTH + x0;
res->y = (mouse_y-task->pix_top - task->scroll_y) / FONT_HEIGHT + y0;
DocRecalc(res, RECALCt_FIND_CURSOR);
task->scroll_x = 0;
task->scroll_y = 0;
task->scroll_z = 0;
if (unlock)
DocUnlock(res);
}
}
WinToTop(task);
}
return res;
}
Bool WinKeyNavMenu()
{
I64 i, old_key_count;
CD3I64 old_pos, new_pos;
CMenu *m;
CMenuEntry *tmpme;
CTask *focus = MenuTask;
if (Bt(kbd.down_bitmap, SC_GUI) && focus && (m = focus->cur_menu))
{
winmgr.show_menu = TRUE;
sys_cur_submenu_entry = NULL;
old_pos.x = mouse.pos.x;
old_pos.y = mouse.pos.y;
mouse.pos.x = new_pos.x = mouse.pos.y = new_pos.y = 0;
while (Bt(kbd.down_bitmap, SC_GUI))
{
old_key_count = kbd.count;
if (Bt(kbd.down_bitmap, SC_CURSOR_LEFT))
{
while (Bt(kbd.down_bitmap, SC_CURSOR_LEFT) && kbd.count == old_key_count)
WinMgrSleep(TRUE);
if (new_pos.x)
{
i = 0;
tmpme = m->sub;
while (tmpme)
{
if (i + MenuEntryWidth(tmpme) * FONT_WIDTH == new_pos.x)
{
new_pos.x = i;
break;
}
i += MenuEntryWidth(tmpme) * FONT_WIDTH;
tmpme = tmpme->next;
}
}
new_pos.y = 0;
}
else if (Bt(kbd.down_bitmap, SC_CURSOR_RIGHT))
{
while (Bt(kbd.down_bitmap, SC_CURSOR_RIGHT) && kbd.count == old_key_count)
WinMgrSleep(TRUE);
i = 0;
tmpme = m->sub;
while (tmpme)
{
if (i == new_pos.x)
{
if (tmpme->next)
new_pos.x = i + MenuEntryWidth(tmpme) * FONT_WIDTH;
break;
}
i += MenuEntryWidth(tmpme) * FONT_WIDTH;
tmpme = tmpme->next;
}
new_pos.y = 0;
}
else if (Bt(kbd.down_bitmap, SC_CURSOR_UP))
{
while (Bt(kbd.down_bitmap, SC_CURSOR_UP) && kbd.count == old_key_count)
WinMgrSleep(TRUE);
new_pos.y -= FONT_HEIGHT;
}
else if (Bt(kbd.down_bitmap, SC_CURSOR_DOWN))
{
while (Bt(kbd.down_bitmap, SC_CURSOR_DOWN) && kbd.count == old_key_count)
WinMgrSleep(TRUE);
new_pos.y += FONT_HEIGHT;
}
new_pos.x = ClampI64(new_pos.x, 0, GR_WIDTH - 1);
new_pos.y = ClampI64(new_pos.y, 0, GR_HEIGHT - 1);
mouse.pos.x = new_pos.x;
mouse.pos.y = new_pos.y;
WinMgrSleep(TRUE);
if (!sys_cur_submenu_entry)
mouse.pos.y = new_pos.y=0;
}
if (sys_cur_submenu_entry)
TaskMessage(sys_focus_task, 0, sys_cur_submenu_entry->message_code,
sys_cur_submenu_entry->arg1, sys_cur_submenu_entry->arg2, 0);
winmgr.show_menu = FALSE;
mouse.pos.x = old_pos.x;
mouse.pos.y = old_pos.y;
return TRUE;
}
return FALSE;
}
U0 WinMgrTask(I64)
{
CTask *task = Fs;
CDoc *doc;
CDocEntry *doc_e;
I64 x, y, z, message_code, my_mouse_z = 0, left, top, old_flags = RFlagsGet;
Bool has_border;
CCtrl *c;
WinHorz(0, TEXT_COLS - 1);
WinVert(0, TEXT_ROWS - 1);
LBts(&Fs->display_flags, DISPLAYf_NO_BORDER);
LBts(&Fs->display_flags, DISPLAYf_SHOW);
gr.dc->win_task = Fs;
Fs->win_inhibit &= ~WIF_SELF_CTRLS;
GrSetUpTables;
screencast.dc2_alias = DCAlias(gr.dc2);
WinZBufUpdate;
LBts(&sys_run_level, RLf_WINMGR);
while (TRUE)
{
try
{
wmt_start:
if (Bt(&sys_run_level, RLf_SYSTEM_SERVER))
TaskKillDying;
WinMgrSleep;
task = Fs->last_task;
while (TRUE)
{
CLI
if (!TaskValidate(task))
{
RFlagsSet(old_flags);
goto wmt_start;
}
TaskDerivedValsUpdate(task, FALSE);
task = task->last_task;
RFlagsSet(old_flags);
if (task == Fs)
break;
}
TaskDerivedValsUpdate(Fs, FALSE);
task = Fs->last_task;
while (TRUE)
{
CLI
if (!TaskValidate(task))
{
RFlagsSet(old_flags);
goto wmt_start;
}
if (WinInside(mouse.pos.x, mouse.pos.y, task, FONT_WIDTH))
{
RFlagsSet(old_flags);
break;
}
if (task == Fs) { //Shouldn't happen
RFlagsSet(old_flags);
goto wmt_start;
}
task = task->last_task;
RFlagsSet(old_flags);
}
if (Bt(&task->display_flags, DISPLAYf_NO_BORDER))
has_border = FALSE;
else
has_border = TRUE;
winmgr.show_menu = FALSE;
sys_cur_submenu_entry = NULL;
if (TaskValidate(sys_focus_task) && !Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_MENU))
{
if (WinKeyNavMenu)
goto wmt_start;
if (task == Fs && 0 <= mouse.pos.y < FONT_HEIGHT && mouse_hard.installed)
{
winmgr.show_menu = TRUE;
if (mouse.lb && !old_mouse.lb)
{
winmgr.show_menu = TRUE;
while (mouse.lb)
WinMgrSleep(TRUE);
if (sys_cur_submenu_entry)
TaskMessage(sys_focus_task, 0,
sys_cur_submenu_entry->message_code,
sys_cur_submenu_entry->arg1,
sys_cur_submenu_entry->arg2, 0);
winmgr.show_menu = FALSE;
old_mouse.lb = FALSE;
goto wmt_start;
}
}
}
//grab scroll
if (!Bt(&task->win_inhibit, WIf_SELF_GRAB_SCROLL) &&
(!TaskValidate(sys_focus_task)||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_GRAB_SCROLL)) &&
kbd.scan_code & SCF_CTRL && TaskValidate(task))
{
winmgr.grab_scroll_closed = FALSE;
winmgr.grab_scroll = TRUE;
while (kbd.scan_code & SCF_CTRL && TaskValidate(task) && (!ac.task ||
!WinInside(mouse.pos.x, mouse.pos.y, ac.task, FONT_WIDTH)))
{
if (mouse.lb)
{
winmgr.grab_scroll_closed = TRUE;
x = mouse.pos.x - task->scroll_x;
y = mouse.pos.y - task->scroll_y;
z = mouse.pos.z - task->scroll_z;
while (mouse.lb && kbd.scan_code & SCF_CTRL && TaskValidate(task))
{
task->scroll_x = (mouse.pos.x - x) & ~7;
task->scroll_y = (mouse.pos.y-y) & ~7;
task->scroll_z = mouse.pos.z-z;
WinMgrSleep(TRUE);
}
winmgr.grab_scroll_closed = FALSE;
}
else if (mouse.rb)
{
task->scroll_x = 0;
task->scroll_y = 0;
task->scroll_z = 0;
WinMgrSleep(TRUE);
}
else
WinMgrSleep;
}
winmgr.grab_scroll = FALSE;
goto wmt_start;
}
else
winmgr.grab_scroll = FALSE;
if (!Bt(&task->win_inhibit, WIf_SELF_CTRLS) &&
(!TaskValidate(sys_focus_task)||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_CTRLS)))
{
if (mouse.lb && !old_mouse.lb)
{
c = task->next_ctrl;
while (c != &task->next_ctrl)
{
if (CtrlInside(c, mouse.pos.x, mouse.pos.y))
{
left = task->pix_left;
top = task->pix_top;
if (c->flags & CTRLF_BORDER)
{
left -= FONT_WIDTH;
top -= FONT_HEIGHT;
}
if (c->flags & CTRLF_CAPTURE_LEFT_MS)
{
while (mouse.lb && TaskValidate(task))
{
if (c->left_click)
(*c->left_click)(c, mouse.pos.x - left, mouse.pos.y - top, TRUE);
WinMgrSleep;
}
if (c->left_click)
(*c->left_click)(c, mouse.pos.x - left, mouse.pos.y - top, FALSE);
old_mouse.lb = FALSE;
goto wmt_start;
}
else
{
if (c->left_click)
(*c->left_click)(c, mouse.pos.x - left, mouse.pos.y - top, TRUE);
old_mouse.lb = TRUE;
goto wmt_start;
}
}
c = c->next;
}
}
if (old_mouse.lb && !mouse.lb)
{
c = task->next_ctrl;
while (c != &task->next_ctrl)
{
if (CtrlInside(c, mouse.pos.x, mouse.pos.y))
{
left = task->pix_left;
top = task->pix_top;
if (c->flags & CTRLF_BORDER)
{
left -= FONT_WIDTH;
top -= FONT_HEIGHT;
}
if (c->left_click)
(*c->left_click)(c, mouse.pos.x - left, mouse.pos.y - top, FALSE);
old_mouse.lb = FALSE;
goto wmt_start;
}
c = c->next;
}
}
if (mouse.rb && !old_mouse.rb)
{
c = task->next_ctrl;
while (c != &task->next_ctrl)
{
if (CtrlInside(c, mouse.pos.x, mouse.pos.y))
{
left = task->pix_left;
top = task->pix_top;
if (c->flags & CTRLF_BORDER)
{
left -= FONT_WIDTH;
top -= FONT_HEIGHT;
}
if (c->flags & CTRLF_CAPTURE_RIGHT_MS)
{
while (mouse.rb && TaskValidate(task))
{
if (c->right_click)
(*c->right_click)(c, mouse.pos.x - left, mouse.pos.y - top, TRUE);
WinMgrSleep;
}
if (c->right_click)
(*c->right_click)(c, mouse.pos.x - left, mouse.pos.y - top, FALSE);
old_mouse.rb = FALSE;
goto wmt_start;
}
else
{
if (c->right_click)
(*c->right_click)(c, mouse.pos.x - left, mouse.pos.y - top, TRUE);
old_mouse.rb = TRUE;
goto wmt_start;
}
}
c = c->next;
}
}
if (old_mouse.rb && !mouse.rb)
{
c = task->next_ctrl;
while (c != &task->next_ctrl)
{
if (CtrlInside(c, mouse.pos.x, mouse.pos.y))
{
left = task->pix_left;
top = task->pix_top;
if (c->flags & CTRLF_BORDER)
{
left -= FONT_WIDTH;
top -= FONT_HEIGHT;
}
if (c->right_click)
(*c->right_click)(c, mouse.pos.x - left, mouse.pos.y - top, FALSE);
old_mouse.rb = FALSE;
goto wmt_start;
}
c = c->next;
}
}
if (mouse.has_wheel && my_mouse_z != mouse.pos.z)
{
if (task == sys_focus_task)
{
c = task->next_ctrl;
while (c != &task->next_ctrl)
{
if (c->wheel_chg)
{
(*c->wheel_chg)(c, mouse.pos.z - my_mouse_z);
my_mouse_z = mouse.pos.z;
goto wmt_start;
}
c = c->next;
}
my_mouse_z = mouse.pos.z;
}
else if (!sys_focus_task)
my_mouse_z = mouse.pos.z;
}
}
if (task == Fs)
goto wmt_start;
if (!Bt(&task->win_inhibit, WIf_SELF_MS_L) &&
(!TaskValidate(sys_focus_task) ||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_MS_L)))
{
if (!old_mouse.lb && mouse.lb)
{
if (doc = WinCursorPosSet(task, mouse.pos.x, mouse.pos.y))
{
DocLock(doc);
if (doc->doc_signature == DOC_SIGNATURE_VAL)
{
doc_e = doc->cur_entry;
if (doc_e != doc)
{
if (doc_e->de_flags & DOCEF_HAS_BORDER)
doc_e->de_flags |= DOCEF_SOLID_BORDER;
}
}
DocUnlock(doc);
old_mouse.lb = TRUE;
goto wmt_start;
}
}
}
if (!Bt(&task->win_inhibit, WIf_SELF_MS_R) &&
(!TaskValidate(sys_focus_task) ||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_MS_R)))
{
if (!old_mouse.rb && mouse.rb)
{
if (WinCursorPosSet(task, mouse.pos.x, mouse.pos.y))
{
old_mouse.rb = TRUE;
goto wmt_start;
}
}
}
if (!Bt(&task->win_inhibit, WIf_SELF_BORDER) && has_border &&
(!TaskValidate(sys_focus_task) ||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_BORDER)))
{
if (old_mouse.lb && !mouse.lb)
{
if (mouse.pos_text.y == task->win_top - 1)
{
if (task->win_left <= mouse.pos_text.x < task->win_left + 4)
{
TaskMessage(task, 0, MESSAGE_KEY_DOWN, CH_CTRLM, 0x43200000432, 0);
old_mouse.lb = FALSE;
goto wmt_start;
}
else if (task->win_right - 2 <= mouse.pos_text.x <= task->win_right)
{
if (DocPut(task))
TaskMessage(task, 0, MESSAGE_KEY_DOWN, CH_SHIFT_ESC, 0, 0);
else
Kill(task, FALSE);
old_mouse.lb = FALSE;
goto wmt_start;
}
}
}
}
if (!Bt(&task->win_inhibit, WIf_SELF_MS_L) &&
(!TaskValidate(sys_focus_task) ||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_MS_L)))
{
if (old_mouse.lb && !mouse.lb)
{
if (doc = WinCursorPosSet(task, mouse.pos.x, mouse.pos.y, FALSE))
{
do message_code = WinMgrSleep;
while (TaskValidate(task) && (mouse.lb || mouse.left_dbl_time));
if (TaskValidate(task))
{
if (message_code == MESSAGE_MS_L_UP)
{
if (doc->doc_signature == DOC_SIGNATURE_VAL)
{
DocLock(doc);
if (TaskValidate(task))
{
if (doc->doc_signature == DOC_SIGNATURE_VAL)
{
doc_e = doc->cur_entry;
if (doc_e!=doc)
{
if (doc_e->de_flags & DOCEF_HAS_BORDER)
doc_e->de_flags &= ~DOCEF_SOLID_BORDER;
if (doc_e->de_flags & (DOCEF_TREE | DOCEF_LIST |
DOCEF_LINK | DOCEF_CHECK_COLLAPSABLE |
DOCEF_LEFT_CB | DOCEF_LEFT_MACRO | DOCEF_LEFT_EXP))
{
TaskMessage(task, 0, MESSAGE_KEY_DOWN, CH_SPACE, 0, 0);
}
}
}
DocUnlock(doc);
}
}
}
else if (message_code == MESSAGE_MS_L_D_UP)
TaskMessage(task, 0, MESSAGE_KEY_DOWN, CH_ESC, 0, 0);
}
old_mouse.lb = FALSE;
goto wmt_start;
}
}
}
if (!Bt(&task->win_inhibit, WIf_SELF_MS_R) &&
(!TaskValidate(sys_focus_task) ||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_MS_R)))
{
if (old_mouse.rb && !mouse.rb)
{
if (doc = WinCursorPosSet(task, mouse.pos.x, mouse.pos.y, FALSE))
{
do message_code = WinMgrSleep;
while (TaskValidate(task) && (mouse.rb || mouse.right_dbl_time));
if (TaskValidate(task))
{
if (message_code == MESSAGE_MS_R_UP)
{
if (doc->doc_signature == DOC_SIGNATURE_VAL)
{
DocLock(doc);
if (TaskValidate(task))
{
if (doc->doc_signature == DOC_SIGNATURE_VAL)
{
doc_e = doc->cur_entry;
if (doc_e != doc) {
if (doc_e->de_flags & (DOCEF_LINK |
DOCEF_RIGHT_CB | DOCEF_RIGHT_MACRO | DOCEF_RIGHT_EXP))
{
TaskMessage(task, 0, MESSAGE_KEY_DOWN, '\n', 0, 0);
}
}
}
DocUnlock(doc);
}
}
}
else if (message_code == MESSAGE_MS_R_D_UP)
TaskMessage(task, 0, MESSAGE_KEY_DOWN, CH_SHIFT_ESC, 0, 0);
}
old_mouse.rb = FALSE;
goto wmt_start;
}
}
}
if (!Bt(&task->win_inhibit, WIf_SELF_BORDER) && has_border &&
(!TaskValidate(sys_focus_task) ||
!Bt(&sys_focus_task->win_inhibit, WIf_FOCUS_TASK_BORDER)))
{
if (mouse.lb && !old_mouse.lb)
{
if (task->win_top == mouse.pos_text.y + 1 &&
task->win_left - 1 <= mouse.pos_text.x <= task->win_right + 1)
{
if (task->win_left <= mouse.pos_text.x < task->win_left + 4)
{
old_mouse.lb = TRUE;
goto wmt_start;
}
if (task->win_right - 2 <= mouse.pos_text.x <= task->win_right)
{
old_mouse.lb = TRUE;
goto wmt_start;
}
x = mouse.pos_text.x - task->win_left;
if (mouse.lb)
{
WinToTop(task);
while (mouse.lb && TaskValidate(task))
{
WinHorz(mouse.pos_text.x - x, task->win_width - 1 + mouse.pos_text.x - x, task);
WinVert(mouse.pos_text.y + 1, task->win_height + mouse.pos_text.y, task);
WinMgrSleep;
}
}
old_mouse.lb = FALSE;
goto wmt_start;
}
if (task->win_left == mouse.pos_text.x + 1 &&
task->win_top - 1 <= mouse.pos_text.y <= task->win_bottom + 1)
{
y = mouse.pos_text.y - task->win_top;
if (mouse.lb)
{
WinToTop(task);
while (mouse.lb && TaskValidate(task))
{
WinHorz(mouse.pos_text.x + 1, task->win_width + mouse.pos_text.x, task);
WinVert(mouse.pos_text.y - y, task->win_height - 1 + mouse.pos_text.y - y, task);
WinMgrSleep;
}
}
old_mouse.lb = FALSE;
goto wmt_start;
}
if (task->win_right + 1 == mouse.pos_text.x &&
task->win_bottom + 1 == mouse.pos_text.y)
{
if (mouse.lb)
{
WinToTop(task);
while (mouse.lb && TaskValidate(task))
{
WinHorz(task->win_left, mouse.pos_text.x - 1, task);
WinVert(task->win_top, mouse.pos_text.y - 1, task);
WinMgrSleep;
}
}
old_mouse.lb = FALSE;
goto wmt_start;
}
if (task->win_bottom == mouse.pos_text.y - 1 &&
task->win_left <= mouse.pos_text.x <= task->win_right)
{
if (mouse.lb)
{
WinToTop(task);
while (mouse.lb && TaskValidate(task))
{
WinVert(task->win_top, mouse.pos_text.y - 1, task);
WinMgrSleep;
}
}
old_mouse.lb = FALSE;
goto wmt_start;
}
if (task->win_right == mouse.pos_text.x - 1 &&
task->win_top <= mouse.pos_text.y <= task->win_bottom)
{
if (mouse.lb)
{
WinToTop(task);
while (mouse.lb && TaskValidate(task))
{
WinHorz(task->win_left, mouse.pos_text.x - 1, task);
WinMgrSleep;
}
}
old_mouse.lb = FALSE;
goto wmt_start;
}
}
}
}
catch
{
Beep;
Fs->catch_except = TRUE;
task = Fs;
}
}
}