mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-17 20:50:34 +01:00
Update SingleApplication to latest upstream sources
This commit is contained in:
@@ -1,6 +1,54 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
__3.0.18__
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Fallback to standard QApplication class on iOS and Android systems where
|
||||||
|
the library is not supported.
|
||||||
|
|
||||||
|
* Added Build CI tests to verify the library builds successfully on Linux, Windows and MacOS across multiple Qt versions.
|
||||||
|
|
||||||
|
_Anton Filimonov_
|
||||||
|
|
||||||
|
__3.0.17__
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Fixed compilation warning/error caused by `geteuid()` on unix based systems.
|
||||||
|
|
||||||
|
_Iakov Kirilenko_
|
||||||
|
|
||||||
|
* Added CMake support
|
||||||
|
|
||||||
|
_Hennadii Chernyshchyk_
|
||||||
|
|
||||||
|
__3.0.16__
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Use geteuid and getpwuid to get username on Unix, fallback to environment variable.
|
||||||
|
|
||||||
|
_Jonas Kvinge_
|
||||||
|
|
||||||
|
__3.0.15__
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Bug Fix: sendMessage() might return false even though data was actually written.
|
||||||
|
|
||||||
|
_Jonas Kvinge_
|
||||||
|
|
||||||
|
__3.0.14__
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Fixed uninitialised variables in the `SingleApplicationPrivate` constructor.
|
||||||
|
|
||||||
|
__3.0.13a__
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Process socket events asynchronously
|
||||||
|
* Fix undefined variable error on Windows
|
||||||
|
|
||||||
|
_Francis Giraldeau_
|
||||||
|
|
||||||
__3.0.12a__
|
__3.0.12a__
|
||||||
----------
|
----------
|
||||||
|
|
||||||
@@ -113,7 +161,7 @@ __3.0.1a__
|
|||||||
__v3.0a__
|
__v3.0a__
|
||||||
---------
|
---------
|
||||||
|
|
||||||
* Depricated secondary instances count.
|
* Deprecated secondary instances count.
|
||||||
* Added a sendMessage() method to send a message to the primary instance.
|
* Added a sendMessage() method to send a message to the primary instance.
|
||||||
* Added a receivedMessage() signal, emitted when a message is received from a
|
* Added a receivedMessage() signal, emitted when a message is received from a
|
||||||
secondary instance.
|
secondary instance.
|
||||||
|
|||||||
43
SingleApplication/CMakeLists.txt
Normal file
43
SingleApplication/CMakeLists.txt
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.1.0)
|
||||||
|
|
||||||
|
project(SingleApplication)
|
||||||
|
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
|
||||||
|
# SingleApplication base class
|
||||||
|
set(QAPPLICATION_CLASS QCoreApplication CACHE STRING "Inheritance class for SingleApplication")
|
||||||
|
set_property(CACHE QAPPLICATION_CLASS PROPERTY STRINGS QApplication QGuiApplication QCoreApplication)
|
||||||
|
|
||||||
|
# Libary target
|
||||||
|
add_library(${PROJECT_NAME} STATIC
|
||||||
|
singleapplication.cpp
|
||||||
|
singleapplication_p.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
# Find dependencies
|
||||||
|
find_package(Qt5Network)
|
||||||
|
if(QAPPLICATION_CLASS STREQUAL QApplication)
|
||||||
|
find_package(Qt5 COMPONENTS Widgets REQUIRED)
|
||||||
|
elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication)
|
||||||
|
find_package(Qt5 COMPONENTS Gui REQUIRED)
|
||||||
|
else()
|
||||||
|
find_package(Qt5 COMPONENTS Core REQUIRED)
|
||||||
|
endif()
|
||||||
|
add_compile_definitions(QAPPLICATION_CLASS=${QAPPLICATION_CLASS})
|
||||||
|
|
||||||
|
# Link dependencies
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Network)
|
||||||
|
if(QAPPLICATION_CLASS STREQUAL QApplication)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)
|
||||||
|
elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Gui)
|
||||||
|
else()
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE advapi32)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
@@ -50,15 +50,27 @@ how:
|
|||||||
git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication
|
git submodule add git@github.com:itay-grudev/SingleApplication.git singleapplication
|
||||||
```
|
```
|
||||||
|
|
||||||
Then include the `singleapplication.pri` file in your `.pro` project file. Also
|
**Qmake:**
|
||||||
don't forget to specify which `QCoreApplication` class your app is using if it
|
|
||||||
is not `QCoreApplication`.
|
Then include the `singleapplication.pri` file in your `.pro` project file.
|
||||||
|
|
||||||
```qmake
|
```qmake
|
||||||
include(singleapplication/singleapplication.pri)
|
include(singleapplication/singleapplication.pri)
|
||||||
DEFINES += QAPPLICATION_CLASS=QApplication
|
DEFINES += QAPPLICATION_CLASS=QApplication
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**CMake:**
|
||||||
|
|
||||||
|
Then include the subdirectory in your `CMakeLists.txt` project file.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication")
|
||||||
|
add_subdirectory(src/third-party/singleapplication)
|
||||||
|
```
|
||||||
|
|
||||||
|
Also don't forget to specify which `QCoreApplication` class your app is using if it
|
||||||
|
is not `QCoreApplication` as in examples above.
|
||||||
|
|
||||||
The `Instance Started` signal
|
The `Instance Started` signal
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Here is an example:
|
|||||||
```cpp
|
```cpp
|
||||||
if( app.isSecondary() ) {
|
if( app.isSecondary() ) {
|
||||||
// This API requires LIBS += User32.lib to be added to the project
|
// This API requires LIBS += User32.lib to be added to the project
|
||||||
AllowSetForegroundWindow( DWORD( app.getPrimaryPid() ) );
|
AllowSetForegroundWindow( DWORD( app.primaryPid() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( app.isPrimary() ) {
|
if( app.isPrimary() ) {
|
||||||
|
|||||||
@@ -41,6 +41,13 @@ SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSeconda
|
|||||||
{
|
{
|
||||||
Q_D(SingleApplication);
|
Q_D(SingleApplication);
|
||||||
|
|
||||||
|
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
|
||||||
|
// On Android and iOS since the library is not supported fallback to
|
||||||
|
// standard QApplication behaviour by simply returning at this point.
|
||||||
|
qWarning() << "SingleApplication is not supported on Android and iOS systems.";
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Store the current mode of the program
|
// Store the current mode of the program
|
||||||
d->options = options;
|
d->options = options;
|
||||||
|
|
||||||
@@ -168,7 +175,7 @@ bool SingleApplication::sendMessage( QByteArray message, int timeout )
|
|||||||
d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect );
|
d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect );
|
||||||
|
|
||||||
d->socket->write( message );
|
d->socket->write( message );
|
||||||
bool dataWritten = d->socket->flush();
|
bool dataWritten = d->socket->waitForBytesWritten( timeout );
|
||||||
d->socket->waitForBytesWritten( timeout );
|
d->socket->flush();
|
||||||
return dataWritten;
|
return dataWritten;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
class SingleApplicationPrivate;
|
class SingleApplicationPrivate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The SingleApplication class handles multipe instances of the same
|
* @brief The SingleApplication class handles multiple instances of the same
|
||||||
* Application
|
* Application
|
||||||
* @see QCoreApplication
|
* @see QCoreApplication
|
||||||
*/
|
*/
|
||||||
@@ -74,7 +74,7 @@ public:
|
|||||||
* if there is already a primary instance.
|
* if there is already a primary instance.
|
||||||
* @arg {Mode} mode - Whether for the SingleApplication block to be applied
|
* @arg {Mode} mode - Whether for the SingleApplication block to be applied
|
||||||
* User wide or System wide.
|
* User wide or System wide.
|
||||||
* @arg {int} timeout - Timeout to wait in miliseconds.
|
* @arg {int} timeout - Timeout to wait in milliseconds.
|
||||||
* @note argc and argv may be changed as Qt removes arguments that it
|
* @note argc and argv may be changed as Qt removes arguments that it
|
||||||
* recognizes
|
* recognizes
|
||||||
* @note Mode::SecondaryNotification only works if set on both the primary
|
* @note Mode::SecondaryNotification only works if set on both the primary
|
||||||
|
|||||||
@@ -33,11 +33,8 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
#include <QtCore/QDir>
|
#include <QtCore/QDir>
|
||||||
#include <QtCore/QProcess>
|
|
||||||
#include <QtCore/QByteArray>
|
#include <QtCore/QByteArray>
|
||||||
#include <QtCore/QSemaphore>
|
|
||||||
#include <QtCore/QDataStream>
|
#include <QtCore/QDataStream>
|
||||||
#include <QtCore/QStandardPaths>
|
|
||||||
#include <QtCore/QCryptographicHash>
|
#include <QtCore/QCryptographicHash>
|
||||||
#include <QtNetwork/QLocalServer>
|
#include <QtNetwork/QLocalServer>
|
||||||
#include <QtNetwork/QLocalSocket>
|
#include <QtNetwork/QLocalSocket>
|
||||||
@@ -45,6 +42,12 @@
|
|||||||
#include "singleapplication.h"
|
#include "singleapplication.h"
|
||||||
#include "singleapplication_p.h"
|
#include "singleapplication_p.h"
|
||||||
|
|
||||||
|
#ifdef Q_OS_UNIX
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <lmcons.h>
|
#include <lmcons.h>
|
||||||
@@ -55,6 +58,8 @@ SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr )
|
|||||||
{
|
{
|
||||||
server = nullptr;
|
server = nullptr;
|
||||||
socket = nullptr;
|
socket = nullptr;
|
||||||
|
memory = nullptr;
|
||||||
|
instanceNumber = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SingleApplicationPrivate::~SingleApplicationPrivate()
|
SingleApplicationPrivate::~SingleApplicationPrivate()
|
||||||
@@ -107,22 +112,20 @@ void SingleApplicationPrivate::genBlockServerName()
|
|||||||
if( GetUserNameW( username, &usernameLength ) ) {
|
if( GetUserNameW( username, &usernameLength ) ) {
|
||||||
appData.addData( QString::fromWCharArray(username).toUtf8() );
|
appData.addData( QString::fromWCharArray(username).toUtf8() );
|
||||||
} else {
|
} else {
|
||||||
appData.addData( QStandardPaths::standardLocations( QStandardPaths::HomeLocation ).join("").toUtf8() );
|
appData.addData( qgetenv("USERNAME") );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef Q_OS_UNIX
|
#ifdef Q_OS_UNIX
|
||||||
QProcess process;
|
QByteArray username;
|
||||||
process.start( "whoami" );
|
uid_t uid = geteuid();
|
||||||
if( process.waitForFinished( 100 ) &&
|
struct passwd *pw = getpwuid(uid);
|
||||||
process.exitCode() == QProcess::NormalExit) {
|
if( pw ) {
|
||||||
appData.addData( process.readLine() );
|
username = pw->pw_name;
|
||||||
} else {
|
|
||||||
appData.addData(
|
|
||||||
QDir(
|
|
||||||
QStandardPaths::standardLocations( QStandardPaths::HomeLocation ).first()
|
|
||||||
).absolutePath().toUtf8()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
if( username.isEmpty() ) {
|
||||||
|
username = qgetenv("USER");
|
||||||
|
}
|
||||||
|
appData.addData(username);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -385,8 +388,7 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sock->bytesAvailable() > 0) {
|
if (sock->bytesAvailable() > 0) {
|
||||||
//This line crash
|
Q_EMIT this->slotDataAvailable( sock, instanceId );
|
||||||
//Q_EMIT this->slotDataAvailable( sock, instanceId );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user