Whenever I add non-interactive GUIElements to my scene it ends up calling my EventReceiver twice per frame. I'm wondering what The Right Way to handle this situation is.
Here's a full report:
My event handler returns "false" on Key/Mouse events. That's necessary because if I have a GUI up, I want the events to pass to it. Below we see that UserReceiver must return false before GUIEnvironment is polled (and there are numerous threads about this etc.) :
Code: Select all
//! send the event to the right receiver
void CIrrDeviceStub::postEventFromUser(SEvent event)
{
bool absorbed = false;
if (UserReceiver)
absorbed = UserReceiver->OnEvent(event);
if (!absorbed && GUIEnvironment)
absorbed = GUIEnvironment->postEventFromUser(event);
scene::ISceneManager* inputReceiver = InputReceivingSceneManager;
if (!inputReceiver)
inputReceiver = SceneManager;
if (!absorbed && inputReceiver)
absorbed = inputReceiver->postEventFromUser(event);
}0. My handler processes the Event and returns false. As seen above, execution moves to CGUIEnvironment::postEventFromUser().
1. CGUIEnvironment::postEventFromUser(), seeing the mouse event, searches for a "Hovered" object, finds the IGUIStaticText as a "Hovered" object, and calls
2. IGUIStaticText->onEvent() with the event my handler just processed. IGUIStaticText, having no virtual override for OnEvent(), calls IGUIElement::onEvent():
Code: Select all
//! Called if an event happened.
virtual bool IGUIElement::OnEvent(SEvent event)
{
if (Parent)
Parent->OnEvent(event);
return true;
}
3. Therefore, this calls IGUIEnvironment::onEvent():
Code: Select all
//! called by ui if an event happened.
bool CGUIEnvironment::OnEvent(SEvent event)
{
if (UserReceiver && event.GUIEvent.Caller != this)
return UserReceiver->OnEvent(event);
return false;
}Thanks for helping,
denton