File indexing completed on 2024-03-24 05:01:18
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 }