From b103f297752b170ee4ade6e0e9085c6d31c020ca Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 18 Jul 2020 00:35:26 -0400 Subject: added --multiple to allow launching multiple instances --- src/singleinstance.h | 62 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 19 deletions(-) (limited to 'src/singleinstance.h') diff --git a/src/singleinstance.h b/src/singleinstance.h index 14d49d6d..5c7cdf85 100644 --- a/src/singleinstance.h +++ b/src/singleinstance.h @@ -27,8 +27,8 @@ along with Mod Organizer. If not, see . /** * used to ensure only a single instance of Mod Organizer is started and to - * allow secondary instances to send messages to the primary (visible) one. This way, - * secondary instances can start a download in the primary one + * allow ephemeral instances to send messages to the primary (visible) one. + * This way, other instances can start a download in the primary one **/ class SingleInstance : public QObject { @@ -36,24 +36,46 @@ class SingleInstance : public QObject Q_OBJECT public: + enum Flag + { + NoFlags = 0x00, - /** - * @brief constructor - * - * @param forcePrimary if true, this will be treated as the primary instance even - * if another instance is running. This is used after an update since - * the other instance is assumed to be in the process of quitting - * @param parent parent object - * @todo the forcePrimary parameter makes no sense. The second instance after an update - * needs to delete the files from before the update so the first instance needs to quit - * first anyway - **/ - explicit SingleInstance(bool forcePrimary, QObject *parent = 0); + + // when set, this will be treated as the primary instance even if + // another instance is running. This is used after an update since the + // other instance is assumed to be in the process of quitting + // + // todo: this makes no sense. The second instance after an update needs + // to delete the files from before the update so the first instance + // needs to quit first anyway + ForcePrimary = 0x01, + + // if another instance is running, run this one disconnected from the + // shared memory + AllowMultiple = 0x02 + }; + + using Flags = QFlags; + + + explicit SingleInstance(Flags flags, QObject *parent = 0); /** - * @return true if this is the primary instance (the one that gets to display a UI) + * @return true if this instance's job is to forward data to the primary + * instance through shared memory **/ - bool primaryInstance() const { return m_PrimaryInstance; } + bool ephemeral() const + { + return m_Ephemeral; + } + + // returns true if this is not the primary instance, but was allowed because + // of the AllowMultiple flag + // + bool secondary() const + { + return !m_Ephemeral && !m_OwnsSM; + } /** * send a message to the primary instance. This can be used to transmit download urls @@ -65,7 +87,7 @@ public: signals: /** - * @brief emitted when a secondary instance has sent a message (to us) + * @brief emitted when an ephemeral instance has sent a message (to us) * * @param message the message we received **/ @@ -78,11 +100,13 @@ private slots: void receiveMessage(); private: - - bool m_PrimaryInstance; + bool m_Ephemeral; + bool m_OwnsSM; QSharedMemory m_SharedMem; QLocalServer m_Server; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(SingleInstance::Flags); + #endif // SINGLEINSTANCE_H -- cgit v1.3.1