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; } } }
void Gui::distributeMouseEvent(WidgetPtr source, int type, int button, int x, int y, bool force, bool toSourceOnly) { WidgetPtr parent = source; WidgetPtr widget = source; if (mFocusHandler->GetModalFocused() && !widget->isModalFocused() && !force) { return; } if (mFocusHandler->GetModalMouseInputFocused() && !widget->isModalMouseInputFocused() && !force) { return; } MouseEvent mouseEvent(source, mShiftPressed, mControlPressed, mAltPressed, mMetaPressed, type, button, x, y, mClickCount); while (parent != NULL) { // If the widget has been removed due to input // cancel the distribution. if (!Widget::widgetExists(widget)) { break; } parent = (WidgetPtr)widget->GetParent(); if (widget->IsEnabled() || force) { int widgetX, widgetY; widget->getAbsolutePosition(widgetX, widgetY); mouseEvent.mX = x - widgetX; mouseEvent.mY = y - widgetY; std::list<MouseListener*> mouseListeners = widget->_getMouseListeners(); // Send the event to all mouse listeners of the widget. for (std::list<MouseListener*>::iterator it = mouseListeners.begin(); it != mouseListeners.end(); ++it) { switch (mouseEvent.getType()) { case MouseEvent::ENTERED: (*it)->MouseEntered(mouseEvent); break; case MouseEvent::EXITED: (*it)->MouseExited(mouseEvent); break; case MouseEvent::MOVED: (*it)->mouseMoved(mouseEvent); break; case MouseEvent::PRESSED: (*it)->mousePressed(mouseEvent); break; case MouseEvent::RELEASED: (*it)->mouseReleased(mouseEvent); break; case MouseEvent::WHEEL_MOVED_UP: (*it)->mouseWheelMovedUp(mouseEvent); break; case MouseEvent::WHEEL_MOVED_DOWN: (*it)->mouseWheelMovedDown(mouseEvent); break; case MouseEvent::DRAGGED: (*it)->mouseDragged(mouseEvent); break; case MouseEvent::CLICKED: (*it)->mouseClicked(mouseEvent); break; default: throw GCN_EXCEPTION("Unknown mouse event type."); } } if (toSourceOnly) { break; } } 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; } // If a non modal mouse input focused widget has been reach // and we have modal mouse input focus cancel the distribution. if (mFocusHandler->GetModalMouseInputFocused() != NULL && !widget->isModalMouseInputFocused()) { break; } } }