void QGuiApplicationPrivate::processActivatedEvent(QWindowSystemInterfacePrivate::ActivatedWindowEvent *e)
{
+ QWindow *previous = QGuiApplicationPrivate::active_window;
QGuiApplicationPrivate::active_window = e->activated.data();
+ if (self)
+ self->notifyActiveWindowChange(previous);
}
void QGuiApplicationPrivate::processGeometryChangeEvent(QWindowSystemInterfacePrivate::GeometryChangeEvent *e)
{
}
+void QGuiApplicationPrivate::notifyActiveWindowChange(QWindow *)
+{
+}
+
/*!
\property QGuiApplication::layoutDirection
\brief the default layout direction for this application
void createEventDispatcher();
virtual void notifyLayoutDirectionChange();
+ virtual void notifyActiveWindowChange(QWindow *previous);
static int keyboard_input_time;
static int mouse_double_click_time;
#if !defined(Q_WS_QPA) && !defined(QT_NO_CLIPBOARD)
QClipboard *qt_clipboard = 0; // global clipboard object
#endif
-QWidgetList * qt_modal_stack=0; // stack of modal widgets
+QWidgetList * qt_modal_stack = 0; // stack of modal widgets
+bool app_do_modal = false;
/*!
\internal
}
}
-
/*!
\fn Qt::WindowsVersion QApplication::winVersion()
if (QApplication::activePopupWidget() == widget)
return false;
-#if 0
for (int i = 0; i < qt_modal_stack->size(); ++i) {
QWidget *modalWidget = qt_modal_stack->at(i);
break;
}
}
-#endif
return false;
}
~QApplicationPrivate();
virtual void notifyLayoutDirectionChange();
+ virtual void notifyActiveWindowChange(QWindow *);
#if defined(Q_WS_X11)
#ifndef QT_NO_SETTINGS
static QString appName;
static QString appFont;
+extern bool app_do_modal;
+extern QWidgetList *qt_modal_stack;
QString QApplicationPrivate::appName() const
{
QGuiApplicationPrivate::createEventDispatcher();
}
-static bool qt_try_modal(QWidget *widget, QEvent::Type type)
+bool qt_try_modal(QWidget *widget, QEvent::Type type)
{
QWidget * top = 0;
return !block_event;
}
-
-
-void QApplicationPrivate::enterModal_sys(QWidget *)
+void QApplicationPrivate::enterModal_sys(QWidget *widget)
{
-#if 0
if (!qt_modal_stack)
qt_modal_stack = new QWidgetList;
qt_modal_stack->insert(0, widget);
app_do_modal = true;
-#endif
}
-void QApplicationPrivate::leaveModal_sys(QWidget *)
+void QApplicationPrivate::leaveModal_sys(QWidget *widget)
{
-#if 0
if (qt_modal_stack && qt_modal_stack->removeAll(widget)) {
if (qt_modal_stack->isEmpty()) {
delete qt_modal_stack;
}
}
app_do_modal = qt_modal_stack != 0;
-#endif
}
bool QApplicationPrivate::modalState()
{
- return false;
-#if 0
return app_do_modal;
-#endif
+}
+
+QWidget *qt_tlw_for_window(QWindow *wnd)
+{
+ if (wnd)
+ foreach (QWidget *tlw, qApp->topLevelWidgets())
+ if (tlw->windowHandle() == wnd)
+ return tlw;
+ return 0;
+}
+
+void QApplicationPrivate::notifyActiveWindowChange(QWindow *previous)
+{
+ Q_UNUSED(previous);
+ Q_Q(QApplication);
+ QWindow *wnd = QGuiApplicationPrivate::active_window;
+ QWidget *tlw = qt_tlw_for_window(wnd);
+ if (!tlw)
+ return;
+ if (modalState()
+ && !qt_try_modal(tlw, QEvent::MouseButtonRelease)
+ && q->activeWindow())
+ q->activeWindow()->activateWindow();
+ else
+ q->setActiveWindow(tlw);
}
void QApplicationPrivate::closePopup(QWidget *popup)
{
Q_D(const QWidget);
QTLWExtra *extra = d->maybeTopData();
- if (extra && extra->window)
+ if (extra) {
+ if (!extra->window)
+ const_cast<QWidgetPrivate *>(d)->createTLSysExtra();
return extra->window;
+ }
return 0;
}
static QWidget *qt_popup_down = 0; // popup that contains the pressed widget
extern int openPopupCount;
static bool replayPopupMouseEvent = false;
+extern bool qt_try_modal(QWidget *widget, QEvent::Type type);
QWidgetWindow::QWidgetWindow(QWidget *widget)
: m_widget(widget)
return;
}
+ // modal event handling
+ if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
+ return;
+
// which child should have it?
QWidget *widget = m_widget->childAt(event->pos());
QPoint mapped = event->pos();
void QWidgetWindow::handleKeyEvent(QKeyEvent *event)
{
+ if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
+ return;
+
QWidget *widget = m_widget->focusWidget();
if (!widget)
void QWidgetWindow::handleWheelEvent(QWheelEvent *event)
{
+ if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
+ return;
+
// which child should have it?
QWidget *widget = m_widget->childAt(event->pos());