Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/slic3r/GUI/InstanceCheck.hpp')
-rw-r--r--src/slic3r/GUI/InstanceCheck.hpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/slic3r/GUI/InstanceCheck.hpp b/src/slic3r/GUI/InstanceCheck.hpp
new file mode 100644
index 000000000..9fb74b0a9
--- /dev/null
+++ b/src/slic3r/GUI/InstanceCheck.hpp
@@ -0,0 +1,101 @@
+#ifndef slic3r_InstanceCheck_hpp_
+#define slic3r_InstanceCheck_hpp_
+
+#include "Event.hpp"
+
+#if _WIN32
+#include <windows.h>
+#endif //_WIN32
+
+#include <string>
+
+#include <boost/filesystem.hpp>
+
+#if __linux__
+#include <boost/thread.hpp>
+#include <tbb/mutex.h>
+#include <condition_variable>
+#endif // __linux__
+
+
+namespace Slic3r {
+// checks for other running instances and sends them argv,
+// if there is --single-instance argument or AppConfig is set to single_instance=1
+// returns true if this instance should terminate
+bool instance_check(int argc, char** argv, bool app_config_single_instance);
+
+#if __APPLE__
+// apple implementation of inner functions of instance_check
+// in InstanceCheckMac.mm
+void send_message_mac(const std::string& msg, const std::string& version);
+
+bool unlock_lockfile(const std::string& name, const std::string& path);
+#endif //__APPLE__
+
+namespace GUI {
+
+class MainFrame;
+
+#if __linux__
+ #define BACKGROUND_MESSAGE_LISTENER
+#endif // __linux__
+
+using LoadFromOtherInstanceEvent = Event<std::vector<boost::filesystem::path>>;
+wxDECLARE_EVENT(EVT_LOAD_MODEL_OTHER_INSTANCE, LoadFromOtherInstanceEvent);
+
+using InstanceGoToFrontEvent = SimpleEvent;
+wxDECLARE_EVENT(EVT_INSTANCE_GO_TO_FRONT, InstanceGoToFrontEvent);
+
+class OtherInstanceMessageHandler
+{
+public:
+ OtherInstanceMessageHandler() = default;
+ OtherInstanceMessageHandler(OtherInstanceMessageHandler const&) = delete;
+ void operator=(OtherInstanceMessageHandler const&) = delete;
+ ~OtherInstanceMessageHandler() { assert(!m_initialized); }
+
+ // inits listening, on each platform different. On linux starts background thread
+ void init(wxEvtHandler* callback_evt_handler);
+ // stops listening, on linux stops the background thread
+ void shutdown(MainFrame* main_frame);
+
+ //finds paths to models in message(= command line arguments, first should be prusaSlicer executable)
+ //and sends them to plater via LoadFromOtherInstanceEvent
+ //security of messages: from message all existing paths are proccesed to load model
+ // win32 - anybody who has hwnd can send message.
+ // mac - anybody who posts notification with name:@"OtherPrusaSlicerTerminating"
+ // linux - instrospectable on dbus
+ void handle_message(const std::string& message);
+#ifdef _WIN32
+ static void init_windows_properties(MainFrame* main_frame, size_t instance_hash);
+#endif //WIN32
+private:
+ bool m_initialized { false };
+ wxEvtHandler* m_callback_evt_handler { nullptr };
+
+#ifdef BACKGROUND_MESSAGE_LISTENER
+ //worker thread to listen incoming dbus communication
+ boost::thread m_thread;
+ std::condition_variable m_thread_stop_condition;
+ mutable std::mutex m_thread_stop_mutex;
+ bool m_stop{ false };
+ bool m_start{ true };
+
+ // background thread method
+ void listen();
+#endif //BACKGROUND_MESSAGE_LISTENER
+
+#if __APPLE__
+ //implemented at InstanceCheckMac.mm
+ void register_for_messages(const std::string &version_hash);
+ void unregister_for_messages();
+ // Opaque pointer to RemovableDriveManagerMM
+ void* m_impl_osx;
+public:
+ void bring_instance_forward();
+#endif //__APPLE__
+
+};
+} // namespace GUI
+} // namespace Slic3r
+#endif // slic3r_InstanceCheck_hpp_