summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel/qwidgetwindow_qpa.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/kernel/qwidgetwindow_qpa.cpp')
-rw-r--r--src/gui/kernel/qwidgetwindow_qpa.cpp44
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