68#include <QStackedWidget>
71#include <QDesktopServices>
72#include <QWebEngineHistory>
73#include <QWebEngineSettings>
78#include <QTemporaryFile>
79#include <QActionGroup>
83#include <xcb/xcb_atom.h>
86static const int savedWindowVersion = 2;
93 windowState = window->isFullScreen() ? QByteArray() : window->saveState();
100 const int tabsCount = window->
tabCount();
101 tabs.reserve(tabsCount);
102 for (
int i = 0;
i < tabsCount; ++
i) {
125 if (!tab.isValid()) {
129 return currentTab > -1;
135 windowGeometry.clear();
143 stream << savedWindowVersion;
148 stream << static_cast<int>(window.
tabs.count());
150 for (
int i = 0;
i < window.
tabs.count(); ++
i) {
151 stream << window.
tabs.at(
i);
175 window.
tabs.reserve(tabsCount);
177 for (
int i = 0;
i < tabsCount; ++
i) {
180 window.
tabs.append(tab);
191 : QMainWindow(nullptr)
192 , m_startUrl(startUrl)
194 , m_startTab(nullptr)
195 , m_startPage(nullptr)
197 , m_hideNavigationTimer(nullptr)
199 setAttribute(Qt::WA_DeleteOnClose);
200 setAttribute(Qt::WA_DontCreateNativeAncestors);
202 setObjectName(
QSL(
"mainwindow"));
204 setProperty(
"private",
mApp->isPrivate());
209 m_hideNavigationTimer =
new QTimer(
this);
210 m_hideNavigationTimer->setInterval(1000);
211 m_hideNavigationTimer->setSingleShot(
true);
212 connect(m_hideNavigationTimer, &QTimer::timeout,
this, &BrowserWindow::hideNavigationSlot);
216 QTimer::singleShot(0,
this, &BrowserWindow::postLaunch);
218 if (
mApp->isPrivate()) {
228 mApp->plugins()->emitMainWindowDeleted(
this);
230 for (
const QPointer<QWidget> &pointer : std::as_const(m_deleteOnCloseWidgets)) {
232 pointer->deleteLater();
247void BrowserWindow::postLaunch()
254 switch (
mApp->afterLaunch()) {
260 startUrl = QUrl(
QSL(
"falkon:speeddial"));
266 startUrl = m_homepage;
273 if (!
mApp->isTestModeEnabled()) {
277 switch (m_windowType) {
279 if (
mApp->isStartingAfterCrash()) {
299 if (!m_startUrl.isEmpty()) {
300 startUrl = m_startUrl;
318 if (startUrl.isEmpty() || startUrl.toString() == QLatin1String(
"falkon:speeddial")) {
324 if (m_tabWidget->
count() <= 0) {
328 mApp->plugins()->emitMainWindowCreated(
this);
333 updateStartupFocus();
336void BrowserWindow::setupUi()
340 const QByteArray windowGeometry = settings.
value(
QSL(
"WindowGeometry")).toByteArray();
342 const QStringList keys = {
343 QSL(
"LocationBarWidth"),
344 QSL(
"WebSearchBarWidth"),
349 QHash<QString, QVariant> uiState;
350 for (
const QString &key : keys) {
352 uiState[key] = settings.
value(key);
357 auto* widget =
new QWidget(
this);
358 widget->setCursor(Qt::ArrowCursor);
359 setCentralWidget(widget);
361 m_mainLayout =
new QVBoxLayout(widget);
362 m_mainLayout->setContentsMargins(0, 0, 0, 0);
363 m_mainLayout->setSpacing(0);
364 m_mainSplitter =
new QSplitter(
this);
365 m_mainSplitter->setObjectName(
QSL(
"sidebar-splitter"));
367 m_superMenu =
new QMenu(
this);
371 m_tabModel =
new TabModel(
this,
this);
373 m_tabMruModel->setSourceModel(m_tabModel);
376 m_navigationContainer->
addWidget(m_navigationToolbar);
377 m_navigationContainer->
addWidget(m_bookmarksToolbar);
380 m_mainSplitter->addWidget(m_tabWidget);
381 m_mainSplitter->setCollapsible(0,
false);
383 m_mainLayout->addWidget(m_navigationContainer);
384 m_mainLayout->addWidget(m_mainSplitter);
387 m_statusBar->setObjectName(
QSL(
"mainwindow-statusbar"));
388 m_statusBar->setCursor(Qt::ArrowCursor);
389 setStatusBar(m_statusBar);
391 m_ipLabel =
new QLabel(
this);
392 m_ipLabel->setObjectName(
QSL(
"statusbar-ip-label"));
393 m_ipLabel->setToolTip(tr(
"IP Address of current page"));
395 m_statusBar->addPermanentWidget(m_progressBar);
396 m_statusBar->addPermanentWidget(m_ipLabel);
402 auto desktop = QGuiApplication::primaryScreen();
403 int windowWidth = desktop->availableGeometry().width() / 1.3;
404 int windowHeight = desktop->availableGeometry().height() / 1.3;
410 QPoint p =
mApp->getWindow()->geometry().topLeft();
414 if (!desktop->availableGeometry(
mApp->getWindow()).contains(p)) {
415 p.setX(desktop->availableGeometry(
mApp->getWindow()).x() + 30);
416 p.setY(desktop->availableGeometry(
mApp->getWindow()).y() + 30);
419 setGeometry(QRect(p,
mApp->getWindow()->size()));
421 resize(
mApp->getWindow()->size());
423 }
else if (!restoreGeometry(windowGeometry)) {
425 setGeometry(QRect(desktop->availableGeometry(
mApp->getWindow()).x() + 30,
426 desktop->availableGeometry(
mApp->getWindow()).y() + 30, windowWidth, windowHeight));
428 resize(windowWidth, windowHeight);
432 restoreUiState(uiState);
435 setMinimumWidth(300);
438void BrowserWindow::setupMenu()
444 macMainMenu =
new MainMenu(
this, 0);
452 m_mainMenu = macMainMenu;
456 m_mainMenu =
new MainMenu(
this,
this);
462 auto* reloadBypassCacheAction =
new QShortcut(QKeySequence(
QSL(
"Ctrl+F5")),
this);
463 auto* reloadBypassCacheAction2 =
new QShortcut(QKeySequence(
QSL(
"Ctrl+Shift+R")),
this);
467 auto* closeTabAction =
new QShortcut(QKeySequence(
QSL(
"Ctrl+W")),
this);
468 auto* closeTabAction2 =
new QShortcut(QKeySequence(
QSL(
"Ctrl+F4")),
this);
469 connect(closeTabAction, &QShortcut::activated,
this, &BrowserWindow::closeTab);
470 connect(closeTabAction2, &QShortcut::activated,
this, &BrowserWindow::closeTab);
472 auto* reloadAction =
new QShortcut(QKeySequence(
QSL(
"Ctrl+R")),
this);
475 auto* openLocationAction =
new QShortcut(QKeySequence(
QSL(
"Alt+D")),
this);
476 connect(openLocationAction, &QShortcut::activated,
this, &BrowserWindow::openLocation);
478 auto* inspectorAction =
new QShortcut(QKeySequence(
QSL(
"F12")),
this);
481 auto* restoreClosedWindow =
new QShortcut(QKeySequence(
QSL(
"Ctrl+Shift+N")),
this);
485void BrowserWindow::updateStartupFocus()
487 QTimer::singleShot(500,
this, [
this]() {
498QAction* BrowserWindow::createEncodingAction(
const QString &codecName,
499 const QString &activeCodecName, QMenu* menu)
501 auto*
action =
new QAction(codecName, menu);
502 action->setData(codecName);
503 action->setCheckable(
true);
504 connect(
action, &QAction::triggered,
this, &BrowserWindow::changeEncoding);
505 if (activeCodecName.compare(codecName, Qt::CaseInsensitive) == 0) {
511void BrowserWindow::createEncodingSubMenu(
const QString &name, QStringList &codecNames, QMenu* menu)
513 if (codecNames.isEmpty()) {
518 collator.setNumericMode(
true);
519 std::sort(codecNames.begin(), codecNames.end(), [collator](
const QString &a,
const QString &b) {
520 return collator.compare(a, b) < 0;
523 auto* subMenu =
new QMenu(name, menu);
524 const QString activeCodecName =
mApp->webSettings()->defaultTextEncoding();
526 auto *group =
new QActionGroup(subMenu);
528 for (
const QString &codecName : std::as_const(codecNames)) {
529 QAction *act = createEncodingAction(codecName, activeCodecName, subMenu);
530 group->addAction(act);
531 subMenu->addAction(act);
534 menu->addMenu(subMenu);
537QHash<QString, QVariant> BrowserWindow::saveUiState()
541 QHash<QString, QVariant>
state;
542 state[
QSL(
"LocationBarWidth")] = m_navigationToolbar->
splitter()->sizes().at(0);
543 state[
QSL(
"WebSearchBarWidth")] = m_navigationToolbar->
splitter()->sizes().at(1);
544 state[
QSL(
"SideBarWidth")] = m_sideBarWidth;
545 state[
QSL(
"WebViewWidth")] = m_webViewWidth;
550void BrowserWindow::restoreUiState(
const QHash<QString, QVariant> &
state)
552 const int locationBarWidth =
state.value(
QSL(
"LocationBarWidth"), 480).toInt();
553 const int websearchBarWidth =
state.value(
QSL(
"WebSearchBarWidth"), 140).toInt();
556 m_sideBarWidth =
state.value(
QSL(
"SideBarWidth"), 250).toInt();
557 m_webViewWidth =
state.value(
QSL(
"WebViewWidth"), 2000).toInt();
559 m_mainSplitter->setSizes({m_sideBarWidth, m_webViewWidth});
562 const QString activeSideBar =
state.value(
QSL(
"SideBar")).toString();
563 if (activeSideBar.isEmpty() && m_sideBar) {
566 m_sideBarManager->
showSideBar(activeSideBar,
false);
570void BrowserWindow::loadSettings()
576 m_homepage = settings.
value(
QSL(
"homepage"),
QSL(
"falkon:start")).toUrl();
581 bool showStatusBar = settings.
value(
QSL(
"showStatusBar"),
false).toBool();
582 bool showBookmarksToolbar = settings.
value(
QSL(
"showBookmarksToolbar"),
false).toBool();
583 bool showNavigationToolbar = settings.
value(
QSL(
"showNavigationToolbar"),
true).toBool();
584 bool showMenuBar = settings.
value(
QSL(
"showMenubar"),
false).toBool();
588 if (!showNavigationToolbar) {
596 m_useTabNumberShortcuts = settings.
value(
QSL(
"useTabNumberShortcuts"),
true).toBool();
597 m_useSpeedDialNumberShortcuts = settings.
value(
QSL(
"useSpeedDialNumberShortcuts"),
true).toBool();
598 m_useSingleKeyShortcuts = settings.
value(
QSL(
"useSingleKeyShortcuts"),
false).toBool();
602 QAction *quitAction = m_mainMenu->
action(
QSL(
"Standard/Quit"));
603 if (settings.
value(
QSL(
"closeAppWithCtrlQ"),
true).toBool()) {
606 quitAction->setShortcut(QKeySequence());
610 m_statusBarVisible = showStatusBar;
611 statusBar()->setVisible(!isFullScreen() && showStatusBar);
612 m_bookmarksToolbar->setVisible(showBookmarksToolbar);
613 m_navigationToolbar->setVisible(showNavigationToolbar);
616 m_menuBarVisible = showMenuBar;
617 menuBar()->setVisible(!isFullScreen() && showMenuBar);
645 return m_tabWidget->
count();
655 auto* webTab = qobject_cast<WebTab*>(m_tabWidget->
widget(index));
660 return webTab->webView();
665 return qobject_cast<LocationBar*>(m_tabWidget->
locationBars()->currentWidget());
675 return m_bookmarksToolbar;
685 return m_navigationToolbar;
690 return m_sideBarManager;
715 return m_mainMenu->
action(name);
725 return m_tabMruModel;
732 if (
mApp->isPrivate()) {
733 title.append(tr(
" (Private Browsing)"));
736 QMainWindow::setWindowTitle(title);
739void BrowserWindow::changeEncoding()
741 if (
auto*
action = qobject_cast<QAction*>(sender())) {
742 const QString encoding =
action->data().toString();
743 mApp->webSettings()->setDefaultTextEncoding(encoding);
746 settings.
setValue(
QSL(
"Web-Browser-Settings/DefaultEncoding"), encoding);
752void BrowserWindow::printPage()
789 if (
auto*
action = qobject_cast<QAction*>(obj)) {
800 if (
auto*
action = qobject_cast<QAction*>(obj)) {
807 if (
weView()->webTab()->isPinned()) {
809 weView(index)->setFocus();
818 mApp->browsingLibrary()->showHistory(
this);
831 return m_sideBar.data();
834 m_sideBar =
new SideBar(m_sideBarManager,
this);
836 m_mainSplitter->insertWidget(0, m_sideBar.data());
837 m_mainSplitter->setCollapsible(0,
false);
838 m_mainSplitter->setSizes({m_sideBarWidth, m_webViewWidth});
840 return m_sideBar.data();
848 m_sideBarWidth = m_mainSplitter->sizes().at(0) + 1;
849 m_webViewWidth = width() - m_sideBarWidth;
862 setUpdatesEnabled(
false);
864 menuBar()->setVisible(!menuBar()->isVisible());
867 setUpdatesEnabled(
true);
872 if (!m_navigationToolbar->isVisible() && !menuBar()->isVisible()) {
879 setUpdatesEnabled(
false);
881 m_statusBar->setVisible(!m_statusBar->isVisible());
883 setUpdatesEnabled(
true);
891 setUpdatesEnabled(
false);
893 m_bookmarksToolbar->setVisible(!m_bookmarksToolbar->isVisible());
895 setUpdatesEnabled(
true);
897 Settings().
setValue(
QSL(
"Browser-View-Settings/showBookmarksToolbar"), m_bookmarksToolbar->isVisible());
903 setUpdatesEnabled(
false);
905 m_navigationToolbar->setVisible(!m_navigationToolbar->isVisible());
907 setUpdatesEnabled(
true);
909 Settings().
setValue(
QSL(
"Browser-View-Settings/showNavigationToolbar"), m_navigationToolbar->isVisible());
913 if (!m_navigationToolbar->isVisible() && !menuBar()->isVisible()) {
927 if (m_htmlFullScreenView) {
928 weView()->triggerPageAction(QWebEnginePage::ExitFullScreen);
932 if (isFullScreen()) {
933 setWindowState(windowState() & ~Qt::WindowFullScreen);
935 setWindowState(windowState() | Qt::WindowFullScreen);
942 setWindowState(windowState() | Qt::WindowFullScreen);
944 setWindowState(windowState() & ~Qt::WindowFullScreen);
948 m_sideBar.data()->setHidden(enable);
950 m_htmlFullScreenView = enable ? view :
nullptr;
977 if (title.isEmpty()) {
982 m_ipLabel->setText(view->
getIp());
1001 m_ipLabel->setVisible(!isLoading);
1002 m_progressBar->setVisible(isLoading);
1004 action(
QSL(
"View/Stop"))->setEnabled(isLoading);
1005 action(
QSL(
"View/Reload"))->setEnabled(!isLoading);
1018 if (!m_deleteOnCloseWidgets.contains(widget)) {
1019 m_deleteOnCloseWidgets.append(widget);
1031 if (!
mApp->isTestModeEnabled()) {
1035 updateStartupFocus();
1047 action->setCheckable(
true);
1048 action->setChecked(menuBar()->isVisible());
1052 action->setCheckable(
true);
1053 action->setChecked(m_navigationToolbar->isVisible());
1056 action->setCheckable(
true);
1059 menu->addSeparator();
1062 action->setCheckable(
true);
1065 addActions(menu->actions());
1075 const QString activeCodecName =
mApp->webSettings()->defaultTextEncoding();
1077 QStringList isoCodecs;
1078 QStringList utfCodecs;
1079 QStringList windowsCodecs;
1080 QStringList isciiCodecs;
1081 QStringList ibmCodecs;
1082 QStringList otherCodecs;
1083 QStringList allCodecs;
1085 const auto mibs = QTextCodec::availableMibs();
1086 for (
const int mib : mibs) {
1087 const QString codecName = QString::fromUtf8(QTextCodec::codecForMib(mib)->name());
1089 if (!allCodecs.contains(codecName))
1090 allCodecs.append(codecName);
1094 if (codecName.startsWith(QLatin1String(
"ISO")))
1095 isoCodecs.append(codecName);
1096 else if (codecName.startsWith(QLatin1String(
"UTF")))
1097 utfCodecs.append(codecName);
1098 else if (codecName.startsWith(QLatin1String(
"windows")))
1099 windowsCodecs.append(codecName);
1100 else if (codecName.startsWith(QLatin1String(
"Iscii")))
1101 isciiCodecs.append(codecName);
1102 else if (codecName.startsWith(QLatin1String(
"IBM")))
1103 ibmCodecs.append(codecName);
1105 otherCodecs.append(codecName);
1108 if (!menu->isEmpty())
1109 menu->addSeparator();
1111 createEncodingSubMenu(
QSL(
"ISO"), isoCodecs, menu);
1112 createEncodingSubMenu(
QSL(
"UTF"), utfCodecs, menu);
1113 createEncodingSubMenu(
QSL(
"Windows"), windowsCodecs, menu);
1114 createEncodingSubMenu(
QSL(
"Iscii"), isciiCodecs, menu);
1115 createEncodingSubMenu(
QSL(
"IBM"), ibmCodecs, menu);
1116 createEncodingSubMenu(tr(
"Other"), otherCodecs, menu);
1121 for (QAction *
action : actions) {
1135void BrowserWindow::webSearch()
1141void BrowserWindow::searchOnPage()
1144 const QString searchText =
weView()->
page()->selectedText();
1145 if (!searchText.contains(
QL1C(
'\n'))) {
1153void BrowserWindow::openFile()
1155 const QString fileTypes =
QSL(
"%1(*.html *.htm *.shtml *.shtm *.xhtml);;"
1156 "%2(*.png *.jpg *.jpeg *.bmp *.gif *.svg *.tiff);;"
1158 "%4(*.*)").arg(tr(
"HTML files"), tr(
"Image files"), tr(
"Text files"), tr(
"All files"));
1160 const QString filePath =
QzTools::getOpenFileName(
QSL(
"MainWindow-openFile"),
this, tr(
"Open file..."), QDir::homePath(), fileTypes);
1162 if (!filePath.isEmpty()) {
1167void BrowserWindow::openLocation()
1169 if (isFullScreen()) {
1179 return m_navigationContainer->isVisible();
1184 if (m_htmlFullScreenView)
1187 if (m_hideNavigationTimer->isActive()) {
1188 m_hideNavigationTimer->stop();
1191 m_navigationContainer->show();
1199 if (!m_hideNavigationTimer->isActive()) {
1200 m_hideNavigationTimer->start();
1204void BrowserWindow::hideNavigationSlot()
1207 bool mouseInView = view && view->underMouse();
1209 if (isFullScreen() && mouseInView) {
1210 m_navigationContainer->hide();
1214bool BrowserWindow::event(QEvent *event)
1216 if (event->type() == QEvent::WindowStateChange) {
1217 auto *e =
static_cast<QWindowStateChangeEvent*
>(event);
1218 if (!(e->oldState() & Qt::WindowFullScreen) && windowState() & Qt::WindowFullScreen) {
1220 m_statusBarVisible = m_statusBar->isVisible();
1222 m_menuBarVisible = menuBar()->isVisible();
1225 m_statusBar->hide();
1227 m_navigationContainer->hide();
1233 else if (e->oldState() & Qt::WindowFullScreen && !(windowState() & Qt::WindowFullScreen)) {
1235 m_statusBar->setVisible(m_statusBarVisible);
1237 menuBar()->setVisible(m_menuBarVisible);
1240 m_navigationContainer->show();
1243 m_htmlFullScreenView =
nullptr;
1246 if (m_hideNavigationTimer) {
1247 m_hideNavigationTimer->stop();
1251 return QMainWindow::event(event);
1254void BrowserWindow::resizeEvent(QResizeEvent* event)
1256 m_bookmarksToolbar->setMaximumWidth(width());
1258 QMainWindow::resizeEvent(event);
1261void BrowserWindow::keyPressEvent(QKeyEvent* event)
1270 switch (event->key()) {
1278 case Qt::Key_Forward:
1292 case Qt::Key_Reload:
1293 case Qt::Key_Refresh:
1300 case Qt::Key_HomePage:
1305 case Qt::Key_Favorites:
1306 mApp->browsingLibrary()->showBookmarks(
this);
1310 case Qt::Key_Search:
1316 case Qt::Key_OpenUrl:
1321 case Qt::Key_History:
1326 case Qt::Key_AddFavorite:
1332 action(
QSL(
"Standard/Preferences"))->trigger();
1337 if (event->modifiers() == Qt::ControlModifier) {
1338 static_cast<QObject*
>(m_tabWidget)->event(event);
1342 case Qt::Key_Backtab:
1343 if (event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier)) {
1344 static_cast<QObject*
>(m_tabWidget)->event(event);
1348 case Qt::Key_PageDown:
1349 if (event->modifiers() == Qt::ControlModifier) {
1355 case Qt::Key_PageUp:
1356 if (event->modifiers() == Qt::ControlModifier) {
1363 if (view && event->modifiers() == Qt::ControlModifier) {
1370 if (event->modifiers() == Qt::ControlModifier) {
1371 action(
QSL(
"Tools/SiteInfo"))->trigger();
1377 if (event->modifiers() == Qt::ControlModifier) {
1378 action(
QSL(
"View/PageSource"))->trigger();
1384 if (event->modifiers() == Qt::ControlModifier) {
1391 if (m_useSingleKeyShortcuts) {
1430 if (event->modifiers() & Qt::AltModifier && m_useTabNumberShortcuts) {
1432 number = m_tabWidget->
count();
1438 if (event->modifiers() & Qt::ControlModifier && m_useSpeedDialNumberShortcuts) {
1439 const QUrl url =
mApp->plugins()->speedDial()->urlForShortcut(number - 1);
1440 if (url.isValid()) {
1446 if (event->modifiers() == Qt::NoModifier && m_useSingleKeyShortcuts) {
1454 QMainWindow::keyPressEvent(event);
1457void BrowserWindow::keyReleaseEvent(QKeyEvent* event)
1463 switch (event->key()) {
1465 if (event->modifiers() == Qt::ControlModifier) {
1475 QMainWindow::keyReleaseEvent(event);
1478void BrowserWindow::closeEvent(QCloseEvent* event)
1480 if (
mApp->isClosing()) {
1486 bool askOnClose = settings.
value(
QSL(
"Browser-Tabs-Settings/AskOnClosing"),
true).toBool();
1494 dialog.setDefaultButton(QMessageBox::No);
1497 dialog.setText(tr(
"There are still %n open tabs and your session won't be stored.\nAre you sure you want to close this window?",
"", m_tabWidget->
count()));
1498 dialog.setCheckBoxText(tr(
"Don't ask again"));
1499 dialog.setWindowTitle(tr(
"There are still open tabs"));
1500 dialog.setIcon(QMessageBox::Warning);
1502 if (dialog.exec() != QMessageBox::Yes) {
1507 if (dialog.isChecked()) {
1508 settings.
setValue(
QSL(
"Browser-Tabs-Settings/AskOnClosing"),
false);
1515 mApp->closedWindowsManager()->saveWindow(
this);
1518 if (
mApp->windowCount() == 1)
1519 mApp->quitApplication();
1525void BrowserWindow::closeWindow()
1532 if (
mApp->windowCount() > 1) {
1537void BrowserWindow::saveSettings()
1539 if (
mApp->isPrivate()) {
1545 settings.
setValue(
QSL(
"WindowGeometry"), saveGeometry());
1547 const auto state = saveUiState();
1548 for (
auto it =
state.constBegin(); it !=
state.constEnd(); ++it) {
1549 settings.
setValue(it.key(), it.value());
1555void BrowserWindow::closeTab()
1564static xcb_connection_t *getXcbConnection()
1566 const QNativeInterface::QX11Application *x11App = qApp->nativeInterface<QNativeInterface::QX11Application>();
1567 if (x11App ==
nullptr)
1569 return x11App->connection();
1572int BrowserWindow::getCurrentVirtualDesktop()
const
1574 if (QGuiApplication::platformName() !=
QL1S(
"xcb"))
1577 xcb_connection_t *connection = getXcbConnection();
1578 if (connection ==
nullptr)
1581 xcb_intern_atom_cookie_t intern_atom;
1582 xcb_intern_atom_reply_t *atom_reply =
nullptr;
1584 xcb_get_property_cookie_t cookie;
1585 xcb_get_property_reply_t *reply =
nullptr;
1588 intern_atom = xcb_intern_atom(connection,
false, qstrlen(
"_NET_WM_DESKTOP"),
"_NET_WM_DESKTOP");
1589 atom_reply = xcb_intern_atom_reply(connection, intern_atom,
nullptr);
1594 atom = atom_reply->atom;
1596 cookie = xcb_get_property(connection,
false, winId(), atom, XCB_ATOM_CARDINAL, 0, 1);
1597 reply = xcb_get_property_reply(connection, cookie,
nullptr);
1599 if (!reply || reply->type != XCB_ATOM_CARDINAL || reply->value_len != 1 || reply->format !=
sizeof(uint32_t) * 8)
1602 value = *
reinterpret_cast<uint32_t*
>(xcb_get_property_value(reply));
1614void BrowserWindow::moveToVirtualDesktop(
int desktopId)
1616 if (QGuiApplication::platformName() !=
QL1S(
"xcb"))
1623 xcb_connection_t *connection = getXcbConnection();
1624 if (connection ==
nullptr)
1627 xcb_intern_atom_cookie_t intern_atom;
1628 xcb_intern_atom_reply_t *atom_reply =
nullptr;
1631 intern_atom = xcb_intern_atom(connection,
false, qstrlen(
"_NET_WM_DESKTOP"),
"_NET_WM_DESKTOP");
1632 atom_reply = xcb_intern_atom_reply(connection, intern_atom,
nullptr);
1637 atom = atom_reply->atom;
1639 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, winId(), atom,
1640 XCB_ATOM_CARDINAL, 32, 1, (
const void*) &desktopId);
QDataStream & operator>>(QDataStream &stream, BrowserWindow::SavedWindow &window)
QDataStream & operator<<(QDataStream &stream, const BrowserWindow::SavedWindow &window)
Qz::BrowserWindowType windowType() const
void toggleShowBookmarksToolbar()
void setStartPage(WebPage *page)
QAction * action(const QString &name) const
TabMruModel * tabMruModel() const
void removeActions(const QList< QAction * > &actions)
bool fullScreenNavigationVisible() const
void toggleTabsOnTop(bool enable)
TabWidget * tabWidget() const
void setStartTab(WebTab *tab)
void updateLoadingActions()
void showSource(WebView *view=nullptr)
void createSidebarsMenu(QMenu *menu)
void toggleShowStatusBar()
void showNavigationWithFullScreen()
LocationBar * locationBar() const
void requestHtmlFullScreen(TabbedWebView *view, bool enable)
void showHistoryManager()
void addDeleteOnCloseWidget(QWidget *widget)
NavigationBar * navigationBar() const
~BrowserWindow() override
void addBookmark(const QUrl &url, const QString &title)
void toggleWebInspector()
SideBarManager * sideBarManager() const
QMenu * superMenu() const
TabModel * tabModel() const
void loadAddress(const QUrl &url)
void toggleShowNavigationToolbar()
void saveSideBarSettings()
void loadActionUrl(QObject *obj=nullptr)
StatusBar * statusBar() const
void createEncodingMenu(QMenu *menu)
TabbedWebView * weView() const
void createToolbarsMenu(QMenu *menu)
void loadActionUrlInNewTab(QObject *obj=nullptr)
BookmarksToolbar * bookmarksToolbar() const
void setWindowTitle(const QString &t)
void hideNavigationWithFullScreen()
BrowserWindow(Qz::BrowserWindowType type, const QUrl &url=QUrl())
void restoreWindow(const SavedWindow &window)
void restoreClosedWindow()
void ensureVisible(int index=-1, int xmargin=-1)
static QString convertUrlToText(const QUrl &url)
QAction * action(const QString &name) const
void initSuperMenu(QMenu *superMenu) const
void setWindow(BrowserWindow *window)
void initMenuBar(QMenuBar *menuBar) const
WebSearchBar * webSearchBar()
void setSplitterSizes(int locationBar, int websearchBar)
void setSuperMenuVisible(bool visible)
void setCurrentView(TabbedWebView *view)
void addToolButton(AbstractButtonInterface *button)
void addWidget(QWidget *widget)
void toggleTabsOnTop(bool enable)
void setTabBar(TabBar *tabBar)
void beginGroup(const QString &prefix)
bool contains(const QString &key) const
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
QString activeSideBar() const
void createMenu(QMenu *menu)
void showSideBar(const QString &id, bool toggle=true)
void addButton(AbstractButtonInterface *button)
void setPage(WebPage *page)
void showWebInspector(bool inspectElement=false)
bool isCurrentTab() const
void toggleWebInspector()
QString title(bool allowEmpty=false) const
void showSearchToolBar(const QString &searchText=QString())
int loadingProgress() const
void load(const QUrl &url)
QString title(bool allowEmpty=false) const
int value(const QColor &c)
@ NT_CleanSelectedTabAtTheEnd
QByteArray windowGeometry
QVector< WebTab::SavedTab > tabs
QHash< QString, QVariant > windowUiState