diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4eaccbe4..de7d1167d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,23 +83,28 @@ jobs: # Create install tree cmake --install app --prefix appdir/usr + # Process AppDir + /usr/local/linuxdeployqt-x86_64.AppImage \ + appdir/usr/share/applications/org.olivevideoeditor.Olive.desktop \ + -bundle-non-qt-libs \ + -executable=appdir/usr/bin/crashpad_handler \ + -executable=appdir/usr/bin/minidump_stackwalk \ + -executable=appdir/usr/bin/olive-crashhandler \ + --appimage-extract-and-run + # Dump Crashpad symbols - dump_syms app/olive-editor > olive-editor.sym - SYM_HEADER=($(head -n 1 olive-editor.sym)) # Read first line of symbol file - SYM_DIR=appdir/usr/share/olive-editor/symbols/olive-editor/${SYM_HEADER[3]} + dump_syms appdir/usr/bin/olive-editor > olive-editor.sym + # HACK: For some reason, minidump_stackwalk reads identifier as all 0s + SYM_DIR=appdir/usr/share/olive-editor/symbols/olive-editor/000000000000000000000000000000000 mkdir -p "$SYM_DIR" mv olive-editor.sym "$SYM_DIR" # Package AppImage - VERSION=${GITHUB_SHA::8} - export VERSION - /usr/local/linuxdeployqt-x86_64.AppImage \ - appdir/usr/share/applications/org.olivevideoeditor.Olive.desktop \ - -appimage \ - -executable=appdir/usr/bin/crashpad_handler \ - -executable=appdir/usr/bin/minidump_stackwalk \ - -executable=appdir/usr/bin/olive-crashhandler \ - --appimage-extract-and-run + $DOWNLOAD_TOOL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage + chmod +x appimagetool-x86_64.AppImage + VERSION=${GITHUB_SHA::8} ./appimagetool-x86_64.AppImage appdir --appimage-extract-and-run + + # Set env variables filename=$(echo Olive*.AppImage) pkgname="${filename/x86_64/Linux-x86_64}" mv "${filename}" "${pkgname}" @@ -316,7 +321,7 @@ jobs: working-directory: ${{ runner.workspace }}/build run: | brew install ninja - PATH=$DEP_LOCATION:$PATH \ + PATH=$DEP_LOCATION:$DEP_LOCATION/crashpad:$PATH \ cmake $GITHUB_WORKSPACE -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -G "${{ matrix.cmake-gen }}" -DCMAKE_INSTALL_PREFIX=$DEP_LOCATION - name: Build diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index 7b284725e..1107cdd60 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -371,15 +371,18 @@ void NodeViewItem::DrawNodeTitle(QPainter* painter, QString text, const QRectF& { QFontMetrics fm = painter->fontMetrics(); + painter->setRenderHint(QPainter::SmoothPixmapTransform); + // Draw right or down arrow based on expanded state int icon_size = fm.height() / 2; int icon_padding = title_bar_rect_.height() / 2 - icon_size / 2; int icon_full_size = icon_size + icon_padding * 2; const QIcon& expand_icon = IsExpanded() ? icon::TriDown : icon::TriRight; - expand_icon.paint(painter, QRect(title_bar_rect_.x() + icon_padding, - title_bar_rect_.y() + icon_padding, - icon_size, - icon_size)); + int icon_size_scaled = icon_size * painter->transform().m11(); + painter->drawPixmap(QRect(title_bar_rect_.x() + icon_padding, + title_bar_rect_.y() + icon_padding, + icon_size, + icon_size), expand_icon.pixmap(QSize(icon_size_scaled, icon_size_scaled))); // Calculate how much space we have for text int item_width = title_bar_rect_.width(); diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 89838fee9..69d81309c 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -50,9 +50,7 @@ MainWindow::MainWindow(QWidget *parent) : taskbar_interface_ = nullptr; #endif -#ifdef Q_OS_LINUX - checked_graphics_vendor_ = false; -#endif + first_show_ = true; // Create empty central widget - we don't actually want a central widget (so we set its maximum // size to 0,0) but some of Qt's docking/undocking fails without it @@ -635,10 +633,10 @@ void MainWindow::showEvent(QShowEvent *e) { QMainWindow::showEvent(e); - QMetaObject::invokeMethod(Core::instance(), "CheckForAutoRecoveries", Qt::QueuedConnection); + if (first_show_) { + QMetaObject::invokeMethod(Core::instance(), "CheckForAutoRecoveries", Qt::QueuedConnection); #ifdef Q_OS_LINUX - if (!checked_graphics_vendor_) { // Check for nouveau since that driver really doesn't work with Olive QOffscreenSurface surface; surface.create(); @@ -651,9 +649,9 @@ void MainWindow::showEvent(QShowEvent *e) QMetaObject::invokeMethod(this, "ShowNouveauWarning", Qt::QueuedConnection); } - checked_graphics_vendor_ = true; - } + first_show_ = false; #endif + } } template diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index 19760b8bf..68c34a01c 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -156,9 +156,7 @@ private: ITaskbarList3* taskbar_interface_; #endif -#ifdef Q_OS_LINUX - bool checked_graphics_vendor_; -#endif + bool first_show_; private slots: void FocusedPanelChanged(PanelWidget* panel); diff --git a/docker/scripts/build_crashpad.sh b/docker/scripts/build_crashpad.sh index f935966ba..843dd3754 100644 --- a/docker/scripts/build_crashpad.sh +++ b/docker/scripts/build_crashpad.sh @@ -78,5 +78,5 @@ cd breakpad fetch breakpad cd src ./configure --prefix="${OLIVE_INSTALL_PREFIX}" -make -make install -j$(nproc) +make -j$(nproc) +make install