void Gui::distributeKeyEvent(KeyEvent& keyEvent) { WidgetPtr parent = keyEvent.GetSource(); WidgetPtr widget = keyEvent.GetSource(); if (mFocusHandler->GetModalFocused() != NULL && !widget->isModalFocused()) { return; } if (mFocusHandler->GetModalMouseInputFocused() != NULL && !widget->isModalMouseInputFocused()) { return; } while (parent != NULL) { // If the widget has been removed due to input // cancel the distribution. if (!Widget::widgetExists(widget)) { break; } parent = widget->GetParent(); if (widget->IsEnabled()) { std::list<KeyListener*> keyListeners = widget->_getKeyListeners(); // Send the event to all key listeners of the source widget. for (std::list<KeyListener*>::iterator it = keyListeners.begin(); it != keyListeners.end(); ++it) { switch (keyEvent.getType()) { case KeyEvent::PRESSED: (*it)->keyPressed(keyEvent); break; case KeyEvent::RELEASED: (*it)->keyReleased(keyEvent); break; default: throw GCN_EXCEPTION("Unknown key event type."); } } } WidgetPtr swap = widget; widget = parent; parent = (WidgetPtr)swap->GetParent(); // If a non modal focused widget has been reach // and we have modal focus cancel the distribution. if (mFocusHandler->GetModalFocused() != NULL && !widget->isModalFocused()) { break; } } }