void Ctrl::TimerProc(dword time) { if(IsPanicMode()) return; sTimerLock.Enter(); TimeEvent *list = tevents(); if(time == sTClick) { sTimerLock.Leave(); return; } sTClick = time; sTimerLock.Leave(); Ctrl::CheckMouseCtrl(); Ctrl::SyncCaret(); sTimerLock.Enter(); #ifdef LOG_QUEUE LLOG("--- Timer queue at " << time); for(TimeEvent *e = list->GetNext(); e != list; e = e->GetNext()) LLOG("TP " << e->time << " " << e->delay << " " << e->id << " " << e->rep); LLOG("----"); #endif for(;;) { TimeEvent *todo = NULL; int maxtm = -1; for(TimeEvent *e = list->GetNext(); e != list; e = e->GetNext()) { int tm = (int)(time - e->time); if(!e->rep && tm >= 0 && tm > maxtm) { maxtm = tm; todo = e; } } if(!todo) break; LLOG("Performing " << todo->time << " " << todo->delay << " " << todo->id); Callback cb = todo->cb; if(todo->delay < 0) todo->rep = true; else delete todo; sTimerLock.Leave(); cb(); sTimerLock.Enter(); } time = GetTickCount(); LLOG("--- Rescheduling at " << time); TimeEvent *e = list->GetNext(); while(e != list) { TimeEvent *w = e; e = e->GetNext(); if(w->rep) { LLOG("Rescheduling " << e->id); sTimeCallback(time - w->delay, w->delay, w->cb, w->id); delete w; } } LLOG("----"); sTimerLock.Leave(); }
void Ctrl::UpdateArea(SystemDraw& draw, const Rect& clip) { GuiLock __; if(IsPanicMode()) return; RemoveFullRefresh(); Point sp = GetScreenRect().TopLeft(); Ctrl *b = FindBestOpaque(clip + sp); if(b) { Point p = b->GetScreenRect().TopLeft() - sp; draw.Offset(p); b->UpdateArea0(draw, clip.Offseted(-p), backpaint); draw.End(); } else UpdateArea0(draw, clip, backpaint); }