From 3c9a597f7f80b3fcb750b54d67ecc4c3ddf40597 Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 25 Jan 2022 13:29:13 +0000 Subject: [PATCH] MPV: quick setup for load file menu action Signed-off-by: falkTX --- plugins/Cardinal/src/EmbedWidget.cpp | 9 +++++ plugins/Cardinal/src/EmbedWidget.hpp | 2 ++ plugins/Cardinal/src/MPV.cpp | 51 ++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/plugins/Cardinal/src/EmbedWidget.cpp b/plugins/Cardinal/src/EmbedWidget.cpp index ce54acd..2484a82 100644 --- a/plugins/Cardinal/src/EmbedWidget.cpp +++ b/plugins/Cardinal/src/EmbedWidget.cpp @@ -208,6 +208,15 @@ void EmbedWidget::hide() pData->hide(); } +uintptr_t EmbedWidget::getNativeWindowId() const +{ + #ifdef HAVE_X11 + return pData->window; + #else + return 0; + #endif +} + void EmbedWidget::step() { pData->step(getAbsoluteRect()); diff --git a/plugins/Cardinal/src/EmbedWidget.hpp b/plugins/Cardinal/src/EmbedWidget.hpp index 9369754..5bf2a52 100644 --- a/plugins/Cardinal/src/EmbedWidget.hpp +++ b/plugins/Cardinal/src/EmbedWidget.hpp @@ -29,6 +29,8 @@ struct EmbedWidget : Widget { void embedIntoRack(uintptr_t nativeWindowId); void hide(); + uintptr_t getNativeWindowId() const; + private: void draw(const DrawArgs&) override {} void step() override; diff --git a/plugins/Cardinal/src/MPV.cpp b/plugins/Cardinal/src/MPV.cpp index 76e3694..f9ca32f 100644 --- a/plugins/Cardinal/src/MPV.cpp +++ b/plugins/Cardinal/src/MPV.cpp @@ -16,9 +16,9 @@ */ #include "plugincontext.hpp" - #ifndef HEADLESS # include "EmbedWidget.hpp" +# include "extra/ExternalWindow.hpp" #endif // -------------------------------------------------------------------------------------------------------------------- @@ -54,7 +54,7 @@ struct CardinalEmbedModule : Module { // -------------------------------------------------------------------------------------------------------------------- #ifndef HEADLESS -struct CardinalEmbedWidget : ModuleWidget { +struct CardinalEmbedWidget : ModuleWidget, ExternalWindow { CardinalEmbedModule* const module; CardinalPluginContext* const pcontext; EmbedWidget* embedWidget = nullptr; @@ -62,6 +62,7 @@ struct CardinalEmbedWidget : ModuleWidget { CardinalEmbedWidget(CardinalEmbedModule* const m) : ModuleWidget(), + ExternalWindow(), module(m), pcontext(m != nullptr ? m->pcontext : nullptr) { @@ -75,6 +76,11 @@ struct CardinalEmbedWidget : ModuleWidget { } } + ~CardinalEmbedWidget() + { + terminateAndWaitForExternalProcess(); + } + void onContextCreate(const ContextCreateEvent& e) override { ModuleWidget::onContextCreate(e); @@ -121,6 +127,47 @@ struct CardinalEmbedWidget : ModuleWidget { isEmbed = false; embedWidget->hide(); } + + void appendContextMenu(ui::Menu* const menu) override + { + menu->addChild(new ui::MenuSeparator); + + struct LoadVideoFileItem : MenuItem { + CardinalEmbedWidget* const self; + + LoadVideoFileItem(CardinalEmbedWidget* const s) + : self(s) + { + text = "Load video file..."; + } + + void onAction(const event::Action&) override + { + WeakPtr const self = this->self; + async_dialog_filebrowser(false, nullptr, text.c_str(), [self](char* path) + { + if (path == nullptr) + return; + + if (self != nullptr) + { + char winIdStr[64]; + std::snprintf(winIdStr, sizeof(winIdStr), "--wid=%lu", + static_cast(self->embedWidget->getNativeWindowId())); + const char* args[] = { + "mpv", "--no-audio", winIdStr, path, nullptr + }; + self->terminateAndWaitForExternalProcess(); + self->startExternalProcess(args); + } + + std::free(path); + }); + } + }; + + menu->addChild(new LoadVideoFileItem(this)); + } }; #else typedef ModuleWidget CardinalEmbedWidget;