diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2011-05-02 09:25:17 +0200 |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2011-05-02 09:26:40 +0200 |
commit | af77656f15bb32cbf532106641522b42cab3a343 (patch) | |
tree | 72aaba20121b6987dba7dbea576ae9231aab2055 /src/gui/kernel/qwidgetwindow_qpa.cpp | |
parent | a90d1b432c32becb9066e1542e44c0d7e0147fcc (diff) |
Proper child delivery of mouse and key events.
Diffstat (limited to 'src/gui/kernel/qwidgetwindow_qpa.cpp')
-rw-r--r-- | src/gui/kernel/qwidgetwindow_qpa.cpp | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/gui/kernel/qwidgetwindow_qpa.cpp b/src/gui/kernel/qwidgetwindow_qpa.cpp index 8ab6c9cec3..ec53b794f2 100644 --- a/src/gui/kernel/qwidgetwindow_qpa.cpp +++ b/src/gui/kernel/qwidgetwindow_qpa.cpp @@ -50,10 +50,50 @@ QWidgetWindow::QWidgetWindow(QWidget *widget) bool QWidgetWindow::event(QEvent *event) { - if (m_widget->event(event)) + switch (event->type()) { + case QEvent::MouseMove: + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + case QEvent::MouseButtonDblClick: + handleMouseEvent(static_cast<QMouseEvent *>(event)); return true; - return QWindow::event(event); + case QEvent::KeyPress: + case QEvent::KeyRelease: + handleKeyEvent(static_cast<QKeyEvent *>(event)); + return true; + + default: + break; + } + + return m_widget->event(event) || QWindow::event(event); +} + +void QWidgetWindow::handleMouseEvent(QMouseEvent *event) +{ + // which child should have it? + QWidget *widget = m_widget->childAt(event->pos()); + + // TODO: make sure mouse release is delivered to same widget that got the press event + + if (!widget) + widget = m_widget; + + QPoint mapped = widget->mapFrom(m_widget, event->pos()); + + QMouseEvent translated(event->type(), mapped, event->globalPos(), event->button(), event->buttons(), event->modifiers()); + QGuiApplication::sendSpontaneousEvent(widget, &translated); +} + +void QWidgetWindow::handleKeyEvent(QKeyEvent *event) +{ + QWidget *widget = m_widget->focusWidget(); + + if (!widget) + widget = m_widget; + + QGuiApplication::sendSpontaneousEvent(widget, event); } QT_END_NAMESPACE |