int TopWindow::Run(bool appmodal) { GuiLock __; LLOG("TopWindow::Run() <- " << typeid(*this).name()); LLOG("Focus = " << UPP::Name(GetFocusCtrl())); if(!IsOpen()) Open(); if(!IsVisible()) Show(); bool pinloop = inloop; int pexitcode = exitcode; exitcode = Null; Vector<Ctrl *> es; if(appmodal) es = GetTopCtrls(); else { Vector<Ctrl *> ws = GetTopCtrls(); for(int i = 0; i < ws.GetCount(); i++) if(ws[i]->InLoop()) es.Add(ws[i]); Ctrl *mw = GetMainWindow(); if(mw) GatherWindowTree(mw, ws, es); } Vector< Ptr<Ctrl> > disabled = DisableCtrls(es, this); #ifdef _DEBUG for(int d = 0; d < disabled.GetCount(); d++) LLOG("DisableCtrls[" << d << "] = " << UPP::Name(disabled[d])); LLOG("Running EventLoop in " << UPP::Name(this)); #endif EventLoop(this); #ifdef _DEBUG LLOG("Finished EventLoop in " << UPP::Name(this)); for(int e = 0; e < disabled.GetCount(); e++) LLOG("EnableCtrls[" << e << "] = " << UPP::Name(disabled[e])); #endif EnableCtrls(disabled); if(IsNull(exitcode)) { WhenClose(); if(IsNull(exitcode)) DefaultBreak(); } int q = exitcode; inloop = pinloop; exitcode = pexitcode; LLOG("TopWindow::Run() = " << q << " -> " << typeid(*this).name()); #ifdef GUI_WIN LLOG("Focus = " << UPP::Name(GetFocusCtrl()) << ", raw " << (void *)::GetFocus()); #endif return q; }
void Ctrl::EventLoop0(Ctrl *ctrl) { GuiLock __; ASSERT(IsMainThread()); ASSERT(LoopLevel == 0 || ctrl); LoopLevel++; LLOG("Entering event loop at level " << LoopLevel << BeginIndent); Ptr<Ctrl> ploop; if(ctrl) { ploop = LoopCtrl; LoopCtrl = ctrl; ctrl->inloop = true; } bool quit = false; ProcessEvents(&quit); while(!EndSession() && !quit && ctrl ? ctrl->IsOpen() && ctrl->InLoop() : GetTopCtrls().GetCount()) { // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / GuiSleep"); SyncCaret(); GuiSleep(1000); if(EndSession()) break; // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / ProcessEvents"); ProcessEvents(&quit); // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / after ProcessEvents"); } if(ctrl) LoopCtrl = ploop; LoopLevel--; LLOG(EndIndent << "Leaving event loop "); }
void Ctrl::EventLoop(Ctrl *ctrl) { GuiLock __; ASSERT_(IsMainThread(), "EventLoop can only run in the main thread"); ASSERT(LoopLevel == 0 || ctrl); LoopLevel++; LLOG("Entering event loop at level " << LoopLevel << LOG_BEGIN); if(!GetMouseRight() && !GetMouseMiddle() && !GetMouseLeft()) ReleaseCtrlCapture(); Ptr<Ctrl> ploop; if(ctrl) { ploop = LoopCtrl; LoopCtrl = ctrl; ctrl->inloop = true; } while(!IsEndSession() && (ctrl ? ctrl->IsOpen() && ctrl->InLoop() : GetTopCtrls().GetCount())) { FetchEvents(TRUE); ProcessEvents(); } if(ctrl) LoopCtrl = ploop; LoopLevel--; LLOG(LOG_END << "Leaving event loop "); }
int Ctrl::DoDragAndDrop(const char *fmts, const Image& sample, dword actions, const VectorMap<String, ClipData>& data) { LLOG("------------------------------"); LLOG("DoDragAndDrop " << fmts); TopWindow *w = GetTopWindow(); if(!w || !w->top) return DND_NONE; int gdk_actions = 0; if(actions & DND_MOVE) gdk_actions |= GDK_ACTION_MOVE; if(actions & DND_COPY) gdk_actions |= GDK_ACTION_COPY; GtkTargetList *list = CreateTargetList(data); dnd_fmts.Clear(); for(int i = 0; i < data.GetCount(); i++) AddFmt(list, data.GetKey(i), i); Vector<String> f = Split(fmts, ';'); for(int i = 0; i < f.GetCount(); i++) { AddFmt(list, f[i], data.GetCount() + i); dnd_fmts.Add(f[i]); } dnd_source_data = &data; dnd_result = DND_NONE; dnd_source = this; if(IsNull(sample)) dnd_icon = Null; else { Size sz = sample.GetSize(); if(sz.cx > 128) sz.cx = 128; if(sz.cy > 128) sz.cy = 128; sz += 2; ImageDraw iw(sz); iw.DrawRect(sz, White()); DrawFrame(iw, sz, Black()); iw.DrawImage(1, 1, sz.cx, sz.cy, sample); ImageBuffer b(128, 128); dnd_icon = iw; } gtk_drag_begin(w->top->window, list, GdkDragAction(gdk_actions), GetMouseLeft() ? 1 : GetMouseMiddle() ? 2 : 3, CurrentEvent.event); while(dnd_source && GetTopCtrls().GetCount()) ProcessEvents(); dnd_source_data = NULL; gtk_target_list_unref (list); LLOG("-------- DoDragAndDrop"); return dnd_result; }
Ctrl *Ctrl::GetActiveCtrl() { GuiLock __; if(focusCtrl) return focusCtrl->GetTopCtrl(); HWND actwnd = ::GetActiveWindow(); Vector<Ctrl *> top = GetTopCtrls(); for(int i = 0; i < top.GetCount(); i++) if(top[i]->IsActiveX() && top[i]->GetHWND()) { LLOG("-> top[" << i << "] = " << FormatIntHex(top[i]->GetHWND())); for(HWND hwnd = top[i]->GetHWND(); hwnd; hwnd = ::GetParent(hwnd)) if(hwnd == actwnd) { LLOG("-> match for " <<UPP::Name(top[i])); return top[i]; } } LLOG("//Ctrl::GetActiveCtrl -> not found (NULL)"); return NULL; }
void TopWindow::ShutdownWindows() { bool again = true; while(again) { Vector<Ctrl *> tc = GetTopCtrls(); again = false; for(int i = 0; i < tc.GetCount(); i++) { Ptr<TopWindow> w = dynamic_cast<TopWindow *>(tc[i]); if(w && w->IsOpen() && w->IsEnabled()) { again = true; w->SetForeground(); w->ShutdownWindow(); if(w && w->IsOpen()) w->WhenClose(); if(!w || !w->IsOpen()) break; } } } }
void Ctrl::EventLoop(Ctrl *ctrl) { GuiLock __; ASSERT_(IsMainThread(), "EventLoop can only run in the main thread"); ASSERT(LoopLevel == 0 || ctrl); LoopLevel++; LLOG("Entering event loop at level " << LoopLevel << LOG_BEGIN); Ptr<Ctrl> ploop; if(ctrl) { ploop = LoopCtrl; LoopCtrl = ctrl; ctrl->inloop = true; } bool quit = false; int64 loopno = ++EventLoopNo; ProcessEvents(&quit); while(loopno > EndSessionLoopNo && !quit && (ctrl ? ctrl->IsOpen() && ctrl->InLoop() : GetTopCtrls().GetCount())) { // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / GuiSleep"); SyncCaret(); GuiSleep(1000); // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / ProcessEvents"); ProcessEvents(&quit); // LLOG(GetSysTime() << " % " << (unsigned)msecs() % 10000 << ": EventLoop / after ProcessEvents"); } if(ctrl) LoopCtrl = ploop; LoopLevel--; LLOG(LOG_END << "Leaving event loop "); }