diff --git a/autotests/kstartupinfo_unittest.cpp b/autotests/kstartupinfo_unittest.cpp --- a/autotests/kstartupinfo_unittest.cpp +++ b/autotests/kstartupinfo_unittest.cpp @@ -1,6 +1,6 @@ /* This file is part of the KDE libraries - Copyright 2012 David Faure + Copyright 2012,2019 David Faure Copyright 2012 Kai Dombrowe This library is free software; you can redistribute it and/or @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -62,6 +63,7 @@ void checkStartupTest(); void createNewStartupIdTest(); void createNewStartupIdForTimestampTest(); + void setNewStartupIdTest(); private: KStartupInfo m_listener; @@ -305,6 +307,23 @@ QCOMPARE(id.mid(index + 4).toULongLong(), 5u); } +void KStartupInfo_UnitTest::setNewStartupIdTest() +{ + { + QWindow window; + const QByteArray str = "somefancyidwhichisrandom_kstartupinfo_unittest_2"; + KStartupInfo::setNewStartupId(&window, str); + QCOMPARE(KStartupInfo::startupId(), str); + } + + { + QWidget widget; + const QByteArray str = "somefancyidwhichisrandom_kstartupinfo_unittest_3"; + KStartupInfo::setNewStartupId(&widget, str); // deprecated + QCOMPARE(KStartupInfo::startupId(), str); + } +} + QTEST_MAIN(KStartupInfo_UnitTest) #include "kstartupinfo_unittest.moc" diff --git a/src/kstartupinfo.h b/src/kstartupinfo.h --- a/src/kstartupinfo.h +++ b/src/kstartupinfo.h @@ -30,7 +30,8 @@ #include #include #include -#include +#include // for WId +#include #include @@ -109,7 +110,20 @@ * or a new one, before being shown. Note that this function is usually * needed only when a window is reused. */ - static void setNewStartupId(QWidget *window, const QByteArray &startup_id); + static void setNewStartupId(QWindow *window, const QByteArray &startup_id); + + /** + * Use this function if the application got a request with startup + * notification from outside (for example, when KUniqueApplication::newInstance() + * is called, or e.g. when khelpcenter opens new URL in its window). + * The window can be either an already existing and visible window, + * or a new one, before being shown. Note that this function is usually + * needed only when a window is reused. + * @deprecated since 5.62, use setNewStartupId(QWindow *) instead + */ +#ifndef KWINDOWSYSTEM_NO_DEPRECATED + KWINDOWSYSTEM_DEPRECATED static void setNewStartupId(QWidget *window, const QByteArray &startup_id); +#endif /** * If your application shows temporarily some window during its startup, diff --git a/src/kstartupinfo.cpp b/src/kstartupinfo.cpp --- a/src/kstartupinfo.cpp +++ b/src/kstartupinfo.cpp @@ -777,9 +777,18 @@ void KStartupInfo::setNewStartupId(QWidget *window, const QByteArray &startup_id) { - bool activate = true; + // Set the WA_NativeWindow attribute to force the creation of the QWindow. + // Without this QWidget::windowHandle() returns 0. + window->setAttribute(Qt::WA_NativeWindow, true); + setNewStartupId(window->window()->windowHandle(), startup_id); +} + +void KStartupInfo::setNewStartupId(QWindow *window, const QByteArray &startup_id) +{ + Q_ASSERT(window); setStartupId(startup_id); #if KWINDOWSYSTEM_HAVE_X11 + bool activate = true; if (window != nullptr && QX11Info::isPlatformX11()) { if (!startup_id.isEmpty() && startup_id != "0") { NETRootInfo i(QX11Info::connection(), NET::Supported); @@ -798,7 +807,6 @@ } } #else - Q_UNUSED(activate) Q_UNUSED(window) #endif }