void RenderFrameBase::layoutWithFlattening(bool hasFixedWidth, bool hasFixedHeight) { FrameView* childFrameView = childView(); RenderView* childRoot = childFrameView ? childFrameView->frame().contentRenderer() : 0; if (!childRoot || !shouldExpandFrame(width(), height(), hasFixedWidth, hasFixedHeight)) { updateWidgetPosition(); if (childFrameView) childFrameView->layout(); clearNeedsLayout(); return; } // need to update to calculate min/max correctly updateWidgetPosition(); // if scrollbars are off, and the width or height are fixed // we obey them and do not expand. With frame flattening // no subframe much ever become scrollable. bool isScrollable = frameOwnerElement().scrollingMode() != ScrollbarAlwaysOff; // consider iframe inset border int hBorder = borderLeft() + borderRight(); int vBorder = borderTop() + borderBottom(); // make sure minimum preferred width is enforced if (isScrollable || !hasFixedWidth) { setWidth(std::max(width(), childRoot->minPreferredLogicalWidth() + hBorder)); // update again to pass the new width to the child frame updateWidgetPosition(); childFrameView->layout(); } // expand the frame by setting frame height = content height if (isScrollable || !hasFixedHeight || childRoot->isFrameSet()) setHeight(std::max<LayoutUnit>(height(), childFrameView->contentsHeight() + vBorder)); if (isScrollable || !hasFixedWidth || childRoot->isFrameSet()) setWidth(std::max<LayoutUnit>(width(), childFrameView->contentsWidth() + hBorder)); updateWidgetPosition(); ASSERT(!childFrameView->layoutPending()); ASSERT(!childRoot->needsLayout()); ASSERT(!childRoot->firstChild() || !childRoot->firstChild()->firstChildSlow() || !childRoot->firstChild()->firstChildSlow()->needsLayout()); clearNeedsLayout(); }
RenderView* RenderFrameBase::childRenderView() const { if (!childView()) return nullptr; return childView()->renderView(); }
DesktopWindow::DesktopWindow(int screenNum): View(Fm::FolderView::IconMode), proxyModel_(nullptr), model_(nullptr), wallpaperMode_(WallpaperNone), slideShowInterval_(0), wallpaperTimer_(nullptr), wallpaperRandomize_(false), fileLauncher_(nullptr), showWmMenu_(false), screenNum_(screenNum), relayoutTimer_(nullptr) { QDesktopWidget* desktopWidget = QApplication::desktop(); setWindowFlags(Qt::Window | Qt::FramelessWindowHint); setAttribute(Qt::WA_X11NetWmWindowTypeDesktop); setAttribute(Qt::WA_DeleteOnClose); // set our custom file launcher View::setFileLauncher(&fileLauncher_); listView_ = static_cast<Fm::FolderViewListView*>(childView()); listView_->setMovement(QListView::Snap); listView_->setResizeMode(QListView::Adjust); listView_->setFlow(QListView::TopToBottom); // This is to workaround Qt bug 54384 which affects Qt >= 5.6 // https://bugreports.qt.io/browse/QTBUG-54384 // Setting a QPixmap larger then the screen resolution to desktop's QPalette won't work. // So we make the viewport transparent by preventing its backround from being filled automatically. // Then we paint desktop's background ourselves by using its paint event handling method. listView_->viewport()->setAutoFillBackground(false); // NOTE: When XRnadR is in use, the all screens are actually combined to form a // large virtual desktop and only one DesktopWindow needs to be created and screenNum is -1. // In some older multihead setups, such as xinerama, every physical screen // is treated as a separate desktop so many instances of DesktopWindow may be created. // In this case we only want to show desktop icons on the primary screen. if(desktopWidget->isVirtualDesktop() || screenNum_ == desktopWidget->primaryScreen()) { loadItemPositions(); Settings& settings = static_cast<Application* >(qApp)->settings(); auto desktopPath = Fm::FilePath::fromLocalPath(XdgDir::readDesktopDir().toStdString().c_str()); model_ = Fm::CachedFolderModel::modelFromPath(desktopPath); folder_ = model_->folder(); proxyModel_ = new Fm::ProxyFolderModel(); proxyModel_->setSourceModel(model_); proxyModel_->setShowThumbnails(settings.showThumbnails()); proxyModel_->sort(settings.desktopSortColumn(), settings.desktopSortOrder()); proxyModel_->setFolderFirst(settings.desktopSortFolderFirst()); setModel(proxyModel_); connect(proxyModel_, &Fm::ProxyFolderModel::rowsInserted, this, &DesktopWindow::onRowsInserted); connect(proxyModel_, &Fm::ProxyFolderModel::rowsAboutToBeRemoved, this, &DesktopWindow::onRowsAboutToBeRemoved); connect(proxyModel_, &Fm::ProxyFolderModel::layoutChanged, this, &DesktopWindow::onLayoutChanged); connect(proxyModel_, &Fm::ProxyFolderModel::sortFilterChanged, this, &DesktopWindow::onModelSortFilterChanged); connect(proxyModel_, &Fm::ProxyFolderModel::dataChanged, this, &DesktopWindow::onDataChanged); connect(listView_, &QListView::indexesMoved, this, &DesktopWindow::onIndexesMoved); } // remove frame listView_->setFrameShape(QFrame::NoFrame); // inhibit scrollbars FIXME: this should be optional in the future listView_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); listView_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); connect(this, &DesktopWindow::openDirRequested, this, &DesktopWindow::onOpenDirRequested); listView_->installEventFilter(this); listView_->viewport()->installEventFilter(this); // setup shortcuts QShortcut* shortcut; shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_X), this); // cut connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onCutActivated); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_C), this); // copy connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onCopyActivated); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_V), this); // paste connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onPasteActivated); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_A), this); // select all connect(shortcut, &QShortcut::activated, this, &FolderView::selectAll); shortcut = new QShortcut(QKeySequence(Qt::Key_Delete), this); // delete connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onDeleteActivated); shortcut = new QShortcut(QKeySequence(Qt::Key_F2), this); // rename connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onRenameActivated); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F2), this); // bulk rename connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onBulkRenameActivated); shortcut = new QShortcut(QKeySequence(Qt::ALT + Qt::Key_Return), this); // properties connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onFilePropertiesActivated); shortcut = new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Delete), this); // force delete connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onDeleteActivated); }
DesktopWindow::DesktopWindow(int screenNum): View(Fm::FolderView::IconMode), proxyModel_(NULL), model_(NULL), folder_(NULL), wallpaperMode_(WallpaperNone), fileLauncher_(NULL), showWmMenu_(false), screenNum_(screenNum), relayoutTimer_(NULL) { QDesktopWidget* desktopWidget = QApplication::desktop(); setWindowFlags(Qt::Window | Qt::FramelessWindowHint); setAttribute(Qt::WA_X11NetWmWindowTypeDesktop); setAttribute(Qt::WA_DeleteOnClose); // set our custom file launcher View::setFileLauncher(&fileLauncher_); listView_ = static_cast<Fm::FolderViewListView*>(childView()); listView_->setMovement(QListView::Snap); listView_->setResizeMode(QListView::Adjust); listView_->setFlow(QListView::TopToBottom); // NOTE: When XRnadR is in use, the all screens are actually combined to form a // large virtual desktop and only one DesktopWindow needs to be created and screenNum is -1. // In some older multihead setups, such as xinerama, every physical screen // is treated as a separate desktop so many instances of DesktopWindow may be created. // In this case we only want to show desktop icons on the primary screen. if(desktopWidget->isVirtualDesktop() || screenNum_ == desktopWidget->primaryScreen()) { loadItemPositions(); Settings& settings = static_cast<Application* >(qApp)->settings(); model_ = Fm::CachedFolderModel::modelFromPath(fm_path_get_desktop()); folder_ = reinterpret_cast<FmFolder*>(g_object_ref(model_->folder())); proxyModel_ = new Fm::ProxyFolderModel(); proxyModel_->setSourceModel(model_); proxyModel_->setShowThumbnails(settings.showThumbnails()); proxyModel_->sort(settings.desktopSortColumn(), settings.desktopSortOrder()); proxyModel_->setFolderFirst(settings.desktopSortFolderFirst()); setModel(proxyModel_); connect(proxyModel_, &Fm::ProxyFolderModel::rowsInserted, this, &DesktopWindow::onRowsInserted); connect(proxyModel_, &Fm::ProxyFolderModel::rowsAboutToBeRemoved, this, &DesktopWindow::onRowsAboutToBeRemoved); connect(proxyModel_, &Fm::ProxyFolderModel::layoutChanged, this, &DesktopWindow::onLayoutChanged); connect(proxyModel_, &Fm::ProxyFolderModel::sortFilterChanged, this, &DesktopWindow::onModelSortFilterChanged); connect(listView_, &QListView::indexesMoved, this, &DesktopWindow::onIndexesMoved); } // set our own delegate delegate_ = new DesktopItemDelegate(listView_); listView_->setItemDelegateForColumn(Fm::FolderModel::ColumnFileName, delegate_); // remove frame listView_->setFrameShape(QFrame::NoFrame); // inhibit scrollbars FIXME: this should be optional in the future listView_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); listView_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); connect(this, &DesktopWindow::openDirRequested, this, &DesktopWindow::onOpenDirRequested); listView_->installEventFilter(this); // setup shortcuts QShortcut* shortcut; shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_X), this); // cut connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onCutActivated); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_C), this); // copy connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onCopyActivated); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_V), this); // paste connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onPasteActivated); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_A), this); // select all connect(shortcut, &QShortcut::activated, listView_, &QListView::selectAll); shortcut = new QShortcut(QKeySequence(Qt::Key_Delete), this); // delete connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onDeleteActivated); shortcut = new QShortcut(QKeySequence(Qt::Key_F2), this); // rename connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onRenameActivated); shortcut = new QShortcut(QKeySequence(Qt::ALT + Qt::Key_Return), this); // rename connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onFilePropertiesActivated); shortcut = new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Delete), this); // force delete connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onDeleteActivated); }