void Ctrl::KillFocusWnd() { GuiLock __; // notification, don't set host platform focus here LLOG("KillFocusWnd " << Name()); if(this == ~focusCtrlWnd) { Ptr<Ctrl> pfocusCtrl = focusCtrl; DoDeactivate(pfocusCtrl, NULL); focusCtrl = focusCtrlWnd = NULL; DoKillFocus(pfocusCtrl, NULL); } }
void Ctrl::ActivateWnd() { GuiLock __; // notification, don't set physical focus here LLOG("ActivateWnd " << Name()); Ptr<Ctrl> nfocusCtrl = this; Ptr<Ctrl> pfocusCtrl = focusCtrl; LLOG("About to set focus: " << UPP::Name(nfocusCtrl)); DoDeactivate(pfocusCtrl, nfocusCtrl); focusCtrl = nfocusCtrl; focusCtrlWnd = this; DoKillFocus(pfocusCtrl, nfocusCtrl); DoSetFocus(pfocusCtrl, nfocusCtrl, true); LLOG("Focus: " << UPP::Name(focusCtrl) << " FocusWnd:" << UPP::Name(focusCtrlWnd)); }
bool Ctrl::SetFocus0(bool activate) { GuiLock __; USRLOG(" SETFOCUS " << Desc(this)); LLOG("Ctrl::SetFocus " << Desc(this)); LLOG("focusCtrlWnd " << UPP::Name(focusCtrlWnd)); LLOG("Ctrl::SetFocus0 -> deferredSetFocus = NULL; was: " << UPP::Name(defferedSetFocus)); defferedSetFocus = NULL; if(focusCtrl == this) return true; if(!IsOpen() || !IsEnabled() || !IsVisible()) return false; Ptr<Ctrl> pfocusCtrl = focusCtrl; Ptr<Ctrl> topwindow = GetTopWindow(); Ptr<Ctrl> topctrl = GetTopCtrl(); Ptr<Ctrl> _this = this; if(!topwindow) topwindow = topctrl; LLOG("SetFocus -> SetWndFocus: topwindow = " << UPP::Name(topwindow) << ", focusCtrlWnd = " << UPP::Name(focusCtrlWnd)); if(!topwindow->HasWndFocus() && !topwindow->SetWndFocus()) return false;// cxl 31.1.2004 #ifdef PLATFORM_OSX11 // ugly temporary hack - popups not behaving right in MacOS // before 2012-9-2 was #ifdef GUI_X11, but that caused issues in most linux distros (cxl) // as parent window of popup always manages focus/keyboard for popup in X11 if(activate) // Dolik/fudadmin 2011-5-1 topctrl->SetWndForeground(); #else topwindow->SetWndForeground(); // cxl 2007-4-27 #endif LLOG("SetFocus -> focusCtrl = this: " << FormatIntHex(this) << ", _this = " << FormatIntHex(~_this) << ", " << UPP::Name(_this)); focusCtrl = _this; focusCtrlWnd = topwindow; DoKillFocus(pfocusCtrl, _this); LLOG("SetFocus 2"); DoDeactivate(pfocusCtrl, _this); DoSetFocus(pfocusCtrl, _this, activate); if(topwindow) lastActiveWnd = topwindow; return true; }
FX_BOOL CFWL_NoteDriver::DispatchMessage(CFWL_Message* pMessage, IFWL_Widget* pMessageForm) { FX_BOOL bRet = FALSE; switch (pMessage->GetClassID()) { case FWL_MSGHASH_Activate: { bRet = DoActivate(static_cast<CFWL_MsgActivate*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_Deactivate: { bRet = DoDeactivate(static_cast<CFWL_MsgDeactivate*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_SetFocus: { bRet = DoSetFocus(static_cast<CFWL_MsgSetFocus*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_KillFocus: { bRet = DoKillFocus(static_cast<CFWL_MsgKillFocus*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_Key: { bRet = DoKey(static_cast<CFWL_MsgKey*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_Mouse: { bRet = DoMouse(static_cast<CFWL_MsgMouse*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_MouseWheel: { bRet = DoWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_Size: { bRet = DoSize(static_cast<CFWL_MsgSize*>(pMessage)); break; } case FWL_MSGHASH_Cursor: { bRet = TRUE; break; } case FWL_MSGHASH_WindowMove: { bRet = DoWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage), pMessageForm); break; } case FWL_MSGHASH_DropFiles: { bRet = DoDragFiles(static_cast<CFWL_MsgDropFiles*>(pMessage), pMessageForm); break; } default: { bRet = TRUE; break; } } if (bRet) { IFWL_WidgetDelegate* pDelegate = pMessage->m_pDstTarget->SetDelegate(NULL); if (pDelegate) { pDelegate->OnProcessMessage(pMessage); } } return bRet; }