File indexing completed on 2024-04-28 08:50:44

0001 /* This file is part of the KDE project
0002     SPDX-FileCopyrightText: 1998, 1999, 2016 David Faure <faure@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "konqmainwindowfactory.h"
0008 #include "konqmainwindow.h"
0009 #include "konqview.h"
0010 #include "konqsettingsxt.h"
0011 #include "konqdebug.h"
0012 #include "konqurl.h"
0013 #include "konqmisc.h"
0014 
0015 #include <KWindowInfo>
0016 #include <KStartupInfo>
0017 #include <QTimer>
0018 
0019 #if QT_VERSION_MAJOR < 6
0020 #include <QX11Info>
0021 #else
0022 #include <QtGui/private/qtx11extras_p.h>
0023 #endif
0024 
0025 #include <KWindowSystem>
0026 
0027 // Terminates fullscreen-mode for any full-screen window on the current desktop
0028 static void abortFullScreenMode()
0029 {
0030     QList<KonqMainWindow *> *mainWindows = KonqMainWindow::mainWindowList();
0031     if (mainWindows) {
0032         for (KonqMainWindow *window: *mainWindows) {
0033             if (window->fullScreenMode()) {
0034                 KWindowInfo info(window->winId(), NET::WMDesktop);
0035                 if (info.valid() && info.isOnCurrentDesktop()) {
0036                     window->setWindowState(window->windowState() & ~Qt::WindowFullScreen);
0037                 }
0038             }
0039         }
0040     }
0041 }
0042 
0043 // Prepare another preloaded window for next time
0044 static void ensurePreloadedWindow()
0045 {
0046     if (KonqSettings::alwaysHavePreloaded()) {
0047         QTimer::singleShot(500, nullptr, []() {return KonqMainWindowFactory::createPreloadWindow();});
0048     }
0049 }
0050 
0051 KonqMainWindow* KonqMainWindowFactory::findPreloadedWindow()
0052 {
0053     QList<KonqMainWindow *> *mainWindowList = KonqMainWindow::mainWindowList();
0054     if (!mainWindowList) {
0055         return nullptr;
0056     }
0057     auto it = std::find_if(mainWindowList->constBegin(), mainWindowList->constEnd(), [](KonqMainWindow* w){return w->isPreloaded();});
0058     return it != mainWindowList->constEnd() ? *it : nullptr;
0059 }
0060 
0061 KonqMainWindow *KonqMainWindowFactory::createEmptyWindow()
0062 {
0063     abortFullScreenMode();
0064 
0065     // Let's see if we can reuse a preloaded window
0066     KonqMainWindow *win = findPreloadedWindow();
0067     if (win) {
0068         qCDebug(KONQUEROR_LOG) << "Reusing preloaded window" << win;
0069         QByteArray startupId = KWindowSystem::isPlatformX11() ? QX11Info::nextStartupId() : qEnvironmentVariable("XDG_ACTIVATION_TOKEN").toUtf8();
0070         KStartupInfo::setNewStartupId(win->windowHandle(), startupId);
0071     } else {
0072         win = new KonqMainWindow(KonqUrl::url(KonqUrl::Type::Blank));
0073     }
0074     ensurePreloadedWindow();
0075     return win;
0076 }
0077 
0078 KonqMainWindow * KonqMainWindowFactory::createPreloadWindow()
0079 {
0080     KonqMainWindow *mw = new KonqMainWindow(KonqUrl::url(KonqUrl::Type::Blank));
0081     return mw;
0082 }
0083 
0084 KonqMainWindow *KonqMainWindowFactory::createNewWindow(const QUrl &url,
0085                                           const KonqOpenURLRequest &req)
0086 {
0087     KonqMainWindow *mainWindow = KonqMainWindowFactory::createEmptyWindow();
0088     if (!url.isEmpty()) {
0089         mainWindow->openUrl(nullptr, url, QString(), req);
0090         mainWindow->setInitialFrameName(req.browserArgs.frameName);
0091     } else {
0092         mainWindow->openUrl(nullptr, KonqMisc::konqFilteredURL(mainWindow, KonqSettings::startURL()));
0093         mainWindow->focusLocationBar();
0094     }
0095     return mainWindow;
0096 }