diff --git a/3rd-parties/SingleApplication/CHANGELOG.md b/3rd-parties/SingleApplication/CHANGELOG.md deleted file mode 100644 index 9efd3fd..0000000 --- a/3rd-parties/SingleApplication/CHANGELOG.md +++ /dev/null @@ -1,224 +0,0 @@ -Changelog -========= - -__3.0.18__ ----------- - -* Fallback to standard QApplication class on iOS and Android systems where - the library is not supported. - -__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/3rd-parties/SingleApplication/CMakeLists.txt b/3rd-parties/SingleApplication/CMakeLists.txt deleted file mode 100644 index d619230..0000000 --- a/3rd-parties/SingleApplication/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -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}) diff --git a/3rd-parties/SingleApplication/LICENSE b/3rd-parties/SingleApplication/LICENSE deleted file mode 100644 index 85b2a14..0000000 --- a/3rd-parties/SingleApplication/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Itay Grudev 2015 - 2016 - -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: - -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/3rd-parties/SingleApplication/README.md b/3rd-parties/SingleApplication/README.md deleted file mode 100644 index 5d60986..0000000 --- a/3rd-parties/SingleApplication/README.md +++ /dev/null @@ -1,277 +0,0 @@ -SingleApplication -================= - -This is a replacement of the QtSingleApplication for `Qt5`. - -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. - -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. - -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. - -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 and include it's contents with a `.pri` file. Here is -how: - -```bash -git submodule add git@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) -``` - -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 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.* - -API ---- - -### Members - -```cpp -SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSecondary = false, Options options = Mode::User, int timeout = 100 ) -``` - -Depending on whether `allowSecondary` is set, this constructor may terminate -your app if there is already a primary instance running. Additional `Options` -can be specified to set whether the SingleApplication block should work -user-wide or system-wide. Additionally the `Mode::SecondaryNotification` may be -used to notify the primary instance whenever a secondary instance had been -started (disabled by default). `timeout` specifies the maximum time in -milliseconds to wait for blocking operations. - -*__Note:__ `argc` and `argv` may be changed as Qt removes arguments that it -recognizes.* - -*__Note:__ `Mode::SecondaryNotification` only works if set on both the primary -and the secondary instance.* - -*__Note:__ Operating system can restrict the shared memory blocks to the same -user, in which case the User/System modes will have no effect and the block will -be user wide.* - ---- - -```cpp -bool SingleApplication::sendMessage( QByteArray message, int timeout = 100 ) -``` - -Sends `message` to the Primary Instance. Uses `timeout` as a the maximum timeout -in milliseconds for blocking functions - ---- - -```cpp -bool SingleApplication::isPrimary() -``` - -Returns if the instance is the primary instance. - ---- - -```cpp -bool SingleApplication::isSecondary() -``` -Returns if the instance is a secondary instance. - ---- - -```cpp -quint32 SingleApplication::instanceId() -``` - -Returns a unique identifier for the current instance. - ---- - -```cpp -qint64 SingleApplication::primaryPid() -``` - -Returns the process ID (PID) of the primary instance. - -### Signals - -```cpp -void SingleApplication::instanceStarted() -``` - -Triggered whenever a new instance had been started, except for secondary -instances if the `Mode::SecondaryNotification` flag is not specified. - ---- - -```cpp -void SingleApplication::receivedMessage( quint32 instanceId, QByteArray message ) -``` - -Triggered whenever there is a message received from a secondary instance. - ---- - -### Flags - -```cpp -enum SingleApplication::Mode -``` - -* `Mode::User` - The SingleApplication block should apply user wide. This adds - user specific data to the key used for the shared memory and server name. - This is the default functionality. -* `Mode::System` – The SingleApplication block applies system-wide. -* `Mode::SecondaryNotification` – Whether to trigger `instanceStarted()` even - whenever secondary instances are started. -* `Mode::ExcludeAppPath` – Excludes the application path from the server name - (and memory block) hash. -* `Mode::ExcludeAppVersion` – Excludes the application version from the server - name (and memory block) hash. - -*__Note:__ `Mode::SecondaryNotification` only works if set on both the primary -and the secondary instance.* - -*__Note:__ Operating system can restrict the shared memory blocks to the same -user, in which case the User/System modes will have no effect and the block will -be user wide.* - ---- - -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 are released under -`The MIT License (MIT)` with the exception of the Qt calculator examples which -is distributed under the BSD license. diff --git a/3rd-parties/SingleApplication/Windows.md b/3rd-parties/SingleApplication/Windows.md deleted file mode 100644 index 13c52da..0000000 --- a/3rd-parties/SingleApplication/Windows.md +++ /dev/null @@ -1,46 +0,0 @@ -Windows Specific Implementations -================================ - -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()`][AllowSetForegroundWindow] 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` and the `options` parameter must -include `Mode::SecondaryNotification`, See `SingleApplication::Mode` for more -details. - -Here is an example: - -```cpp -if( app.isSecondary() ) { - // This API requires LIBS += User32.lib to be added to the project - AllowSetForegroundWindow( DWORD( app.primaryPid() ) ); -} - -if( app.isPrimary() ) { - QObject::connect( - &app, - &SingleApplication::instanceStarted, - this, - &App::instanceStarted - ); -} -``` - -```cpp -void App::instanceStarted() { - QApplication::setActiveWindow( [window/widget to set to the foreground] ); -} -``` - -[AllowSetForegroundWindow]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms632668.aspx diff --git a/3rd-parties/SingleApplication/singleapplication.cpp b/3rd-parties/SingleApplication/singleapplication.cpp deleted file mode 100644 index d434b40..0000000 --- a/3rd-parties/SingleApplication/singleapplication.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2018 -// -// 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: -// -// 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 -#include -#include -#include -#include - -#include "singleapplication.h" -#include "singleapplication_p.h" - -/** - * @brief Constructor. Checks and fires up LocalServer or closes the program - * if another instance already exists - * @param argc - * @param argv - * @param {bool} allowSecondaryInstances - */ -SingleApplication::SingleApplication(int &argc, char *argv[], const char* appName, bool allowSecondary, Options options, int timeout ) - : app_t( argc, argv ), d_ptr( new SingleApplicationPrivate( this ) ) -{ - 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 - d->options = options; - - // Generating an application ID used for identifying the shared memory - // block and QLocalServer - d->genBlockServerName(appName); - -#ifdef Q_OS_UNIX - // By explicitly attaching it and then deleting it we make sure that the - // memory is deleted even after the process has crashed on Unix. - d->memory = new QSharedMemory( d->blockServerName ); - d->memory->attach(); - delete d->memory; -#endif - // Guarantee thread safe behaviour with a shared memory block. - d->memory = new QSharedMemory( d->blockServerName ); - - // Create a shared memory block - if( d->memory->create( sizeof( InstancesInfo ) ) ) { - // Initialize the shared memory block - d->memory->lock(); - d->initializeMemoryBlock(); - d->memory->unlock(); - } else { - // Attempt to attach to the memory segment - if( ! d->memory->attach() ) { - qCritical() << "SingleApplication: Unable to attach to shared memory block."; - qCritical() << d->memory->errorString(); - delete d; - ::exit( EXIT_FAILURE ); - } - } - - InstancesInfo* inst = static_cast( d->memory->data() ); - QTime time; - time.start(); - - // Make sure the shared memory block is initialised and in consistent state - while( true ) { - d->memory->lock(); - - if( d->blockChecksum() == inst->checksum ) break; - - if( time.elapsed() > 5000 ) { - qWarning() << "SingleApplication: Shared memory block has been in an inconsistent state from more than 5s. Assuming primary instance failure."; - d->initializeMemoryBlock(); - } - - d->memory->unlock(); - - // Random sleep here limits the probability of a collision between two racing apps - qsrand( QDateTime::currentMSecsSinceEpoch() % std::numeric_limits::max() ); - QThread::sleep( 8 + static_cast ( static_cast ( qrand() ) / RAND_MAX * 10 ) ); - } - - if( inst->primary == false) { - d->startPrimary(); - d->memory->unlock(); - return; - } - - // Check if another instance can be started - if( allowSecondary ) { - inst->secondary += 1; - inst->checksum = d->blockChecksum(); - d->instanceNumber = inst->secondary; - d->startSecondary(); - if( d->options & Mode::SecondaryNotification ) { - d->connectToPrimary( timeout, SingleApplicationPrivate::SecondaryInstance ); - } - d->memory->unlock(); - return; - } - - d->memory->unlock(); - - d->connectToPrimary( timeout, SingleApplicationPrivate::NewInstance ); - - delete d; - - ::exit( EXIT_SUCCESS ); -} - -/** - * @brief Destructor - */ -SingleApplication::~SingleApplication() -{ - Q_D(SingleApplication); - delete d; -} - -bool SingleApplication::isPrimary() -{ - Q_D(SingleApplication); - return d->server != nullptr; -} - -bool SingleApplication::isSecondary() -{ - Q_D(SingleApplication); - return d->server == nullptr; -} - -quint32 SingleApplication::instanceId() -{ - Q_D(SingleApplication); - return d->instanceNumber; -} - -qint64 SingleApplication::primaryPid() -{ - Q_D(SingleApplication); - return d->primaryPid(); -} - -bool SingleApplication::sendMessage( QByteArray message, int timeout ) -{ - Q_D(SingleApplication); - - // Nobody to connect to - if( isPrimary() ) return false; - - // Make sure the socket is connected - d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ); - - d->socket->write( message ); - bool dataWritten = d->socket->waitForBytesWritten( timeout ); - d->socket->flush(); - return dataWritten; -} diff --git a/3rd-parties/SingleApplication/singleapplication.h b/3rd-parties/SingleApplication/singleapplication.h deleted file mode 100644 index 1fedd4c..0000000 --- a/3rd-parties/SingleApplication/singleapplication.h +++ /dev/null @@ -1,135 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2018 -// -// 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: -// -// 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. - -#ifndef SINGLE_APPLICATION_H -#define SINGLE_APPLICATION_H - -#include -#include - -#ifndef QAPPLICATION_CLASS -#define QAPPLICATION_CLASS QCoreApplication -#endif - -#include QT_STRINGIFY(QAPPLICATION_CLASS) - -class SingleApplicationPrivate; - -/** - * @brief The SingleApplication class handles multiple instances of the same - * Application - * @see QCoreApplication - */ -class SingleApplication : public QAPPLICATION_CLASS -{ - Q_OBJECT - - typedef QAPPLICATION_CLASS app_t; - -public: - /** - * @brief Mode of operation of SingleApplication. - * Whether the block should be user-wide or system-wide and whether the - * primary instance should be notified when a secondary instance had been - * started. - * @note Operating system can restrict the shared memory blocks to the same - * user, in which case the User/System modes will have no effect and the - * block will be user wide. - * @enum - */ - enum Mode { - User = 1 << 0, - System = 1 << 1, - SecondaryNotification = 1 << 2, - ExcludeAppVersion = 1 << 3, - ExcludeAppPath = 1 << 4 - }; - Q_DECLARE_FLAGS(Options, Mode) - - /** - * @brief Intitializes a SingleApplication instance with argc command line - * arguments in argv - * @arg {int &} argc - Number of arguments in argv - * @arg {const char *[]} argv - Supplied command line arguments - * @arg {bool} allowSecondary - Whether to start the instance as secondary - * if there is already a primary instance. - * @arg {Mode} mode - Whether for the SingleApplication block to be applied - * User wide or System wide. - * @arg {int} timeout - Timeout to wait in milliseconds. - * @note argc and argv may be changed as Qt removes arguments that it - * recognizes - * @note Mode::SecondaryNotification only works if set on both the primary - * instance and the secondary instance. - * @note The timeout is just a hint for the maximum time of blocking - * operations. It does not guarantee that the SingleApplication - * initialisation will be completed in given time, though is a good hint. - * Usually 4*timeout would be the worst case (fail) scenario. - * @see See the corresponding QAPPLICATION_CLASS constructor for reference - */ - explicit SingleApplication(int &argc, char *argv[], const char *appName = "SingleApplication", bool allowSecondary = false, Options options = Mode::User, int timeout = 1000 ); - ~SingleApplication(); - - /** - * @brief Returns if the instance is the primary instance - * @returns {bool} - */ - bool isPrimary(); - - /** - * @brief Returns if the instance is a secondary instance - * @returns {bool} - */ - bool isSecondary(); - - /** - * @brief Returns a unique identifier for the current instance - * @returns {qint32} - */ - quint32 instanceId(); - - /** - * @brief Returns the process ID (PID) of the primary instance - * @returns {qint64} - */ - qint64 primaryPid(); - - /** - * @brief Sends a message to the primary instance. Returns true on success. - * @param {int} timeout - Timeout for connecting - * @returns {bool} - * @note sendMessage() will return false if invoked from the primary - * instance. - */ - bool sendMessage( QByteArray message, int timeout = 100 ); - -Q_SIGNALS: - void instanceStarted(); - void receivedMessage( quint32 instanceId, QByteArray message ); - -private: - SingleApplicationPrivate *d_ptr; - Q_DECLARE_PRIVATE(SingleApplication) -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(SingleApplication::Options) - -#endif // SINGLE_APPLICATION_H diff --git a/3rd-parties/SingleApplication/singleapplication.pri b/3rd-parties/SingleApplication/singleapplication.pri deleted file mode 100644 index 26f5c9c..0000000 --- a/3rd-parties/SingleApplication/singleapplication.pri +++ /dev/null @@ -1,19 +0,0 @@ -QT += core network -CONFIG += c++11 - -HEADERS += $$PWD/singleapplication.h \ - $$PWD/singleapplication_p.h -SOURCES += $$PWD/singleapplication.cpp \ - $$PWD/singleapplication_p.cpp - -INCLUDEPATH += $$PWD - -win32 { - msvc:LIBS += Advapi32.lib - gcc:LIBS += -ladvapi32 -} - -DISTFILES += \ - $$PWD/README.md \ - $$PWD/CHANGELOG.md \ - $$PWD/Windows.md diff --git a/3rd-parties/SingleApplication/singleapplication_p.cpp b/3rd-parties/SingleApplication/singleapplication_p.cpp deleted file mode 100644 index 2b44af9..0000000 --- a/3rd-parties/SingleApplication/singleapplication_p.cpp +++ /dev/null @@ -1,407 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2018 -// -// 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: -// -// 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. - -// -// W A R N I N G !!! -// ----------------- -// -// This file is not part of the SingleApplication API. It is used purely as an -// implementation detail. This header file may change from version to -// version without notice, or may even be removed. -// - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "singleapplication.h" -#include "singleapplication_p.h" - -#ifdef Q_OS_UNIX -#include -#include -#include -#endif - -#ifdef Q_OS_WIN -#include -#include -#endif - -SingleApplicationPrivate::SingleApplicationPrivate( SingleApplication *q_ptr ) - : q_ptr( q_ptr ) -{ - server = nullptr; - socket = nullptr; - memory = nullptr; - instanceNumber = -1; -} - -SingleApplicationPrivate::~SingleApplicationPrivate() -{ - if( socket != nullptr ) { - socket->close(); - delete socket; - } - - memory->lock(); - InstancesInfo* inst = static_cast(memory->data()); - if( server != nullptr ) { - server->close(); - delete server; - inst->primary = false; - inst->primaryPid = -1; - inst->checksum = blockChecksum(); - } - memory->unlock(); - - delete memory; -} - -void SingleApplicationPrivate::genBlockServerName(const char* appName) -{ - QCryptographicHash appData( QCryptographicHash::Sha256 ); - appData.addData( appName, 17 ); - appData.addData( SingleApplication::app_t::applicationName().toUtf8() ); - appData.addData( SingleApplication::app_t::organizationName().toUtf8() ); - appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() ); - - if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) { - appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() ); - } - - if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) { -#ifdef Q_OS_WIN - appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() ); -#else - appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); -#endif - } - - // User level block requires a user specific data in the hash - if( options & SingleApplication::Mode::User ) { -#ifdef Q_OS_WIN - wchar_t username [ UNLEN + 1 ]; - // Specifies size of the buffer on input - DWORD usernameLength = UNLEN + 1; - if( GetUserNameW( username, &usernameLength ) ) { - appData.addData( QString::fromWCharArray(username).toUtf8() ); - } else { - appData.addData( qgetenv("USERNAME") ); - } -#endif -#ifdef Q_OS_UNIX - QByteArray username; - uid_t uid = geteuid(); - struct passwd *pw = getpwuid(uid); - if( pw ) { - username = pw->pw_name; - } - if( username.isEmpty() ) { - username = qgetenv("USER"); - } - appData.addData(username); -#endif - } - - appData.addData(qgetenv("DISPLAY")); - - // Replace the backslash in RFC 2045 Base64 [a-zA-Z0-9+/=] to comply with - // server naming requirements. - blockServerName = appData.result().toBase64().replace("/", "_"); -} - -void SingleApplicationPrivate::initializeMemoryBlock() -{ - InstancesInfo* inst = static_cast( memory->data() ); - inst->primary = false; - inst->secondary = 0; - inst->primaryPid = -1; - inst->checksum = blockChecksum(); -} - -void SingleApplicationPrivate::startPrimary() -{ - Q_Q(SingleApplication); - - // Successful creation means that no main process exists - // So we start a QLocalServer to listen for connections - QLocalServer::removeServer( blockServerName ); - server = new QLocalServer(); - - // Restrict access to the socket according to the - // SingleApplication::Mode::User flag on User level or no restrictions - if( options & SingleApplication::Mode::User ) { - server->setSocketOptions( QLocalServer::UserAccessOption ); - } else { - server->setSocketOptions( QLocalServer::WorldAccessOption ); - } - - server->listen( blockServerName ); - QObject::connect( - server, - &QLocalServer::newConnection, - this, - &SingleApplicationPrivate::slotConnectionEstablished - ); - - // Reset the number of connections - InstancesInfo* inst = static_cast ( memory->data() ); - - inst->primary = true; - inst->primaryPid = q->applicationPid(); - inst->checksum = blockChecksum(); - - instanceNumber = 0; -} - -void SingleApplicationPrivate::startSecondary() -{ -} - -void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType ) -{ - // Connect to the Local Server of the Primary Instance if not already - // connected. - if( socket == nullptr ) { - socket = new QLocalSocket(); - } - - // If already connected - we are done; - if( socket->state() == QLocalSocket::ConnectedState ) - return; - - // If not connect - if( socket->state() == QLocalSocket::UnconnectedState || - socket->state() == QLocalSocket::ClosingState ) { - socket->connectToServer( blockServerName ); - } - - // Wait for being connected - if( socket->state() == QLocalSocket::ConnectingState ) { - socket->waitForConnected( msecs ); - } - - // Initialisation message according to the SingleApplication protocol - if( socket->state() == QLocalSocket::ConnectedState ) { - // Notify the parent that a new instance had been started; - QByteArray initMsg; - QDataStream writeStream(&initMsg, QIODevice::WriteOnly); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - writeStream.setVersion(QDataStream::Qt_5_6); -#endif - - writeStream << blockServerName.toLatin1(); - writeStream << static_cast(connectionType); - writeStream << instanceNumber; - quint16 checksum = qChecksum(initMsg.constData(), static_cast(initMsg.length())); - writeStream << checksum; - - // The header indicates the message length that follows - QByteArray header; - QDataStream headerStream(&header, QIODevice::WriteOnly); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - headerStream.setVersion(QDataStream::Qt_5_6); -#endif - headerStream << static_cast ( initMsg.length() ); - - socket->write( header ); - socket->write( initMsg ); - socket->flush(); - socket->waitForBytesWritten( msecs ); - } -} - -quint16 SingleApplicationPrivate::blockChecksum() -{ - return qChecksum( - static_cast ( memory->data() ), - offsetof( InstancesInfo, checksum ) - ); -} - -qint64 SingleApplicationPrivate::primaryPid() -{ - qint64 pid; - - memory->lock(); - InstancesInfo* inst = static_cast( memory->data() ); - pid = inst->primaryPid; - memory->unlock(); - - return pid; -} - -/** - * @brief Executed when a connection has been made to the LocalServer - */ -void SingleApplicationPrivate::slotConnectionEstablished() -{ - QLocalSocket *nextConnSocket = server->nextPendingConnection(); - connectionMap.insert(nextConnSocket, ConnectionInfo()); - - QObject::connect(nextConnSocket, &QLocalSocket::aboutToClose, - [nextConnSocket, this]() { - auto &info = connectionMap[nextConnSocket]; - Q_EMIT this->slotClientConnectionClosed( nextConnSocket, info.instanceId ); - } - ); - - QObject::connect(nextConnSocket, &QLocalSocket::disconnected, - [nextConnSocket, this]() { - connectionMap.remove(nextConnSocket); - nextConnSocket->deleteLater(); - } - ); - - QObject::connect(nextConnSocket, &QLocalSocket::readyRead, - [nextConnSocket, this]() { - auto &info = connectionMap[nextConnSocket]; - switch(info.stage) { - case StageHeader: - readInitMessageHeader(nextConnSocket); - break; - case StageBody: - readInitMessageBody(nextConnSocket); - break; - case StageConnected: - Q_EMIT this->slotDataAvailable( nextConnSocket, info.instanceId ); - break; - default: - break; - }; - } - ); -} - -void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock ) -{ - if (!connectionMap.contains( sock )) { - return; - } - - if( sock->bytesAvailable() < ( qint64 )sizeof( quint64 ) ) { - return; - } - - QDataStream headerStream( sock ); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - headerStream.setVersion( QDataStream::Qt_5_6 ); -#endif - - // Read the header to know the message length - quint64 msgLen = 0; - headerStream >> msgLen; - ConnectionInfo &info = connectionMap[sock]; - info.stage = StageBody; - info.msgLen = msgLen; - - if ( sock->bytesAvailable() >= (qint64) msgLen ) { - readInitMessageBody( sock ); - } -} - -void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock ) -{ - Q_Q(SingleApplication); - - if (!connectionMap.contains( sock )) { - return; - } - - ConnectionInfo &info = connectionMap[sock]; - if( sock->bytesAvailable() < ( qint64 )info.msgLen ) { - return; - } - - // Read the message body - QByteArray msgBytes = sock->read(info.msgLen); - QDataStream readStream(msgBytes); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - readStream.setVersion( QDataStream::Qt_5_6 ); -#endif - - // server name - QByteArray latin1Name; - readStream >> latin1Name; - - // connection type - ConnectionType connectionType = InvalidConnection; - quint8 connTypeVal = InvalidConnection; - readStream >> connTypeVal; - connectionType = static_cast ( connTypeVal ); - - // instance id - quint32 instanceId = 0; - readStream >> instanceId; - - // checksum - quint16 msgChecksum = 0; - readStream >> msgChecksum; - - const quint16 actualChecksum = qChecksum( msgBytes.constData(), static_cast( msgBytes.length() - sizeof( quint16 ) ) ); - - bool isValid = readStream.status() == QDataStream::Ok && - QLatin1String(latin1Name) == blockServerName && - msgChecksum == actualChecksum; - - if( !isValid ) { - sock->close(); - return; - } - - info.instanceId = instanceId; - info.stage = StageConnected; - - if( connectionType == NewInstance || - ( connectionType == SecondaryInstance && - options & SingleApplication::Mode::SecondaryNotification ) ) - { - Q_EMIT q->instanceStarted(); - } - - if (sock->bytesAvailable() > 0) { - Q_EMIT this->slotDataAvailable( sock, instanceId ); - } -} - -void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId ) -{ - Q_Q(SingleApplication); - Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() ); -} - -void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId ) -{ - if( closedSocket->bytesAvailable() > 0 ) - Q_EMIT slotDataAvailable( closedSocket, instanceId ); -} diff --git a/3rd-parties/SingleApplication/singleapplication_p.h b/3rd-parties/SingleApplication/singleapplication_p.h deleted file mode 100644 index 1247837..0000000 --- a/3rd-parties/SingleApplication/singleapplication_p.h +++ /dev/null @@ -1,99 +0,0 @@ -// The MIT License (MIT) -// -// Copyright (c) Itay Grudev 2015 - 2016 -// -// 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: -// -// 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. - -// -// W A R N I N G !!! -// ----------------- -// -// This file is not part of the SingleApplication API. It is used purely as an -// implementation detail. This header file may change from version to -// version without notice, or may even be removed. -// - -#ifndef SINGLEAPPLICATION_P_H -#define SINGLEAPPLICATION_P_H - -#include -#include -#include -#include "singleapplication.h" - -struct InstancesInfo { - bool primary; - quint32 secondary; - qint64 primaryPid; - quint16 checksum; -}; - -struct ConnectionInfo { - explicit ConnectionInfo() : - msgLen(0), instanceId(0), stage(0) {} - qint64 msgLen; - quint32 instanceId; - quint8 stage; -}; - -class SingleApplicationPrivate : public QObject { - Q_OBJECT -public: - enum ConnectionType : quint8 { - InvalidConnection = 0, - NewInstance = 1, - SecondaryInstance = 2, - Reconnect = 3 - }; - enum ConnectionStage : quint8 { - StageHeader = 0, - StageBody = 1, - StageConnected = 2, - }; - Q_DECLARE_PUBLIC(SingleApplication) - - SingleApplicationPrivate( SingleApplication *q_ptr ); - ~SingleApplicationPrivate(); - - void genBlockServerName(const char *appName); - void initializeMemoryBlock(); - void startPrimary(); - void startSecondary(); - void connectToPrimary(int msecs, ConnectionType connectionType ); - quint16 blockChecksum(); - qint64 primaryPid(); - void readInitMessageHeader(QLocalSocket *socket); - void readInitMessageBody(QLocalSocket *socket); - - SingleApplication *q_ptr; - QSharedMemory *memory; - QLocalSocket *socket; - QLocalServer *server; - quint32 instanceNumber; - QString blockServerName; - SingleApplication::Options options; - QMap connectionMap; - -public Q_SLOTS: - void slotConnectionEstablished(); - void slotDataAvailable( QLocalSocket*, quint32 ); - void slotClientConnectionClosed( QLocalSocket*, quint32 ); -}; - -#endif // SINGLEAPPLICATION_P_H diff --git a/3rd-parties/qtsingleapplication/CMakeLists.txt b/3rd-parties/qtsingleapplication/CMakeLists.txt new file mode 100644 index 0000000..4c93029 --- /dev/null +++ b/3rd-parties/qtsingleapplication/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.16) +project(qtsingleapplication) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Widgets Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Widgets Network REQUIRED) + +include_directories(src) +set(SRCS src/qtsingleapplication.h src/qtsingleapplication.cpp src/qtlocalpeer.h src/qtlocalpeer.cpp) + +add_library(${PROJECT_NAME} STATIC ${SRCS}) +target_include_directories(${PROJECT_NAME} PRIVATE src) +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Network) \ No newline at end of file diff --git a/3rd-parties/qtsingleapplication/INSTALL.TXT b/3rd-parties/qtsingleapplication/INSTALL.TXT new file mode 100644 index 0000000..bbb74a9 --- /dev/null +++ b/3rd-parties/qtsingleapplication/INSTALL.TXT @@ -0,0 +1,254 @@ +INSTALLATION INSTRUCTIONS + +These instructions refer to the package you are installing as +some-package.tar.gz or some-package.zip. The .zip file is intended for use +on Windows. + +The directory you choose for the installation will be referred to as +your-install-dir. + +Note to Qt Visual Studio Integration users: In the instructions below, +instead of building from command line with nmake, you can use the menu +command 'Qt->Open Solution from .pro file' on the .pro files in the +example and plugin directories, and then build from within Visual +Studio. + +Unpacking and installation +-------------------------- + +1. Unpacking the archive (if you have not done so already). + + On Unix and Mac OS X (in a terminal window): + + cd your-install-dir + gunzip some-package.tar.gz + tar xvf some-package.tar + + This creates the subdirectory some-package containing the files. + + On Windows: + + Unpack the .zip archive by right-clicking it in explorer and + choosing "Extract All...". If your version of Windows does not + have zip support, you can use the infozip tools available + from www.info-zip.org. + + If you are using the infozip tools (in a command prompt window): + cd your-install-dir + unzip some-package.zip + +2. Configuring the package. + + The configure script is called "configure" on unix/mac and + "configure.bat" on Windows. It should be run from a command line + after cd'ing to the package directory. + + You can choose whether you want to use the component by including + its source code directly into your project, or build the component + as a dynamic shared library (DLL) that is loaded into the + application at run-time. The latter may be preferable for + technical or licensing (LGPL) reasons. If you want to build a DLL, + run the configure script with the argument "-library". Also see + the note about usage below. + + (Components that are Qt plugins, e.g. styles and image formats, + are by default built as a plugin DLL.) + + The configure script will prompt you in some cases for further + information. Answer these questions and carefully read the license text + before accepting the license conditions. The package cannot be used if + you do not accept the license conditions. + +3. Building the component and examples (when required). + + If a DLL is to be built, or if you would like to build the + examples, next give the commands + + qmake + make [or nmake if your are using Microsoft Visual C++] + + The example program(s) can be found in the directory called + "examples" or "example". + + Components that are Qt plugins, e.g. styles and image formats, are + ready to be used as soon as they are built, so the rest of this + installation instruction can be skipped. + +4. Building the Qt Designer plugin (optional). + + Some of the widget components are provided with plugins for Qt + Designer. To build and install the plugin, cd into the + some-package/plugin directory and give the commands + + qmake + make [or nmake if your are using Microsoft Visual C++] + + Restart Qt Designer to make it load the new widget plugin. + + Note: If you are using the built-in Qt Designer from the Qt Visual + Studio Integration, you will need to manually copy the plugin DLL + file, i.e. copy + %QTDIR%\plugins\designer\some-component.dll + to the Qt Visual Studio Integration plugin path, typically: + C:\Program Files\Trolltech\Qt VS Integration\plugins + + Note: If you for some reason are using a Qt Designer that is built + in debug mode, you will need to build the plugin in debug mode + also. Edit the file plugin.pro in the plugin directory, changing + 'release' to 'debug' in the CONFIG line, before running qmake. + + + +Solutions components are intended to be used directly from the package +directory during development, so there is no 'make install' procedure. + + +Using a component in your project +--------------------------------- + +To use this component in your project, add the following line to the +project's .pro file (or do the equivalent in your IDE): + + include(your-install-dir/some-package/src/some-package.pri) + +This adds the package's sources and headers to the SOURCES and HEADERS +project variables respectively (or, if the component has been +configured as a DLL, it adds that library to the LIBS variable), and +updates INCLUDEPATH to contain the package's src +directory. Additionally, the .pri file may include some dependencies +needed by the package. + +To include a header file from the package in your sources, you can now +simply use: + + #include + +or alternatively, in pre-Qt 4 style: + + #include + +Refer to the documentation to see the classes and headers this +components provides. + + + +Install documentation (optional) +-------------------------------- + +The HTML documentation for the package's classes is located in the +your-install-dir/some-package/doc/html/index.html. You can open this +file and read the documentation with any web browser. + +To install the documentation into Qt Assistant (for Qt version 4.4 and +later): + +1. In Assistant, open the Edit->Preferences dialog and choose the + Documentation tab. Click the Add... button and select the file + your-install-dir/some-package/doc/html/some-package.qch + +For Qt versions prior to 4.4, do instead the following: + +1. The directory your-install-dir/some-package/doc/html contains a + file called some-package.dcf. Execute the following commands in a + shell, command prompt or terminal window: + + cd your-install-dir/some-package/doc/html/ + assistant -addContentFile some-package.dcf + +The next time you start Qt Assistant, you can access the package's +documentation. + + +Removing the documentation from assistant +----------------------------------------- + +If you have installed the documentation into Qt Assistant, and want to uninstall it, do as follows, for Qt version 4.4 and later: + +1. In Assistant, open the Edit->Preferences dialog and choose the + Documentation tab. In the list of Registered Documentation, select + the item com.nokia.qtsolutions.some-package_version, and click + the Remove button. + +For Qt versions prior to 4.4, do instead the following: + +1. The directory your-install-dir/some-package/doc/html contains a + file called some-package.dcf. Execute the following commands in a + shell, command prompt or terminal window: + + cd your-install-dir/some-package/doc/html/ + assistant -removeContentFile some-package.dcf + + + +Using the component as a DLL +---------------------------- + +1. Normal components + + The shared library (DLL) is built and placed in the + some-package/lib directory. It is intended to be used directly + from there during development. When appropriate, both debug and + release versions are built, since the run-time linker will in some + cases refuse to load a debug-built DLL into a release-built + application or vice versa. + + The following steps are taken by default to help the dynamic + linker to locate the DLL at run-time (during development): + + Unix: The some-package.pri file will add linker instructions to + add the some-package/lib directory to the rpath of the + executable. (When distributing, or if your system does not support + rpath, you can copy the shared library to another place that is + searched by the dynamic linker, e.g. the "lib" directory of your + Qt installation.) + + Mac: The full path to the library is hardcoded into the library + itself, from where it is copied into the executable at link time, + and ready by the dynamic linker at run-time. (When distributing, + you will want to edit these hardcoded paths in the same way as for + the Qt DLLs. Refer to the document "Deploying an Application on + Mac OS X" in the Qt Reference Documentation.) + + Windows: the .dll file(s) are copied into the "bin" directory of + your Qt installation. The Qt installation will already have set up + that directory to be searched by the dynamic linker. + + +2. Plugins + + For Qt Solutions plugins (e.g. image formats), both debug and + release versions of the plugin are built by default when + appropriate, since in some cases the release Qt library will not + load a debug plugin, and vice versa. The plugins are automatically + copied into the plugins directory of your Qt installation when + built, so no further setup is required. + + Plugins may also be built statically, i.e. as a library that will be + linked into your application executable, and so will not need to + be redistributed as a separate plugin DLL to end users. Static + building is required if Qt itself is built statically. To do it, + just add "static" to the CONFIG variable in the plugin/plugin.pro + file before building. Refer to the "Static Plugins" section in the + chapter "How to Create Qt Plugins" for explanation of how to use a + static plugin in your application. The source code of the example + program(s) will also typically contain the relevant instructions + as comments. + + + +Uninstalling +------------ + + The following command will remove any fils that have been + automatically placed outside the package directory itself during + installation and building + + make distclean [or nmake if your are using Microsoft Visual C++] + + If Qt Assistant documentation or Qt Designer plugins have been + installed, they can be uninstalled manually, ref. above. + + +Enjoy! :) + +- The Qt Solutions Team. diff --git a/3rd-parties/qtsingleapplication/README.TXT b/3rd-parties/qtsingleapplication/README.TXT new file mode 100644 index 0000000..06abb09 --- /dev/null +++ b/3rd-parties/qtsingleapplication/README.TXT @@ -0,0 +1,33 @@ +Qt Solutions Component: Single Application + +The QtSingleApplication component provides support for +applications that can be only started once per user. + + + +Version history: + +2.0: - Version 1.3 ported to Qt 4. + +2.1: - Fix compilation problem on Mac. + +2.2: - Really fix the Mac compilation problem. + - Mac: fix crash due to wrong object releasing. + - Mac: Fix memory leak. + +2.3: - Windows: Force creation of internal widget to make it work + with Qt 4.2. + +2.4: - Fix the system for automatic window raising on message + reception. NOTE: minor API change. + +2.5: - Mac: Fix isRunning() to work and report correctly. + +2.6: - - initialize() is now obsolete, no longer necessary to call + it + - - Fixed race condition where multiple instances migth be started + - - QtSingleCoreApplication variant provided for non-GUI (console) + usage + - Complete reimplementation. Visible changes: + - LGPL release. + diff --git a/3rd-parties/qtsingleapplication/buildlib/buildlib.pro b/3rd-parties/qtsingleapplication/buildlib/buildlib.pro new file mode 100644 index 0000000..37dddcd --- /dev/null +++ b/3rd-parties/qtsingleapplication/buildlib/buildlib.pro @@ -0,0 +1,13 @@ +TEMPLATE=lib +CONFIG += qt dll qtsingleapplication-buildlib +mac:CONFIG += absolute_library_soname +win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all +include(../src/qtsingleapplication.pri) +TARGET = $$QTSINGLEAPPLICATION_LIBNAME +DESTDIR = $$QTSINGLEAPPLICATION_LIBDIR +win32 { + DLLDESTDIR = $$[QT_INSTALL_BINS] + QMAKE_DISTCLEAN += $$[QT_INSTALL_BINS]\\$${QTSINGLEAPPLICATION_LIBNAME}.dll +} +target.path = $$DESTDIR +INSTALLS += target diff --git a/3rd-parties/qtsingleapplication/common.pri b/3rd-parties/qtsingleapplication/common.pri new file mode 100644 index 0000000..924c57c --- /dev/null +++ b/3rd-parties/qtsingleapplication/common.pri @@ -0,0 +1,14 @@ +exists(config.pri):infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtsingleapplication-uselib + +TEMPLATE += fakelib +greaterThan(QT_MAJOR_VERSION, 5)|\ + if(equals(QT_MAJOR_VERSION, 5):greaterThan(QT_MINOR_VERSION, 4))|\ + if(equals(QT_MAJOR_VERSION, 5):equals(QT_MINOR_VERSION, 4):greaterThan(QT_PATCH_VERSION, 1)) { + QTSINGLEAPPLICATION_LIBNAME = $$qt5LibraryTarget(QtSolutions_SingleApplication-head) +} else { + QTSINGLEAPPLICATION_LIBNAME = $$qtLibraryTarget(QtSolutions_SingleApplication-head) +} +TEMPLATE -= fakelib + +QTSINGLEAPPLICATION_LIBDIR = $$PWD/lib +unix:qtsingleapplication-uselib:!qtsingleapplication-buildlib:QMAKE_RPATHDIR += $$QTSINGLEAPPLICATION_LIBDIR diff --git a/3rd-parties/qtsingleapplication/configure b/3rd-parties/qtsingleapplication/configure new file mode 100755 index 0000000..3c4edff --- /dev/null +++ b/3rd-parties/qtsingleapplication/configure @@ -0,0 +1,25 @@ +#!/bin/sh + +if [ "x$1" != "x" -a "x$1" != "x-library" ]; then + echo "Usage: $0 [-library]" + echo + echo "-library: Build the component as a dynamic library (DLL). Default is to" + echo " include the component source code directly in the application." + echo + exit 0 +fi + +rm -f config.pri +if [ "x$1" = "x-library" ]; then + echo "Configuring to build this component as a dynamic library." + echo "SOLUTIONS_LIBRARY = yes" > config.pri +fi + +echo +echo "This component is now configured." +echo +echo "To build the component library (if requested) and example(s)," +echo "run qmake and your make command." +echo +echo "To remove or reconfigure, run make distclean." +echo diff --git a/3rd-parties/qtsingleapplication/configure.bat b/3rd-parties/qtsingleapplication/configure.bat new file mode 100644 index 0000000..2927549 --- /dev/null +++ b/3rd-parties/qtsingleapplication/configure.bat @@ -0,0 +1,43 @@ +:: Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +:: SPDX-License-Identifier: BSD-3-Clause + +@echo off + +rem +rem "Main" +rem + +if not "%1"=="" ( + if not "%1"=="-library" ( + call :PrintUsage + goto EOF + ) +) + +if exist config.pri. del config.pri +if "%1"=="-library" ( + echo Configuring to build this component as a dynamic library. + echo SOLUTIONS_LIBRARY = yes > config.pri +) + +echo . +echo This component is now configured. +echo . +echo To build the component library (if requested) and example(s), +echo run qmake and your make or nmake command. +echo . +echo To remove or reconfigure, run make (nmake) distclean. +echo . +goto EOF + +:PrintUsage +echo Usage: configure.bat [-library] +echo . +echo -library: Build the component as a dynamic library (DLL). Default is to +echo include the component source directly in the application. +echo A DLL may be preferable for technical or licensing (LGPL) reasons. +echo . +goto EOF + + +:EOF diff --git a/3rd-parties/qtsingleapplication/doc/html/classic.css b/3rd-parties/qtsingleapplication/doc/html/classic.css new file mode 100644 index 0000000..b8cae8e --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/classic.css @@ -0,0 +1,284 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Arial, Geneva, Helvetica, sans-serif; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} + +h3.fn,span.fn +{ + background-color: #eee; + border-width: 1px; + border-style: solid; + border-color: #ddd; + font-weight: bold; + padding: 6px 0px 6px 10px; + margin: 42px 0px 0px 0px; +} + +hr { + border: 0; + color: #a0a0a0; + background-color: #ccc; + height: 1px; + width: 100%; + text-align: left; + margin: 34px 0px 34px 0px; +} + +table.valuelist { + border-width: 1px 1px 1px 1px; + border-style: solid; + border-color: #dddddd; + border-collapse: collapse; + background-color: #f0f0f0; +} + +table.indextable { + border-width: 1px 1px 1px 1px; + border-style: solid; + border-collapse: collapse; + background-color: #f0f0f0; + border-color:#555; + font-size: 100%; +} + +table td.largeindex { + border-width: 1px 1px 1px 1px; + border-collapse: collapse; + background-color: #f0f0f0; + border-color:#555; + font-size: 120%; +} + +table.valuelist th { + border-width: 1px 1px 1px 2px; + padding: 4px; + border-style: solid; + border-color: #666; + color:white; + background-color:#666; +} + +th.titleheader { + border-width: 1px 0px 1px 0px; + padding: 2px; + border-style: solid; + border-color: #666; + color:white; + background-color:#555; + background-image:url('images/gradient.png')}; + background-repeat: repeat-x; + font-size: 100%; +} + + +th.largeheader { + border-width: 1px 0px 1px 0px; + padding: 4px; + border-style: solid; + border-color: #444; + color:white; + background-color:#555555; + font-size: 120%; +} + +p { + + margin-left: 4px; + margin-top: 8px; + margin-bottom: 8px; +} + +a:link +{ + color: #0046ad; + text-decoration: none +} + +a:visited +{ + color: #672967; + text-decoration: none +} + +a.obsolete +{ + color: #661100; + text-decoration: none +} + +a.compat +{ + color: #661100; + text-decoration: none +} + +a.obsolete:visited +{ + color: #995500; + text-decoration: none +} + +a.compat:visited +{ + color: #995500; + text-decoration: none +} + +body +{ + background: #ffffff; + color: black +} + +table.generic, table.annotated +{ + border-width: 1px; + border-color:#bbb; + border-style:solid; + border-collapse:collapse; +} + +table td.memItemLeft { + width: 180px; + padding: 2px 0px 0px 8px; + margin: 4px; + border-width: 1px; + border-color: #E0E0E0; + border-style: none; + font-size: 100%; + white-space: nowrap +} + +table td.memItemRight { + padding: 2px 8px 0px 8px; + margin: 4px; + border-width: 1px; + border-color: #E0E0E0; + border-style: none; + font-size: 100%; +} + +table tr.odd { + background: #f0f0f0; + color: black; +} + +table tr.even { + background: #e4e4e4; + color: black; +} + +table.annotated th { + padding: 3px; + text-align: left +} + +table.annotated td { + padding: 3px; +} + +table tr pre +{ + padding-top: 0px; + padding-bottom: 0px; + padding-left: 0px; + padding-right: 0px; + border: none; + background: none +} + +tr.qt-style +{ + background: #96E066; + color: black +} + +body pre +{ + padding: 0.2em; + border: #e7e7e7 1px solid; + background: #f1f1f1; + color: black +} + +table tr.qt-code pre +{ + padding: 0.2em; + border: #e7e7e7 1px solid; + background: #f1f1f1; + color: black +} + +span.preprocessor, span.preprocessor a +{ + color: darkblue; +} + +span.comment +{ + color: darkred; + font-style: italic +} + +span.string,span.char +{ + color: darkgreen; +} + +.title +{ + text-align: center +} + +.subtitle +{ + font-size: 0.8em +} + +.small-subtitle +{ + font-size: 0.65em +} + +.qmlitem { + padding: 0; +} + +.qmlname { + white-space: nowrap; +} + +.qmltype { + text-align: center; + font-size: 160%; +} + +.qmlproto { + background-color: #eee; + border-width: 1px; + border-style: solid; + border-color: #ddd; + font-weight: bold; + padding: 6px 10px 6px 10px; + margin: 42px 0px 0px 0px; +} + +.qmlreadonly { + float: right; + color: red +} + +.qmldoc { +} + +*.qmlitem p { +} diff --git a/3rd-parties/qtsingleapplication/doc/html/images/qt-logo.png b/3rd-parties/qtsingleapplication/doc/html/images/qt-logo.png new file mode 100644 index 0000000..794162f Binary files /dev/null and b/3rd-parties/qtsingleapplication/doc/html/images/qt-logo.png differ diff --git a/3rd-parties/qtsingleapplication/doc/html/index.html b/3rd-parties/qtsingleapplication/doc/html/index.html new file mode 100644 index 0000000..af9dab1 --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/index.html @@ -0,0 +1,48 @@ + + + + + + Single Application + + + + + + + +
  Home

Single Application
+

+ +

Description

+

The QtSingleApplication component provides support for applications that can be only started once per user.

+

For some applications it is useful or even critical that they are started only once by any user. Future attempts to start the application should activate any already running instance, and possibly perform requested actions, e.g. loading a file, in that instance.

+

The QtSingleApplication class provides an interface to detect a running instance, and to send command strings to that instance. For console (non-GUI) applications, the QtSingleCoreApplication variant is provided, which avoids dependency on QtGui.

+ +

Classes

+ + +

Examples

+ + +

Tested platforms

+
    +
  • Qt 4.4, 4.5 / Windows XP / MSVC.NET 2005
  • +
  • Qt 4.4, 4.5 / Linux / gcc
  • +
  • Qt 4.4, 4.5 / MacOS X 10.5 / gcc
  • +
+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-example-loader.html b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-example-loader.html new file mode 100644 index 0000000..6a36632 --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-example-loader.html @@ -0,0 +1,175 @@ + + + + + + Loading Documents + + + + + + + +
  Home

Loading Documents
+

+

The application in this example loads or prints the documents passed as commandline parameters to further instances of this application.

+
 /****************************************************************************
+ **
+ ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
+ ** This file is part of the Qt Solutions component.
+ **
+ ** 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 Nokia Corporation and its Subsidiary(-ies) 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."
+ **
+ ****************************************************************************/
+
+ #include <qtsingleapplication.h>
+ #include <QtCore/QFile>
+ #include <QtGui/QMainWindow>
+ #include <QtGui/QPrinter>
+ #include <QtGui/QPainter>
+ #include <QtGui/QTextEdit>
+ #include <QtGui/QMdiArea>
+ #include <QtCore/QTextStream>
+
+ class MainWindow : public QMainWindow
+ {
+     Q_OBJECT
+ public:
+     MainWindow();
+
+ public slots:
+     void handleMessage(const QString& message);
+
+ signals:
+     void needToShow();
+
+ private:
+     QMdiArea *workspace;
+ };
+

The user interface in this application is a QMainWindow subclass with a QMdiArea as the central widget. It implements a slot handleMessage() that will be connected to the messageReceived() signal of the QtSingleApplication class.

+
 MainWindow::MainWindow()
+ {
+     workspace = new QMdiArea(this);
+
+     setCentralWidget(workspace);
+ }
+

The MainWindow constructor creates a minimal user interface.

+
 void MainWindow::handleMessage(const QString& message)
+ {
+     enum Action {
+         Nothing,
+         Open,
+         Print
+     } action;
+
+     action = Nothing;
+     QString filename = message;
+     if (message.toLower().startsWith("/print ")) {
+         filename = filename.mid(7);
+         action = Print;
+     } else if (!message.isEmpty()) {
+         action = Open;
+     }
+     if (action == Nothing) {
+         emit needToShow();
+         return;
+     }
+
+     QFile file(filename);
+     QString contents;
+     if (file.open(QIODevice::ReadOnly))
+         contents = file.readAll();
+     else
+         contents = "[[Error: Could not load file " + filename + "]]";
+
+     QTextEdit *view = new QTextEdit;
+     view->setPlainText(contents);
+
+     switch(action) {
+

The handleMessage() slot interprets the message passed in as a filename that can be prepended with /print to indicate that the file should just be printed rather than loaded.

+
     case Print:
+         {
+             QPrinter printer;
+             view->print(&printer);
+             delete view;
+         }
+         break;
+
+     case Open:
+         {
+             workspace->addSubWindow(view);
+             view->setWindowTitle(message);
+             view->show();
+             emit needToShow();
+         }
+         break;
+     default:
+         break;
+     };
+ }
+

Loading the file will also activate the window.

+
 #include "main.moc"
+
+ int main(int argc, char **argv)
+ {
+     QtSingleApplication instance("File loader QtSingleApplication example", argc, argv);
+     QString message;
+     for (int a = 1; a < argc; ++a) {
+         message += argv[a];
+         if (a < argc-1)
+             message += " ";
+     }
+
+     if (instance.sendMessage(message))
+         return 0;
+

The main entry point function creates a QtSingleApplication object, and creates a message to send to a running instance of the application. If the message was sent successfully the process exits immediately.

+
     MainWindow mw;
+     mw.handleMessage(message);
+     mw.show();
+
+     QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
+                      &mw, SLOT(handleMessage(const QString&)));
+
+     instance.setActivationWindow(&mw, false);
+     QObject::connect(&mw, SIGNAL(needToShow()), &instance, SLOT(activateWindow()));
+
+     return instance.exec();
+ }
+

If the message could not be sent the application starts up. Note that false is passed to the call to setActivationWindow() to prevent automatic activation for every message received, e.g. when the application should just print a file. Instead, the message handling function determines whether activation is requested, and signals that by emitting the needToShow() signal. This is then simply connected directly to QtSingleApplication's activateWindow() slot.

+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-example-trivial.html b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-example-trivial.html new file mode 100644 index 0000000..5e60cfa --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-example-trivial.html @@ -0,0 +1,101 @@ + + + + + + A Trivial Example + + + + + + + +
  Home

A Trivial Example
+

+

The application in this example has a log-view that displays messages sent by further instances of the same application.

+

The example demonstrates the use of the QtSingleApplication class to detect and communicate with a running instance of the application using the sendMessage() API. The messageReceived() signal is used to display received messages in a QTextEdit log.

+
 /****************************************************************************
+ **
+ ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
+ ** This file is part of the Qt Solutions component.
+ **
+ ** 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 Nokia Corporation and its Subsidiary(-ies) 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."
+ **
+ ****************************************************************************/
+
+ #include <qtsingleapplication.h>
+ #include <QtGui/QTextEdit>
+
+ class TextEdit : public QTextEdit
+ {
+     Q_OBJECT
+ public:
+     TextEdit(QWidget *parent = 0)
+         : QTextEdit(parent)
+     {}
+ public slots:
+     void append(const QString &str)
+     {
+         QTextEdit::append(str);
+     }
+ };
+
+ #include "main.moc"
+
+ int main(int argc, char **argv)
+ {
+     QtSingleApplication instance(argc, argv);
+

The example has only the main entry point function. A QtSingleApplication object is created immediately.

+
     if (instance.sendMessage("Wake up!"))
+         return 0;
+

If another instance of this application is already running, sendMessage() will succeed, and this instance just exits immediately.

+
     TextEdit logview;
+     logview.setReadOnly(true);
+     logview.show();
+

Otherwise the instance continues as normal and creates the user interface.

+
     instance.setActivationWindow(&logview);
+
+     QObject::connect(&instance, SIGNAL(messageReceived(const QString&)),
+                      &logview, SLOT(append(const QString&)));
+
+     return instance.exec();
+

The logview object is also set as the application's activation window. Every time a message is received, the window will be raised and activated automatically.

+

The messageReceived() signal is also connected to the QTextEdit's append() slot. Every message received from further instances of this application will be displayed in the log.

+

Finally the event loop is entered.

+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-members.html b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-members.html new file mode 100644 index 0000000..c995ce3 --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-members.html @@ -0,0 +1,235 @@ + + + + + + List of All Members for QtSingleApplication + + + + + + + +
  Home

List of All Members for QtSingleApplication

+

This is the complete list of members for QtSingleApplication, including inherited members.

+

+ +
+

+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-obsolete.html b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-obsolete.html new file mode 100644 index 0000000..0d07dfa --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication-obsolete.html @@ -0,0 +1,31 @@ + + + + + + Obsolete Members for QtSingleApplication + + + + + + + +
  Home

Obsolete Members for QtSingleApplication

+

The following class members are obsolete. They are provided to keep old source code working. We strongly advise against using them in new code.

+

+

Public Functions

+ + +
void initialize ( bool dummy = true )   (obsolete)
+
+

Member Function Documentation

+

void QtSingleApplication::initialize ( bool dummy = true )

+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.dcf b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.dcf new file mode 100644 index 0000000..d81f87f --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.dcf @@ -0,0 +1,40 @@ + + +
+
+ QtSingleApplication + activateWindow + activationWindow + id + isRunning + messageReceived + sendMessage + setActivationWindow +
+
+
+
+ QtSingleCoreApplication + id + isRunning + messageReceived + sendMessage +
+
+
+
+
+ A non-GUI example +
+
+ A Trivial Example +
+
+ Loading Documents +
+
+ Single Application +
+
+
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.html b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.html new file mode 100644 index 0000000..2754a3b --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.html @@ -0,0 +1,162 @@ + + + + + + QtSingleApplication Class Reference + + + + + + + +
  Home

QtSingleApplication Class Reference

+

The QtSingleApplication class provides an API to detect and communicate with running instances of an application. More...

+
 #include <QtSingleApplication>

Inherits QApplication.

+ +
+ +

Public Functions

+ + + + + + + + + + + +
QtSingleApplication ( int & argc, char ** argv, bool GUIenabled = true )
QtSingleApplication ( const QString & appId, int & argc, char ** argv )
QtSingleApplication ( int & argc, char ** argv, Type type )
QtSingleApplication ( Display * dpy, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )
QtSingleApplication ( Display * dpy, int & argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )
QtSingleApplication ( Display * dpy, const QString & appId, int argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )
QWidget * activationWindow () const
QString id () const
bool isRunning ()
void setActivationWindow ( QWidget * aw, bool activateOnMessage = true )
+ +
+ +

Public Slots

+ + + +
void activateWindow ()
bool sendMessage ( const QString & message, int timeout = 5000 )
+ +
+ +

Signals

+ + +
void messageReceived ( const QString & message )
+ +

Additional Inherited Members

+ + +
+

Detailed Description

+

The QtSingleApplication class provides an API to detect and communicate with running instances of an application.

+

This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server.

+

By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead.

+

The application should create the QtSingleApplication object early in the startup phase, and call isRunning() to find out if another instance of this application is already running. If isRunning() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. In this case, the application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal.

+

The messageReceived() signal will be emitted when the running application receives messages from another instance of the same application. When a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot.

+

If isRunning() returns true, another instance is already running. It may be alerted to the fact that another instance has started by using the sendMessage() function. Also data such as startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance with this function. Then, the application should terminate (or enter client mode).

+

If isRunning() returns true, but sendMessage() fails, that is an indication that the running instance is frozen.

+

Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that).

+
 // Original
+ int main(int argc, char **argv)
+ {
+     QApplication app(argc, argv);
+
+     MyMainWidget mmw;
+     mmw.show();
+     return app.exec();
+ }
+
+ // Single instance
+ int main(int argc, char **argv)
+ {
+     QtSingleApplication app(argc, argv);
+
+     if (app.isRunning())
+         return !app.sendMessage(someDataString);
+
+     MyMainWidget mmw;
+     app.setActivationWindow(&mmw);
+     mmw.show();
+     return app.exec();
+ }
+

Once this QtSingleApplication instance is destroyed (normally when the process exits or crashes), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance.

+

For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library.

+

See also QtSingleCoreApplication.

+
+

Member Function Documentation

+

QtSingleApplication::QtSingleApplication ( int & argc, char ** argv, bool GUIenabled = true )

+

Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc, argv, and GUIenabled are passed on to the QAppliation constructor.

+

If you are creating a console application (i.e. setting GUIenabled to false), you may consider using QtSingleCoreApplication instead.

+

QtSingleApplication::QtSingleApplication ( const QString & appId, int & argc, char ** argv )

+

Creates a QtSingleApplication object with the application identifier appId. argc and argv are passed on to the QAppliation constructor.

+

QtSingleApplication::QtSingleApplication ( int & argc, char ** argv, Type type )

+

Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc, argv, and type are passed on to the QAppliation constructor.

+

QtSingleApplication::QtSingleApplication ( Display * dpy, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

+

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). dpy, visual, and cmap are passed on to the QApplication constructor.

+

QtSingleApplication::QtSingleApplication ( Display * dpy, int & argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

+

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). dpy, argc, argv, visual, and cmap are passed on to the QApplication constructor.

+

QtSingleApplication::QtSingleApplication ( Display * dpy, const QString & appId, int argc, char ** argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap = 0 )

+

Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be appId. dpy, argc, argv, visual, and cmap are passed on to the QApplication constructor.

+

void QtSingleApplication::activateWindow ()   [slot]

+

De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set.

+

This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance.

+

This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set.

+

See also setActivationWindow(), messageReceived(), and initialize().

+

QWidget * QtSingleApplication::activationWindow () const

+

Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0.

+

See also setActivationWindow().

+

QString QtSingleApplication::id () const

+

Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application.

+

bool QtSingleApplication::isRunning ()

+

Returns true if another instance of this application is running; otherwise false.

+

This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session).

+

See also sendMessage().

+

void QtSingleApplication::messageReceived ( const QString & message )   [signal]

+

This signal is emitted when the current instance receives a message from another instance of this application.

+

See also sendMessage(), setActivationWindow(), and activateWindow().

+

bool QtSingleApplication::sendMessage ( const QString & message, int timeout = 5000 )   [slot]

+

Tries to send the text message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message.

+

This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within timeout milliseconds, this function return false.

+

See also isRunning() and messageReceived().

+

void QtSingleApplication::setActivationWindow ( QWidget * aw, bool activateOnMessage = true )

+

Sets the activation window of this application to aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window.

+

If activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted.

+

See also activationWindow(), activateWindow(), and messageReceived().

+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.index b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.index new file mode 100644 index 0000000..56052c2 --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.index @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.qhp b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.qhp new file mode 100644 index 0000000..ff42d9d --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsingleapplication.qhp @@ -0,0 +1,53 @@ + + + com.nokia.qtsolutions.qtsingleapplication_head + qdoc + + qt + solutions + qtsingleapplication + + + qt + solutions + qtsingleapplication + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + qtsingleapplication.html + index.html + qtsingleapplication-example-trivial.html + qtsinglecoreapplication.html + qtsingleapplication-example-loader.html + qtsinglecoreapplication-example-console.html + classic.css + images/qt-logo.png + + + diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication-example-console.html b/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication-example-console.html new file mode 100644 index 0000000..18a9ae8 --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication-example-console.html @@ -0,0 +1,118 @@ + + + + + + A non-GUI example + + + + + + + +
  Home

A non-GUI example
+

+

This example shows how to use the single-application functionality in a console application. It does not require the QtGui library at all.

+

The only differences from the GUI application usage demonstrated in the other examples are:

+

1) The .pro file should include qtsinglecoreapplication.pri instead of qtsingleapplication.pri

+

2) The class name is QtSingleCoreApplication instead of QtSingleApplication.

+

3) No calls are made regarding window activation, for obvious reasons.

+

console.pro:

+
 TEMPLATE   = app
+ CONFIG    += console
+ SOURCES   += main.cpp
+ include(../../src/qtsinglecoreapplication.pri)
+ QT -= gui
+

main.cpp:

+
 /****************************************************************************
+ **
+ ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
+ ** This file is part of the Qt Solutions component.
+ **
+ ** 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 Nokia Corporation and its Subsidiary(-ies) 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."
+ **
+ ****************************************************************************/
+
+ #include "qtsinglecoreapplication.h"
+ #include <QtCore/QDebug>
+
+ void report(const QString& msg)
+ {
+     qDebug("[%i] %s", (int)QCoreApplication::applicationPid(), qPrintable(msg));
+ }
+
+ class MainClass : public QObject
+ {
+     Q_OBJECT
+ public:
+     MainClass()
+         : QObject()
+         {}
+
+ public slots:
+     void handleMessage(const QString& message)
+         {
+             report( "Message received: \"" + message + "\"");
+         }
+ };
+
+ int main(int argc, char **argv)
+ {
+     report("Starting up");
+
+     QtSingleCoreApplication app(argc, argv);
+
+     if (app.isRunning()) {
+         QString msg(QString("Hi master, I am %1.").arg(QCoreApplication::applicationPid()));
+         bool sentok = app.sendMessage(msg, 2000);
+         QString rep("Another instance is running, so I will exit.");
+         rep += sentok ? " Message sent ok." : " Message sending failed; the other instance may be frozen.";
+         report(rep);
+         return 0;
+     } else {
+         report("No other instance is running; so I will.");
+         MainClass mainObj;
+         QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
+                          &mainObj, SLOT(handleMessage(const QString&)));
+         return app.exec();
+     }
+ }
+
+ #include "main.moc"
+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication-members.html b/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication-members.html new file mode 100644 index 0000000..69fb858 --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication-members.html @@ -0,0 +1,126 @@ + + + + + + List of All Members for QtSingleCoreApplication + + + + + + + +
  Home

List of All Members for QtSingleCoreApplication

+

This is the complete list of members for QtSingleCoreApplication, including inherited members.

+

+ +
+

+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication.html b/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication.html new file mode 100644 index 0000000..a20cf2f --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/html/qtsinglecoreapplication.html @@ -0,0 +1,98 @@ + + + + + + QtSingleCoreApplication Class Reference + + + + + + + +
  Home

QtSingleCoreApplication Class Reference

+

A variant of the QtSingleApplication class for non-GUI applications. More...

+
 #include <QtSingleCoreApplication>

Inherits QCoreApplication.

+ +
+ +

Public Functions

+ + + + + +
QtSingleCoreApplication ( int & argc, char ** argv )
QtSingleCoreApplication ( const QString & appId, int & argc, char ** argv )
QString id () const
bool isRunning ()
+ +
+ +

Public Slots

+ + +
bool sendMessage ( const QString & message, int timeout = 5000 )
+ +
+ +

Signals

+ + +
void messageReceived ( const QString & message )
+ +

Additional Inherited Members

+ + +
+

Detailed Description

+

A variant of the QtSingleApplication class for non-GUI applications.

+

This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library.

+

The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage.

+

A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application.

+

See also QtSingleApplication.

+
+

Member Function Documentation

+

QtSingleCoreApplication::QtSingleCoreApplication ( int & argc, char ** argv )

+

Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). argc and argv are passed on to the QCoreAppliation constructor.

+

QtSingleCoreApplication::QtSingleCoreApplication ( const QString & appId, int & argc, char ** argv )

+

Creates a QtSingleCoreApplication object with the application identifier appId. argc and argv are passed on to the QCoreAppliation constructor.

+

QString QtSingleCoreApplication::id () const

+

Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application.

+

bool QtSingleCoreApplication::isRunning ()

+

Returns true if another instance of this application is running; otherwise false.

+

This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session).

+

See also sendMessage().

+

void QtSingleCoreApplication::messageReceived ( const QString & message )   [signal]

+

This signal is emitted when the current instance receives a message from another instance of this application.

+

See also sendMessage().

+

bool QtSingleCoreApplication::sendMessage ( const QString & message, int timeout = 5000 )   [slot]

+

Tries to send the text message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message.

+

This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within timeout milliseconds, this function return false.

+

See also isRunning() and messageReceived().

+


+ + + + +
Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)Trademarks
Qt Solutions
+ diff --git a/3rd-parties/qtsingleapplication/doc/images/qt-logo.png b/3rd-parties/qtsingleapplication/doc/images/qt-logo.png new file mode 100644 index 0000000..794162f Binary files /dev/null and b/3rd-parties/qtsingleapplication/doc/images/qt-logo.png differ diff --git a/3rd-parties/qtsingleapplication/doc/index.qdoc b/3rd-parties/qtsingleapplication/doc/index.qdoc new file mode 100644 index 0000000..796dffe --- /dev/null +++ b/3rd-parties/qtsingleapplication/doc/index.qdoc @@ -0,0 +1,50 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +/*! + \page index.html + \title Single Application + + \section1 Description + + The QtSingleApplication component provides support + for applications that can be only started once per user. + + + + For some applications it is useful or even critical that they are started + only once by any user. Future attempts to start the application should + activate any already running instance, and possibly perform requested + actions, e.g. loading a file, in that instance. + + The QtSingleApplication class provides an interface to detect a running + instance, and to send command strings to that instance. + For console (non-GUI) applications, the QtSingleCoreApplication variant is provided, which avoids dependency on QtGui. + + + + + \section1 Classes + \list + \i QtSingleApplication \i QtSingleCoreApplication\endlist + + \section1 Examples + \list + \i \link qtsingleapplication-example-trivial.html A Trivial Example \endlink \i \link qtsingleapplication-example-loader.html Loading Documents \endlink \i \link qtsinglecoreapplication-example-console.html A Non-GUI Example \endlink \endlist + + + + + + + \section1 Tested platforms + \list + \i Qt 4.4, 4.5 / Windows XP / MSVC.NET 2005 + \i Qt 4.4, 4.5 / Linux / gcc + \i Qt 4.4, 4.5 / MacOS X 10.5 / gcc + \endlist + + + + +*/ diff --git a/3rd-parties/qtsingleapplication/examples/console/console.pro b/3rd-parties/qtsingleapplication/examples/console/console.pro new file mode 100644 index 0000000..e0390e2 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/console/console.pro @@ -0,0 +1,5 @@ +TEMPLATE = app +CONFIG += console +SOURCES += main.cpp +include(../../src/qtsinglecoreapplication.pri) +QT -= gui diff --git a/3rd-parties/qtsingleapplication/examples/console/console.qdoc b/3rd-parties/qtsingleapplication/examples/console/console.qdoc new file mode 100644 index 0000000..2706e26 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/console/console.qdoc @@ -0,0 +1,28 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +/*! \page qtsinglecoreapplication-example-console.html + \title A non-GUI example + + This example shows how to use the single-application functionality + in a console application. It does not require the \c QtGui library + at all. + + The only differences from the GUI application usage demonstrated + in the other examples are: + + 1) The \c.pro file should include \c qtsinglecoreapplication.pri + instead of \c qtsingleapplication.pri + + 2) The class name is \c QtSingleCoreApplication instead of \c + QtSingleApplication. + + 3) No calls are made regarding window activation, for obvious reasons. + + console.pro: + \quotefile console/console.pro + + main.cpp: + \quotefile console/main.cpp + +*/ diff --git a/3rd-parties/qtsingleapplication/examples/console/main.cpp b/3rd-parties/qtsingleapplication/examples/console/main.cpp new file mode 100644 index 0000000..13fd00e --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/console/main.cpp @@ -0,0 +1,52 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + + +#include "qtsinglecoreapplication.h" +#include + + +void report(const QString& msg) +{ + qDebug("[%i] %s", (int)QCoreApplication::applicationPid(), qPrintable(msg)); +} + +class MainClass : public QObject +{ + Q_OBJECT +public: + MainClass() + : QObject() + {} + +public slots: + void handleMessage(const QString& message) + { + report( "Message received: \"" + message + "\""); + } +}; + +int main(int argc, char **argv) +{ + report("Starting up"); + + QtSingleCoreApplication app(argc, argv); + + if (app.isRunning()) { + QString msg(QString("Hi master, I am %1.").arg(QCoreApplication::applicationPid())); + bool sentok = app.sendMessage(msg, 2000); + QString rep("Another instance is running, so I will exit."); + rep += sentok ? " Message sent ok." : " Message sending failed; the other instance may be frozen."; + report(rep); + return 0; + } else { + report("No other instance is running; so I will."); + MainClass mainObj; + QObject::connect(&app, SIGNAL(messageReceived(const QString&)), + &mainObj, SLOT(handleMessage(const QString&))); + return app.exec(); + } +} + + +#include "main.moc" diff --git a/3rd-parties/qtsingleapplication/examples/examples.pro b/3rd-parties/qtsingleapplication/examples/examples.pro new file mode 100644 index 0000000..36b8fd3 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/examples.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS = trivial \ + loader \ + console diff --git a/3rd-parties/qtsingleapplication/examples/loader/file1.qsl b/3rd-parties/qtsingleapplication/examples/loader/file1.qsl new file mode 100644 index 0000000..50fcd26 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/loader/file1.qsl @@ -0,0 +1 @@ +File 1 diff --git a/3rd-parties/qtsingleapplication/examples/loader/file2.qsl b/3rd-parties/qtsingleapplication/examples/loader/file2.qsl new file mode 100644 index 0000000..4475433 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/loader/file2.qsl @@ -0,0 +1 @@ +File 2 diff --git a/3rd-parties/qtsingleapplication/examples/loader/loader.pro b/3rd-parties/qtsingleapplication/examples/loader/loader.pro new file mode 100644 index 0000000..3e52586 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/loader/loader.pro @@ -0,0 +1,6 @@ +greaterThan(QT_MAJOR_VERSION, 4): QT += printsupport +TEMPLATE = app + +include(../../src/qtsingleapplication.pri) + +SOURCES += main.cpp diff --git a/3rd-parties/qtsingleapplication/examples/loader/loader.qdoc b/3rd-parties/qtsingleapplication/examples/loader/loader.qdoc new file mode 100644 index 0000000..1f55026 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/loader/loader.qdoc @@ -0,0 +1,44 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +/*! \page qtsingleapplication-example-loader.html + \title Loading Documents + + The application in this example loads or prints the documents + passed as commandline parameters to further instances of this + application. + + \quotefromfile loader/main.cpp + \printuntil }; + The user interface in this application is a QMainWindow subclass + with a QMdiArea as the central widget. It implements a slot + \c handleMessage() that will be connected to the messageReceived() + signal of the QtSingleApplication class. + + \printuntil } + The MainWindow constructor creates a minimal user interface. + + \printto case Print: + The handleMessage() slot interprets the message passed in as a + filename that can be prepended with \e /print to indicate that + the file should just be printed rather than loaded. + + \printto #include + Loading the file will also activate the window. + + \printto mw + The \c main entry point function creates a QtSingleApplication + object, and creates a message to send to a running instance + of the application. If the message was sent successfully the + process exits immediately. + + \printuntil } + If the message could not be sent the application starts up. Note + that \c false is passed to the call to setActivationWindow() to + prevent automatic activation for every message received, e.g. when + the application should just print a file. Instead, the message + handling function determines whether activation is requested, and + signals that by emitting the needToShow() signal. This is then + simply connected directly to QtSingleApplication's + activateWindow() slot. +*/ diff --git a/3rd-parties/qtsingleapplication/examples/loader/main.cpp b/3rd-parties/qtsingleapplication/examples/loader/main.cpp new file mode 100644 index 0000000..5078490 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/loader/main.cpp @@ -0,0 +1,115 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +#include +#include +#include +#include +#include +#include +#include +#include + +class MainWindow : public QMainWindow +{ + Q_OBJECT +public: + MainWindow(); + +public slots: + void handleMessage(const QString& message); + +signals: + void needToShow(); + +private: + QMdiArea *workspace; +}; + +MainWindow::MainWindow() +{ + workspace = new QMdiArea(this); + + setCentralWidget(workspace); +} + +void MainWindow::handleMessage(const QString& message) +{ + enum Action { + Nothing, + Open, + Print + } action; + + action = Nothing; + QString filename = message; + if (message.toLower().startsWith("/print ")) { + filename = filename.mid(7); + action = Print; + } else if (!message.isEmpty()) { + action = Open; + } + if (action == Nothing) { + emit needToShow(); + return; + } + + QFile file(filename); + QString contents; + if (file.open(QIODevice::ReadOnly)) + contents = file.readAll(); + else + contents = "[[Error: Could not load file " + filename + "]]"; + + QTextEdit *view = new QTextEdit; + view->setPlainText(contents); + + switch(action) { + case Print: + { + QPrinter printer; + view->print(&printer); + delete view; + } + break; + + case Open: + { + workspace->addSubWindow(view); + view->setWindowTitle(message); + view->show(); + emit needToShow(); + } + break; + default: + break; + }; +} + +#include "main.moc" + +int main(int argc, char **argv) +{ + QtSingleApplication instance("File loader QtSingleApplication example", argc, argv); + QString message; + for (int a = 1; a < argc; ++a) { + message += argv[a]; + if (a < argc-1) + message += " "; + } + + if (instance.sendMessage(message)) + return 0; + + MainWindow mw; + mw.handleMessage(message); + mw.show(); + + QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), + &mw, SLOT(handleMessage(const QString&))); + + instance.setActivationWindow(&mw, false); + QObject::connect(&mw, SIGNAL(needToShow()), &instance, SLOT(activateWindow())); + + return instance.exec(); +} diff --git a/3rd-parties/qtsingleapplication/examples/trivial/main.cpp b/3rd-parties/qtsingleapplication/examples/trivial/main.cpp new file mode 100644 index 0000000..d243cc5 --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/trivial/main.cpp @@ -0,0 +1,41 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +#include +#include + +class TextEdit : public QTextEdit +{ + Q_OBJECT +public: + TextEdit(QWidget *parent = 0) + : QTextEdit(parent) + {} +public slots: + void append(const QString &str) + { + QTextEdit::append(str); + } +}; + +#include "main.moc" + + + +int main(int argc, char **argv) +{ + QtSingleApplication instance(argc, argv); + if (instance.sendMessage("Wake up!")) + return 0; + + TextEdit logview; + logview.setReadOnly(true); + logview.show(); + + instance.setActivationWindow(&logview); + + QObject::connect(&instance, SIGNAL(messageReceived(const QString&)), + &logview, SLOT(append(const QString&))); + + return instance.exec(); +} diff --git a/3rd-parties/qtsingleapplication/examples/trivial/trivial.pro b/3rd-parties/qtsingleapplication/examples/trivial/trivial.pro new file mode 100644 index 0000000..673497a --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/trivial/trivial.pro @@ -0,0 +1,5 @@ +TEMPLATE = app + +include(../../src/qtsingleapplication.pri) + +SOURCES += main.cpp diff --git a/3rd-parties/qtsingleapplication/examples/trivial/trivial.qdoc b/3rd-parties/qtsingleapplication/examples/trivial/trivial.qdoc new file mode 100644 index 0000000..4a8640e --- /dev/null +++ b/3rd-parties/qtsingleapplication/examples/trivial/trivial.qdoc @@ -0,0 +1,39 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +/*! \page qtsingleapplication-example-trivial.html + \title A Trivial Example + + The application in this example has a log-view that displays + messages sent by further instances of the same application. + + The example demonstrates the use of the QtSingleApplication + class to detect and communicate with a running instance of + the application using the sendMessage() API. The messageReceived() + signal is used to display received messages in a QTextEdit log. + + \quotefromfile trivial/main.cpp + \printuntil instance + The example has only the \c main entry point function. + A QtSingleApplication object is created immediately. + + \printuntil return + If another instance of this application is already running, + sendMessage() will succeed, and this instance just exits + immediately. + + \printuntil show() + Otherwise the instance continues as normal and creates the + user interface. + + \printuntil return instance.exec(); + The \c logview object is also set as the application's activation + window. Every time a message is received, the window will be raised + and activated automatically. + + The messageReceived() signal is also connected to the QTextEdit's + append() slot. Every message received from further instances of + this application will be displayed in the log. + + Finally the event loop is entered. +*/ diff --git a/3rd-parties/qtsingleapplication/qtlocalpeer.h b/3rd-parties/qtsingleapplication/qtlocalpeer.h deleted file mode 100644 index 1b533b1..0000000 --- a/3rd-parties/qtsingleapplication/qtlocalpeer.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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 QTLOCALPEER_H -#define QTLOCALPEER_H - -#include -#include -#include - -#include "qtlockedfile.h" - -class QtLocalPeer : public QObject -{ - Q_OBJECT - -public: - QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); - bool isClient(); - bool sendMessage(const QString &message, int timeout); - QString applicationId() const - { return id; } - -Q_SIGNALS: - void messageReceived(const QString &message); - -protected Q_SLOTS: - void receiveConnection(); - -protected: - QString id; - QString socketName; - QLocalServer* server; - QtLP_Private::QtLockedFile lockFile; - -private: - static const char* ack; -}; - -#endif // QTLOCALPEER_H diff --git a/3rd-parties/qtsingleapplication/qtlockedfile.h b/3rd-parties/qtsingleapplication/qtlockedfile.h deleted file mode 100644 index 84c18e5..0000000 --- a/3rd-parties/qtsingleapplication/qtlockedfile.h +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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 QTLOCKEDFILE_H -#define QTLOCKEDFILE_H - -#include -#ifdef Q_OS_WIN -#include -#endif - -#if defined(Q_OS_WIN) -# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) -# define QT_QTLOCKEDFILE_EXPORT -# elif defined(QT_QTLOCKEDFILE_IMPORT) -# if defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# endif -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) -# elif defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) -# endif -#else -# define QT_QTLOCKEDFILE_EXPORT -#endif - -namespace QtLP_Private { - -class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile -{ -public: - enum LockMode { NoLock = 0, ReadLock, WriteLock }; - - QtLockedFile(); - QtLockedFile(const QString &name); - ~QtLockedFile(); - - bool open(OpenMode mode); - - bool lock(LockMode mode, bool block = true); - bool unlock(); - bool isLocked() const; - LockMode lockMode() const; - -private: -#ifdef Q_OS_WIN - Qt::HANDLE wmutex; - Qt::HANDLE rmutex; - QVector rmutexes; - QString mutexname; - - Qt::HANDLE getMutexHandle(int idx, bool doCreate); - bool waitMutex(Qt::HANDLE mutex, bool doBlock); - -#endif - LockMode m_lock_mode; -}; -} -#endif diff --git a/3rd-parties/qtsingleapplication/qtlockedfile_unix.cpp b/3rd-parties/qtsingleapplication/qtlockedfile_unix.cpp deleted file mode 100644 index 976c1b9..0000000 --- a/3rd-parties/qtsingleapplication/qtlockedfile_unix.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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 -#include - -#include "qtlockedfile.h" - -bool QtLockedFile::lock(LockMode mode, bool block) -{ - if (!isOpen()) { - qWarning("QtLockedFile::lock(): file is not opened"); - return false; - } - - if (mode == NoLock) - return unlock(); - - if (mode == m_lock_mode) - return true; - - if (m_lock_mode != NoLock) - unlock(); - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; - int cmd = block ? F_SETLKW : F_SETLK; - int ret = fcntl(handle(), cmd, &fl); - - if (ret == -1) { - if (errno != EINTR && errno != EAGAIN) - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - - m_lock_mode = mode; - return true; -} - - -bool QtLockedFile::unlock() -{ - if (!isOpen()) { - qWarning("QtLockedFile::unlock(): file is not opened"); - return false; - } - - if (!isLocked()) - return true; - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = F_UNLCK; - int ret = fcntl(handle(), F_SETLKW, &fl); - - if (ret == -1) { - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - m_lock_mode = NoLock; - return true; -} - -QtLockedFile::~QtLockedFile() -{ - if (isOpen()) - unlock(); -} - diff --git a/3rd-parties/qtsingleapplication/qtsingleapplication.pro b/3rd-parties/qtsingleapplication/qtsingleapplication.pro new file mode 100644 index 0000000..07257c5 --- /dev/null +++ b/3rd-parties/qtsingleapplication/qtsingleapplication.pro @@ -0,0 +1,5 @@ +TEMPLATE=subdirs +CONFIG += ordered +include(common.pri) +qtsingleapplication-uselib:SUBDIRS=buildlib +SUBDIRS+=examples diff --git a/3rd-parties/qtsingleapplication/qtsinglecoreapplication.h b/3rd-parties/qtsingleapplication/qtsinglecoreapplication.h deleted file mode 100644 index b87fffe..0000000 --- a/3rd-parties/qtsingleapplication/qtsinglecoreapplication.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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 QTSINGLECOREAPPLICATION_H -#define QTSINGLECOREAPPLICATION_H - -#include - -class QtLocalPeer; - -class QtSingleCoreApplication : public QCoreApplication -{ - Q_OBJECT - -public: - QtSingleCoreApplication(int &argc, char **argv); - QtSingleCoreApplication(const QString &id, int &argc, char **argv); - - bool isRunning(); - QString id() const; - -public Q_SLOTS: - bool sendMessage(const QString &message, int timeout = 5000); - - -Q_SIGNALS: - void messageReceived(const QString &message); - - -private: - QtLocalPeer* peer; -}; - -#endif // QTSINGLECOREAPPLICATION_H diff --git a/3rd-parties/qtsingleapplication/QtLockedFile b/3rd-parties/qtsingleapplication/src/QtLockedFile similarity index 100% rename from 3rd-parties/qtsingleapplication/QtLockedFile rename to 3rd-parties/qtsingleapplication/src/QtLockedFile diff --git a/3rd-parties/qtsingleapplication/QtSingleApplication b/3rd-parties/qtsingleapplication/src/QtSingleApplication similarity index 100% rename from 3rd-parties/qtsingleapplication/QtSingleApplication rename to 3rd-parties/qtsingleapplication/src/QtSingleApplication diff --git a/3rd-parties/qtsingleapplication/qtlocalpeer.cpp b/3rd-parties/qtsingleapplication/src/qtlocalpeer.cpp similarity index 68% rename from 3rd-parties/qtsingleapplication/qtlocalpeer.cpp rename to 3rd-parties/qtsingleapplication/src/qtlocalpeer.cpp index a7dd166..7e99171 100644 --- a/3rd-parties/qtsingleapplication/qtlocalpeer.cpp +++ b/3rd-parties/qtsingleapplication/src/qtlocalpeer.cpp @@ -1,47 +1,11 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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$ -** -****************************************************************************/ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause #include "qtlocalpeer.h" #include #include +#include #include #if defined(Q_OS_WIN) @@ -78,7 +42,7 @@ QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) #endif prefix = id.section(QLatin1Char('/'), -1); } - prefix.remove(QRegExp("[^a-zA-Z]")); + prefix.remove(QRegularExpression("[^a-zA-Z]")); prefix.truncate(6); QByteArray idc = id.toUtf8(); @@ -180,7 +144,6 @@ void QtLocalPeer::receiveConnection() if (socket->state() == QLocalSocket::UnconnectedState) { qWarning("QtLocalPeer: Peer disconnected"); delete socket; - socket = nullptr; return; } if (socket->bytesAvailable() >= qint64(sizeof(quint32))) @@ -203,7 +166,6 @@ void QtLocalPeer::receiveConnection() if (got < 0) { qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData()); delete socket; - socket = nullptr; return; } QString message(QString::fromUtf8(uMsg)); @@ -211,6 +173,5 @@ void QtLocalPeer::receiveConnection() socket->waitForBytesWritten(1000); socket->waitForDisconnected(1000); // make sure client reads ack delete socket; - socket = nullptr; - Q_EMIT messageReceived(message); //### (might take a long time to return) + emit messageReceived(message); //### (might take a long time to return) } diff --git a/3rd-parties/qtsingleapplication/src/qtlocalpeer.h b/3rd-parties/qtsingleapplication/src/qtlocalpeer.h new file mode 100644 index 0000000..5e6db56 --- /dev/null +++ b/3rd-parties/qtsingleapplication/src/qtlocalpeer.h @@ -0,0 +1,40 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +#ifndef QTLOCALPEER_H +#define QTLOCALPEER_H + +#include +#include +#include + +#include "qtlockedfile.h" + +class QtLocalPeer : public QObject +{ + Q_OBJECT + +public: + QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); + bool isClient(); + bool sendMessage(const QString &message, int timeout); + QString applicationId() const + { return id; } + +Q_SIGNALS: + void messageReceived(const QString &message); + +protected Q_SLOTS: + void receiveConnection(); + +protected: + QString id; + QString socketName; + QLocalServer* server; + QtLP_Private::QtLockedFile lockFile; + +private: + static const char* ack; +}; + +#endif // QTLOCALPEER_H diff --git a/3rd-parties/qtsingleapplication/qtlockedfile.cpp b/3rd-parties/qtsingleapplication/src/qtlockedfile.cpp similarity index 67% rename from 3rd-parties/qtsingleapplication/qtlockedfile.cpp rename to 3rd-parties/qtsingleapplication/src/qtlockedfile.cpp index c142a86..78f20bc 100644 --- a/3rd-parties/qtsingleapplication/qtlockedfile.cpp +++ b/3rd-parties/qtsingleapplication/src/qtlockedfile.cpp @@ -1,42 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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$ -** -****************************************************************************/ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause #include "qtlockedfile.h" diff --git a/3rd-parties/qtsingleapplication/src/qtlockedfile.h b/3rd-parties/qtsingleapplication/src/qtlockedfile.h new file mode 100644 index 0000000..c729bf2 --- /dev/null +++ b/3rd-parties/qtsingleapplication/src/qtlockedfile.h @@ -0,0 +1,60 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +#ifndef QTLOCKEDFILE_H +#define QTLOCKEDFILE_H + +#include +#ifdef Q_OS_WIN +#include +#endif + +#if defined(Q_OS_WIN) +# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) +# define QT_QTLOCKEDFILE_EXPORT +# elif defined(QT_QTLOCKEDFILE_IMPORT) +# if defined(QT_QTLOCKEDFILE_EXPORT) +# undef QT_QTLOCKEDFILE_EXPORT +# endif +# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) +# elif defined(QT_QTLOCKEDFILE_EXPORT) +# undef QT_QTLOCKEDFILE_EXPORT +# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTLOCKEDFILE_EXPORT +#endif + +namespace QtLP_Private { + +class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile +{ +public: + enum LockMode { NoLock = 0, ReadLock, WriteLock }; + + QtLockedFile(); + QtLockedFile(const QString &name); + ~QtLockedFile(); + + bool open(OpenMode mode); + + bool lock(LockMode mode, bool block = true); + bool unlock(); + bool isLocked() const; + LockMode lockMode() const; + +private: +#ifdef Q_OS_WIN + Qt::HANDLE wmutex; + Qt::HANDLE rmutex; + QVector rmutexes; + QString mutexname; + + Qt::HANDLE getMutexHandle(int idx, bool doCreate); + bool waitMutex(Qt::HANDLE mutex, bool doBlock); + +#endif + LockMode m_lock_mode; +}; +} +#endif diff --git a/3rd-parties/qtsingleapplication/src/qtlockedfile_unix.cpp b/3rd-parties/qtsingleapplication/src/qtlockedfile_unix.cpp new file mode 100644 index 0000000..8385d8b --- /dev/null +++ b/3rd-parties/qtsingleapplication/src/qtlockedfile_unix.cpp @@ -0,0 +1,78 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +#include +#include +#include +#include + +#include "qtlockedfile.h" + +bool QtLockedFile::lock(LockMode mode, bool block) +{ + if (!isOpen()) { + qWarning("QtLockedFile::lock(): file is not opened"); + return false; + } + + if (mode == NoLock) + return unlock(); + + if (mode == m_lock_mode) + return true; + + if (m_lock_mode != NoLock) + unlock(); + + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; + int cmd = block ? F_SETLKW : F_SETLK; + int ret = fcntl(handle(), cmd, &fl); + + if (ret == -1) { + if (errno != EINTR && errno != EAGAIN) + qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); + return false; + } + + + m_lock_mode = mode; + return true; +} + + +bool QtLockedFile::unlock() +{ + if (!isOpen()) { + qWarning("QtLockedFile::unlock(): file is not opened"); + return false; + } + + if (!isLocked()) + return true; + + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = F_UNLCK; + int ret = fcntl(handle(), F_SETLKW, &fl); + + if (ret == -1) { + qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); + return false; + } + + m_lock_mode = NoLock; + return true; +} + +QtLockedFile::~QtLockedFile() +{ + if (isOpen()) + unlock(); +} + diff --git a/3rd-parties/qtsingleapplication/qtlockedfile_win.cpp b/3rd-parties/qtsingleapplication/src/qtlockedfile_win.cpp similarity index 69% rename from 3rd-parties/qtsingleapplication/qtlockedfile_win.cpp rename to 3rd-parties/qtsingleapplication/src/qtlockedfile_win.cpp index 5e21262..28cf072 100644 --- a/3rd-parties/qtsingleapplication/qtlockedfile_win.cpp +++ b/3rd-parties/qtsingleapplication/src/qtlockedfile_win.cpp @@ -1,42 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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$ -** -****************************************************************************/ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause #include "qtlockedfile.h" #include diff --git a/3rd-parties/qtsingleapplication/qtsingleapplication.cpp b/3rd-parties/qtsingleapplication/src/qtsingleapplication.cpp similarity index 82% rename from 3rd-parties/qtsingleapplication/qtsingleapplication.cpp rename to 3rd-parties/qtsingleapplication/src/qtsingleapplication.cpp index 5878a82..a6f4516 100644 --- a/3rd-parties/qtsingleapplication/qtsingleapplication.cpp +++ b/3rd-parties/qtsingleapplication/src/qtsingleapplication.cpp @@ -1,42 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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$ -** -****************************************************************************/ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause #include "qtsingleapplication.h" @@ -323,7 +286,7 @@ QWidget* QtSingleApplication::activationWindow() const void QtSingleApplication::activateWindow() { if (actWin) { - //actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); + actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); actWin->raise(); actWin->activateWindow(); } diff --git a/3rd-parties/qtsingleapplication/qtsingleapplication.h b/3rd-parties/qtsingleapplication/src/qtsingleapplication.h similarity index 50% rename from 3rd-parties/qtsingleapplication/qtsingleapplication.h rename to 3rd-parties/qtsingleapplication/src/qtsingleapplication.h index 049406f..f8f6e88 100644 --- a/3rd-parties/qtsingleapplication/qtsingleapplication.h +++ b/3rd-parties/qtsingleapplication/src/qtsingleapplication.h @@ -1,42 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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$ -** -****************************************************************************/ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause #ifndef QTSINGLEAPPLICATION_H #define QTSINGLEAPPLICATION_H diff --git a/3rd-parties/qtsingleapplication/qtsingleapplication.pri b/3rd-parties/qtsingleapplication/src/qtsingleapplication.pri similarity index 96% rename from 3rd-parties/qtsingleapplication/qtsingleapplication.pri rename to 3rd-parties/qtsingleapplication/src/qtsingleapplication.pri index 1d85285..6f2bced 100644 --- a/3rd-parties/qtsingleapplication/qtsingleapplication.pri +++ b/3rd-parties/qtsingleapplication/src/qtsingleapplication.pri @@ -1,3 +1,4 @@ +include(../common.pri) INCLUDEPATH += $$PWD DEPENDPATH += $$PWD QT *= network diff --git a/3rd-parties/qtsingleapplication/qtsinglecoreapplication.cpp b/3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.cpp similarity index 62% rename from 3rd-parties/qtsingleapplication/qtsinglecoreapplication.cpp rename to 3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.cpp index 5634537..a3e2b3a 100644 --- a/3rd-parties/qtsingleapplication/qtsinglecoreapplication.cpp +++ b/3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.cpp @@ -1,42 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the Qt Solutions component. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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$ -** -****************************************************************************/ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause #include "qtsinglecoreapplication.h" diff --git a/3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.h b/3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.h new file mode 100644 index 0000000..1272589 --- /dev/null +++ b/3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.h @@ -0,0 +1,34 @@ +// Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +// SPDX-License-Identifier: BSD-3-Clause + +#ifndef QTSINGLECOREAPPLICATION_H +#define QTSINGLECOREAPPLICATION_H + +#include + +class QtLocalPeer; + +class QtSingleCoreApplication : public QCoreApplication +{ + Q_OBJECT + +public: + QtSingleCoreApplication(int &argc, char **argv); + QtSingleCoreApplication(const QString &id, int &argc, char **argv); + + bool isRunning(); + QString id() const; + +public Q_SLOTS: + bool sendMessage(const QString &message, int timeout = 5000); + + +Q_SIGNALS: + void messageReceived(const QString &message); + + +private: + QtLocalPeer* peer; +}; + +#endif // QTSINGLECOREAPPLICATION_H diff --git a/3rd-parties/qtsingleapplication/qtsinglecoreapplication.pri b/3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.pri similarity index 100% rename from 3rd-parties/qtsingleapplication/qtsinglecoreapplication.pri rename to 3rd-parties/qtsingleapplication/src/qtsinglecoreapplication.pri diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..7887722 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.14) +project(ukui-search LANGUAGES C CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +include(GNUInstallDirs) + +add_subdirectory(libchinese-segmentation) +add_subdirectory(libsearch) +add_subdirectory(frontend) +add_subdirectory(ukuisearch-systemdbus) +add_subdirectory(search-ukcc-plugin) +add_subdirectory(ukui-search-service) +add_subdirectory(ukui-search-app-data-service) +add_subdirectory(ukui-search-service-dir-manager) + +if (BUILD_TEST) + add_subdirectory(tests) +endif () \ No newline at end of file diff --git a/frontend/CMakeLists.txt b/frontend/CMakeLists.txt new file mode 100644 index 0000000..f78b0fe --- /dev/null +++ b/frontend/CMakeLists.txt @@ -0,0 +1,125 @@ +cmake_minimum_required(VERSION 3.14) +project(ukui-search VERSION 1.0 LANGUAGES C CXX) + +set(VERSION_MAJOR 2) +set(VERSION_MINOR 2) +set(VERSION_MICRO 3) +set(UKUI_SEARCH_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MICRO}) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools X11Extras REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools X11Extras REQUIRED) +find_package(PkgConfig REQUIRED) +find_package(KF5WindowSystem) + +set(UKUI_SEARCH_EXTERNAL_LIBS "") +set(UKUI_SEARCH_PC_PKGS gio-2.0 glib-2.0 gio-unix-2.0 kysdk-waylandhelper xapian-core gsettings-qt) + +foreach(PC_LIB IN ITEMS ${UKUI_SEARCH_PC_PKGS}) + pkg_check_modules(${PC_LIB} REQUIRED IMPORTED_TARGET ${PC_LIB}) + if(${${PC_LIB}_FOUND}) + include_directories(${${PC_LIB}_INCLUDE_DIRS}) + link_directories(${${PC_LIB}_LIBRARY_DIRS}) + list(APPEND UKUI_NOTIFICATION_EXTERNAL_LIBS PkgConfig::${PC_LIB}) + endif() +endforeach() + +add_subdirectory(../3rd-parties/qtsingleapplication ${CMAKE_CURRENT_SOURCE_DIR}) + +set(UKUI_SEARCH_SRC + control/create-index-ask-dialog.cpp control/create-index-ask-dialog.h + control/list-labels/show-more-label.cpp control/list-labels/show-more-label.h + control/list-labels/title-label.cpp control/list-labels/title-label.h + control/search-line-edit.cpp control/search-line-edit.h + control/stack-pages/search-page-section.cpp control/stack-pages/search-page-section.h + control/stack-pages/search-result-page.cpp control/stack-pages/search-result-page.h + main.cpp + mainwindow.cpp mainwindow.h + model/best-list-model.cpp model/best-list-model.h + model/search-result-manager.cpp model/search-result-manager.h + model/search-result-model.cpp model/search-result-model.h + model/web-search-model.cpp model/web-search-model.h + search-app-widget-plugin/search.cpp search-app-widget-plugin/search.h + ukui-search-dbus-service.cpp ukui-search-dbus-service.h + ukui-search-gui.cpp ukui-search-gui.h + view/best-list-view.cpp view/best-list-view.h + view/result-view.cpp view/result-view.h + view/result-view-delegate.cpp view/result-view-delegate.h + ) + +set(QRC_FILES resource.qrc) + +file(GLOB UKUI_SEARCH_TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../translations/ukui-search/*.ts) +set_source_files_properties(${UKUI_SEARCH_TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/frontend/.qm) +qt5_create_translation(UKUI_SEARCH_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${UKUI_SEARCH_TS_FILES}) + +file(GLOB UKUI_SEARCH_APP_WIDGET_TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../translations/ukui-search/appwidget/*.ts) +set_source_files_properties(${UKUI_SEARCH_APP_WIDGET_TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/frontend/.qm) +qt5_create_translation(UKUI_SEARCH_APP_WIDGET_QM_FILES ${PROJECT_SOURCE_DIR} ${UKUI_SEARCH_APP_WIDGET_TS_FILES}) +add_executable(ukui-search + ${UKUI_SEARCH_SRC} + ${QRC_FILES} + ${UKUI_SEARCH_QM_FILES} + ${UKUI_SEARCH_APP_WIDGET_QM_FILES}) + +target_compile_definitions(ukui-search PRIVATE + VERSION="${UKUI_SEARCH_VERSION}" + ) + +target_link_libraries(ukui-search PRIVATE + KF5::WindowSystem + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::X11Extras + gsettings-qt + ukui-appwidget-manager + ukui-appwidget-provider + libukui-search + chinese-segmentation + kysdk-waylandhelper + qtsingleapplication + ) + +target_include_directories(ukui-search PRIVATE + ../3rd-parties/qtsingleapplication/src + ../libchinese-segmentation + ../libsearch + ../libsearch/pluginmanage + ../libsearch/plugininterface + ../libsearch/searchinterface + control + control/list-labels + control/stack-pages + model + search-app-widget-plugin + view + xatom + ) + +set(APP_WIDGET_FILES_PRE + search-app-widget-plugin/provider +) +#小插件相关 +install(FILES ${APP_WIDGET_FILES_PRE}/data/search.conf DESTINATION /usr/share/appwidget/config/) +install(FILES ${APP_WIDGET_FILES_PRE}/org.ukui.appwidget.provider.search.service DESTINATION /usr/share/dbus-1/services/) +install(FILES + ${APP_WIDGET_FILES_PRE}/data/search.png + ${APP_WIDGET_FILES_PRE}/data/ukui-search.svg + DESTINATION /usr/share/appwidget/search/) +install(FILES ${APP_WIDGET_FILES_PRE}/data/search.qml DESTINATION /usr/share/appwidget/qml/) +install(FILES ${UKUI_SEARCH_APP_WIDGET_QM_FILES} DESTINATION /usr/share/appwidget/translations/) +#二进制 +install(TARGETS ukui-search RUNTIME DESTINATION /usr/bin) +#翻译 +install(FILES ${UKUI_SEARCH_QM_FILES} DESTINATION /usr/share/ukui-search/translations/) +#desktop文件 +install(FILES ../data/ukui-search-menu.desktop DESTINATION /usr/share/applications) +install(FILES ../data/ukui-search.desktop DESTINATION /etc/xdg/autostart) +#gsettings +install(FILES ../data/org.ukui.log4qt.ukui-search.gschema.xml DESTINATION /usr/share/glib-2.0/schemas/) \ No newline at end of file diff --git a/frontend/control/README.md b/frontend/control/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/control/control.pri b/frontend/control/control.pri deleted file mode 100644 index 9fc1074..0000000 --- a/frontend/control/control.pri +++ /dev/null @@ -1,14 +0,0 @@ -include(stack-pages/stack-pages.pri) -include(list-labels/list-labels.pri) - -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/search-line-edit.h \ -# $$PWD/settings-widget.h \ - $$PWD/create-index-ask-dialog.h \ - -SOURCES += \ - $$PWD/search-line-edit.cpp \ -# $$PWD/settings-widget.cpp \ - $$PWD/create-index-ask-dialog.cpp \ diff --git a/frontend/control/flow-layout/flow-layout.pri b/frontend/control/flow-layout/flow-layout.pri deleted file mode 100644 index d0e147a..0000000 --- a/frontend/control/flow-layout/flow-layout.pri +++ /dev/null @@ -1,5 +0,0 @@ -SOURCES += \ - $$PWD/flow-layout.cpp \ - -HEADERS += \ - $$PWD/flow-layout.h \ diff --git a/frontend/control/list-labels/list-labels.pri b/frontend/control/list-labels/list-labels.pri deleted file mode 100644 index 4049a43..0000000 --- a/frontend/control/list-labels/list-labels.pri +++ /dev/null @@ -1,9 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/show-more-label.h \ - $$PWD/title-label.h - -SOURCES += \ - $$PWD/show-more-label.cpp \ - $$PWD/title-label.cpp diff --git a/frontend/control/stack-pages/stack-pages.pri b/frontend/control/stack-pages/stack-pages.pri deleted file mode 100644 index d61da71..0000000 --- a/frontend/control/stack-pages/stack-pages.pri +++ /dev/null @@ -1,9 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/search-page-section.h \ - $$PWD/search-result-page.h - -SOURCES += \ - $$PWD/search-page-section.cpp \ - $$PWD/search-result-page.cpp diff --git a/frontend/frontend.pro b/frontend/frontend.pro deleted file mode 100644 index 4ad83b5..0000000 --- a/frontend/frontend.pro +++ /dev/null @@ -1,109 +0,0 @@ -QT += core gui dbus KWindowSystem xml x11extras sql - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -VERSION = 2.2.3 -DEFINES += VERSION='\\"$${VERSION}\\"' -TARGET = ukui-search -TEMPLATE = app - -PKGCONFIG += gio-2.0 glib-2.0 gio-unix-2.0 kysdk-waylandhelper -CONFIG += c++11 link_pkgconfig no_keywords lrelease -LIBS += -lxapian -lgsettings-qt -lquazip5 -lX11 -LIBS += -lukui-appwidget-manager -lukui-appwidget-provider -#LIBS += -lukui-log4qt -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -include(../libsearch/libukui-search-headers.pri) -include(control/control.pri) -include(model/model.pri) -include(xatom/xatom.pri) -include(../3rd-parties/qtsingleapplication/qtsingleapplication.pri) -include(view/view.pri) -include(search-app-widget-plugin/search-app-widget-plugin.pri) - - -SOURCES += \ - main.cpp \ - mainwindow.cpp \ - ukui-search-dbus-service.cpp \ - ukui-search-gui.cpp - - -HEADERS += \ - mainwindow.h \ - ukui-search-dbus-service.h \ - ukui-search-gui.h - -# Default rules for deployment. - -target.path = /usr/bin -!isEmpty(target.path): INSTALLS += target - -data-menu.path = /usr/share/applications -data-menu.files += ../data/ukui-search-menu.desktop -data.path = /etc/xdg/autostart -data.files += ../data/ukui-search.desktop - -INSTALLS += data data-menu - -RESOURCES += \ - resource.qrc \ - search-app-widget-plugin/provider/src.qrc - -TRANSLATIONS += \ - ../translations/ukui-search/zh_CN.ts \ - ../translations/ukui-search/tr.ts \ - ../translations/ukui-search/bo_CN.ts \ - ../translations/ukui-search/mn.ts \ - ../translations/ukui-search/appwidget/search_zh_CN.ts \ - ../translations/ukui-search/appwidget/search_bo_CN.ts \ - ../translations/ukui-search/appwidget/search_mn.ts - -qm_files.path = /usr/share/ukui-search/translations/ -qm_files.files = $$OUT_PWD/.qm/zh_CN.qm \ - $$OUT_PWD/.qm/bo_CN.qm \ - $$OUT_PWD/.qm/tr.qm \ - $$OUT_PWD/.qm/mn.qm \ - -schemes.path = /usr/share/glib-2.0/schemas/ -schemes.files += ../data/org.ukui.log4qt.ukui-search.gschema.xml - -appwidget_qm_files.files = $$OUT_PWD/.qm/search_bo_CN.qm \ - $$OUT_PWD/.qm/search_zh_CN.qm \ - $$OUT_PWD/.qm/search_mn.qm -appwidget_qm_files.path = /usr/share/appwidget/translations/ - -qml.files += search-app-widget-plugin/provider/data/search.qml -qml.path = /usr/share/appwidget/qml/ - -appwidgetconf.files += search-app-widget-plugin/provider/data/search.conf -appwidgetconf.path = /usr/share/appwidget/config/ - -service.files += search-app-widget-plugin/provider/org.ukui.appwidget.provider.search.service -service.path += /usr/share/dbus-1/services/ - -preview.files += search-app-widget-plugin/provider/data/search.png -preview.path = /usr/share/appwidget/search/ - -svg.files += search-app-widget-plugin/provider/data/ukui-search.svg -svg.path = /usr/share/appwidget/search/ - -INSTALLS += qm_files schemes qml appwidget_qm_files appwidgetconf service preview svg - -LIBS += -L$$OUT_PWD/../libchinese-segmentation -lchinese-segmentation \ - -L$$OUT_PWD/../libsearch -lukui-search - -INCLUDEPATH += $$PWD/../libchinese-segmentation -DEPENDPATH += $$PWD/../libchinese-segmentation - -DISTFILES += \ - ../data/org.ukui.log4qt.ukui-search.gschema.xml \ diff --git a/frontend/model/README.md b/frontend/model/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/model/model.pri b/frontend/model/model.pri deleted file mode 100644 index 5278729..0000000 --- a/frontend/model/model.pri +++ /dev/null @@ -1,13 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/best-list-model.h \ - $$PWD/search-result-manager.h \ - $$PWD/search-result-model.h \ - $$PWD/web-search-model.h - -SOURCES += \ - $$PWD/best-list-model.cpp \ - $$PWD/search-result-manager.cpp \ - $$PWD/search-result-model.cpp \ - $$PWD/web-search-model.cpp diff --git a/frontend/search-app-widget-plugin/provider/data/search.svg b/frontend/search-app-widget-plugin/provider/data/search.svg deleted file mode 100644 index e931c1d..0000000 --- a/frontend/search-app-widget-plugin/provider/data/search.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - ukui-global search-search - - - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/search-app-widget-plugin/provider/src.qrc b/frontend/search-app-widget-plugin/provider/src.qrc deleted file mode 100644 index 52b9d51..0000000 --- a/frontend/search-app-widget-plugin/provider/src.qrc +++ /dev/null @@ -1,9 +0,0 @@ - - - org.ukui.appwidget.provider.search.service - data/search.conf - data/search.qml - data/search.png - data/ukui-search.svg - - diff --git a/frontend/search-app-widget-plugin/search-app-widget-plugin.pro b/frontend/search-app-widget-plugin/search-app-widget-plugin.pro deleted file mode 100644 index 3e1c4f4..0000000 --- a/frontend/search-app-widget-plugin/search-app-widget-plugin.pro +++ /dev/null @@ -1,52 +0,0 @@ -QT += dbus widgets - -TEMPLATE = lib -DEFINES += SEARCHAPPWIDGETPLUGIN_LIBRARY - -CONFIG += c++11 link_pkgconfig - -PKGCONFIG += gsettings-qt - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -TRANSLATIONS += translations/zh_CN.ts - -SOURCES += \ - search.cpp - -HEADERS += \ - search-app-widget-plugin_global.h \ - search.h - -LIBS += -lukui-appwidget-manager -lukui-appwidget-provider - -# Default rules for deployment. - -qml.files += provider/data/search.qml -qml.path = /usr/share/appwidget/qml/ - -qm_files.files = translations/* $$OUT_PWD/.qm/*.qm -qm_files.path = /usr/share/appwidget/search/translations/ - -appwidgetconf.files += provider/data/search.conf -appwidgetconf.path = /usr/share/appwidget/config/ - -service.files += provider/org.ukui.appwidget.provider.search.service -service.path += /usr/share/dbus-1/services/ - -preview.files += provider/data/search.png -preview.path = /usr/share/appwidget/search/ - -svg.files += provider/data/ukui-search.svg -svg.path = /usr/share/appwidget/search/ - -INSTALLS += target qml qm_files appwidgetconf service preview svg diff --git a/frontend/search-app-widget-plugin/search-app-widget-plugin_global.h b/frontend/search-app-widget-plugin/search-app-widget-plugin_global.h deleted file mode 100644 index 4c83b89..0000000 --- a/frontend/search-app-widget-plugin/search-app-widget-plugin_global.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef SEARCHAPPWIDGETPLUGIN_GLOBAL_H -#define SEARCHAPPWIDGETPLUGIN_GLOBAL_H - -#include - -#if defined(SEARCHAPPWIDGETPLUGIN_LIBRARY) -# define SEARCHAPPWIDGETPLUGIN_EXPORT Q_DECL_EXPORT -#else -# define SEARCHAPPWIDGETPLUGIN_EXPORT Q_DECL_IMPORT -#endif - -#endif // SEARCHAPPWIDGETPLUGIN_GLOBAL_H diff --git a/frontend/search-app-widget-plugin/search.h b/frontend/search-app-widget-plugin/search.h index d0b609f..166130d 100644 --- a/frontend/search-app-widget-plugin/search.h +++ b/frontend/search-app-widget-plugin/search.h @@ -19,9 +19,6 @@ */ #ifndef SEARCH_H #define SEARCH_H - -#include "libsearch_global.h" - #define signals Q_SIGNALS #define slots Q_SLOTS @@ -35,7 +32,7 @@ #include namespace UkuiSearch { -class LIBSEARCH_EXPORT AppWidgetPlugin : public AppWidget::KAppWidgetProvider +class AppWidgetPlugin : public AppWidget::KAppWidgetProvider { Q_OBJECT diff --git a/frontend/ukui-search-gui.cpp b/frontend/ukui-search-gui.cpp index 7c76fd8..8611627 100644 --- a/frontend/ukui-search-gui.cpp +++ b/frontend/ukui-search-gui.cpp @@ -25,7 +25,6 @@ #include #include "plugin-manager.h" #include "search-plugin-manager.h" -#include "document.h" using namespace UkuiSearch; UkuiSearchGui::UkuiSearchGui(int &argc, char *argv[], const QString &applicationName): QtSingleApplication (applicationName, argc, argv) @@ -62,7 +61,7 @@ UkuiSearchGui::UkuiSearchGui(int &argc, char *argv[], const QString &application QTranslator *lib_translator = new QTranslator(this); try { - if(! lib_translator->load("/usr/share/ukui-search/translations/libukui-search_" + QLocale::system().name())) throw - 1; + if(! lib_translator->load("/usr/share/ukui-search/translations/libukui-search/libukui-search_" + QLocale::system().name())) throw - 1; this->installTranslator(lib_translator); } catch(...) { qDebug() << "Load translations file" << QLocale() << "failed!"; diff --git a/frontend/view/view.pri b/frontend/view/view.pri deleted file mode 100644 index 78a89f7..0000000 --- a/frontend/view/view.pri +++ /dev/null @@ -1,11 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/best-list-view.h \ - $$PWD/result-view-delegate.h \ - $$PWD/result-view.h - -SOURCES += \ - $$PWD/best-list-view.cpp \ - $$PWD/result-view-delegate.cpp \ - $$PWD/result-view.cpp diff --git a/frontend/xatom/xatom.pri b/frontend/xatom/xatom.pri deleted file mode 100644 index 2d5b140..0000000 --- a/frontend/xatom/xatom.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/xatom-helper.h \ - -SOURCES += \ - $$PWD/xatom-helper.cpp \ diff --git a/libchinese-segmentation b/libchinese-segmentation index 4734827..1cae358 160000 --- a/libchinese-segmentation +++ b/libchinese-segmentation @@ -1 +1 @@ -Subproject commit 4734827d7c31936f1485e4513316b05cb7c8714f +Subproject commit 1cae358a5bd4d5dd4ed93ff97de7b3ebf394c5c6 diff --git a/libsearch/CMakeLists.txt b/libsearch/CMakeLists.txt new file mode 100644 index 0000000..ccbfa2a --- /dev/null +++ b/libsearch/CMakeLists.txt @@ -0,0 +1,214 @@ +set(VERSION_MAJOR 2) +set(VERSION_MINOR 3) +set(VERSION_MICRO 0) +set(LIBUKUI_SEARCH_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MICRO}) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools REQUIRED) +find_package(PkgConfig REQUIRED) +find_package(KF5WindowSystem) +find_package(qt5xdg) + +set(LIBUKUI_SEARCH_EXTERNAL_LIBS "") +set(LIBUKUI_SEARCH_PC_PKGS + xapian-core + gio-2.0 + glib-2.0 + gio-unix-2.0 + gsettings-qt + poppler-qt5 + kysdk-qtwidgets + lept + uchardet + tesseract) + +foreach(PC_LIB IN ITEMS ${LIBUKUI_SEARCH_PC_PKGS}) + pkg_check_modules(${PC_LIB} REQUIRED IMPORTED_TARGET ${PC_LIB}) + if(${${PC_LIB}_FOUND}) + include_directories(${${PC_LIB}_INCLUDE_DIRS}) + link_directories(${${PC_LIB}_LIBRARY_DIRS}) + list(APPEND LIBUKUI_SEARCH_EXTERNAL_LIBS PkgConfig::${PC_LIB}) + endif() +endforeach() + +set(LIBUKUI_SEARCH_SRC + appdata/app-info-dbus-argument.h + appdata/app-info-table.cpp appdata/app-info-table.h + appdata/app-info-table-private.h + appdata/application-info.cpp appdata/application-info.h + appdata/application-property.h + appdata/application-property-helper.cpp appdata/application-property-helper.h + appsearch/app-search-plugin.cpp appsearch/app-search-plugin.h + common.h + dirwatcher/dir-watcher.cpp dirwatcher/dir-watcher.h + file-utils.cpp file-utils.h + filesystemwatcher/file-system-watcher.cpp filesystemwatcher/file-system-watcher.h + filesystemwatcher/file-system-watcher-private.h + global-settings.cpp global-settings.h + global-settings-private.h + gobject-template.cpp gobject-template.h + index/basic-indexer.cpp index/basic-indexer.h + index/batch-indexer.cpp index/batch-indexer.h + index/compatible-define.h + index/database.cpp index/database.h + index/document.cpp index/document.h + index/file-content-indexer.cpp index/file-content-indexer.h + index/file-indexer-config.cpp index/file-indexer-config.h + index/file-reader.cpp index/file-reader.h + index/file-search-plugin.cpp index/file-search-plugin.h + index/file-watcher.cpp index/file-watcher.h + index/index-scheduler.cpp index/index-scheduler.h + index/index-status-recorder.cpp index/index-status-recorder.h + index/index-updater.cpp index/index-updater.h + index/monitor.cpp index/monitor.h + index/ocrobject.cpp index/ocrobject.h + index/pending-file.cpp index/pending-file.h + index/pending-file-queue.cpp index/pending-file-queue.h + index/search-manager.cpp index/search-manager.h + index/ukui-search-qdbus.cpp index/ukui-search-qdbus.h + index/writable-database.cpp index/writable-database.h + libsearch.cpp libsearch.h + libsearch_global.h + log-utils.cpp log-utils.h + notesearch/note-search-plugin.cpp notesearch/note-search-plugin.h + parser/binary-parser.cpp parser/binary-parser.h + parser/common.h + plugininterface/action-label.cpp plugininterface/action-label.h + plugininterface/action-transmiter.cpp plugininterface/action-transmiter.h + plugininterface/data-queue.h + plugininterface/plugin-iface.h + plugininterface/search-plugin-iface.cpp plugininterface/search-plugin-iface.h + plugininterface/search-task-plugin-iface.h + plugininterface/separation-line.cpp plugininterface/separation-line.h + pluginmanage/plugin-info.h + pluginmanage/plugin-manager.cpp pluginmanage/plugin-manager.h + pluginmanage/search-plugin-manager.cpp pluginmanage/search-plugin-manager.h + pluginmanage/search-task-plugin-manager.cpp pluginmanage/search-task-plugin-manager.h + searchinterface/result-item.cpp searchinterface/result-item.h + searchinterface/search-controller.cpp searchinterface/search-controller.h + searchinterface/search-result-property.h + searchinterface/search-result-property-info.cpp searchinterface/search-result-property-info.h + searchinterface/searchtasks/app-search-task.cpp searchinterface/searchtasks/app-search-task.h + searchinterface/searchtasks/file-content-search-task.cpp searchinterface/searchtasks/file-content-search-task.h + searchinterface/searchtasks/file-search-task.cpp searchinterface/searchtasks/file-search-task.h + searchinterface/ukui-search-task.cpp searchinterface/ukui-search-task.h + settingsearch/settings-search-plugin.cpp settingsearch/settings-search-plugin.h + websearch/web-search-plugin.cpp websearch/web-search-plugin.h + ) +set(QRC_FILES resource1.qrc) +file(GLOB TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../translations/libukui-search/*.ts) +set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/libsearch/.qm) +qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES}) + +add_library(libukui-search SHARED + ${LIBUKUI_SEARCH_SRC} + ${QRC_FILES} + ${QM_FILES} +) +set(HEADERS + libsearch_global.h + plugininterface/action-label.h + plugininterface/action-transmiter.h + plugininterface/data-queue.h + plugininterface/plugin-iface.h + plugininterface/search-plugin-iface.h + plugininterface/search-task-plugin-iface.h + plugininterface/separation-line.h + appdata/application-info.h + appdata/application-property.h + appdata/application-property-helper.h + searchinterface/ukui-search-task.h + searchinterface/result-item.h + searchinterface/search-result-property.h + filesystemwatcher/file-system-watcher.h + development-files/header-files/UkuiSearchTask + development-files/header-files/UkuiSearchPluginIface + development-files/header-files/FileSystemWatcher + ) + +include_directories( + ../libchinese-segmentation + appdata + appsearch + dirwatcher + filesystemwatcher + index + notesearch + parser + plugininterface + pluginmanage + searchinterface + searchinterface/searchtasks + settingsearch + websearch +) + +target_compile_definitions(libukui-search PRIVATE + PLUGIN_INSTALL_DIRS="/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/ukui-search-plugins" + QT_NO_KEYWORDS + ) + +target_link_libraries(libukui-search PUBLIC + KF5::WindowSystem + Qt5Xdg + Qt${QT_VERSION_MAJOR}::Concurrent + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Sql + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Xml + chinese-segmentation + quazip5 + tesseract + uchardet + xapian + ${LIBUKUI_SEARCH_EXTERNAL_LIBS} + ) + +include(CMakePackageConfigHelpers) +set(CMAKE_CONFIG_INSTALL_DIR "/usr/share/cmake/ukui-search") +set(HEADERS_INSTALL_DIR /usr/include/ukui-search) +set(PC_INSTALL_DIR "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/pkgconfig") + +target_include_directories(libukui-search PUBLIC $) + +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/ukui-search-config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/ukui-search-config.cmake" + INSTALL_DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/ukui-search-config-version.cmake + VERSION ${LIBUKUI_SEARCH_VERSION} + COMPATIBILITY SameMajorVersion +) +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/ukui-search.pc.in" + "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/ukui-search.pc" + INSTALL_DESTINATION ${PC_INSTALL_DIR}) + +set_target_properties(libukui-search PROPERTIES + VERSION ${LIBUKUI_SEARCH_VERSION} + SOVERSION ${VERSION_MAJOR} + OUTPUT_NAME ukui-search + ) +install(TARGETS libukui-search + EXPORT libukui-search + PUBLIC_HEADER DESTINATION ${HEADERS_INSTALL_DIR} + LIBRARY DESTINATION /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} + ) +install(EXPORT libukui-search + FILE ukui-search-targets.cmake + DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}) +install(FILES ${QM_FILES} DESTINATION /usr/share/ukui-search/translations/libukui-search) + +install(FILES ${HEADERS} DESTINATION ${HEADERS_INSTALL_DIR}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/ukui-search.pc DESTINATION ${PC_INSTALL_DIR}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ukui-search-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/ukui-search-config-version.cmake + DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}) \ No newline at end of file diff --git a/libsearch/appdata/appdata.pri b/libsearch/appdata/appdata.pri deleted file mode 100644 index aa1c8cc..0000000 --- a/libsearch/appdata/appdata.pri +++ /dev/null @@ -1,17 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/app-info-table-private.h \ - $$PWD/app-info-table.h \ -# $$PWD/application-info-storage.h \ - $$PWD/application-info.h \ - $$PWD/application-property-helper.h \ - $$PWD/application-property.h \ - $$PWD/app-info-dbus-argument.h - -SOURCES += \ - $$PWD/app-info-table.cpp \ -# $$PWD/application-info-storage.cpp \ - $$PWD/application-info.cpp \ - $$PWD/application-property-helper.cpp - diff --git a/libsearch/appsearch/appsearch.pri b/libsearch/appsearch/appsearch.pri deleted file mode 100644 index 9f39bab..0000000 --- a/libsearch/appsearch/appsearch.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/app-search-plugin.h - -SOURCES += \ - $$PWD/app-search-plugin.cpp diff --git a/libsearch/dirwatcher/dirwatcher.pri b/libsearch/dirwatcher/dirwatcher.pri deleted file mode 100644 index 4558940..0000000 --- a/libsearch/dirwatcher/dirwatcher.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/dir-watcher.h - -SOURCES += \ - $$PWD/dir-watcher.cpp diff --git a/libsearch/filesystemwatcher/file-system-watcher.pri b/libsearch/filesystemwatcher/file-system-watcher.pri deleted file mode 100644 index 6db39b6..0000000 --- a/libsearch/filesystemwatcher/file-system-watcher.pri +++ /dev/null @@ -1,9 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/file-system-watcher-private.h \ - $$PWD/file-system-watcher.h - -SOURCES += \ - $$PWD/file-system-watcher.cpp - diff --git a/libsearch/index/data-queue.cpp b/libsearch/index/data-queue.cpp deleted file mode 100644 index b06cd4f..0000000 --- a/libsearch/index/data-queue.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "data-queue.h" - -DataQueue::DataQueue() -{ - -} diff --git a/libsearch/index/data-queue.h b/libsearch/index/data-queue.h deleted file mode 100644 index 2af8741..0000000 --- a/libsearch/index/data-queue.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef DATAQUEUE_H -#define DATAQUEUE_H - - -class DataQueue -{ -public: - DataQueue(); -}; - -#endif // DATAQUEUE_H diff --git a/libsearch/index/index.pri b/libsearch/index/index.pri deleted file mode 100644 index 601c063..0000000 --- a/libsearch/index/index.pri +++ /dev/null @@ -1,46 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/basic-indexer.h \ - $$PWD/batch-indexer.h \ - $$PWD/compatible-define.h \ - $$PWD/database.h \ - $$PWD/document.h \ -# $$PWD/file-iterator.h \ - $$PWD/file-content-indexer.h \ - $$PWD/file-reader.h \ - $$PWD/file-search-plugin.h \ - $$PWD/index-scheduler.h \ - $$PWD/index-status-recorder.h \ - $$PWD/monitor.h \ - $$PWD/ocrobject.h \ - $$PWD/pending-file-queue.h \ - $$PWD/pending-file.h \ - $$PWD/search-manager.h \ - $$PWD/ukui-search-qdbus.h \ - $$PWD/file-indexer-config.h \ - $$PWD/file-watcher.h \ - $$PWD/index-updater.h \ - $$PWD/writable-database.h - -SOURCES += \ - $$PWD/basic-indexer.cpp \ - $$PWD/batch-indexer.cpp \ - $$PWD/database.cpp \ - $$PWD/document.cpp \ - $$PWD/file-content-indexer.cpp \ - $$PWD/file-reader.cpp \ - $$PWD/file-search-plugin.cpp \ - $$PWD/index-scheduler.cpp \ - $$PWD/index-status-recorder.cpp \ - $$PWD/monitor.cpp \ - $$PWD/ocrobject.cpp \ - $$PWD/pending-file-queue.cpp \ - $$PWD/pending-file.cpp \ - $$PWD/search-manager.cpp \ - $$PWD/ukui-search-qdbus.cpp \ - $$PWD/file-indexer-config.cpp \ - $$PWD/file-watcher.cpp \ - $$PWD/index-updater.cpp \ - $$PWD/writable-database.cpp - diff --git a/libsearch/libsearch.pro b/libsearch/libsearch.pro deleted file mode 100644 index 99da5fc..0000000 --- a/libsearch/libsearch.pro +++ /dev/null @@ -1,109 +0,0 @@ -QT += core xml widgets dbus concurrent sql KWindowSystem -VERSION = 2.3.0 -DEFINES += VERSION='\\"$${VERSION}\\"' - -TARGET = ukui-search -TEMPLATE = lib -DEFINES += LIBSEARCH_LIBRARY -CONFIG += create_pc create_prl no_install_prl - -PKGCONFIG += gio-2.0 glib-2.0 gio-unix-2.0 gsettings-qt poppler-qt5 kysdk-qtwidgets lept - -CONFIG += c++11 link_pkgconfig no_keywords lrelease -QMAKE_CXXFLAGS += -Werror=return-type -Werror=return-local-addr -Werror=uninitialized - - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -PLUGIN_INSTALL_DIRS = $$[QT_INSTALL_LIBS]/ukui-search-plugins -DEFINES += PLUGIN_INSTALL_DIRS='\\"$${PLUGIN_INSTALL_DIRS}\\"' -QMAKE_CXXFLAGS += -execution-charset:utf-8 - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -include(filesystemwatcher/file-system-watcher.pri) -include(pluginmanage/plugin-manager.pri) -include(plugininterface/plugin-interface.pri) -include(index/index.pri) -include(parser/parser.pri) -include(appsearch/appsearch.pri) -include(appdata/appdata.pri) -include(notesearch/notesearch.pri) -include(settingsearch/settingsearch.pri) -include(websearch/websearch.pri) -include(searchinterface/search-interface.pri) -include(dirwatcher/dirwatcher.pri) -#include(mailsearch/mailsearch.pri) - -LIBS += -L$$OUT_PWD/../libchinese-segmentation/ -lchinese-segmentation -LIBS += -lxapian -luchardet -lQt5Xdg -lquazip5 -ltesseract #-L/usr/local/lib/libjemalloc -ljemalloc - -SOURCES += \ - file-utils.cpp \ - global-settings.cpp \ - gobject-template.cpp \ - libsearch.cpp \ - log-utils.cpp - -HEADERS += \ - common.h \ - file-utils.h \ - global-settings-private.h \ - global-settings.h \ - gobject-template.h \ - libsearch_global.h \ - libsearch.h \ - log-utils.h - -RESOURCES += \ - resource1.qrc - -TRANSLATIONS += \ - ../translations/libukui-search/libukui-search_zh_CN.ts \ - ../translations/libukui-search/libukui-search_bo_CN.ts \ - ../translations/libukui-search/libukui-search_mn.ts - -qm_files.path = /usr/share/ukui-search/translations/ -qm_files.files = $$OUT_PWD/.qm/*.qm - -INSTALLS += qm_files - - -# Default rules for deployment. -unix { - target.path = $$[QT_INSTALL_LIBS] - QMAKE_PKGCONFIG_NAME = ukui-search - QMAKE_PKGCONFIG_DESCRIPTION = Ukui-search Header files - QMAKE_PKGCONFIG_VERSION = $$VERSION - QMAKE_PKGCONFIG_LIBDIR = $$target.path - QMAKE_PKGCONFIG_DESTDIR = pkgconfig - QMAKE_PKGCONFIG_INCDIR = /usr/include/ukui-search - QMAKE_PKGCONFIG_CFLAGS += -I/usr/include/ukui-search - - INSTALLS += target - - header.path = /usr/include/ukui-search - header.files += libsearch_global.h \ - plugininterface/*.h \ - appdata/application-info.h \ - appdata/application-property.h \ - appdata/application-property-helper.h \ - searchinterface/ukui-search-task.h \ - searchinterface/result-item.h \ - searchinterface/search-result-property.h - - header.files += development-files/header-files/* - - INSTALLS += header -} -INCLUDEPATH += $$PWD/../libchinese-segmentation -DEPENDPATH += $$PWD/../libchinese-segmentation - -#DISTFILES += \ -# ../translations/libsearch/libukui-search_zh_CN.ts diff --git a/libsearch/mailsearch/mailsearch.pri b/libsearch/mailsearch/mailsearch.pri deleted file mode 100644 index 103b9f6..0000000 --- a/libsearch/mailsearch/mailsearch.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/mail-search-plugin.h - -SOURCES += \ - $$PWD/mail-search-plugin.cpp diff --git a/libsearch/notesearch/notesearch.pri b/libsearch/notesearch/notesearch.pri deleted file mode 100644 index 62dc971..0000000 --- a/libsearch/notesearch/notesearch.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/note-search-plugin.h - -SOURCES += \ - $$PWD/note-search-plugin.cpp diff --git a/libsearch/parser/parser.pri b/libsearch/parser/parser.pri deleted file mode 100644 index c24be85..0000000 --- a/libsearch/parser/parser.pri +++ /dev/null @@ -1,9 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/common.h \ - $$PWD/binary-parser.h - - -SOURCES += \ - $$PWD/binary-parser.cpp diff --git a/libsearch/plugininterface/plugin-interface.pri b/libsearch/plugininterface/plugin-interface.pri deleted file mode 100644 index 67fc25b..0000000 --- a/libsearch/plugininterface/plugin-interface.pri +++ /dev/null @@ -1,17 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/action-transmiter.h \ - $$PWD/action-label.h \ - $$PWD/plugin-iface.h \ - $$PWD/search-plugin-iface.h \ - $$PWD/search-task-plugin-iface.h \ - $$PWD/data-queue.h \ - $$PWD/separation-line.h - -SOURCES += \ - $$PWD/action-transmiter.cpp \ - $$PWD/action-label.cpp \ - $$PWD/separation-line.cpp \ - $$PWD/search-plugin-iface.cpp - diff --git a/libsearch/searchinterface/search-interface.pri b/libsearch/searchinterface/search-interface.pri deleted file mode 100644 index 984df54..0000000 --- a/libsearch/searchinterface/search-interface.pri +++ /dev/null @@ -1,18 +0,0 @@ -INCLUDEPATH += $$PWD -include(searchtasks/search-tasks.pri) - -HEADERS += \ -# $$PWD/result-item-private.h \ - $$PWD/search-controller.h \ - $$PWD/result-item.h \ - $$PWD/search-result-property-info.h \ - $$PWD/search-result-property.h \ -# $$PWD/ukui-search-task-private.h \ - $$PWD/ukui-search-task.h - -SOURCES += \ - $$PWD/search-controller.cpp \ - $$PWD/result-item.cpp \ - $$PWD/search-result-property-info.cpp \ - $$PWD/ukui-search-task.cpp - diff --git a/libsearch/settingsearch/settingsearch.pri b/libsearch/settingsearch/settingsearch.pri deleted file mode 100644 index fd5ff3b..0000000 --- a/libsearch/settingsearch/settingsearch.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/settings-search-plugin.h - -SOURCES += \ - $$PWD/settings-search-plugin.cpp diff --git a/libsearch/ukui-search-config.cmake.in b/libsearch/ukui-search-config.cmake.in new file mode 100644 index 0000000..5e07a90 --- /dev/null +++ b/libsearch/ukui-search-config.cmake.in @@ -0,0 +1,9 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +find_dependency(Qt@QT_VERSION_MAJOR@Core "@REQUIRED_QT_VERSION@") +if(TARGET Qt6::Core) + find_dependency(Qt6Core5Compat @REQUIRED_QT_VERSION@) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/ukui-search-targets.cmake") \ No newline at end of file diff --git a/libsearch/ukui-search.pc.in b/libsearch/ukui-search.pc.in new file mode 100644 index 0000000..ab4ce78 --- /dev/null +++ b/libsearch/ukui-search.pc.in @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib/@CMAKE_LIBRARY_ARCHITECTURE@ +includedir=${prefix}/include/ukui-search + +Name: ukui-search +Description: ukui-search header files +URL: https://www.ukui.org/ +Version: @VERSION@ +Cflags: -I${includedir} +Libs: -L${libdir} -lukui-search \ No newline at end of file diff --git a/libsearch/websearch/websearch.pri b/libsearch/websearch/websearch.pri deleted file mode 100644 index 3a3830b..0000000 --- a/libsearch/websearch/websearch.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/web-search-plugin.h - -SOURCES += \ - $$PWD/web-search-plugin.cpp diff --git a/search-ukcc-plugin/CMakeLists.txt b/search-ukcc-plugin/CMakeLists.txt new file mode 100644 index 0000000..0142303 --- /dev/null +++ b/search-ukcc-plugin/CMakeLists.txt @@ -0,0 +1,45 @@ +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Widgets LinguistTools REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Widgets LinguistTools REQUIRED) +find_package(PkgConfig REQUIRED) +set(UKCC_PLUGIN_EXTERNAL_LIBS "") +set(UKCC_PLUGIN_PC_PKGS gsettings-qt kysdk-qtwidgets) + +foreach(PC_LIB IN ITEMS ${UKCC_PLUGIN_PC_PKGS}) + pkg_check_modules(${PC_LIB} REQUIRED ${PC_LIB}) + if(${${PC_LIB}_FOUND}) + include_directories(${${PC_LIB}_INCLUDE_DIRS}) + link_directories(${${PC_LIB}_LIBRARY_DIRS}) + list(APPEND UKCC_PLUGIN_EXTERNAL_LIBS PkgConfig::${PC_LIB}) + endif() +endforeach() + +file(GLOB UKCC_PLUGIN_TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/translations/*.ts) +set_source_files_properties(${UKCC_PLUGIN_TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/search-ukcc-plugin/.qm) +qt5_create_translation(UKCC_PLUGIN_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${UKCC_PLUGIN_TS_FILES}) + +add_library(search-ukcc-plugin MODULE + search.cpp search.h + ${UKCC_PLUGIN_QM_FILES} + ) +target_link_libraries(search-ukcc-plugin PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Widgets + gsettings-qt + ukcc + ${UKCC_PLUGIN_PC_PKGS} + ) + +install(TARGETS search-ukcc-plugin + DESTINATION /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/ukui-control-center) +install(FILES + ${UKCC_PLUGIN_TS_FILES} + ${UKCC_PLUGIN_QM_FILES} + DESTINATION /usr/share/ukui-search/search-ukcc-plugin/translations) +file(GLOB IMG_FILES ./image/*) +install(FILES ${IMG_FILES} DESTINATION /usr/share/ukui-search/search-ukcc-plugin/image) diff --git a/search-ukcc-plugin/search-ukcc-plugin.pro b/search-ukcc-plugin/search-ukcc-plugin.pro deleted file mode 100644 index 30bc3ae..0000000 --- a/search-ukcc-plugin/search-ukcc-plugin.pro +++ /dev/null @@ -1,38 +0,0 @@ -QT += widgets dbus - -TEMPLATE = lib -TARGET = $$qtLibraryTarget(search-ukcc-plugin) -target.path = $$[QT_INSTALL_LIBS]/ukui-control-center/ - -CONFIG += plugin link_pkgconfig c++11 lrelease - -PKGCONFIG += gio-2.0 gio-unix-2.0 gsettings-qt kysdk-qtwidgets - -LIBS += -L$$[QT_INSTALL_LIBS] -lgsettings-qt -LIBS += -lukcc - -DEFINES += QT_DEPRECATED_WARNINGS - -SOURCES += search.cpp - -HEADERS += search.h - -TRANSLATIONS += translations/zh_CN.ts \ - translations/bo_CN.ts \ - translations/en_US.ts \ - translations/mn.ts - -images.files = image/* -images.path = /usr/share/ukui-search/search-ukcc-plugin/image/ - -qm_files.files = translations/* $$OUT_PWD/.qm/*.qm -qm_files.path = /usr/share/ukui-search/search-ukcc-plugin/translations - - -INSTALLS += target images qm_files - -DISTFILES += \ - ./image/360.svg \ - ./image/baidu.scg \ - ./image/sougou.svg \ - ./image/add.svg diff --git a/search-ukcc-plugin/search.ui b/search-ukcc-plugin/search.ui deleted file mode 100644 index 0a9f70e..0000000 --- a/search-ukcc-plugin/search.ui +++ /dev/null @@ -1,19 +0,0 @@ - - - Search - - - - 0 - 0 - 784 - 630 - - - - Form - - - - - diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..0846b57 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.16) +project(tests VERSION 1.0 LANGUAGES C CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_executable(tests + file-system-watcher-test.cpp file-system-watcher-test.h + main.cpp +) +target_include_directories(tests PRIVATE + ../libsearch ../libsearch + ../libsearch/appsearch + ../libsearch/dirwatcher + ../libsearch/filesystemwatcher + ../libsearch/index + ../libsearch/parser + ../libsearch/plugininterface + ../libsearch/pluginmanage + ../libsearch/searchinterface + ../libsearch/settingsearch +) +target_link_libraries(tests PRIVATE + # Remove: L${CMAKE_CURRENT_BINARY_DIR}/../libsearch/ + Qt${QT_VERSION_MAJOR}::Core + libukui-search +) diff --git a/translations/libukui-search/libukui-search_bo_CN.ts b/translations/libukui-search/libukui-search_bo_CN.ts index 6718df2..79eb112 100644 --- a/translations/libukui-search/libukui-search_bo_CN.ts +++ b/translations/libukui-search/libukui-search_bo_CN.ts @@ -4,12 +4,12 @@ QObject - + Content index incomplete. ནང་དོན་གྱི་སྟོན་གྲངས་ཆ་མི་ཚང་བ། - + Warning, Can not find home path. ཁྱིམ་གྱི་དཀར་ཆག་རྙེད་ཐབས་མེད། @@ -17,38 +17,39 @@ UkuiSearch::AppMatch + Application Description: - ཉེར་སྤྱོད་གོ་རིམ་གྱི་གསལ་བཤད། + ཉེར་སྤྱོད་གོ་རིམ་གྱི་གསལ་བཤད། UkuiSearch::AppSearchPlugin - + Open སྒོ་ཕྱེ་བ། - + Add Shortcut to Desktop ཅོག་ངོས་སུ་མྱུར་འཐེབ་སྣོན་པ། - + Add Shortcut to Panel ལས་འགན་གྱི་སྒྲོམ་ཐོག་མགྱོགས་མྱུར་གྱི་བྱེད་ཐབས་གསར་སྣོན་བྱ་དགོས - + Install སྒྲིག་སྦྱོར་བྱེད་པ - + Application Description: ཉེར་སྤྱོད་གོ་རིམ་གྱི་གསལ་བཤད། @@ -59,7 +60,7 @@ ཉེར་སྤྱོད་གོ་རིམ་འཚོལ་བཤེར། - + Application ཉེར་སྤྱོད་བྱ་རིམ། @@ -67,12 +68,12 @@ UkuiSearch::AppSearchTask - + Application ཉེར་སྤྱོད་བྱ་རིམ། - + Application search. ཉེར་སྤྱོད་གོ་རིམ་འཚོལ་བཤེར། @@ -131,13 +132,13 @@ UkuiSearch::FileContengSearchPlugin - + Open སྒོ་ཕྱེ་བ། - + Open path ཡིག་ཆའི་ཐབས་ལམ་འབྱེད་དགོས། @@ -147,37 +148,37 @@ ཡིག་ཆའི་ལམ་ཐིག་དཔར་བ། - + File content search. ཡིག་ཆའི་ནང་དོན་འཚོལ་ཞིབ་ - + File content search ཡིག་ཆའི་ནང་དོན་འཚོལ་ཞིབ་ - + OCR OCR - + File ཡིག་ཆ། - + Path ལམ་ཐིག - + Last time modified ཐེངས་སྔ་མའི་བཟོ་བཅོས་དུས་ཚོད། - + Copy path ཡིག་ཆའི་ལམ་ཐིག་དཔར་བ། @@ -265,39 +266,49 @@ UkuiSearch::MailSearch + From - དེ་ནས་ཡོང་བ་ཡིན། + དེ་ནས་ཡོང་བ་ཡིན། + Time - དུས་ཚོད། + དུས་ཚོད། + To - དམིགས་ཡུལ་ས་གནས། + དམིགས་ཡུལ་ས་གནས། + Cc - Cc + Cc UkuiSearch::MailSearchPlugin + open - སྒོ་ཕྱེ་བ། + སྒོ་ཕྱེ་བ། + + + Mail Search - སྦྲག་རྫས་འཚོལ་བཤེར། + སྦྲག་རྫས་འཚོལ་བཤེར། + Mail - སྦྲག་རྫས། + སྦྲག་རྫས། + Open - སྒོ་ཕྱེ་བ། + སྒོ་ཕྱེ་བ། @@ -437,7 +448,7 @@ UkuiSearch::UkuiSearchTask - + Current task uuid error or an unregistered plugin is used! ᠣᠳᠣᠬᠠᠨ ᠤ ᠡᠭᠦᠷᠭᠡ UUID ᠪᠤᠷᠤᠭᠤ ᠪᠤᠶᠤ ᠳᠠᠩᠰᠠᠯᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠬᠠᠳᠬᠤᠮᠠᠯ ᠬᠡᠷᠡᠭᠰᠡᠯ ᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠳᠡᠵᠡᠢ ! diff --git a/translations/libukui-search/libukui-search_mn.ts b/translations/libukui-search/libukui-search_mn.ts index 2aace1c..38adef7 100644 --- a/translations/libukui-search/libukui-search_mn.ts +++ b/translations/libukui-search/libukui-search_mn.ts @@ -4,12 +4,12 @@ QObject - + Content index incomplete. ᠠᠭᠤᠯᠭ᠎ᠠ᠎ᠶᠢᠨ ᠬᠡᠯᠬᠢᠶᠡᠰᠦ ᠪᠦᠷᠢᠨ ᠪᠤᠰᠤ ᠃ - + Warning, Can not find home path. ᠰᠡᠷᠡᠮᠵᠢᠯᠡᠬᠦᠦᠯ ᠂home ᠵᠠᠮ᠎ᠢ ᠤᠯᠵᠤ ᠮᠡᠳᠡᠭᠰᠡᠨ ᠦᠬᠡᠢ᠃ @@ -17,8 +17,9 @@ UkuiSearch::AppMatch + Application Description: - 应用描述: + 应用描述: @@ -32,25 +33,25 @@ UkuiSearch::AppSearchPlugin - + Open ᠨᠡᠬᠡᠬᠡᠬᠦ᠌ - + Add Shortcut to Desktop ᠱᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ᠎ᠤᠨ ᠲᠦᠳᠡ ᠴᠦᠷᠬᠡ᠎ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ᠎ᠳᠤ ᠨᠡᠮᠡᠬᠦ᠌ - + Add Shortcut to Panel ᠡᠬᠦᠷᠭᠡ᠎ᠶᠢᠨ ᠬᠡᠷᠡᠭᠰᠡᠬᠡ᠎ᠶᠢᠨ ᠲᠦᠲᠡ ᠴᠦᠷᠬᠡ᠎ᠳᠦ ᠨᠡᠮᠡᠬᠦ᠌ - + Install ᠤᠭᠰᠠᠷᠠᠬᠤ @@ -61,12 +62,12 @@ ᠬᠡᠷᠡᠭᠯᠡᠯᠳᠡ - + Application ᠬᠡᠷᠡᠭᠯᠡᠯᠳᠡ - + Application Description: 应用描述: @@ -74,12 +75,12 @@ UkuiSearch::AppSearchTask - + Application ᠬᠡᠷᠡᠭᠯᠡᠯᠳᠡ - + Application search. ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ ᠦ ᠡᠷᠢᠯᠲᠡ ᠃ @@ -142,13 +143,13 @@ UkuiSearch::FileContengSearchPlugin - + Open ᠨᠡᠬᠡᠬᠡᠬᠦ᠌ - + Open path ᠹᠠᠢᠯ᠎ᠤᠨ ᠪᠠᠢᠭ᠎ᠠ ᠵᠠᠮ᠎ᠢ ᠨᠡᠬᠡᠬᠡᠬᠦ᠌ @@ -162,37 +163,37 @@ 文本内容搜索 - + File content search. ᠲᠸᠺᠰᠲ᠎ᠦᠨ ᠠᠭᠤᠯᠭ᠎ᠠ᠎ᠶᠢ ᠬᠠᠢᠬᠤ᠃ - + File content search ᠲᠸᠺᠰᠲ᠎ᠦᠨ ᠠᠭᠤᠯᠭ᠎ᠠ - + OCR OCR - + File ᠹᠠᠢᠯ - + Path ᠵᠠᠮ - + Last time modified ᠳᠡᠭᠡᠷ᠎ᠡ ᠤᠳᠠᠭ᠎ᠠ᠎ᠶᠢᠨ ᠵᠠᠰᠠᠭᠰᠠᠨ ᠴᠠᠭ - + Copy path ᠹᠠᠢᠯ᠎ᠤᠨ ᠵᠠᠮ᠎ᠢ ᠬᠠᠭᠤᠯᠪᠤᠷᠢᠯᠠᠬᠤ @@ -280,39 +281,49 @@ UkuiSearch::MailSearch + From - ᠢᠮᠸᠯ ᠢᠯᠡᠬᠡᠭᠴᠢ + ᠢᠮᠸᠯ ᠢᠯᠡᠬᠡᠭᠴᠢ + Time - ᠴᠠᠭ + ᠴᠠᠭ + To - ᠢᠮᠸᠯ ᠬᠤᠷᠢᠶᠠᠭᠴᠢ + ᠢᠮᠸᠯ ᠬᠤᠷᠢᠶᠠᠭᠴᠢ + Cc - ᠬᠠᠭᠤᠯᠵᠤ ᠬᠦᠷᠬᠡᠭᠴᠢ + ᠬᠠᠭᠤᠯᠵᠤ ᠬᠦᠷᠬᠡᠭᠴᠢ UkuiSearch::MailSearchPlugin + open - ᠨᠡᠬᠡᠬᠡᠬᠦ᠌ + ᠨᠡᠬᠡᠬᠡᠬᠦ᠌ + + + Mail Search - ᠢᠮᠸᠯ ᠬᠠᠢᠬᠤ + ᠢᠮᠸᠯ ᠬᠠᠢᠬᠤ + Mail - ᠢᠮᠸᠯ + ᠢᠮᠸᠯ + Open - ᠨᠡᠬᠡᠬᠡᠬᠦ᠌ + ᠨᠡᠬᠡᠬᠡᠬᠦ᠌ @@ -457,7 +468,7 @@ UkuiSearch::UkuiSearchTask - + Current task uuid error or an unregistered plugin is used! ᠲᠤᠰ ᠡᠬᠦᠷᠭᠡuuid ᠨᠢ ᠪᠤᠷᠤᠭᠤ ᠡᠰᠡᠪᠡᠯ ᠨᠢᠭᠡ ᠪᠦᠷᠢᠳᠭᠡᠬᠦᠯᠦᠭᠰᠡᠨ ᠦᠬᠡᠢ ᠤᠭᠯᠤᠷᠭ᠎ᠠ ᠲᠤᠨᠤᠭ ᠬᠡᠷᠡᠭᠯᠡᠭᠳᠡᠭᠰᠡᠨ ᠪᠠᠢᠨ᠎ᠠ! diff --git a/translations/libukui-search/libukui-search_zh_CN.ts b/translations/libukui-search/libukui-search_zh_CN.ts index 6596e65..e074e29 100644 --- a/translations/libukui-search/libukui-search_zh_CN.ts +++ b/translations/libukui-search/libukui-search_zh_CN.ts @@ -4,12 +4,12 @@ QObject - + Content index incomplete. 内容索引未完成。 - + Warning, Can not find home path. 警告,找不到家目录。 @@ -17,8 +17,9 @@ UkuiSearch::AppMatch + Application Description: - 应用描述: + 应用描述: @@ -32,25 +33,25 @@ UkuiSearch::AppSearchPlugin - + Open 打开 - + Add Shortcut to Desktop 添加到桌面快捷方式 - + Add Shortcut to Panel 添加到任务栏快捷方式 - + Install 安装 @@ -61,12 +62,12 @@ 应用 - + Application 应用 - + Application Description: 应用描述: @@ -74,12 +75,12 @@ UkuiSearch::AppSearchTask - + Application 应用 - + Application search. 应用搜索 @@ -142,13 +143,13 @@ UkuiSearch::FileContengSearchPlugin - + Open 打开 - + Open path 打开文件所在路径 @@ -162,37 +163,37 @@ 文本内容搜索 - + File content search. 文本内容搜索。 - + File content search 文本内容 - + OCR OCR - + File 文件 - + Path 路径 - + Last time modified 上次修改时间 - + Copy path 复制路径 @@ -280,39 +281,49 @@ UkuiSearch::MailSearch + From - 发件人 + 发件人 + Time - 时间 + 时间 + To - 收件人 + 收件人 + Cc - 抄送人 + 抄送人 UkuiSearch::MailSearchPlugin + open - 打开 + 打开 + + + Mail Search - 邮件搜索 + 邮件搜索 + Mail - 邮件 + 邮件 + Open - 打开 + 打开 @@ -446,7 +457,7 @@ UkuiSearch::UkuiSearchTask - + Current task uuid error or an unregistered plugin is used! 当前任务uuid错误或使用了未注册的插件 diff --git a/translations/ukui-search/appwidget/search_bo_CN.ts b/translations/ukui-search/appwidget/search_bo_CN.ts index 3887ce2..b6a8cb1 100644 --- a/translations/ukui-search/appwidget/search_bo_CN.ts +++ b/translations/ukui-search/appwidget/search_bo_CN.ts @@ -1,6 +1,270 @@ + + UkuiSearch::BestListWidget + + + Best Matches + + + + + UkuiSearch::CreateIndexAskDialog + + + ukui-search + + + + + Search + + + + + Creating index can help you getting results quickly, whether to create or not? + + + + + Don't remind + + + + + No + + + + + Yes + + + + + UkuiSearch::FolderListItem + + + Delete the folder out of blacklist + + + + + UkuiSearch::MainWindow + + + ukui-search + + + + + Global Search + + + + + UkuiSearch::SearchLineEdit + + + Search + + + + + UkuiSearch::SettingsWidget + + + ukui-search-settings + + + + + + + Search + + + + + <h2>Settings</h2> + + + + + <h3>Index State</h3> + + + + + + ... + + + + + <h3>File Index Settings</h3> + + + + + Following folders will not be searched. You can set it by adding and removing folders. + + + + + Add ignored folders + + + + + <h3>Search Engine Settings</h3> + + + + + Please select search engine you preferred. + + + + + baidu + + + + + sougou + + + + + 360 + + + + + Whether to delete this directory? + + + + + Yes + + + + + No + + + + + Creating ... + + + + + Done + + + + + Index Entry: %1 + + + + + Directories + + + + + select blocked folder + + + + + Select + + + + + Position: + + + + + FileName: + + + + + FileType: + + + + + Cancel + + + + + Choosen path is Empty! + + + + + Choosen path is not in "home"! + + + + + Its' parent folder has been blocked! + + + + + Set blocked folder failed! + + + + + OK + + + + + UkuiSearch::UkuiSearchGui + + + Quit ukui-search application + + + + + Show main window + + + + + unregister a plugin with <pluginName> + + + + + register a plugin with <pluginName> + + + + + move <pluginName> to the target pos + + + + + move plugin to <index> + + + search diff --git a/translations/ukui-search/appwidget/search_mn.ts b/translations/ukui-search/appwidget/search_mn.ts index 34916da..43282b0 100644 --- a/translations/ukui-search/appwidget/search_mn.ts +++ b/translations/ukui-search/appwidget/search_mn.ts @@ -1,6 +1,270 @@ + + UkuiSearch::BestListWidget + + + Best Matches + + + + + UkuiSearch::CreateIndexAskDialog + + + ukui-search + + + + + Search + + + + + Creating index can help you getting results quickly, whether to create or not? + + + + + Don't remind + + + + + No + + + + + Yes + + + + + UkuiSearch::FolderListItem + + + Delete the folder out of blacklist + + + + + UkuiSearch::MainWindow + + + ukui-search + + + + + Global Search + + + + + UkuiSearch::SearchLineEdit + + + Search + + + + + UkuiSearch::SettingsWidget + + + ukui-search-settings + + + + + + + Search + + + + + <h2>Settings</h2> + + + + + <h3>Index State</h3> + + + + + + ... + + + + + <h3>File Index Settings</h3> + + + + + Following folders will not be searched. You can set it by adding and removing folders. + + + + + Add ignored folders + + + + + <h3>Search Engine Settings</h3> + + + + + Please select search engine you preferred. + + + + + baidu + + + + + sougou + + + + + 360 + + + + + Whether to delete this directory? + + + + + Yes + + + + + No + + + + + Creating ... + + + + + Done + + + + + Index Entry: %1 + + + + + Directories + + + + + select blocked folder + + + + + Select + + + + + Position: + + + + + FileName: + + + + + FileType: + + + + + Cancel + + + + + Choosen path is Empty! + + + + + Choosen path is not in "home"! + + + + + Its' parent folder has been blocked! + + + + + Set blocked folder failed! + + + + + OK + + + + + UkuiSearch::UkuiSearchGui + + + Quit ukui-search application + + + + + Show main window + + + + + unregister a plugin with <pluginName> + + + + + register a plugin with <pluginName> + + + + + move <pluginName> to the target pos + + + + + move plugin to <index> + + + search diff --git a/translations/ukui-search/appwidget/search_zh_CN.ts b/translations/ukui-search/appwidget/search_zh_CN.ts index ec71e9e..51226eb 100644 --- a/translations/ukui-search/appwidget/search_zh_CN.ts +++ b/translations/ukui-search/appwidget/search_zh_CN.ts @@ -1,6 +1,219 @@ + + UkuiSearch::BestListWidget + + Best Matches + + + + + UkuiSearch::CreateIndexAskDialog + + ukui-search + + + + Search + + + + Creating index can help you getting results quickly, whether to create or not? + + + + Don't remind + + + + No + + + + Yes + + + + + UkuiSearch::FolderListItem + + Delete the folder out of blacklist + + + + + UkuiSearch::MainWindow + + ukui-search + + + + Global Search + + + + + UkuiSearch::SearchLineEdit + + Search + + + + + UkuiSearch::SettingsWidget + + ukui-search-settings + + + + Search + + + + <h2>Settings</h2> + + + + <h3>Index State</h3> + + + + ... + + + + <h3>File Index Settings</h3> + + + + Following folders will not be searched. You can set it by adding and removing folders. + + + + Add ignored folders + + + + <h3>Search Engine Settings</h3> + + + + Please select search engine you preferred. + + + + baidu + + + + sougou + + + + 360 + + + + Whether to delete this directory? + + + + Yes + + + + No + + + + Creating ... + + + + Done + + + + Index Entry: %1 + + + + Directories + + + + select blocked folder + + + + Select + + + + Position: + + + + FileName: + + + + FileType: + + + + Cancel + + + + Choosen path is Empty! + + + + Choosen path is not in "home"! + + + + Its' parent folder has been blocked! + + + + Set blocked folder failed! + + + + OK + + + + + UkuiSearch::UkuiSearchGui + + Quit ukui-search application + + + + Show main window + + + + unregister a plugin with <pluginName> + + + + register a plugin with <pluginName> + + + + move <pluginName> to the target pos + + + + move plugin to <index> + + + search diff --git a/translations/ukui-search/bo_CN.ts b/translations/ukui-search/bo_CN.ts index 914683e..c07a672 100644 --- a/translations/ukui-search/bo_CN.ts +++ b/translations/ukui-search/bo_CN.ts @@ -45,8 +45,9 @@ UkuiSearch::FolderListItem + Delete the folder out of blacklist - མིང་ཐོ་ནག་པོའི་ནང་ནས་ཡིག་སྣོད་བསུབ་པ། + མིང་ཐོ་ནག་པོའི་ནང་ནས་ཡིག་སྣོད་བསུབ་པ། @@ -73,159 +74,193 @@ UkuiSearch::SettingsWidget + ukui-search-settings - འཚོལ་བཤེར། + འཚོལ་བཤེར། + + + Search - འཚོལ་ཞིབ། + འཚོལ་ཞིབ། + <h2>Settings</h2> - <h2> སྒྲིག་འགོད། </h2> + <h2> སྒྲིག་འགོད། </h2> + <h3>Index State</h3> - <h3>དཀར་ཆག་གི་རྣམ་པ།</h3> + <h3>དཀར་ཆག་གི་རྣམ་པ།</h3> + + ... - ... + ... + <h3>File Index Settings</h3> - <h3>ཡིག་ཆའི་དཀར་ཆག་སྒྲིག་འགོད། </h3> + <h3>ཡིག་ཆའི་དཀར་ཆག་སྒྲིག་འགོད། </h3> + Following folders will not be searched. You can set it by adding and removing folders. - གཤམ་གྱི་ཡིག་སྣོད་འཚོལ་བཤེར་མི་བྱེད། ཡིག་སྣོད་གསར་སྣོན་དང་གསུབ་འཕྲི་བྱས་ཚེ་ཡིག་ཆའི་དཀར་ཆག་སྒྲིག་འགོད་བྱ་ཐུབ། + གཤམ་གྱི་ཡིག་སྣོད་འཚོལ་བཤེར་མི་བྱེད། ཡིག་སྣོད་གསར་སྣོན་དང་གསུབ་འཕྲི་བྱས་ཚེ་ཡིག་ཆའི་དཀར་ཆག་སྒྲིག་འགོད་བྱ་ཐུབ། + Add ignored folders - སྣང་མེད་དུ་བཞག་པའི་ཡིག་སྣོད་ཁ་སྣོན་ + སྣང་མེད་དུ་བཞག་པའི་ཡིག་སྣོད་ཁ་སྣོན་ + <h3>Search Engine Settings</h3> - <h3>འཚོལ་བཤེར་ཆས་སྒྲིག་འགོད།</h3> + <h3>འཚོལ་བཤེར་ཆས་སྒྲིག་འགོད།</h3> + Please select search engine you preferred. - ཁྱེད་རང་གིས་དགའ་པོ་བྱེད་པའི་འཚོལ་བཤེར་མ་ལག་འདེམས་ + ཁྱེད་རང་གིས་དགའ་པོ་བྱེད་པའི་འཚོལ་བཤེར་མ་ལག་འདེམས་ + baidu - པའེ་ཏུའུ། + པའེ་ཏུའུ། + sougou - སོའོ་གོའུ། + སོའོ་གོའུ། + 360 - 360 + 360 + Whether to delete this directory? - དཀར་ཆག་འདི་གསུབ་བམ། + དཀར་ཆག་འདི་གསུབ་བམ། + Yes - རེད། + རེད། + No - མིན། + མིན། + Creating ... - དཀར་ཆག་འདྲེན་བཞིན་ཡོད། + དཀར་ཆག་འདྲེན་བཞིན་ཡོད། + Done - བསྒྲུབས་ཚར། + བསྒྲུབས་ཚར། + Index Entry: %1 - གསལ་བྱང་ཚན་པ།: + གསལ་བྱང་ཚན་པ།: + Directories - དཀར་ཆག + དཀར་ཆག + select blocked folder - བཀག་སྡོམ་བྱས་པའི་ཡིག་སྣོད་གདམ་གསེས + བཀག་སྡོམ་བྱས་པའི་ཡིག་སྣོད་གདམ་གསེས + Select - བདམས་ཐོན་བྱུང་བ། + བདམས་ཐོན་བྱུང་བ། + Position: - གོ་གནས་ནི། + གོ་གནས་ནི། + FileName: - ཡིག་ཆའི་མིང་ནི། + ཡིག་ཆའི་མིང་ནི། + FileType: - ཡིག་ཆའི་རིགས་དབྱིབས་ནི། + ཡིག་ཆའི་རིགས་དབྱིབས་ནི། + Cancel - ཕྱིར་འཐེན། + ཕྱིར་འཐེན། + Choosen path is Empty! - བདམས་ཟིན་པའི་ལམ་ཐིག་མི་འདུག + བདམས་ཟིན་པའི་ལམ་ཐིག་མི་འདུག + Choosen path is not in "home"! - ཁྱིམ་གྱི་དཀར་ཆག་ནང་གི་ཡིག་སྣོད་འདེམ་རོགས། + ཁྱིམ་གྱི་དཀར་ཆག་ནང་གི་ཡིག་སྣོད་འདེམ་རོགས། + Its' parent folder has been blocked! - རིམ་པ་གོང་མའི་ཡིག་སྣོད་གབ་ཟིན། + རིམ་པ་གོང་མའི་ཡིག་སྣོད་གབ་ཟིན། + Set blocked folder failed! - བཀག་སྡོམ་བྱས་པའི་ཡིག་སྣོད་ལ་ཕམ་ཉེས་བྱུང་བ་རེད། + བཀག་སྡོམ་བྱས་པའི་ཡིག་སྣོད་ལ་ཕམ་ཉེས་བྱུང་བ་རེད། + OK - འགྲིགས། + འགྲིགས། UkuiSearch::UkuiSearchGui - + Quit ukui-search application ཉེར་སྤྱོད་གོ་རིམ་ལས་ཕྱིར་འཐེན་བྱ། - + Show main window སྒེའུ་ཁུང་གཙོ་བོ་མངོན་པ། - + unregister a plugin with <pluginName> - + register a plugin with <pluginName> - + move <pluginName> to the target pos - + move plugin to <index> diff --git a/translations/ukui-search/mn.ts b/translations/ukui-search/mn.ts index db142f9..1d407da 100644 --- a/translations/ukui-search/mn.ts +++ b/translations/ukui-search/mn.ts @@ -45,8 +45,9 @@ UkuiSearch::FolderListItem + Delete the folder out of blacklist - ᠬᠠᠰᠤᠬᠤ + ᠬᠠᠰᠤᠬᠤ @@ -73,159 +74,193 @@ UkuiSearch::SettingsWidget + ukui-search-settings - ᠬᠠᠢᠯᠲᠠ + ᠬᠠᠢᠯᠲᠠ + + + Search - ᠬᠠᠢᠯᠲᠠ + ᠬᠠᠢᠯᠲᠠ + <h2>Settings</h2> - <h2> ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ</h2> + <h2> ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ</h2> + <h3>Index State</h3> - <h3> ᠬᠡᠯᠬᠢᠶᠡᠰᠦ᠎ᠶᠢᠨ ᠪᠠᠢᠳᠠᠯ</h3> + <h3> ᠬᠡᠯᠬᠢᠶᠡᠰᠦ᠎ᠶᠢᠨ ᠪᠠᠢᠳᠠᠯ</h3> + + ... - ... + ... + <h3>File Index Settings</h3> - <h3> ᠹᠠᠢᠯ᠎ᠤᠨ ᠬᠡᠯᠬᠢᠶᠡᠰᠦ᠎ᠶᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ</h3> + <h3> ᠹᠠᠢᠯ᠎ᠤᠨ ᠬᠡᠯᠬᠢᠶᠡᠰᠦ᠎ᠶᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ</h3> + Following folders will not be searched. You can set it by adding and removing folders. - ᠬᠠᠢᠯᠲᠠ᠎ᠪᠠᠷ ᠳᠠᠷᠠᠭᠠᠬᠢ ᠴᠤᠮᠤᠭ᠎ᠢ ᠪᠠᠢᠴᠠᠭᠠᠵᠤ ᠦᠵᠡᠬᠦ᠌ ᠦᠬᠡᠢ ᠂ ᠨᠡᠮᠡᠬᠦ᠌ ᠪᠤᠶᠤ ᠬᠠᠰᠤᠬᠤ᠎ᠪᠠᠷ ᠳᠠᠮᠵᠢᠭᠤᠯᠤᠨ ᠢᠯᠭᠠᠵᠤ ᠭᠠᠷᠭᠠᠭᠰᠠᠨ ᠴᠤᠮᠤᠭ᠎ᠤᠨ ᠪᠠᠢᠷᠢ᠎ᠶᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠵᠤ ᠪᠤᠯᠤᠨ᠎ᠠ ᠃ + ᠬᠠᠢᠯᠲᠠ᠎ᠪᠠᠷ ᠳᠠᠷᠠᠭᠠᠬᠢ ᠴᠤᠮᠤᠭ᠎ᠢ ᠪᠠᠢᠴᠠᠭᠠᠵᠤ ᠦᠵᠡᠬᠦ᠌ ᠦᠬᠡᠢ ᠂ ᠨᠡᠮᠡᠬᠦ᠌ ᠪᠤᠶᠤ ᠬᠠᠰᠤᠬᠤ᠎ᠪᠠᠷ ᠳᠠᠮᠵᠢᠭᠤᠯᠤᠨ ᠢᠯᠭᠠᠵᠤ ᠭᠠᠷᠭᠠᠭᠰᠠᠨ ᠴᠤᠮᠤᠭ᠎ᠤᠨ ᠪᠠᠢᠷᠢ᠎ᠶᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠵᠤ ᠪᠤᠯᠤᠨ᠎ᠠ ᠃ + Add ignored folders - ᠴᠤᠮᠤᠭ᠎ᠢ ᠬᠠᠷ᠎ᠠ ᠳᠠᠩᠰᠠᠨ᠎ᠳᠤ ᠨᠡᠮᠡᠬᠦ᠌ + ᠴᠤᠮᠤᠭ᠎ᠢ ᠬᠠᠷ᠎ᠠ ᠳᠠᠩᠰᠠᠨ᠎ᠳᠤ ᠨᠡᠮᠡᠬᠦ᠌ + <h3>Search Engine Settings</h3> - <h3>ᠡᠷᠢᠯᠲᠡ ᠬᠦᠳᠡᠯᠬᠡᠬᠦᠷ᠎ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ</h3> + <h3>ᠡᠷᠢᠯᠲᠡ ᠬᠦᠳᠡᠯᠬᠡᠬᠦᠷ᠎ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ</h3> + Please select search engine you preferred. - ᠢᠨᠲᠸᠷᠨ᠋ᠸᠲ᠎ᠦᠨ ᠡᠷᠢᠯᠳᠡ ᠬᠦᠳᠡᠯᠬᠡᠬᠦᠷ᠎ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ + ᠢᠨᠲᠸᠷᠨ᠋ᠸᠲ᠎ᠦᠨ ᠡᠷᠢᠯᠳᠡ ᠬᠦᠳᠡᠯᠬᠡᠬᠦᠷ᠎ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ + baidu - ᠪᠠᠢ ᠳ᠋ᠦ᠋ + ᠪᠠᠢ ᠳ᠋ᠦ᠋ + sougou - ᠰᠸᠤ ᠭᠸᠦ + ᠰᠸᠤ ᠭᠸᠦ + 360 - 360 + 360 + Whether to delete this directory? - ᠲᠤᠰ ᠭᠠᠷᠴᠠᠭ᠎ᠢ ᠬᠠᠰᠤᠬᠤ ᠤᠤ? + ᠲᠤᠰ ᠭᠠᠷᠴᠠᠭ᠎ᠢ ᠬᠠᠰᠤᠬᠤ ᠤᠤ? + Yes - Yes + Yes + No - No + No + Creating ... - ᠶᠠᠭ ᠬᠡᠯᠬᠢᠶᠡᠰᠦᠯᠡᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ... + ᠶᠠᠭ ᠬᠡᠯᠬᠢᠶᠡᠰᠦᠯᠡᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ... + Done - ᠬᠡᠯᠬᠢᠶᠡᠰᠦᠯᠡᠵᠤ ᠳᠠᠭᠤᠰᠪᠠ + ᠬᠡᠯᠬᠢᠶᠡᠰᠦᠯᠡᠵᠤ ᠳᠠᠭᠤᠰᠪᠠ + Index Entry: %1 - ᠬᠡᠯᠬᠢᠶᠡᠰᠦ᠎ᠶᠢᠨ ᠵᠦᠢᠯ ᠄%1 + ᠬᠡᠯᠬᠢᠶᠡᠰᠦ᠎ᠶᠢᠨ ᠵᠦᠢᠯ ᠄%1 + Directories - ᠴᠤᠮᠤᠭ + ᠴᠤᠮᠤᠭ + select blocked folder - ᠬᠠᠯᠬᠠᠯᠠᠭᠰᠠᠨ ᠴᠤᠮᠤᠭ᠎ᠢ ᠰᠤᠩᠭᠤᠬᠤ + ᠬᠠᠯᠬᠠᠯᠠᠭᠰᠠᠨ ᠴᠤᠮᠤᠭ᠎ᠢ ᠰᠤᠩᠭᠤᠬᠤ + Select - ᠰᠤᠩᠭᠤᠬᠤ + ᠰᠤᠩᠭᠤᠬᠤ + Position: - ᠪᠠᠢᠷᠢ ᠄ + ᠪᠠᠢᠷᠢ ᠄ + FileName: - ᠹᠠᠢᠯ᠎ᠤᠨ ᠨᠡᠷ᠎ᠡ ᠄ + ᠹᠠᠢᠯ᠎ᠤᠨ ᠨᠡᠷ᠎ᠡ ᠄ + FileType: - ᠬᠡᠯᠪᠡᠷᠢ ᠮᠠᠶᠢᠭ ᠄ + ᠬᠡᠯᠪᠡᠷᠢ ᠮᠠᠶᠢᠭ ᠄ + Cancel - ᠦᠬᠡᠢᠰᠭᠡᠬᠦ᠌ + ᠦᠬᠡᠢᠰᠭᠡᠬᠦ᠌ + Choosen path is Empty! - ᠰᠤᠩᠭᠤᠭᠰᠠᠨ ᠵᠠᠮ ᠪᠠᠢᠬᠤ ᠦᠬᠡᠢ! + ᠰᠤᠩᠭᠤᠭᠰᠠᠨ ᠵᠠᠮ ᠪᠠᠢᠬᠤ ᠦᠬᠡᠢ! + Choosen path is not in "home"! - ᠲᠤᠰ ᠭᠠᠷᠴᠠ ᠳᠤᠤᠷᠠᠬᠢ ᠴᠤᠮᠤᠭ᠎ᠢ ᠰᠤᠩᠭᠤᠭᠠᠷᠠᠢ! + ᠲᠤᠰ ᠭᠠᠷᠴᠠ ᠳᠤᠤᠷᠠᠬᠢ ᠴᠤᠮᠤᠭ᠎ᠢ ᠰᠤᠩᠭᠤᠭᠠᠷᠠᠢ! + Its' parent folder has been blocked! - ᠡᠬᠢ ᠴᠤᠮᠤᠭ ᠨᠢᠭᠡᠨᠳᠡ ᠬᠠᠯᠬᠠᠯᠠᠭᠳᠠᠪᠠ! + ᠡᠬᠢ ᠴᠤᠮᠤᠭ ᠨᠢᠭᠡᠨᠳᠡ ᠬᠠᠯᠬᠠᠯᠠᠭᠳᠠᠪᠠ! + Set blocked folder failed! - ᠬᠠᠱᠢᠭᠳᠠᠭᠰᠠᠨ ᠴᠤᠮᠤᠭ᠎ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ! + ᠬᠠᠱᠢᠭᠳᠠᠭᠰᠠᠨ ᠴᠤᠮᠤᠭ᠎ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ! + OK - OK + OK UkuiSearch::UkuiSearchGui - + Quit ukui-search application ᠬᠠᠢᠯᠲᠠ᠎ᠶᠢᠨ ᠬᠡᠷᠡᠭᠯᠡᠯᠳᠡ᠎ᠡᠴᠡ ᠪᠤᠴᠠᠵᠤ ᠭᠠᠷᠬᠤ - + Show main window ᠭᠤᠤᠯ ᠨᠢᠭᠤᠷ ᠬᠠᠭᠤᠳᠠᠰᠤ᠎ᠶᠢ ᠢᠯᠡᠷᠡᠬᠦᠯᠬᠦ᠌ - + unregister a plugin with <pluginName> - + register a plugin with <pluginName> - + move <pluginName> to the target pos - + move plugin to <index> diff --git a/translations/ukui-search/tr.ts b/translations/ukui-search/tr.ts index eb2c844..57a1cc4 100644 --- a/translations/ukui-search/tr.ts +++ b/translations/ukui-search/tr.ts @@ -330,8 +330,9 @@ UkuiSearch::FolderListItem + Delete the folder out of blacklist - Klasörü kara listeden silin + Klasörü kara listeden silin @@ -426,84 +427,162 @@ UkuiSearch::SettingsWidget + + ukui-search-settings + + + + + + Search - Ara + Ara + <h2>Settings</h2> - <h2>Ayarlar</h2> + <h2>Ayarlar</h2> + <h3>Index State</h3> - <h3>Dizin Durumu</h3> + <h3>Dizin Durumu</h3> + + ... - ... + ... + <h3>File Index Settings</h3> - <h3>Dosya Dizini Ayarları</h3> + <h3>Dosya Dizini Ayarları</h3> + Following folders will not be searched. You can set it by adding and removing folders. - Aşağıdaki klasörler aranmayacaktır. Klasör ekleyip kaldırarak ayarlayabilirsiniz. + Aşağıdaki klasörler aranmayacaktır. Klasör ekleyip kaldırarak ayarlayabilirsiniz. + Add ignored folders - Göz ardı edilen klasörleri ekleyin + Göz ardı edilen klasörleri ekleyin + <h3>Search Engine Settings</h3> - <h3>SArama Motoru Ayarları</h3> + <h3>SArama Motoru Ayarları</h3> + Please select search engine you preferred. - Lütfen tercih ettiğiniz arama motorunu seçin. + Lütfen tercih ettiğiniz arama motorunu seçin. + + baidu + + + + + sougou + + + + + 360 + + + + Whether to delete this directory? - Bu dizini silinsin mi? + Bu dizini silinsin mi? + + Yes + + + + + No + + + + Creating ... - Oluşturuluyor... + Oluşturuluyor... + Done - Tamam + Tamam + Index Entry: %1 - Dizin Girişi: %1 + Dizin Girişi: %1 + Directories - Dizinler + Dizinler + select blocked folder - engellenen klasörü seç + engellenen klasörü seç + Select - Seç + Seç + Position: - Pozisyon: + Pozisyon: + FileName: - Dosya Adı: + Dosya Adı: + FileType: - Dosya Türü: + Dosya Türü: + Cancel - İptal + İptal + + + + Choosen path is Empty! + + + + + Choosen path is not in "home"! + + + + + Its' parent folder has been blocked! + + + + + Set blocked folder failed! + + + + + OK + @@ -536,32 +615,32 @@ UkuiSearch::UkuiSearchGui - + Quit ukui-search application - + Show main window - + unregister a plugin with <pluginName> - + register a plugin with <pluginName> - + move <pluginName> to the target pos - + move plugin to <index> diff --git a/translations/ukui-search/zh_CN.ts b/translations/ukui-search/zh_CN.ts index d542d15..ec5f96c 100644 --- a/translations/ukui-search/zh_CN.ts +++ b/translations/ukui-search/zh_CN.ts @@ -92,8 +92,9 @@ UkuiSearch::FolderListItem + Delete the folder out of blacklist - 删除 + 删除 @@ -200,120 +201,162 @@ UkuiSearch::SettingsWidget + ukui-search-settings - 搜索 + 搜索 + + + Search - 搜索 + 搜索 + <h2>Settings</h2> - <h2>设置</h2> + <h2>设置</h2> + <h3>Index State</h3> - <h3>索引状态</h3> + <h3>索引状态</h3> + + + ... + + + + <h3>File Index Settings</h3> - <h3>文件索引设置</h3> + <h3>文件索引设置</h3> + Following folders will not be searched. You can set it by adding and removing folders. - 搜索将不再查看以下文件夹。通过增加和删除文件夹可进行文件索引设置。 + 搜索将不再查看以下文件夹。通过增加和删除文件夹可进行文件索引设置。 + Add ignored folders - 添加文件夹至黑名单 + 添加文件夹至黑名单 + <h3>Search Engine Settings</h3> - <h3>搜索引擎设置</h3> + <h3>搜索引擎设置</h3> + Please select search engine you preferred. - 设置互联网搜索引擎 + 设置互联网搜索引擎 + baidu - 百度 + 百度 + sougou - 搜狗 + 搜狗 + 360 - 360 + 360 + Whether to delete this directory? - 是否要删除此目录? + 是否要删除此目录? + Yes - 是(Y) + 是(Y) + No - 否(N) + 否(N) + Creating ... - 正在索引... + 正在索引... + Done - 索引完成 + 索引完成 + Index Entry: %1 - 索引项: %1 + 索引项: %1 + Directories - 文件夹 + 文件夹 + select blocked folder - 选择屏蔽文件夹 + 选择屏蔽文件夹 + Select - 选择 + 选择 + Position: - 位置: + 位置: + FileName: - 名称: + 名称: + FileType: - 类型: + 类型: + Cancel - 取消 + 取消 + Choosen path is Empty! - 选择的路径不存在! + 选择的路径不存在! + Choosen path is not in "home"! - 请选择家目录下的文件夹! + 请选择家目录下的文件夹! + Its' parent folder has been blocked! - 父文件夹已被屏蔽! + 父文件夹已被屏蔽! + + Set blocked folder failed! + + + + OK - 好的 + 好的 @@ -346,32 +389,32 @@ UkuiSearch::UkuiSearchGui - + Quit ukui-search application 退出搜索应用 - + Show main window 显示主页面 - + unregister a plugin with <pluginName> - + register a plugin with <pluginName> - + move <pluginName> to the target pos - + move plugin to <index> diff --git a/ukui-search-app-data-service/CMakeLists.txt b/ukui-search-app-data-service/CMakeLists.txt new file mode 100644 index 0000000..d40c3f9 --- /dev/null +++ b/ukui-search-app-data-service/CMakeLists.txt @@ -0,0 +1,65 @@ +cmake_minimum_required(VERSION 3.14) +project(ukui-search-app-data-service VERSION 1.0.0 LANGUAGES CXX) + +set(VERSION_MAJOR 1) +set(VERSION_MINOR 0) +set(VERSION_MICRO 0) +set(UKUI_SEARCH_APP_DATA_SERVICE_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MICRO}) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Gui Widgets Sql Network REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Gui Widgets Sql Network REQUIRED) +find_package(KF5WindowSystem) +find_package(qt5xdg) + +set(UKUI_SEARCH_APP_DATA_SERVICE_SRC + app-db-manager.cpp app-db-manager.h + main.cpp + pending-app-info.h + pending-app-info-queue.cpp pending-app-info-queue.h + signal-transformer.cpp signal-transformer.h + ukui-search-app-data-service.cpp ukui-search-app-data-service.h) + +if(COMMAND qt_add_dbus_adaptor) + qt_add_dbus_adaptor(UKUI_SEARCH_APP_DATA_SERVICE_SRC dbus/org.ukui.AppDatabase.xml app-db-manager.h UkuiSearch::AppDBManager) +else() + qt5_add_dbus_adaptor(UKUI_SEARCH_APP_DATA_SERVICE_SRC dbus/org.ukui.AppDatabase.xml app-db-manager.h UkuiSearch::AppDBManager) +endif() + +add_executable(ukui-search-app-data-service + ${UKUI_SEARCH_APP_DATA_SERVICE_SRC} +) +target_include_directories(ukui-search-app-data-service PRIVATE + ../3rd-parties/qtsingleapplication/src + ../libchinese-segmentation + ../libsearch + ../libsearch/appdata + ../libsearch/filesystemwatcher +) + +target_compile_definitions(ukui-search-app-data-service PRIVATE + QT_DEPRECATED_WARNINGS + VERSION="${UKUI_SEARCH_APP_DATA_SERVICE_VERSION}" +) + +target_link_libraries(ukui-search-app-data-service PRIVATE + KF5::WindowSystem + Qt5Xdg + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Sql + chinese-segmentation + libukui-search + qtsingleapplication + ) + +install(TARGETS ukui-search-app-data-service DESTINATION /usr/bin) +install(FILES ../data/ukui-search-app-data-service.desktop DESTINATION /etc/xdg/autostart) +install(FILES conf/com.ukui.search.appdb.service DESTINATION /usr/share/dbus-1/services/) \ No newline at end of file diff --git a/ukui-search-app-data-service/app-db-manager.cpp b/ukui-search-app-data-service/app-db-manager.cpp index 1d6f023..1ab977e 100644 --- a/ukui-search-app-data-service/app-db-manager.cpp +++ b/ukui-search-app-data-service/app-db-manager.cpp @@ -16,15 +16,15 @@ * along with this program. If not, see . * */ -#include "app-db-manager.h" -#include "file-utils.h" -#include "convert-winid-to-desktop.h" -#include "application-property-helper.h" #include #include #include #include +#include +#include "appdatabaseadaptor.h" +#include "file-utils.h" +#include "application-property-helper.h" #define GENERAL_APP_DESKTOP_PATH "/usr/share/applications" #define ANDROID_APP_DESKTOP_PATH QDir::homePath() + "/.local/share/applications" @@ -176,7 +176,7 @@ AppDBManager::AppDBManager(QObject *parent) : QThread(parent), m_database(QSqlDa this->updateLaunchTimes(desktopFilePath); } }); - m_adaptor = new AppDBManagerAdaptor(this); + new AppDBManagerAdaptor(this); } else { qDebug() << "App-db-manager does nothing."; } diff --git a/ukui-search-app-data-service/app-db-manager.h b/ukui-search-app-data-service/app-db-manager.h index 0f02f3d..2fd1269 100644 --- a/ukui-search-app-data-service/app-db-manager.h +++ b/ukui-search-app-data-service/app-db-manager.h @@ -30,10 +30,10 @@ #include #include #include +#include #include "pending-app-info-queue.h" #include "file-system-watcher.h" #include "application-property.h" -#include "app-database-adaptor.h" #define APP_DATABASE_PATH QDir::homePath()+"/.config/org.ukui/ukui-search/appdata/" #define APP_DATABASE_NAME "app-info.db" @@ -229,7 +229,6 @@ private: //原本额外排除的目录,不知道额外的原因,有可能之后有问题--bjj20220621 "/usr/share/applications/screensavers" }; - AppDBManagerAdaptor *m_adaptor = nullptr; Q_SIGNALS: //操作数据库 diff --git a/ukui-search-app-data-service/dbus/app-database-adaptor.cpp b/ukui-search-app-data-service/dbus/app-database-adaptor.cpp deleted file mode 100644 index 8fc4965..0000000 --- a/ukui-search-app-data-service/dbus/app-database-adaptor.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp org.ukui.appdatabase.xml -a app-database-adaptor -i ../../libsearch/appdata/application-property.h - * - * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#include "app-database-adaptor.h" -#include -#include -#include -#include -#include -#include -#include - -/* - * Implementation of adaptor class AppDBManagerAdaptor - */ - -AppDBManagerAdaptor::AppDBManagerAdaptor(QObject *parent) - : QDBusAbstractAdaptor(parent) -{ - // constructor - setAutoRelaySignals(true); -} - -AppDBManagerAdaptor::~AppDBManagerAdaptor() -{ - // destructor -} - -void AppDBManagerAdaptor::deleteDBItem(const QString &desktopfd) -{ - // handle method call org.ukui.search.appDBManager.deleteDBItem - QMetaObject::invokeMethod(parent(), "deleteDBItem", Q_ARG(QString, desktopfd)); -} - -QString AppDBManagerAdaptor::desktopFilePathFromName(const QString &desktopFileName) -{ - // handle method call org.ukui.search.appDBManager.desktopFilePathFromName - QString out0; - QMetaObject::invokeMethod(parent(), "desktopFilePathFromName", Q_RETURN_ARG(QString, out0), Q_ARG(QString, desktopFileName)); - return out0; -} - -void AppDBManagerAdaptor::insertDBItem(const QString &desktopfd) -{ - // handle method call org.ukui.search.appDBManager.insertDBItem - QMetaObject::invokeMethod(parent(), "insertDBItem", Q_ARG(QString, desktopfd)); -} - -void AppDBManagerAdaptor::setValue(UkuiSearch::ApplicationInfoMap infos2BSet) -{ - // handle method call org.ukui.search.appDBManager.setValue - QMetaObject::invokeMethod(parent(), "setValue", Q_ARG(UkuiSearch::ApplicationInfoMap, infos2BSet)); -} - -QString AppDBManagerAdaptor::tranPidToDesktopFp(uint pid) -{ - // handle method call org.ukui.search.appDBManager.tranPidToDesktopFp - QString out0; - QMetaObject::invokeMethod(parent(), "tranPidToDesktopFp", Q_RETURN_ARG(QString, out0), Q_ARG(uint, pid)); - return out0; -} - -QString AppDBManagerAdaptor::tranWinIdToDesktopFilePath(const QDBusVariant &id) -{ - // handle method call org.ukui.search.appDBManager.tranWinIdToDesktopFilePath - QString out0; - QMetaObject::invokeMethod(parent(), "tranWinIdToDesktopFilePath", Q_RETURN_ARG(QString, out0), Q_ARG(QDBusVariant, id)); - return out0; -} - -void AppDBManagerAdaptor::updateDBItem(const QString &desktopfd) -{ - // handle method call org.ukui.search.appDBManager.updateDBItem - QMetaObject::invokeMethod(parent(), "updateDBItem", Q_ARG(QString, desktopfd)); -} - -void AppDBManagerAdaptor::updateFavoritesState(const QString &desktopFilePath) -{ - // handle method call org.ukui.search.appDBManager.updateFavoritesState - QMetaObject::invokeMethod(parent(), "updateFavoritesState", Q_ARG(QString, desktopFilePath)); -} - -void AppDBManagerAdaptor::updateFavoritesState(const QString &desktopFilePath, uint num) -{ - // handle method call org.ukui.search.appDBManager.updateFavoritesState - QMetaObject::invokeMethod(parent(), "updateFavoritesState", Q_ARG(QString, desktopFilePath), Q_ARG(uint, num)); -} - -void AppDBManagerAdaptor::updateLaunchTimes(const QString &desktopFilePath) -{ - // handle method call org.ukui.search.appDBManager.updateLaunchTimes - QMetaObject::invokeMethod(parent(), "updateLaunchTimes", Q_ARG(QString, desktopFilePath)); -} - -void AppDBManagerAdaptor::updateLocaleData(const QString &desktopFilePath) -{ - // handle method call org.ukui.search.appDBManager.updateLocaleData - QMetaObject::invokeMethod(parent(), "updateLocaleData", Q_ARG(QString, desktopFilePath)); -} - -void AppDBManagerAdaptor::updateTopState(const QString &desktopFilePath) -{ - // handle method call org.ukui.search.appDBManager.updateTopState - QMetaObject::invokeMethod(parent(), "updateTopState", Q_ARG(QString, desktopFilePath)); -} - -void AppDBManagerAdaptor::updateTopState(const QString &desktopFilePath, uint num) -{ - // handle method call org.ukui.search.appDBManager.updateTopState - QMetaObject::invokeMethod(parent(), "updateTopState", Q_ARG(QString, desktopFilePath), Q_ARG(uint, num)); -} - diff --git a/ukui-search-app-data-service/dbus/app-database-adaptor.h b/ukui-search-app-data-service/dbus/app-database-adaptor.h deleted file mode 100644 index 65e7d6e..0000000 --- a/ukui-search-app-data-service/dbus/app-database-adaptor.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp org.ukui.appdatabase.xml -a app-database-adaptor -i ../../libsearch/appdata/application-property.h - * - * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#ifndef APPDATABASEADAPTOR_H -#define APPDATABASEADAPTOR_H - -#include -#include -#include "../../libsearch/appdata/application-property.h" -QT_BEGIN_NAMESPACE -class QByteArray; -template class QList; -template class QMap; -class QString; -class QStringList; -class QVariant; -QT_END_NAMESPACE - -/* - * Adaptor class for interface org.ukui.search.appDBManager - */ -class AppDBManagerAdaptor: public QDBusAbstractAdaptor -{ - Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "org.ukui.search.appDBManager") - Q_CLASSINFO("D-Bus Introspection", "" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" - "") -public: - AppDBManagerAdaptor(QObject *parent); - virtual ~AppDBManagerAdaptor(); - -public: // PROPERTIES -public Q_SLOTS: // METHODS - void deleteDBItem(const QString &desktopfd); - QString desktopFilePathFromName(const QString &desktopFileName); - void insertDBItem(const QString &desktopfd); - void setValue(UkuiSearch::ApplicationInfoMap infos2BSet); - QString tranPidToDesktopFp(uint pid); - QString tranWinIdToDesktopFilePath(const QDBusVariant &id); - void updateDBItem(const QString &desktopfd); - void updateFavoritesState(const QString &desktopFilePath); - void updateFavoritesState(const QString &desktopFilePath, uint num); - void updateLaunchTimes(const QString &desktopFilePath); - void updateLocaleData(const QString &desktopFilePath); - void updateTopState(const QString &desktopFilePath); - void updateTopState(const QString &desktopFilePath, uint num); -Q_SIGNALS: // SIGNALS -}; - -#endif diff --git a/ukui-search-app-data-service/dbus/app-database-dbus.pri b/ukui-search-app-data-service/dbus/app-database-dbus.pri deleted file mode 100644 index 7352e31..0000000 --- a/ukui-search-app-data-service/dbus/app-database-dbus.pri +++ /dev/null @@ -1,7 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/app-database-adaptor.h - -SOURCES += \ - $$PWD/app-database-adaptor.cpp diff --git a/ukui-search-app-data-service/dbus/org.ukui.appdatabase.xml b/ukui-search-app-data-service/dbus/org.ukui.AppDatabase.xml similarity index 100% rename from ukui-search-app-data-service/dbus/org.ukui.appdatabase.xml rename to ukui-search-app-data-service/dbus/org.ukui.AppDatabase.xml diff --git a/ukui-search-app-data-service/ukui-search-app-data-service.pro b/ukui-search-app-data-service/ukui-search-app-data-service.pro deleted file mode 100644 index 9d80df9..0000000 --- a/ukui-search-app-data-service/ukui-search-app-data-service.pro +++ /dev/null @@ -1,65 +0,0 @@ -QT += core gui dbus sql KWindowSystem - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - - -TARGET = ukui-search-app-data-service -VERSION = 1.0.0 -DEFINES += VERSION='\\"$${VERSION}\\"' -CONFIG += c++11 no_keywords - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS -QMAKE_CXXFLAGS += -Werror=return-type -Werror=return-local-addr -Werror=uninitialized - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -#include(../libsearch/appdata/appdata.pri) -include(../3rd-parties/qtsingleapplication/qtsingleapplication.pri) -include(./dbus/app-database-dbus.pri) - -LIBS += -lQt5Xdg - -SOURCES += \ - main.cpp \ - convert-winid-to-desktop.cpp \ - app-db-manager.cpp \ - pending-app-info-queue.cpp \ - signal-transformer.cpp \ - ukui-search-app-data-service.cpp \ - -HEADERS += \ - convert-winid-to-desktop.h \ - app-db-manager.h \ - pending-app-info-queue.h \ - pending-app-info.h \ - signal-transformer.h \ - ukui-search-app-data-service.h \ - -inst1.files += conf/com.ukui.search.appdb.service -inst1.path = /usr/share/dbus-1/services/ - -target.path = /usr/bin -INSTALLS += \ - target \ - inst1 - -desktop.path = /etc/xdg/autostart -desktop.files += ../data/ukui-search-app-data-service.desktop -INSTALLS += desktop - -LIBS += -L$$OUT_PWD/../libchinese-segmentation/ -lchinese-segmentation -INCLUDEPATH += $$PWD/../libchinese-segmentation -DEPENDPATH += $$PWD/../libchinese-segmentation - -LIBS += -L$$OUT_PWD/../libsearch/ -lukui-search -INCLUDEPATH += $$PWD/../libsearch \ - $$PWD/../libsearch/filesystemwatcher \ - $$PWD/../libsearch/appdata -DEPENDPATH += $$PWD/../libsearch diff --git a/ukui-search-service-dir-manager/CMakeLists.txt b/ukui-search-service-dir-manager/CMakeLists.txt new file mode 100644 index 0000000..8f634c0 --- /dev/null +++ b/ukui-search-service-dir-manager/CMakeLists.txt @@ -0,0 +1,69 @@ +cmake_minimum_required(VERSION 3.14) +project(ukui-search-service-dir-manager VERSION 1.0.0 LANGUAGES CXX) + +set(VERSION_MAJOR 1) +set(VERSION_MINOR 0) +set(VERSION_MICRO 0) +set(UKUI_SEARCH_SERVICE_DIR_MANAGER_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MICRO}) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Network Widgets REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Network Widgets REQUIRED) +find_package(PkgConfig REQUIRED) + +set(UKUI_SEARCH_SERVICE_DIR_MANAGER_EXTERNAL_LIBS "") +set(UKUI_SEARCH_SERVICE_DIR_MANAGER_PC_PKGS gio-2.0 gio-unix-2.0) + +foreach(PC_LIB IN ITEMS ${UKUI_SEARCH_SERVICE_DIR_MANAGER_PC_PKGS}) + pkg_check_modules(${PC_LIB} REQUIRED IMPORTED_TARGET ${PC_LIB}) + if(${${PC_LIB}_FOUND}) + include_directories(${${PC_LIB}_INCLUDE_DIRS}) + link_directories(${${PC_LIB}_LIBRARY_DIRS}) + list(APPEND UKUI_SEARCH_SERVICE_DIR_MANAGER_EXTERNAL_LIBS PkgConfig::${PC_LIB}) + endif() +endforeach() + +set(UKUI_SEARCH_SERVICE_DIR_MANAGER_SRC + dirwatcher/config.cpp dirwatcher/config.h + dirwatcher/dir-watcher.cpp dirwatcher/dir-watcher.h + dirwatcher/search-dir.cpp dirwatcher/search-dir.h + dirwatcher/volume-manager.cpp dirwatcher/volume-manager.h + main.cpp + ukui-search-dir-manager-dbus.cpp ukui-search-dir-manager-dbus.h) + +if(COMMAND qt_add_dbus_adaptor) + qt_add_dbus_adaptor(UKUI_SEARCH_SERVICE_DIR_MANAGER_SRC dirwatcher/com.ukui.search.FileIndexService.xml dir-watcher.h DirWatcher) +else() + qt5_add_dbus_adaptor(UKUI_SEARCH_SERVICE_DIR_MANAGER_SRC dirwatcher/com.ukui.search.FileIndexService.xml dir-watcher.h DirWatcher) +endif() + +add_executable(ukui-search-service-dir-manager + ${UKUI_SEARCH_SERVICE_DIR_MANAGER_SRC} +) +target_include_directories(ukui-search-service-dir-manager PRIVATE + ../3rd-parties/qtsingleapplication/src + dirwatcher + ../libsearch + ) + +target_compile_definitions(ukui-search-service-dir-manager PRIVATE + QT_DEPRECATED_WARNINGS + VERSION="${UKUI_SEARCH_SERVICE_DIR_MANAGER_VERSION}" +) + +target_link_libraries(ukui-search-service-dir-manager PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::Widgets + qtsingleapplication + libukui-search + ${UKUI_SEARCH_SERVICE_DIR_MANAGER_EXTERNAL_LIBS} +) +install(FILES conf/com.ukui.search.fileindex.service DESTINATION /usr/share/dbus-1/services/) +install(FILES ../data/ukui-search-service-dir-manager.desktop DESTINATION /etc/xdg/autostart) +install(TARGETS ukui-search-service-dir-manager DESTINATION /usr/bin) \ No newline at end of file diff --git a/ukui-search-service-dir-manager/dirwatcher/com.ukui.search.fileindex.server.xml b/ukui-search-service-dir-manager/dirwatcher/com.ukui.search.FileIndexService.xml similarity index 100% rename from ukui-search-service-dir-manager/dirwatcher/com.ukui.search.fileindex.server.xml rename to ukui-search-service-dir-manager/dirwatcher/com.ukui.search.FileIndexService.xml diff --git a/ukui-search-service-dir-manager/dirwatcher/dir-watcher-adaptor.cpp b/ukui-search-service-dir-manager/dirwatcher/dir-watcher-adaptor.cpp deleted file mode 100644 index b6a0fc0..0000000 --- a/ukui-search-service-dir-manager/dirwatcher/dir-watcher-adaptor.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp com.ukui.search.fileindex.server.xml -a dir-watcher-adaptor - * - * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#include "dir-watcher-adaptor.h" -#include -#include -#include -#include -#include -#include -#include - -/* - * Implementation of adaptor class FileindexAdaptor - */ - -DirWatcherAdaptor::DirWatcherAdaptor(QObject *parent) - : QDBusAbstractAdaptor(parent) -{ - // constructor - setAutoRelaySignals(true); -} - -DirWatcherAdaptor::~DirWatcherAdaptor() -{ - // destructor -} - -int DirWatcherAdaptor::appendIndexableListItem(const QString &path) -{ - // handle method call org.ukui.search.fileindex.appendIndexableListItem - int out0; - QMetaObject::invokeMethod(parent(), "appendIndexableListItem", Q_RETURN_ARG(int, out0), Q_ARG(QString, path)); - return out0; -} - -int DirWatcherAdaptor::appendSearchDir(const QString &path) -{ - // handle method call org.ukui.search.fileindex.appendSearchDir - int out0; - QMetaObject::invokeMethod(parent(), "appendSearchDir", Q_RETURN_ARG(int, out0), Q_ARG(QString, path)); - return out0; -} - -bool DirWatcherAdaptor::removeIndexableListItem(const QString &path) -{ - // handle method call org.ukui.search.fileindex.removeIndexableListItem - bool out0; - QMetaObject::invokeMethod(parent(), "removeIndexableListItem", Q_RETURN_ARG(bool, out0), Q_ARG(QString, path)); - return out0; -} - -void DirWatcherAdaptor::removeSearchDir(const QString &path) -{ - // handle method call org.ukui.search.fileindex.removeSearchDir - QMetaObject::invokeMethod(parent(), "removeSearchDir", Q_ARG(QString, path)); -} - diff --git a/ukui-search-service-dir-manager/dirwatcher/dir-watcher-adaptor.h b/ukui-search-service-dir-manager/dirwatcher/dir-watcher-adaptor.h deleted file mode 100644 index 0150fea..0000000 --- a/ukui-search-service-dir-manager/dirwatcher/dir-watcher-adaptor.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp com.ukui.search.fileindex.server.xml -a dir-watcher-adaptor - * - * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#ifndef DIR_WATCHER_ADAPTOR_H -#define DIR_WATCHER_ADAPTOR_H - -#include -#include -QT_BEGIN_NAMESPACE -class QByteArray; -template class QList; -template class QMap; -class QString; -class QStringList; -class QVariant; -QT_END_NAMESPACE - -/* - * Adaptor class for interface org.ukui.search.fileindex - */ -class DirWatcherAdaptor: public QDBusAbstractAdaptor -{ - Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "org.ukui.search.fileindex") - Q_CLASSINFO("D-Bus Introspection", "" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" - "") -public: - DirWatcherAdaptor(QObject *parent); - virtual ~DirWatcherAdaptor(); - -public: // PROPERTIES -public Q_SLOTS: // METHODS - int appendIndexableListItem(const QString &path); - int appendSearchDir(const QString &path); - bool removeIndexableListItem(const QString &path); - void removeSearchDir(const QString &path); -Q_SIGNALS: // SIGNALS -}; - -#endif diff --git a/ukui-search-service-dir-manager/dirwatcher/dir-watcher-dbus.pri b/ukui-search-service-dir-manager/dirwatcher/dir-watcher-dbus.pri deleted file mode 100644 index 55746b2..0000000 --- a/ukui-search-service-dir-manager/dirwatcher/dir-watcher-dbus.pri +++ /dev/null @@ -1,15 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/config.h \ - $$PWD/dir-watcher-adaptor.h \ - $$PWD/dir-watcher.h \ - $$PWD/search-dir.h \ - $$PWD/volume-manager.h - -SOURCES += \ - $$PWD/config.cpp \ - $$PWD/dir-watcher-adaptor.cpp \ - $$PWD/dir-watcher.cpp \ - $$PWD/search-dir.cpp \ - $$PWD/volume-manager.cpp diff --git a/ukui-search-service-dir-manager/dirwatcher/dir-watcher.cpp b/ukui-search-service-dir-manager/dirwatcher/dir-watcher.cpp index 5c3e73a..49fb989 100644 --- a/ukui-search-service-dir-manager/dirwatcher/dir-watcher.cpp +++ b/ukui-search-service-dir-manager/dirwatcher/dir-watcher.cpp @@ -27,6 +27,7 @@ #include #include #include "config.h" +#include "fileindexserviceadaptor.h" #define CURRENT_INDEXABLE_DIR_SETTINGS QDir::homePath() + "/.config/org.ukui/ukui-search/ukui-search-current-indexable-dir.conf" #define INDEXABLE_DIR_VALUE "IndexableDir" @@ -40,7 +41,7 @@ DirWatcher::DirWatcher(QObject *parent) : QObject(parent) //兼容旧版配置 Config::self()->processCompatibleCache(); - m_adaptor = new DirWatcherAdaptor(this); + new FileindexAdaptor(this); } DirWatcher::~DirWatcher() diff --git a/ukui-search-service-dir-manager/dirwatcher/dir-watcher.h b/ukui-search-service-dir-manager/dirwatcher/dir-watcher.h index 39feb99..9364808 100644 --- a/ukui-search-service-dir-manager/dirwatcher/dir-watcher.h +++ b/ukui-search-service-dir-manager/dirwatcher/dir-watcher.h @@ -19,8 +19,6 @@ #ifndef MOUNTDISKLISTENER_H #define MOUNTDISKLISTENER_H -#include "dir-watcher-adaptor.h" - #include #include #include @@ -28,6 +26,7 @@ #include #include #include +#include class DirWatcher : public QObject { @@ -81,8 +80,6 @@ private: static QMutex s_mutex; - DirWatcherAdaptor *m_adaptor = nullptr; - Q_SIGNALS: void appendIndexItem(const QString&, const QStringList&); void removeIndexItem(const QString&); diff --git a/ukui-search-service-dir-manager/ukui-search-service-dir-manager.pro b/ukui-search-service-dir-manager/ukui-search-service-dir-manager.pro deleted file mode 100644 index bcb9e55..0000000 --- a/ukui-search-service-dir-manager/ukui-search-service-dir-manager.pro +++ /dev/null @@ -1,50 +0,0 @@ -QT += core dbus -QT -= gui - -TARGET = ukui-search-service-dir-manager -VERSION = 1.0.0 -DEFINES += VERSION='\\"$${VERSION}\\"' -TEMPLATE = app - -CONFIG += c++11 link_pkgconfig -#CONFIG -= app_bundle -PKGCONFIG += gio-2.0 gio-unix-2.0 - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS -QMAKE_CXXFLAGS += -Werror=return-type -Werror=return-local-addr -Werror=uninitialized - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -include(dirwatcher/dir-watcher-dbus.pri) -include(../3rd-parties/qtsingleapplication/qtsingleapplication.pri) - -inst1.files += conf/com.ukui.search.fileindex.service -inst1.path = /usr/share/dbus-1/services/ - -target.source += $$TARGET -target.path = /usr/bin -INSTALLS += \ - target \ - inst1 - -desktop.path = /etc/xdg/autostart -desktop.files += ../data/ukui-search-service-dir-manager.desktop -INSTALLS += desktop - -SOURCES += \ - main.cpp \ - ukui-search-dir-manager-dbus.cpp - -HEADERS += \ - ukui-search-dir-manager-dbus.h - -LIBS += -L$$OUT_PWD/../libsearch -lukui-search \ - -L$$OUT_PWD/../libchinese-segmentation -lchinese-segmentation -INCLUDEPATH += $$PWD/../libsearch -DEPENDPATH += $$PWD/../libsearch diff --git a/ukui-search-service/CMakeLists.txt b/ukui-search-service/CMakeLists.txt new file mode 100644 index 0000000..7d105ea --- /dev/null +++ b/ukui-search-service/CMakeLists.txt @@ -0,0 +1,62 @@ +cmake_minimum_required(VERSION 3.14) +project(ukui-search-service VERSION 1.0.0 LANGUAGES C CXX) + +set(VERSION_MAJOR 1) +set(VERSION_MINOR 0) +set(VERSION_MICRO 0) +set(UKUI_SEARCH_SERVICE_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_MICRO}) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Gui Quick Widgets REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Gui Quick Widgets REQUIRED) +find_package(PkgConfig REQUIRED) +set(UKUI_SEARCH_SERVICE_EXTERNAL_LIBS "") +set(UKUI_SEARCH_SERVICE_PC_PKGS gsettings-qt) + +foreach(PC_LIB IN ITEMS ${UKUI_SEARCH_SERVICE_PC_PKGS}) + pkg_check_modules(${PC_LIB} REQUIRED IMPORTED_TARGET ${PC_LIB}) + if(${${PC_LIB}_FOUND}) + include_directories(${${PC_LIB}_INCLUDE_DIRS}) + link_directories(${${PC_LIB}_LIBRARY_DIRS}) + list(APPEND UKUI_SEARCH_SERVICE_EXTERNAL_LIBS PkgConfig::${PC_LIB}) + endif() +endforeach() + +set(QRC_FILES qml/qml.qrc) +add_executable(ukui-search-service + main.cpp + ukui-search-service.cpp ukui-search-service.h + ${QRC_FILES} +) +target_include_directories(ukui-search-service PRIVATE + ../3rd-parties/qtsingleapplication/src + ../libsearch + ../libsearch/dirwatcher + ../libsearch/filesystemwatcher + ../libsearch/index + ../libsearch/parser +) + +target_compile_definitions(ukui-search-service PRIVATE + QT_DEPRECATED_WARNINGS + VERSION="UKUI_SEARCH_SERVICE_VERSION" + QT_NO_KEYWORDS + ) + +target_link_libraries(ukui-search-service PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Quick + Qt${QT_VERSION_MAJOR}::Widgets + libukui-search + qtsingleapplication + ${UKUI_SEARCH_SERVICE_EXTERNAL_LIBS} +) +install(FILES ../data/org.ukui.search.data.gschema.xml DESTINATION /usr/share/glib-2.0/schemas/) +install(FILES ../data/ukui-search-service.desktop DESTINATION /etc/xdg/autostart) +install(TARGETS ukui-search-service DESTINATION /usr/bin) diff --git a/ukui-search-service/qml/qml.pri b/ukui-search-service/qml/qml.pri deleted file mode 100644 index 51168f2..0000000 --- a/ukui-search-service/qml/qml.pri +++ /dev/null @@ -1,9 +0,0 @@ -# 编译qrc资源 -qmlFile.files = $$files($$PWD/*.qml) -RESOURCES += qmlFile - -DISTFILES += \ - $$PWD/IndexMonitor.qml \ - $$PWD/IndexProgressBar.qml \ - $$PWD/StatusKeyValue.qml - diff --git a/ukui-search-service/qml/qml.qrc b/ukui-search-service/qml/qml.qrc new file mode 100644 index 0000000..27d8663 --- /dev/null +++ b/ukui-search-service/qml/qml.qrc @@ -0,0 +1,25 @@ + + + + + IndexMonitor.qml + IndexProgressBar.qml + StatusKeyValue.qml + + diff --git a/ukui-search-service/ukui-search-service.pro b/ukui-search-service/ukui-search-service.pro deleted file mode 100644 index 861bcfe..0000000 --- a/ukui-search-service/ukui-search-service.pro +++ /dev/null @@ -1,47 +0,0 @@ -QT += core gui dbus quick - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - - -TARGET = ukui-search-service -VERSION = 1.0.0 -DEFINES += VERSION='\\"$${VERSION}\\"' -CONFIG += c++11 link_pkgconfig no_keywords lrelease -PKGCONFIG += gsettings-qt gio-unix-2.0 - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -include(../libsearch/libukui-search-headers.pri) -include(../3rd-parties/qtsingleapplication/qtsingleapplication.pri) -include(./qml/qml.pri) - -LIBS += -L$$OUT_PWD/../libsearch -lukui-search \ - -L$$OUT_PWD/../libchinese-segmentation -lchinese-segmentation - -SOURCES += \ - main.cpp \ - ukui-search-service.cpp - -schemes.path = /usr/share/glib-2.0/schemas/ -schemes.files += ../data/org.ukui.search.data.gschema.xml - -INSTALLS += schemes - -target.path = /usr/bin -INSTALLS += target - -desktop.path = /etc/xdg/autostart -desktop.files += ../data/ukui-search-service.desktop -INSTALLS += desktop - -HEADERS += \ - ukui-search-service.h diff --git a/ukui-search.pro b/ukui-search.pro deleted file mode 100644 index 9df4816..0000000 --- a/ukui-search.pro +++ /dev/null @@ -1,33 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS += $$PWD/libchinese-segmentation \ - $$PWD/libsearch \ - $$PWD/frontend \ - $$PWD/ukuisearch-systemdbus \ - $$PWD/search-ukcc-plugin \ - $$PWD/ukui-search-service \ - $$PWD/ukui-search-app-data-service \ - $$PWD/ukui-search-service-dir-manager - -#SUBDIRS += tests - -# The following define makes your compiler emit warnings if you use -# any Qt feature that has been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if it uses deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -libsearch.depends += libchinese-segmentation -ukui-search-service.depends += libsearch -#src.depends = libsearch -frontend.depends = libsearch - -CONFIG += ordered - -QT += widgets - - diff --git a/ukuisearch-systemdbus/CMakeLists.txt b/ukuisearch-systemdbus/CMakeLists.txt new file mode 100644 index 0000000..4d67b37 --- /dev/null +++ b/ukuisearch-systemdbus/CMakeLists.txt @@ -0,0 +1,16 @@ +set(CMAKE_AUTOMOC ON) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus REQUIRED) + +add_executable(ukui-search-systemdbus + main.cpp + sysdbusregister.cpp sysdbusregister.h +) +target_link_libraries(ukui-search-systemdbus PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::DBus +) +install(FILES conf/com.ukui.search.qt.systemdbus.service DESTINATION /usr/share/dbus-1/system-services/) +install(FILES conf/com.ukui.search.qt.systemdbus.conf DESTINATION /etc/dbus-1/system.d/) + +install(TARGETS ukui-search-systemdbus RUNTIME DESTINATION /usr/bin) \ No newline at end of file diff --git a/ukuisearch-systemdbus/main.cpp b/ukuisearch-systemdbus/main.cpp index eae7df1..1195840 100644 --- a/ukuisearch-systemdbus/main.cpp +++ b/ukuisearch-systemdbus/main.cpp @@ -29,7 +29,6 @@ int main(int argc, char *argv[]) { app.setOrganizationName("Kylin Team"); app.setApplicationName("ukui-search-service"); - QDBusConnection systemBus = QDBusConnection::systemBus(); if(!systemBus.registerService("com.ukui.search.qt.systemdbus")) { qCritical() << "QDbus register service failed reason:" << systemBus.lastError(); diff --git a/ukuisearch-systemdbus/sysdbusregister.cpp b/ukuisearch-systemdbus/sysdbusregister.cpp index c11c4b5..e6b1841 100644 --- a/ukuisearch-systemdbus/sysdbusregister.cpp +++ b/ukuisearch-systemdbus/sysdbusregister.cpp @@ -20,10 +20,8 @@ #include "sysdbusregister.h" #include -#include #include -#include -#include +#include SysdbusRegister::SysdbusRegister() { } diff --git a/ukuisearch-systemdbus/sysdbusregister.h b/ukuisearch-systemdbus/sysdbusregister.h index a52d75d..1bcc83e 100644 --- a/ukuisearch-systemdbus/sysdbusregister.h +++ b/ukuisearch-systemdbus/sysdbusregister.h @@ -44,7 +44,7 @@ public: // Q_SCRIPTABLE void nameChanged(QString); // Q_SCRIPTABLE void computerinfo(QString); -public slots: +public Q_SLOTS: Q_SCRIPTABLE void exitService(); // Q_SCRIPTABLE QString GetComputerInfo(); diff --git a/ukuisearch-systemdbus/ukuisearch-systemdbus.pro b/ukuisearch-systemdbus/ukuisearch-systemdbus.pro deleted file mode 100644 index 623a8b5..0000000 --- a/ukuisearch-systemdbus/ukuisearch-systemdbus.pro +++ /dev/null @@ -1,32 +0,0 @@ -QT += core dbus -QT -= gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -VERSION = 0.0.1 -TARGET = ukui-search-systemdbus -TEMPLATE = app - -CONFIG += console c++11 link_pkgconfig -CONFIG -= app_bundle - -DESTDIR = . -INCLUDEPATH += . - -inst1.files += conf/com.ukui.search.qt.systemdbus.service -inst1.path = /usr/share/dbus-1/system-services/ -inst2.files += conf/com.ukui.search.qt.systemdbus.conf -inst2.path = /etc/dbus-1/system.d/ - -target.source += $$TARGET -target.path = /usr/bin -INSTALLS += \ - target \ - inst1 \ - inst2 - -HEADERS += \ - sysdbusregister.h - -SOURCES += \ - main.cpp \ - sysdbusregister.cpp