diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index a16d9916a6..8ad757f0d2 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -9,6 +9,7 @@ #ifdef _WIN32 #include + #include #include "libslic3r/AppConfig.hpp" #include #endif // _WIN32 @@ -24,6 +25,7 @@ #include #include #include +#include #include "libslic3r/Config.hpp" @@ -46,6 +48,35 @@ wxString format_nozzle_diameter(float diameter) return wxString::Format("%smm", wxString::FromDouble(diameter)); } +bool is_running_in_msix() +{ +#ifdef _WIN32 + // Null-buffer probe: returns ERROR_INSUFFICIENT_BUFFER when packaged, + // APPMODEL_ERROR_NO_PACKAGE when running unpackaged. + static const bool packaged = []() { + UINT32 length = 0; + return ::GetCurrentPackageFullName(&length, nullptr) != APPMODEL_ERROR_NO_PACKAGE; + }(); + return packaged; +#else + return false; +#endif +} + +void open_ms_store_product_page() +{ +#ifdef _WIN32 + UINT32 length = 0; + if (::GetCurrentPackageFamilyName(&length, nullptr) != ERROR_INSUFFICIENT_BUFFER) + return; + std::wstring family_name(length, L'\0'); + if (::GetCurrentPackageFamilyName(&length, family_name.data()) != ERROR_SUCCESS) + return; + family_name.resize(length > 0 ? length - 1 : 0); // drop the terminating null + wxLaunchDefaultBrowser(wxString(L"ms-windows-store://pdp/?PFN=") + family_name.c_str()); +#endif +} + CopyFileResult copy_file_gui(const std::string &from, const std::string &to, std::string& error_message, const bool with_check) { #ifdef WIN32 diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index e50c9254a9..d6767d3310 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -67,6 +67,10 @@ wxDECLARE_EVENT(EVT_VOLUME_DETACHED, VolumeDetachedEvent); wxTopLevelWindow* find_toplevel_parent(wxWindow *window); wxString format_nozzle_diameter(float diameter); +// True when running inside an MSIX package (Microsoft Store build); always false on non-Windows. +bool is_running_in_msix(); +// Opens the Microsoft Store product page for the current package. No-op when not packaged. +void open_ms_store_product_page(); void on_window_geometry(wxTopLevelWindow *tlw, std::function callback);