void tst_QWidget_window::tst_updateWinId_QTBUG40681() { QWidget w; QVBoxLayout *vl = new QVBoxLayout(&w); QLabel *lbl = new QLabel("HELLO1"); lbl->setAttribute(Qt::WA_NativeWindow); lbl->setObjectName("label1"); vl->addWidget(lbl); w.setMinimumWidth(200); w.show(); QVERIFY(QTest::qWaitForWindowExposed(&w)); QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); // simulate screen change and notification QWindow *win = w.windowHandle(); w.windowHandle()->destroy(); lbl->windowHandle()->destroy(); w.windowHandle()->create(); lbl->windowHandle()->create(); QWindowPrivate *p = qt_window_private(win); p->emitScreenChangedRecursion(win->screen()); QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); }
void QGLContext::swapBuffers() const { Q_D(const QGLContext); if (!d->paintDevice || d->paintDevice->devType() != QInternal::Widget) return; QWidget *widget = static_cast<QWidget *>(d->paintDevice); if (!widget->windowHandle()) return; d->guiGlContext->swapBuffers(widget->windowHandle()); }
void QWindowContainer::parentWasChanged(QWidget *parent) { if (QWindowContainerPrivate *d = QWindowContainerPrivate::get(parent)) { if (d->window->parent()) { d->updateUsesNativeWidgets(); d->markParentChain(); QWidget *toplevel = d->usesNativeWidgets ? parent : parent->window(); if (!toplevel->windowHandle()) { QWidgetPrivate *tld = static_cast<QWidgetPrivate *>(QWidgetPrivate::get(toplevel)); tld->createTLExtra(); tld->createTLSysExtra(); Q_ASSERT(toplevel->windowHandle()); } d->window->setParent(toplevel->windowHandle()); d->updateGeometry(); } } qwindowcontainer_traverse(parent, parentWasChanged); }
MythRenderOpenGL::MythRenderOpenGL(const MythRenderFormat& format, QPaintDevice* device, RenderType type) : MythRender(type), m_lock(QMutex::Recursive) { QWidget *w = dynamic_cast<QWidget*>(device); m_window = (w) ? w->windowHandle() : NULL; ResetVars(); ResetProcs(); setFormat(format); }
void tst_QWindowContainer::testAncestorChange() { QWidget root; QWidget *left = new QWidget(&root); QWidget *right = new QWidget(&root); root.setGeometry(0, 0, 200, 100); left->setGeometry(0, 0, 100, 100); right->setGeometry(100, 0, 100, 100); QWindow *window = new QWindow(); QWidget *container = QWidget::createWindowContainer(window, left); container->setGeometry(0, 0, 100, 100); // Root // + left // | + container // | + window // + right root.show(); QVERIFY(QTest::qWaitForWindowExposed(&root)); QCOMPARE(window->geometry(), QRect(0, 0, 100, 100)); container->setParent(right); // Root // + left // + right // + container // + window QCOMPARE(window->geometry(), QRect(100, 0, 100, 100)); QWidget *newRoot = new QWidget(&root); newRoot->setGeometry(50, 50, 200, 200); right->setParent(newRoot); // Root // + left // + newRoot // + right // + container // + window QCOMPARE(window->geometry(), QRect(150, 50, 100, 100)); newRoot->move(0, 0); QCOMPARE(window->geometry(), QRect(100, 0, 100, 100)); newRoot->setParent(0); newRoot->setGeometry(100, 100, 200, 200); newRoot->show(); QVERIFY(QTest::qWaitForWindowExposed(newRoot)); QCOMPARE(newRoot->windowHandle(), window->parent()); // newRoot // + right // + container // + window QCOMPARE(window->geometry(), QRect(100, 0, 100, 100)); }
QWindow* QWebPageClient::ownerWindow() const { QWidget* widget = ownerWidget(); if (!widget) return 0; if (QWindow *window = widget->windowHandle()) return window; if (const QWidget *nativeParent = widget->nativeParentWidget()) return nativeParent->windowHandle(); return 0; }
void QGLContext::makeCurrent() { Q_D(QGLContext); if (!d->paintDevice || d->paintDevice->devType() != QInternal::Widget) return; QWidget *widget = static_cast<QWidget *>(d->paintDevice); if (!widget->windowHandle()) return; if (d->guiGlContext->makeCurrent(widget->windowHandle())) { if (!d->workaroundsCached) { d->workaroundsCached = true; const char *renderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER)); if (renderer && strstr(renderer, "Mali")) { d->workaround_brokenFBOReadBack = true; } } } }
void QXcbConnection::notifyEnterEvent(xcb_enter_notify_event_t *event) { xcb_window_t window = event->event; if (!m_windowMapper.contains(window)) { QWidget *widget = QWidget::find(window); if (widget) { QWindow *windowHandle = widget->windowHandle(); m_windowMapper.insert(window, windowHandle); } } }
QObject* TouchApplication::getRecvWindow(QObject* candidate) { if(candidate->isWindowType()) { QWidget* popup = activePopupWidget(); if(!popup) popup = activeModalWidget(); if(popup) { QWindow* w = popup->windowHandle(); if(w) return w; } } return candidate; }
bool QGLContext::chooseContext(const QGLContext* shareContext) { Q_D(QGLContext); if(!d->paintDevice || d->paintDevice->devType() != QInternal::Widget) { d->valid = false; }else { QWidget *widget = static_cast<QWidget *>(d->paintDevice); QGLFormat glformat = format(); QSurfaceFormat winFormat = QGLFormat::toSurfaceFormat(glformat); if (widget->testAttribute(Qt::WA_TranslucentBackground)) winFormat.setAlphaBufferSize(qMax(winFormat.alphaBufferSize(), 8)); if (!widget->windowHandle()->handle()) { widget->windowHandle()->setSurfaceType(QWindow::OpenGLSurface); widget->windowHandle()->setFormat(winFormat); widget->winId();//make window } if (d->ownContext) delete d->guiGlContext; d->ownContext = true; QOpenGLContext *shareGlContext = shareContext ? shareContext->d_func()->guiGlContext : 0; d->guiGlContext = new QOpenGLContext; d->guiGlContext->setFormat(winFormat); d->guiGlContext->setShareContext(shareGlContext); d->valid = d->guiGlContext->create(); if (d->valid) d->guiGlContext->setQGLContextHandle(this,qDeleteQGLContext); d->glFormat = QGLFormat::fromSurfaceFormat(d->guiGlContext->format()); d->setupSharing(); } return d->valid; }
void tst_QWindowContainer::testActivation() { QWidget root; QWindow *window = new QWindow(); QWidget *container = QWidget::createWindowContainer(window, &root); container->setGeometry(100, 100, 200, 100); root.setGeometry(100, 100, 400, 300); root.show(); root.activateWindow(); QVERIFY(QTest::qWaitForWindowExposed(&root)); QVERIFY(QTest::qWaitForWindowActive(root.windowHandle())); QVERIFY(QGuiApplication::focusWindow() == root.windowHandle()); // Verify that all states in the root widget indicate it is active QVERIFY(root.windowHandle()->isActive()); QVERIFY(root.isActiveWindow()); QCOMPARE(root.palette().currentColorGroup(), QPalette::Active); // Under KDE (ubuntu 12.10), we experience that doing two activateWindow in a row // does not work. The second gets ignored by the window manager, even though the // timestamp in the xcb connection is unique for both. if (QGuiApplication::platformName() == "xcb") QTest::qWait(100); window->requestActivate(); QTRY_VERIFY(QGuiApplication::focusWindow() == window); // Verify that all states in the root widget still indicate it is active QVERIFY(root.windowHandle()->isActive()); QVERIFY(root.isActiveWindow()); QCOMPARE(root.palette().currentColorGroup(), QPalette::Active); }
HWND MumbleHWNDForQWidget(QWidget *widget) { #if QT_VERSION >= 0x050000 QWindow *window = widget->windowHandle(); if (window == NULL) { QWidget *npw = widget->nativeParentWidget(); if (npw != NULL) { window = npw->windowHandle(); } } if (window != NULL && window->handle() != 0) { return static_cast<HWND>(qApp->platformNativeInterface()->nativeResourceForWindow("handle", window)); } return 0; #else return widget->winId(); #endif }
void QWidget::destroy(bool destroyWindow, bool destroySubWindows) { Q_D(QWidget); d->aboutToDestroy(); if (!isWindow() && parentWidget()) parentWidget()->d_func()->invalidateBuffer(d->effectiveRectFor(geometry())); d->deactivateWidgetCleanup(); if ((windowType() == Qt::Popup) && qApp) qApp->d_func()->closePopup(this); if (this == QApplicationPrivate::active_window) QApplication::setActiveWindow(0); if (QWidget::mouseGrabber() == this) releaseMouse(); if (QWidget::keyboardGrabber() == this) releaseKeyboard(); setAttribute(Qt::WA_WState_Created, false); if (windowType() != Qt::Desktop) { if (destroySubWindows) { QObjectList childList(children()); for (int i = 0; i < childList.size(); i++) { QWidget *widget = qobject_cast<QWidget *>(childList.at(i)); if (widget && widget->testAttribute(Qt::WA_NativeWindow)) { if (widget->windowHandle()) { widget->destroy(); } } } } if (destroyWindow) { d->deleteTLSysExtra(); } else { if (parentWidget() && parentWidget()->testAttribute(Qt::WA_WState_Created)) { d->hide_sys(); } } d->setWinId(0); } }
void tst_QWidget_window::tst_dnd() { QStringList log; DnDEventLoggerWidget dndTestWidget(&log); dndTestWidget.setObjectName(QLatin1String("dndTestWidget")); dndTestWidget.setWindowTitle(dndTestWidget.objectName()); dndTestWidget.resize(200, 300); QWidget *dropsRefusingWidget1 = new DnDEventLoggerWidget(&log, &dndTestWidget); dropsRefusingWidget1->setObjectName(QLatin1String("dropsRefusingWidget1")); dropsRefusingWidget1->resize(180, 80); dropsRefusingWidget1->move(10, 10); QWidget *dropsAcceptingWidget1 = new DnDEventLoggerWidget(&log, &dndTestWidget); dropsAcceptingWidget1->setAcceptDrops(true); dropsAcceptingWidget1->setObjectName(QLatin1String("acceptingDropsWidget1")); dropsAcceptingWidget1->resize(180, 80); dropsAcceptingWidget1->move(10, 110); // Create a native widget on top of dropsAcceptingWidget1 to check QTBUG-27336 QWidget *nativeWidget = new QWidget(dropsAcceptingWidget1); nativeWidget->resize(160, 60); nativeWidget->move(10, 10); nativeWidget->winId(); QWidget *dropsAcceptingWidget2 = new DnDEventLoggerWidget(&log, &dndTestWidget); dropsAcceptingWidget2->setAcceptDrops(true); dropsAcceptingWidget2->setObjectName(QLatin1String("acceptingDropsWidget2")); dropsAcceptingWidget2->resize(180, 80); dropsAcceptingWidget2->move(10, 210); QWidget *dropsRefusingWidget2 = new DnDEventLoggerWidget(&log, dropsAcceptingWidget2); dropsRefusingWidget2->setObjectName(QLatin1String("dropsRefusingDropsWidget2")); dropsRefusingWidget2->resize(160, 60); dropsRefusingWidget2->move(10, 10); dndTestWidget.show(); qApp->setActiveWindow(&dndTestWidget); QVERIFY(QTest::qWaitForWindowActive(&dndTestWidget)); QMimeData mimeData; mimeData.setText(QLatin1String("testmimetext")); // Simulate DnD events on the QWidgetWindow. QPoint position = QPoint(11, 1); QDragEnterEvent e(position, Qt::CopyAction, &mimeData, Qt::LeftButton, Qt::NoModifier); QWindow *window = dndTestWidget.windowHandle(); qApp->sendEvent(window, &e); log.push_back(msgEventAccepted(e)); while (true) { position.ry() += 20; if (position.y() >= 250) { QDropEvent e(position, Qt::CopyAction, &mimeData, Qt::LeftButton, Qt::NoModifier); qApp->sendEvent(window, &e); log.push_back(msgEventAccepted(e)); break; } else { QDragMoveEvent e(position, Qt::CopyAction, &mimeData, Qt::LeftButton, Qt::NoModifier); qApp->sendEvent(window, &e); log.push_back(msgEventAccepted(e)); } } window = nativeWidget->windowHandle(); QDragEnterEvent enterEvent(QPoint(0, 0), Qt::CopyAction, &mimeData, Qt::LeftButton, Qt::NoModifier); qApp->sendEvent(window, &enterEvent); log.push_back(msgEventAccepted(enterEvent)); QDragMoveEvent moveEvent(QPoint(1, 1), Qt::CopyAction, &mimeData, Qt::LeftButton, Qt::NoModifier); qApp->sendEvent(window, &moveEvent); log.push_back(msgEventAccepted(moveEvent)); QDropEvent dropEvent(QPoint(2, 2), Qt::CopyAction, &mimeData, Qt::LeftButton, Qt::NoModifier); qApp->sendEvent(window, &dropEvent); log.push_back(msgEventAccepted(dropEvent)); // Compare logs. QStringList expectedLog; const int expectedLogSize = int(sizeof(expectedLogC) / sizeof(expectedLogC[0])); const QString mimeDataAddress = QString::number(quintptr(&mimeData)); const QString mimeDataAddressPlaceHolder = QLatin1String("MIME_DATA_ADDRESS"); for (int i= 0; i < expectedLogSize; ++i) expectedLog.push_back(QString::fromLatin1(expectedLogC[i]).replace(mimeDataAddressPlaceHolder, mimeDataAddress)); QCOMPARE(log, expectedLog); }
void QWidgetWindow::handleMouseEvent(QMouseEvent *event) { static const QEvent::Type contextMenuTrigger = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::ContextMenuOnMouseRelease).toBool() ? QEvent::MouseButtonRelease : QEvent::MouseButtonPress; if (qApp->d_func()->inPopupMode()) { QWidget *activePopupWidget = qApp->activePopupWidget(); QPoint mapped = event->pos(); if (activePopupWidget != m_widget) mapped = activePopupWidget->mapFromGlobal(event->globalPos()); bool releaseAfter = false; QWidget *popupChild = activePopupWidget->childAt(mapped); if (activePopupWidget != qt_popup_down) { qt_button_down = 0; qt_popup_down = 0; } switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseButtonDblClick: qt_button_down = popupChild; qt_popup_down = activePopupWidget; break; case QEvent::MouseButtonRelease: releaseAfter = true; break; default: break; // nothing for mouse move } int oldOpenPopupCount = openPopupCount; if (activePopupWidget->isEnabled()) { // deliver event qt_replay_popup_mouse_event = false; QWidget *receiver = activePopupWidget; QPoint widgetPos = mapped; if (qt_button_down) receiver = qt_button_down; else if (popupChild) receiver = popupChild; if (receiver != activePopupWidget) widgetPos = receiver->mapFromGlobal(event->globalPos()); QWidget *alien = receiver; #if !defined(Q_OS_OSX) && !defined(Q_OS_IOS) // Cocoa tracks popups const bool reallyUnderMouse = activePopupWidget->rect().contains(mapped); const bool underMouse = activePopupWidget->underMouse(); if (activePopupWidget != m_widget || (!underMouse && qt_button_down)) { // If active popup menu is not the first-level popup menu then we must emulate enter/leave events, // because first-level popup menu grabs the mouse and enter/leave events are delivered only to it // by QPA. Make an exception for first-level popup menu when the mouse button is pressed on widget. if (underMouse != reallyUnderMouse) { if (reallyUnderMouse) { QApplicationPrivate::dispatchEnterLeave(receiver, Q_NULLPTR, event->screenPos()); qt_last_mouse_receiver = receiver; } else { QApplicationPrivate::dispatchEnterLeave(Q_NULLPTR, qt_last_mouse_receiver, event->screenPos()); qt_last_mouse_receiver = receiver; receiver = activePopupWidget; } } } else if (!reallyUnderMouse) { alien = Q_NULLPTR; } #endif QMouseEvent e(event->type(), widgetPos, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers(), event->source()); e.setTimestamp(event->timestamp()); QApplicationPrivate::sendMouseEvent(receiver, &e, alien, receiver->window(), &qt_button_down, qt_last_mouse_receiver); qt_last_mouse_receiver = receiver; } else { // close disabled popups when a mouse button is pressed or released switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseButtonDblClick: case QEvent::MouseButtonRelease: activePopupWidget->close(); break; default: break; } } if (qApp->activePopupWidget() != activePopupWidget && qt_replay_popup_mouse_event && QGuiApplicationPrivate::platformIntegration()->styleHint(QPlatformIntegration::ReplayMousePressOutsidePopup).toBool()) { if (m_widget->windowType() != Qt::Popup) qt_button_down = 0; if (event->type() == QEvent::MouseButtonPress) { // the popup disappeared, replay the mouse press event QWidget *w = QApplication::widgetAt(event->globalPos()); if (w && !QApplicationPrivate::isBlockedByModal(w)) { // activate window of the widget under mouse pointer if (!w->isActiveWindow()) { w->activateWindow(); w->raise(); } QWindow *win = w->windowHandle(); if (!win) win = w->nativeParentWidget()->windowHandle(); if (win) { const QRect globalGeometry = win->isTopLevel() ? win->geometry() : QRect(win->mapToGlobal(QPoint(0, 0)), win->size()); if (globalGeometry.contains(event->globalPos())) { // Use postEvent() to ensure the local QEventLoop terminates when called from QMenu::exec() const QPoint localPos = win->mapFromGlobal(event->globalPos()); QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonPress, localPos, localPos, event->globalPos(), event->button(), event->buttons(), event->modifiers(), event->source()); QCoreApplicationPrivate::setEventSpontaneous(e, true); e->setTimestamp(event->timestamp()); QCoreApplication::postEvent(win, e); } } } } qt_replay_popup_mouse_event = false; #ifndef QT_NO_CONTEXTMENU } else if (event->type() == contextMenuTrigger && event->button() == Qt::RightButton && (openPopupCount == oldOpenPopupCount)) { QWidget *popupEvent = activePopupWidget; if (qt_button_down) popupEvent = qt_button_down; else if(popupChild) popupEvent = popupChild; QContextMenuEvent e(QContextMenuEvent::Mouse, mapped, event->globalPos(), event->modifiers()); QApplication::sendSpontaneousEvent(popupEvent, &e); #endif } if (releaseAfter) { qt_button_down = 0; qt_popup_down = 0; } 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(); if (!widget) widget = m_widget; if (event->type() == QEvent::MouseButtonPress) qt_button_down = widget; QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->windowPos().toPoint(), &mapped, event->type(), event->buttons(), qt_button_down, widget); if (!receiver) { if (event->type() == QEvent::MouseButtonRelease) QApplicationPrivate::mouse_buttons &= ~event->button(); return; } if ((event->type() != QEvent::MouseButtonPress) || !(event->flags().testFlag(Qt::MouseEventCreatedDoubleClick))) { // The preceding statement excludes MouseButtonPress events which caused // creation of a MouseButtonDblClick event. QTBUG-25831 QMouseEvent translated(event->type(), mapped, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers(), event->source()); translated.setTimestamp(event->timestamp()); QApplicationPrivate::sendMouseEvent(receiver, &translated, widget, m_widget, &qt_button_down, qt_last_mouse_receiver); event->setAccepted(translated.isAccepted()); } #ifndef QT_NO_CONTEXTMENU if (event->type() == contextMenuTrigger && event->button() == Qt::RightButton && m_widget->rect().contains(event->pos())) { QContextMenuEvent e(QContextMenuEvent::Mouse, mapped, event->globalPos(), event->modifiers()); QGuiApplication::sendSpontaneousEvent(receiver, &e); } #endif }
void QWidgetWindow::handleMouseEvent(QMouseEvent *event) { static const QEvent::Type contextMenuTrigger = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::ContextMenuOnMouseRelease).toBool() ? QEvent::MouseButtonRelease : QEvent::MouseButtonPress; if (qApp->d_func()->inPopupMode()) { QWidget *activePopupWidget = qApp->activePopupWidget(); QWidget *popup = activePopupWidget; QPoint mapped = event->pos(); if (popup != m_widget) mapped = popup->mapFromGlobal(event->globalPos()); bool releaseAfter = false; QWidget *popupChild = popup->childAt(mapped); if (popup != qt_popup_down) { qt_button_down = 0; qt_popup_down = 0; } switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseButtonDblClick: qt_button_down = popupChild; qt_popup_down = popup; break; case QEvent::MouseButtonRelease: releaseAfter = true; break; default: break; // nothing for mouse move } int oldOpenPopupCount = openPopupCount; if (popup->isEnabled()) { // deliver event qt_replay_popup_mouse_event = false; QWidget *receiver = popup; QPoint widgetPos = mapped; if (qt_button_down) receiver = qt_button_down; else if (popupChild) receiver = popupChild; if (receiver != popup) widgetPos = receiver->mapFromGlobal(event->globalPos()); QWidget *alien = m_widget->childAt(m_widget->mapFromGlobal(event->globalPos())); QMouseEvent e(event->type(), widgetPos, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers()); QGuiApplicationPrivate::setMouseEventSource(&e, QGuiApplicationPrivate::mouseEventSource(event)); e.setTimestamp(event->timestamp()); QApplicationPrivate::sendMouseEvent(receiver, &e, alien, m_widget, &qt_button_down, qt_last_mouse_receiver); } else { // close disabled popups when a mouse button is pressed or released switch (event->type()) { case QEvent::MouseButtonPress: case QEvent::MouseButtonDblClick: case QEvent::MouseButtonRelease: popup->close(); break; default: break; } } if (qApp->activePopupWidget() != activePopupWidget && qt_replay_popup_mouse_event) { if (m_widget->windowType() != Qt::Popup) qt_button_down = 0; if (event->type() == QEvent::MouseButtonPress) { // the popup disappeared, replay the mouse press event QWidget *w = QApplication::widgetAt(event->globalPos()); if (w && !QApplicationPrivate::isBlockedByModal(w)) { // activate window of the widget under mouse pointer if (!w->isActiveWindow()) { w->activateWindow(); w->raise(); } QWindow *win = w->windowHandle(); if (!win) win = w->nativeParentWidget()->windowHandle(); if (win && win->geometry().contains(event->globalPos())) { const QPoint localPos = win->mapFromGlobal(event->globalPos()); QMouseEvent e(QEvent::MouseButtonPress, localPos, localPos, event->globalPos(), event->button(), event->buttons(), event->modifiers()); QGuiApplicationPrivate::setMouseEventSource(&e, QGuiApplicationPrivate::mouseEventSource(event)); e.setTimestamp(event->timestamp()); QApplication::sendSpontaneousEvent(win, &e); } } } qt_replay_popup_mouse_event = false; #ifndef QT_NO_CONTEXTMENU } else if (event->type() == contextMenuTrigger && event->button() == Qt::RightButton && (openPopupCount == oldOpenPopupCount)) { QWidget *popupEvent = popup; if (qt_button_down) popupEvent = qt_button_down; else if(popupChild) popupEvent = popupChild; QContextMenuEvent e(QContextMenuEvent::Mouse, mapped, event->globalPos(), event->modifiers()); QApplication::sendSpontaneousEvent(popupEvent, &e); #endif } if (releaseAfter) { qt_button_down = 0; qt_popup_down = 0; } 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(); if (!widget) widget = m_widget; if (event->type() == QEvent::MouseButtonPress) qt_button_down = widget; QWidget *receiver = QApplicationPrivate::pickMouseReceiver(m_widget, event->windowPos().toPoint(), &mapped, event->type(), event->buttons(), qt_button_down, widget); if (!receiver) { if (event->type() == QEvent::MouseButtonRelease) QApplicationPrivate::mouse_buttons &= ~event->button(); return; } if ((event->type() != QEvent::MouseButtonPress) || !(event->flags().testFlag(Qt::MouseEventCreatedDoubleClick))) { // The preceding statement excludes MouseButtonPress events which caused // creation of a MouseButtonDblClick event. QTBUG-25831 QMouseEvent translated(event->type(), mapped, event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers()); QGuiApplicationPrivate::setMouseEventSource(&translated, QGuiApplicationPrivate::mouseEventSource(event)); translated.setTimestamp(event->timestamp()); QApplicationPrivate::sendMouseEvent(receiver, &translated, widget, m_widget, &qt_button_down, qt_last_mouse_receiver); } #ifndef QT_NO_CONTEXTMENU if (event->type() == contextMenuTrigger && event->button() == Qt::RightButton) { QContextMenuEvent e(QContextMenuEvent::Mouse, mapped, event->globalPos(), event->modifiers()); QGuiApplication::sendSpontaneousEvent(receiver, &e); } #endif }
void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f) { Q_Q(QWidget); Qt::WindowFlags oldFlags = data.window_flags; bool wasCreated = q->testAttribute(Qt::WA_WState_Created); int targetScreen = -1; // Handle a request to move the widget to a particular screen if (newparent && newparent->windowType() == Qt::Desktop) { // make sure the widget is created on the same screen as the // programmer specified desktop widget // get the desktop's screen number targetScreen = newparent->window()->d_func()->topData()->screenIndex; newparent = 0; } setWinId(0); if (parent != newparent) { QObjectPrivate::setParent_helper(newparent); //### why does this have to be done in the _sys function??? if (q->windowHandle()) { q->windowHandle()->setFlags(f); QWidget *parentWithWindow = newparent ? (newparent->windowHandle() ? newparent : newparent->nativeParentWidget()) : 0; if (parentWithWindow) { if (f & Qt::Window) { q->windowHandle()->setTransientParent(parentWithWindow->windowHandle()); q->windowHandle()->setParent(0); } else { q->windowHandle()->setTransientParent(0); q->windowHandle()->setParent(parentWithWindow->windowHandle()); } } else { q->windowHandle()->setTransientParent(0); q->windowHandle()->setParent(0); } } } if (!newparent) { f |= Qt::Window; if (targetScreen == -1) { if (parent) targetScreen = q->parentWidget()->window()->d_func()->topData()->screenIndex; } } bool explicitlyHidden = q->testAttribute(Qt::WA_WState_Hidden) && q->testAttribute(Qt::WA_WState_ExplicitShowHide); // Reparenting toplevel to child if (wasCreated && !(f & Qt::Window) && (oldFlags & Qt::Window) && !q->testAttribute(Qt::WA_NativeWindow)) q->destroy(); adjustFlags(f, q); data.window_flags = f; q->setAttribute(Qt::WA_WState_Created, false); q->setAttribute(Qt::WA_WState_Visible, false); q->setAttribute(Qt::WA_WState_Hidden, false); if (newparent && wasCreated && (q->testAttribute(Qt::WA_NativeWindow) || (f & Qt::Window))) q->createWinId(); if (q->isWindow() || (!newparent || newparent->isVisible()) || explicitlyHidden) q->setAttribute(Qt::WA_WState_Hidden); q->setAttribute(Qt::WA_WState_ExplicitShowHide, explicitlyHidden); // move the window to the selected screen if (!newparent && targetScreen != -1) { if (maybeTopData()) maybeTopData()->screenIndex = targetScreen; // only if it is already created if (q->testAttribute(Qt::WA_WState_Created)) { q->windowHandle()->setScreen(QGuiApplication::screens().value(targetScreen, 0)); } } }
int main(int argc, char *argv[]) { printf("Create App\n"); #ifdef AA_DisableHighDpiScaling // XXX with high dpi scaling, plugin crashes without initial screen QCoreApplication::setAttribute(AA_DisableHighDpiScaling, true); #endif QApplication app(argc, argv); if (app.platformName() != "barebone") { printf("This app requires QBareBone platform\n"); return -1; } Card card; KmsManager* mgr = new KmsManager(card) QBareClient* bb = new QBareClient(app, mgr); //dump_screens(app); QList<QScreen*> screens = app.screens(); QScreen* lcd = screens[0]; QScreen* hdmi = screens[1]; int test_num = 0; if (test_num == 0) { MainWindow *w1 = new MainWindow(); //w1->winId(); //w1->windowHandle()->setScreen(lcd); w1->move(50, 50); w1->show(); //MainWindow *w2 = new MainWindow(); //w2->winId(); //w2->windowHandle()->setScreen(hdmi); //w2->move(300, 50); //w2->show(); } else if (test_num == 1) { QSurfaceFormat format; format.setSamples(16); TriangleWindow *window = new TriangleWindow(); window->setFormat(format); window->resize(640, 480); window->show(); window->setAnimating(true); } else if (test_num == 2) { RasterWindow *w = new RasterWindow(); w->show(); } else if (test_num == 3) { QWidget* moveblk = create_moveblocks(); moveblk->windowHandle()->setScreen(hdmi); moveblk->hide(); moveblk->show(); } printf("Enter mainloop\n"); app.exec(); delete bb; return 0; }
int QPageSetupDialog::exec() { Q_D(QPageSetupDialog); if (d->printer->outputFormat() != QPrinter::NativeFormat) return Rejected; QWin32PrintEngine *engine = static_cast<QWin32PrintEngine*>(d->printer->paintEngine()); QWin32PrintEnginePrivate *ep = static_cast<QWin32PrintEnginePrivate *>(engine->d_ptr.data()); PAGESETUPDLG psd; memset(&psd, 0, sizeof(PAGESETUPDLG)); psd.lStructSize = sizeof(PAGESETUPDLG); // we need a temp DEVMODE struct if we don't have a global DEVMODE HGLOBAL hDevMode = 0; int devModeSize = 0; if (!engine->globalDevMode()) { devModeSize = sizeof(DEVMODE) + ep->devMode->dmDriverExtra; hDevMode = GlobalAlloc(GHND, devModeSize); if (hDevMode) { void *dest = GlobalLock(hDevMode); memcpy(dest, ep->devMode, devModeSize); GlobalUnlock(hDevMode); } psd.hDevMode = hDevMode; } else { psd.hDevMode = engine->globalDevMode(); } HGLOBAL *tempDevNames = engine->createGlobalDevNames(); psd.hDevNames = tempDevNames; QWidget *parent = parentWidget(); parent = parent ? parent->window() : QApplication::activeWindow(); Q_ASSERT(!parent ||parent->testAttribute(Qt::WA_WState_Created)); QWindow *parentWindow = parent->windowHandle(); psd.hwndOwner = parentWindow ? (HWND)QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", parentWindow) : 0; psd.Flags = PSD_MARGINS; QPageLayout layout = d->printer->pageLayout(); switch (layout.units()) { case QPageLayout::Millimeter: case QPageLayout::Inch: break; case QPageLayout::Point: case QPageLayout::Pica: case QPageLayout::Didot: case QPageLayout::Cicero: layout.setUnits(QLocale::system().measurementSystem() == QLocale::MetricSystem ? QPageLayout::Millimeter : QPageLayout::Inch); break; } qreal multiplier = 1.0; if (layout.units() == QPageLayout::Millimeter) { psd.Flags |= PSD_INHUNDREDTHSOFMILLIMETERS; multiplier = 100.0; } else { // QPageLayout::Inch) psd.Flags |= PSD_INTHOUSANDTHSOFINCHES; multiplier = 1000.0; } psd.rtMargin.left = layout.margins().left() * multiplier; psd.rtMargin.top = layout.margins().top() * multiplier; psd.rtMargin.right = layout.margins().right() * multiplier; psd.rtMargin.bottom = layout.margins().bottom() * multiplier; QDialog::setVisible(true); bool result = PageSetupDlg(&psd); QDialog::setVisible(false); if (result) { engine->setGlobalDevMode(psd.hDevNames, psd.hDevMode); const QMarginsF margins(psd.rtMargin.left, psd.rtMargin.top, psd.rtMargin.right, psd.rtMargin.bottom); d->printer->setPageMargins(margins / multiplier, layout.units()); // copy from our temp DEVMODE struct if (!engine->globalDevMode() && hDevMode) { void *src = GlobalLock(hDevMode); memcpy(ep->devMode, src, devModeSize); GlobalUnlock(hDevMode); } } if (!engine->globalDevMode() && hDevMode) GlobalFree(hDevMode); GlobalFree(tempDevNames); done(result); return result; }