diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..0e47c4546 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "pugixml"] + path = pugixml + url = https://github.com/zeux/pugixml.git +[submodule "SingleApplication"] + path = SingleApplication + url = https://github.com/itay-grudev/SingleApplication.git diff --git a/SingleApplication b/SingleApplication new file mode 160000 index 000000000..8c48163c4 --- /dev/null +++ b/SingleApplication @@ -0,0 +1 @@ +Subproject commit 8c48163c4d3fbba603cfe8a5b94046c9dad71825 diff --git a/SingleApplication/CHANGELOG.md b/SingleApplication/CHANGELOG.md deleted file mode 100644 index 1044c4c6e..000000000 --- a/SingleApplication/CHANGELOG.md +++ /dev/null @@ -1,298 +0,0 @@ -# Changelog - -## 3.5.1 - -* Bug Fix: Maximum QNativeIpcKey key size on macOS. - _Jonas Kvinge_ - -## 3.5.0 - -* Switch to the new QNativeIpcKey based QSharedMemory constructor with Qt 6.6 and higher. - _Jonas Kvinge_ - -## 3.4.1 - -* Improved Windows advapi32 link library dependency. - _Frederik Seiffert_ - -## 3.4.0 - -* Provide API for blocking sendMessage. - _Christoph Cullmann_ -* New documentation generation using Doxygen -* Improved Windows basic widget example -* Updated Project License - -## 3.3.4 - -* Fix compilation under Qt 6.2+ and stricter Qt compile settings. - _Christoph Cullmann_ - -## 3.3.3 - -* Support for Qt 6.3+ - Fixed deprecated `QCryptographicHash::addData()` that will only support `QByteArrayView` going further. - _Moody Liu_ - -## 3.3.2 - -* Fixed crash caused by sending a `writeAck` on a removed connection. - _Nicolas Werner_ - -## 3.3.1 - -* Added support for _AppImage_ dynamic executable paths. - _Michael Klein_ - -## 3.3.0 - -* Fixed message fragmentation issue causing crashes and incorrectly / inconsistently received messages. - _Nils Jeisecke_ - -## 3.2.0 - -* Added support for Qt 6 - _Jonas Kvinge_ -* Fixed warning in `Qt 5.9` with `min`/`max` functions on Windows - _Nick Korotysh_ -* Fix return value of connectToPrimary() when connect is successful - _Jonas Kvinge_ -* Fix build issue with MinGW GCC pedantic mode - _Iakov Kirilenko_ -* Fixed conversion from `int` to `quint32` and Clang Tidy warnings - _Hennadii Chernyshchyk_ - -## 3.1.5 - -* Improved library stability in edge cases and very rapid process initialisation -* Fixed Bug where the shared memory block may have been modified without a lock -* Fixed Bug causing `instanceStarted()` to not get emitted when a second instance - has been started before the primary has initiated it's `QLocalServer`. - -## 3.1.4 -* Officially supporting and build-testing against Qt 5.15 -* Fixed an MSVC C4996 warning that suggests using `strncpy_s`. - - _Hennadii Chernyshchyk_ - -## 3.1.3.1 -* CMake build system improvements -* Fixed Clang Tidy warnings - - _Hennadii Chernyshchyk_ - -## 3.1.3 -* Improved `CMakeLists.txt` - - _Hennadii Chernyshchyk_ - -## 3.1.2 - -* Fix a crash when exiting an application on Android and iOS - - _Emeric Grange_ - -## 3.1.1a - -* Added currentUser() method that returns the user the current instance is running as. - - _Leander Schulten_ - -## 3.1.0a - -* Added primaryUser() method that returns the user the primary instance is running as. - -## 3.0.19 - -* Fixed code warning for depricated functions in Qt 5.10 related to `QTime` and `qrand()`. - - _Hennadii Chernyshchyk_ - _Anton Filimonov_ - _Jonas Kvinge_ - -## 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 - -* Removed signal handling. - -## 3.0.11a - -* Fixed bug where the message sent by the second process was not received - correctly when the message is sent immediately following a connection. - - _Francis Giraldeau_ - -* Refactored code and implemented shared memory block consistency checks - via `qChecksum()` (CRC-16). -* Explicit `qWarning` and `qCritical` when the library is unable to initialise - correctly. - -## 3.0.10 - -* Removed C style casts and eliminated all clang warnings. Fixed `instanceId` - reading from only one byte in the message deserialization. Cleaned up - serialization code using `QDataStream`. Changed connection type to use - `quint8 enum` rather than `char`. -* Renamed `SingleAppConnectionType` to `ConnectionType`. Added initialization - values to all `ConnectionType` enum cases. - - _Jedidiah Buck McCready_ - -## 3.0.9 - -* Added SingleApplicationPrivate::primaryPid() as a solution to allow - bringing the primary window of an application to the foreground on - Windows. - - _Eelco van Dam from Peacs BV_ - -## 3.0.8 - -* Bug fix - changed QApplication::instance() to QCoreApplication::instance() - - _Evgeniy Bazhenov_ - -## 3.0.7a - -* Fixed compilation error with Mingw32 in MXE thanks to Vitaly Tonkacheyev. -* Removed QMutex used for thread safe behaviour. The implementation now uses - QCoreApplication::instance() to get an instance to SingleApplication for - memory deallocation. - -## 3.0.6a - -* Reverted GetUserName API usage on Windows. Fixed bug with missing library. -* Fixed bug in the Calculator example, preventing it's window to be raised - on Windows. - - Special thanks to Charles Gunawan. - -## 3.0.5a - -* Fixed a memory leak in the SingleApplicationPrivate destructor. - - _Sergei Moiseev_ - -## 3.0.4a - -* Fixed shadow and uninitialised variable warnings. - - _Paul Walmsley_ - -## 3.0.3a - -* Removed Microsoft Windows specific code for getting username due to - multiple problems and compiler differences on Windows platforms. On - Windows the shared memory block in User mode now includes the user's - home path (which contains the user's username). - -* Explicitly getting absolute path of the user's home directory as on Unix - a relative path (`~`) may be returned. - -## 3.0.2a - -* Fixed bug on Windows when username containing wide characters causes the - library to crash. - - _Le Liu_ - -## 3.0.1a - -* Allows the application path and version to be excluded from the server name - hash. The following flags were added for this purpose: - * `SingleApplication::Mode::ExcludeAppVersion` - * `SingleApplication::Mode::ExcludeAppPath` -* Allow a non elevated process to connect to a local server created by an - elevated process run by the same user on Windows -* Fixes a problem with upper case letters in paths on Windows - - _Le Liu_ - -## v3.0a - -* Deprecated secondary instances count. -* Added a sendMessage() method to send a message to the primary instance. -* Added a receivedMessage() signal, emitted when a message is received from a - secondary instance. -* The SingleApplication constructor's third parameter is now a bool - specifying if the current instance should be allowed to run as a secondary - instance if there is already a primary instance. -* The SingleApplication constructor accept a fourth parameter specifying if - the SingleApplication block should be User-wide or System-wide. -* SingleApplication no longer relies on `applicationName` and - `organizationName` to be set. It instead concatenates all of the following - data and computes a `SHA256` hash which is used as the key of the - `QSharedMemory` block and the `QLocalServer`. Since at least - `applicationFilePath` is always present there is no need to explicitly set - any of the following prior to initialising `SingleApplication`. - * `QCoreApplication::applicationName` - * `QCoreApplication::applicationVersion` - * `QCoreApplication::applicationFilePath` - * `QCoreApplication::organizationName` - * `QCoreApplication::organizationDomain` - * User name or home directory path if in User mode -* The primary instance is no longer notified when a secondary instance had - been started by default. A `Mode` flag for this feature exists. -* Added `instanceNumber()` which represents a unique identifier for each - secondary instance started. When called from the primary instance will - return `0`. - -## v2.4 - -* Stability improvements -* Support for secondary instances. -* The library now recovers safely after the primary process has crashed -and the shared memory had not been deleted. - -## v2.3 - -* Improved pimpl design and inheritance safety. - - _Vladislav Pyatnichenko_ - -## v2.2 - -* The `QAPPLICATION_CLASS` macro can now be defined in the file including the -Single Application header or with a `DEFINES+=` statement in the project file. - -## v2.1 - -* A race condition can no longer occur when starting two processes nearly - simultaneously. - - Fix issue [#3](https://github.com/itay-grudev/SingleApplication/issues/3) - -## v2.0 - -* SingleApplication is now being passed a reference to `argc` instead of a - copy. - - Fix issue [#1](https://github.com/itay-grudev/SingleApplication/issues/1) - -* Improved documentation. diff --git a/SingleApplication/CMakeLists.txt b/SingleApplication/CMakeLists.txt deleted file mode 100644 index c9771e155..000000000 --- a/SingleApplication/CMakeLists.txt +++ /dev/null @@ -1,85 +0,0 @@ -cmake_minimum_required(VERSION 3.12.0) - -project(SingleApplication LANGUAGES CXX DESCRIPTION "Replacement for QtSingleApplication") - -set(CMAKE_AUTOMOC ON) - -add_library(${PROJECT_NAME} STATIC - singleapplication.cpp - singleapplication_p.cpp -) -add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) - -if(NOT QT_DEFAULT_MAJOR_VERSION) - set(QT_DEFAULT_MAJOR_VERSION 5 CACHE STRING "Qt version to use (5 or 6), defaults to 5") -endif() - -# Find dependencies -set(QT_COMPONENTS Core Network) -set(QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Core Qt${QT_DEFAULT_MAJOR_VERSION}::Network) - -if(QAPPLICATION_CLASS STREQUAL QApplication) - list(APPEND QT_COMPONENTS Widgets) - list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Widgets) -elseif(QAPPLICATION_CLASS STREQUAL QGuiApplication) - list(APPEND QT_COMPONENTS Gui) - list(APPEND QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Gui) -else() - set(QAPPLICATION_CLASS QCoreApplication) -endif() - -find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS ${QT_COMPONENTS} REQUIRED) - -option(SINGLEAPPLICATION_DOCUMENTATION "Generate Doxygen documentation" OFF) -if(SINGLEAPPLICATION_DOCUMENTATION) - find_package(Doxygen) -endif() - -target_link_libraries(${PROJECT_NAME} PUBLIC ${QT_LIBRARIES}) - -if(WIN32) - find_library(advapi32_LIBRARY advapi32 REQUIRED) - mark_as_advanced(advapi32_LIBRARY) - target_link_libraries(${PROJECT_NAME} PRIVATE ${advapi32_LIBRARY}) -endif() - -target_compile_definitions(${PROJECT_NAME} PUBLIC QAPPLICATION_CLASS=${QAPPLICATION_CLASS}) -target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_compile_definitions(${PROJECT_NAME} PRIVATE - QT_NO_CAST_TO_ASCII - QT_NO_CAST_FROM_ASCII - QT_NO_URL_CAST_FROM_STRING - QT_NO_CAST_FROM_BYTEARRAY - QT_USE_QSTRINGBUILDER - QT_NO_NARROWING_CONVERSIONS_IN_CONNECT - QT_NO_KEYWORDS - QT_NO_FOREACH -) - -if(DOXYGEN_FOUND) - # Doxygen theme - include(FetchContent) - FetchContent_Declare(DoxygenAwesome - GIT_REPOSITORY https://github.com/jothepro/doxygen-awesome-css - GIT_TAG 4cd62308d825fe0396d2f66ffbab45d0e247724c # 2.0.3 - ) - FetchContent_MakeAvailable(DoxygenAwesome) - FetchContent_GetProperties(DoxygenAwesome SOURCE_DIR DoxygenAwesome_SOURCE_DIR) - - set(DOXYGEN_USE_MDFILE_AS_MAINPAGE README.md) - set(DOXYGEN_GENERATE_TREEVIEW YES) - set(DOXYGEN_HTML_HEADER ${DoxygenAwesome_SOURCE_DIR}/doxygen-custom/header.html) - set(DOXYGEN_HTML_EXTRA_STYLESHEET ${DoxygenAwesome_SOURCE_DIR}/doxygen-awesome.css) - set(DOXYGEN_HTML_EXTRA_FILES - ${DoxygenAwesome_SOURCE_DIR}/doxygen-awesome-fragment-copy-button.js - ${DoxygenAwesome_SOURCE_DIR}/doxygen-awesome-paragraph-link.js - ${DoxygenAwesome_SOURCE_DIR}/doxygen-awesome-darkmode-toggle.js - ) - - doxygen_add_docs(${PROJECT_NAME}Documentation - singleapplication.h - CHANGELOG.md - Windows.md - README.md - ) -endif() diff --git a/SingleApplication/LICENSE b/SingleApplication/LICENSE deleted file mode 100644 index 2062357fa..000000000 --- a/SingleApplication/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) Itay Grudev 2015 - 2023 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -Permission is not granted to use this software or any of the associated files -as sample data for the purposes of building machine learning models. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Note: Some of the examples include code not distributed under the terms of the -MIT License. diff --git a/SingleApplication/README.md b/SingleApplication/README.md deleted file mode 100644 index ece4de791..000000000 --- a/SingleApplication/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# SingleApplication - -[![CI](https://github.com/itay-grudev/SingleApplication/workflows/CI:%20Build%20Test/badge.svg)](https://github.com/itay-grudev/SingleApplication/actions) - -This is a replacement of the QtSingleApplication for `Qt5` and `Qt6`. - -Keeps the Primary Instance of your Application and kills each subsequent -instances. It can (if enabled) spawn secondary (non-related to the primary) -instances and can send data to the primary instance from secondary instances. - -# [Documentation](https://itay-grudev.github.io/SingleApplication/) - -You can find the full usage reference and examples [here](https://itay-grudev.github.io/SingleApplication/classSingleApplication.html). - -## Usage - -The `SingleApplication` class inherits from whatever `Q[Core|Gui]Application` -class you specify via the `QAPPLICATION_CLASS` macro (`QCoreApplication` is the -default). Further usage is similar to the use of the `Q[Core|Gui]Application` -classes. - -You can use the library as if you use any other `QCoreApplication` derived -class: - -```cpp -#include -#include - -int main( int argc, char* argv[] ) -{ - SingleApplication app( argc, argv ); - - return app.exec(); -} -``` - -To include the library files I would recommend that you add it as a git -submodule to your project. Here is how: - -```bash -git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplication -``` - -**Qmake:** - -Then include the `singleapplication.pri` file in your `.pro` project file. - -```qmake -include(singleapplication/singleapplication.pri) -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) -target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) -``` - -The library sets up a `QLocalServer` and a `QSharedMemory` block. The first -instance of your Application is your Primary Instance. It would check if the -shared memory block exists and if not it will start a `QLocalServer` and listen -for connections. Each subsequent instance of your application would check if the -shared memory block exists and if it does, it will connect to the QLocalServer -to notify the primary instance that a new instance had been started, after which -it would terminate with status code `0`. In the Primary Instance -`SingleApplication` would emit the `instanceStarted()` signal upon detecting -that a new instance had been started. - -The library uses `stdlib` to terminate the program with the `exit()` function. - -Also don't forget to specify which `QCoreApplication` class your app is using if it -is not `QCoreApplication` as in examples above. - -## Instance started signal - -The `SingleApplication` class implements a `instanceStarted()` signal. You can -bind to that signal to raise your application's window when a new instance had -been started, for example. - -```cpp -// window is a QWindow instance -QObject::connect( - &app, - &SingleApplication::instanceStarted, - &window, - &QWindow::raise -); -``` - -Using `SingleApplication::instance()` is a neat way to get the -`SingleApplication` instance for binding to it's signals anywhere in your -program. - -_Note:_ On Windows the ability to bring the application windows to the -foreground is restricted. See [Windows specific implementations](Windows.md) -for a workaround and an example implementation. - - -## Secondary Instances - -If you want to be able to launch additional Secondary Instances (not related to -your Primary Instance) you have to enable that with the third parameter of the -`SingleApplication` constructor. The default is `false` meaning no Secondary -Instances. Here is an example of how you would start a Secondary Instance send -a message with the command line arguments to the primary instance and then shut -down. - -```cpp -int main(int argc, char *argv[]) -{ - SingleApplication app( argc, argv, true ); - - if( app.isSecondary() ) { - app.sendMessage( app.arguments().join(' ')).toUtf8() ); - app.exit( 0 ); - } - - return app.exec(); -} -``` - -_Note:_ A secondary instance won't cause the emission of the -`instanceStarted()` signal by default. See `SingleApplication::Mode` for more -details.* - -You can check whether your instance is a primary or secondary with the following -methods: - -```cpp -app.isPrimary(); -// or -app.isSecondary(); -``` - -_Note:_ If your Primary Instance is terminated a newly launched instance -will replace the Primary one even if the Secondary flag has been set.* - -## Examples - -There are three examples provided in this repository: - -* Basic example that prevents a secondary instance from starting [`examples/basic`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/basic) -* An example of a graphical application raising it's parent window [`examples/calculator`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/calculator) -* A console application sending the primary instance it's command line parameters [`examples/sending_arguments`](https://github.com/itay-grudev/SingleApplication/tree/master/examples/sending_arguments) - -## Versioning - -Each major version introduces either very significant changes or is not -backwards compatible with the previous version. Minor versions only add -additional features, bug fixes or performance improvements and are backwards -compatible with the previous release. See [CHANGELOG.md](CHANGELOG.md) for -more details. - -## Implementation - -The library is implemented with a `QSharedMemory` block which is thread safe and -guarantees a race condition will not occur. It also uses a `QLocalSocket` to -notify the main process that a new instance had been spawned and thus invoke the -`instanceStarted()` signal and for messaging the primary instance. - -Additionally the library can recover from being forcefully killed on *nix -systems and will reset the memory block given that there are no other -instances running. - -## License - -This library and it's supporting documentation, with the exception of the Qt -calculator examples which is distributed under the BSD license, are released -under the terms of `The MIT License (MIT)` with an extra condition, that: - -```txt -Permission is not granted to use this software or any of the associated files -as sample data for the purposes of building machine learning models. -``` diff --git a/SingleApplication/SingleApplication b/SingleApplication/SingleApplication deleted file mode 100644 index 8ead1a428..000000000 --- a/SingleApplication/SingleApplication +++ /dev/null @@ -1 +0,0 @@ -#include "singleapplication.h" diff --git a/SingleApplication/Windows.md b/SingleApplication/Windows.md deleted file mode 100644 index 97bf72640..000000000 --- a/SingleApplication/Windows.md +++ /dev/null @@ -1,21 +0,0 @@ -# Windows Specifics - -## Setting the foreground window - -In the `instanceStarted()` example in the `README` we demonstrated how an -application can bring it's primary instance window whenever a second copy -of the application is started. - -On Windows the ability to bring the application windows to the foreground is -restricted, see [AllowSetForegroundWindow()](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632668.aspx) for more details. - -The background process (the primary instance) can bring its windows to the -foreground if it is allowed by the current foreground process (the secondary -instance). To bypass this `SingleApplication` must be initialized with the -`allowSecondary` parameter set to `true` . - -If the widget is minimized to Windows task bar, `QWidget::raise()` or -`QWidget::show()` can not bring it to the front, you have to use Windows API -`ShowWindow()` . - -You can find [demo code](examples/windows_raise_widget/main.cpp) in the examples directory. diff --git a/SingleApplication/examples/basic/CMakeLists.txt b/SingleApplication/examples/basic/CMakeLists.txt deleted file mode 100644 index c1429230c..000000000 --- a/SingleApplication/examples/basic/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.7.0) - -project(basic LANGUAGES CXX) - -# SingleApplication base class -set(QAPPLICATION_CLASS QCoreApplication) -add_subdirectory(../.. SingleApplication) - -add_executable(basic main.cpp) - -target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) - diff --git a/SingleApplication/examples/basic/basic.pro b/SingleApplication/examples/basic/basic.pro deleted file mode 100755 index b7af16cf6..000000000 --- a/SingleApplication/examples/basic/basic.pro +++ /dev/null @@ -1,5 +0,0 @@ -# Single Application implementation -include(../../singleapplication.pri) -DEFINES += QAPPLICATION_CLASS=QCoreApplication - -SOURCES += main.cpp diff --git a/SingleApplication/examples/basic/main.cpp b/SingleApplication/examples/basic/main.cpp deleted file mode 100755 index f5539f4f5..000000000 --- a/SingleApplication/examples/basic/main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Itay Grudev 2015 - 2023 -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// Permission is not granted to use this software or any of the associated files -// as sample data for the purposes of building machine learning models. -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#include - -int main(int argc, char *argv[]) -{ - SingleApplication app( argc, argv ); - - qWarning() << "Started a new instance"; - - return app.exec(); -} diff --git a/SingleApplication/examples/calculator/CMakeLists.txt b/SingleApplication/examples/calculator/CMakeLists.txt deleted file mode 100644 index 82305f047..000000000 --- a/SingleApplication/examples/calculator/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -cmake_minimum_required(VERSION 3.7.0) - -project(calculator LANGUAGES CXX) - -set(CMAKE_AUTOMOC ON) - -# SingleApplication base class -set(QAPPLICATION_CLASS QApplication) -add_subdirectory(../.. SingleApplication) - -find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED) - -add_executable(${PROJECT_NAME} - button.h - calculator.h - button.cpp - calculator.cpp - main.cpp -) - -target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) diff --git a/SingleApplication/examples/calculator/button.cpp b/SingleApplication/examples/calculator/button.cpp deleted file mode 100644 index d6cca0a07..000000000 --- a/SingleApplication/examples/calculator/button.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include "button.h" - -//! [0] -Button::Button(const QString &text, QWidget *parent) - : QToolButton(parent) -{ - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - setText(text); -} -//! [0] - -//! [1] -QSize Button::sizeHint() const -//! [1] //! [2] -{ - QSize size = QToolButton::sizeHint(); - size.rheight() += 20; - size.rwidth() = qMax(size.width(), size.height()); - return size; -} -//! [2] diff --git a/SingleApplication/examples/calculator/button.h b/SingleApplication/examples/calculator/button.h deleted file mode 100644 index 2c014c7b9..000000000 --- a/SingleApplication/examples/calculator/button.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef BUTTON_H -#define BUTTON_H - -#include - -//! [0] -class Button : public QToolButton -{ - Q_OBJECT - -public: - explicit Button(const QString &text, QWidget *parent = 0); - - QSize sizeHint() const Q_DECL_OVERRIDE; -}; -//! [0] - -#endif diff --git a/SingleApplication/examples/calculator/calculator.cpp b/SingleApplication/examples/calculator/calculator.cpp deleted file mode 100644 index 3d34c2a74..000000000 --- a/SingleApplication/examples/calculator/calculator.cpp +++ /dev/null @@ -1,406 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include - -#include "button.h" -#include "calculator.h" - -//! [0] -Calculator::Calculator(QWidget *parent) - : QWidget(parent) -{ - sumInMemory = 0.0; - sumSoFar = 0.0; - factorSoFar = 0.0; - waitingForOperand = true; -//! [0] - -//! [1] - display = new QLineEdit("0"); -//! [1] //! [2] - display->setReadOnly(true); - display->setAlignment(Qt::AlignRight); - display->setMaxLength(15); - - QFont font = display->font(); - font.setPointSize(font.pointSize() + 8); - display->setFont(font); -//! [2] - -//! [4] - for (int i = 0; i < NumDigitButtons; ++i) { - digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked())); - } - - Button *pointButton = createButton(".", SLOT(pointClicked())); - Button *changeSignButton = createButton("\302\261", SLOT(changeSignClicked())); - - Button *backspaceButton = createButton("Backspace", SLOT(backspaceClicked())); - Button *clearButton = createButton("Clear", SLOT(clear())); - Button *clearAllButton = createButton("Clear All", SLOT(clearAll())); - - Button *clearMemoryButton = createButton("MC", SLOT(clearMemory())); - Button *readMemoryButton = createButton("MR", SLOT(readMemory())); - Button *setMemoryButton = createButton("MS", SLOT(setMemory())); - Button *addToMemoryButton = createButton("M+", SLOT(addToMemory())); - - Button *divisionButton = createButton("\303\267", SLOT(multiplicativeOperatorClicked())); - Button *timesButton = createButton("\303\227", SLOT(multiplicativeOperatorClicked())); - Button *minusButton = createButton("-", SLOT(additiveOperatorClicked())); - Button *plusButton = createButton("+", SLOT(additiveOperatorClicked())); - - Button *squareRootButton = createButton("Sqrt", SLOT(unaryOperatorClicked())); - Button *powerButton = createButton("x\302\262", SLOT(unaryOperatorClicked())); - Button *reciprocalButton = createButton("1/x", SLOT(unaryOperatorClicked())); - Button *equalButton = createButton("=", SLOT(equalClicked())); -//! [4] - -//! [5] - QGridLayout *mainLayout = new QGridLayout; -//! [5] //! [6] - mainLayout->setSizeConstraint(QLayout::SetFixedSize); - mainLayout->addWidget(display, 0, 0, 1, 6); - mainLayout->addWidget(backspaceButton, 1, 0, 1, 2); - mainLayout->addWidget(clearButton, 1, 2, 1, 2); - mainLayout->addWidget(clearAllButton, 1, 4, 1, 2); - - mainLayout->addWidget(clearMemoryButton, 2, 0); - mainLayout->addWidget(readMemoryButton, 3, 0); - mainLayout->addWidget(setMemoryButton, 4, 0); - mainLayout->addWidget(addToMemoryButton, 5, 0); - - for (int i = 1; i < NumDigitButtons; ++i) { - int row = ((9 - i) / 3) + 2; - int column = ((i - 1) % 3) + 1; - mainLayout->addWidget(digitButtons[i], row, column); - } - - mainLayout->addWidget(digitButtons[0], 5, 1); - mainLayout->addWidget(pointButton, 5, 2); - mainLayout->addWidget(changeSignButton, 5, 3); - - mainLayout->addWidget(divisionButton, 2, 4); - mainLayout->addWidget(timesButton, 3, 4); - mainLayout->addWidget(minusButton, 4, 4); - mainLayout->addWidget(plusButton, 5, 4); - - mainLayout->addWidget(squareRootButton, 2, 5); - mainLayout->addWidget(powerButton, 3, 5); - mainLayout->addWidget(reciprocalButton, 4, 5); - mainLayout->addWidget(equalButton, 5, 5); - setLayout(mainLayout); - - setWindowTitle("Calculator"); -} -//! [6] - -//! [7] -void Calculator::digitClicked() -{ - Button *clickedButton = qobject_cast