|
|
@ -1,53 +1,47 @@ |
|
|
|
/****************************************************************************
|
|
|
|
/****************************************************************************
|
|
|
|
** |
|
|
|
** |
|
|
|
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
|
|
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). |
|
|
|
** All rights reserved. |
|
|
|
** Contact: http://www.qt-project.org/legal
|
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com) |
|
|
|
|
|
|
|
** |
|
|
|
** |
|
|
|
** This file is part of a Qt Solutions component. |
|
|
|
** This file is part of the Qt Solutions component. |
|
|
|
** |
|
|
|
** |
|
|
|
** Commercial Usage |
|
|
|
** $QT_BEGIN_LICENSE:BSD$ |
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in |
|
|
|
** You may use this file under the terms of the BSD license as follows: |
|
|
|
** accordance with the Qt Solutions Commercial License Agreement provided |
|
|
|
|
|
|
|
** with the Software or, alternatively, in accordance with the terms |
|
|
|
|
|
|
|
** contained in a written agreement between you and Nokia. |
|
|
|
|
|
|
|
** |
|
|
|
** |
|
|
|
** GNU Lesser General Public License Usage |
|
|
|
** "Redistribution and use in source and binary forms, with or without |
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser |
|
|
|
** modification, are permitted provided that the following conditions are |
|
|
|
** General Public License version 2.1 as published by the Free Software |
|
|
|
** met: |
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the |
|
|
|
** * Redistributions of source code must retain the above copyright |
|
|
|
** packaging of this file. Please review the following information to |
|
|
|
** notice, this list of conditions and the following disclaimer. |
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements |
|
|
|
** * Redistributions in binary form must reproduce the above copyright |
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
|
|
** 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. |
|
|
|
** |
|
|
|
** |
|
|
|
** In addition, as a special exception, Nokia gives you certain |
|
|
|
|
|
|
|
** additional rights. These rights are described in the Nokia Qt LGPL |
|
|
|
|
|
|
|
** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this |
|
|
|
|
|
|
|
** package. |
|
|
|
|
|
|
|
** |
|
|
|
** |
|
|
|
** GNU General Public License Usage |
|
|
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
|
|
** Alternatively, this file may be used under the terms of the GNU |
|
|
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
|
|
** General Public License version 3.0 as published by the Free Software |
|
|
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
|
|
** Foundation and appearing in the file LICENSE.GPL included in the |
|
|
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
|
|
** packaging of this file. Please review the following information to |
|
|
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
|
|
** ensure the GNU General Public License version 3.0 requirements will be |
|
|
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
|
|
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
|
|
** 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." |
|
|
|
** |
|
|
|
** |
|
|
|
** Please note Third Party Software included with Qt Solutions may impose |
|
|
|
** $QT_END_LICENSE$ |
|
|
|
** additional restrictions and it is the user's responsibility to ensure |
|
|
|
|
|
|
|
** that they have met the licensing requirements of the GPL, LGPL, or Qt |
|
|
|
|
|
|
|
** Solutions Commercial license and the relevant license of the Third |
|
|
|
|
|
|
|
** Party Software they are using. |
|
|
|
|
|
|
|
** |
|
|
|
|
|
|
|
** If you are unsure which license is appropriate for your use, please |
|
|
|
|
|
|
|
** contact Nokia at qt-info@nokia.com. |
|
|
|
|
|
|
|
** |
|
|
|
** |
|
|
|
****************************************************************************/ |
|
|
|
****************************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "qtsingleapplication.h" |
|
|
|
#include "qtsingleapplication.h" |
|
|
|
#include "qtlocalpeer.h" |
|
|
|
#include "qtlocalpeer.h" |
|
|
|
#include <QtGui/QWidget> |
|
|
|
#include <QWidget> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
/*!
|
|
|
@ -68,28 +62,31 @@ |
|
|
|
that will be compared instead. |
|
|
|
that will be compared instead. |
|
|
|
|
|
|
|
|
|
|
|
The application should create the QtSingleApplication object early |
|
|
|
The application should create the QtSingleApplication object early |
|
|
|
in the startup phase, and call isRunning() or sendMessage() to |
|
|
|
in the startup phase, and call isRunning() to find out if another |
|
|
|
find out if another instance of this application is already |
|
|
|
instance of this application is already running. If isRunning() |
|
|
|
running. Startup parameters (e.g. the name of the file the user |
|
|
|
returns false, it means that no other instance is running, and |
|
|
|
wanted this new instance to open) can be passed to the running |
|
|
|
this instance has assumed the role as the running instance. In |
|
|
|
instance in the sendMessage() function. |
|
|
|
this case, the application should continue with the initialization |
|
|
|
|
|
|
|
of the application user interface before entering the event loop |
|
|
|
If isRunning() or sendMessage() returns false, it means that no |
|
|
|
with exec(), as normal. |
|
|
|
other instance is running, and this instance has assumed the role |
|
|
|
|
|
|
|
as the running instance. The application should continue with the |
|
|
|
The messageReceived() signal will be emitted when the running |
|
|
|
initialization of the application user interface before entering |
|
|
|
application receives messages from another instance of the same |
|
|
|
the event loop with exec(), as normal. The messageReceived() |
|
|
|
application. When a message is received it might be helpful to the |
|
|
|
signal will be emitted when the application receives messages from |
|
|
|
user to raise the application so that it becomes visible. To |
|
|
|
another instance of the same application. |
|
|
|
facilitate this, QtSingleApplication provides the |
|
|
|
|
|
|
|
setActivationWindow() function and the activateWindow() slot. |
|
|
|
If isRunning() or sendMessage() returns true, another instance is |
|
|
|
|
|
|
|
already running, and the application should terminate or enter |
|
|
|
If isRunning() returns true, another instance is already |
|
|
|
client mode. |
|
|
|
running. It may be alerted to the fact that another instance has |
|
|
|
|
|
|
|
started by using the sendMessage() function. Also data such as |
|
|
|
If a message is received it might be helpful to the user to raise |
|
|
|
startup parameters (e.g. the name of the file the user wanted this |
|
|
|
the application so that it becomes visible. To facilitate this, |
|
|
|
new instance to open) can be passed to the running instance with |
|
|
|
QtSingleApplication provides the setActivationWindow() function |
|
|
|
this function. Then, the application should terminate (or enter |
|
|
|
and the activateWindow() slot. |
|
|
|
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 |
|
|
|
Here's an example that shows how to convert an existing |
|
|
|
application to use QtSingleApplication. It is very simple and does |
|
|
|
application to use QtSingleApplication. It is very simple and does |
|
|
@ -103,7 +100,6 @@ |
|
|
|
QApplication app(argc, argv); |
|
|
|
QApplication app(argc, argv); |
|
|
|
|
|
|
|
|
|
|
|
MyMainWidget mmw; |
|
|
|
MyMainWidget mmw; |
|
|
|
|
|
|
|
|
|
|
|
mmw.show(); |
|
|
|
mmw.show(); |
|
|
|
return app.exec(); |
|
|
|
return app.exec(); |
|
|
|
} |
|
|
|
} |
|
|
@ -114,19 +110,17 @@ |
|
|
|
QtSingleApplication app(argc, argv); |
|
|
|
QtSingleApplication app(argc, argv); |
|
|
|
|
|
|
|
|
|
|
|
if (app.isRunning()) |
|
|
|
if (app.isRunning()) |
|
|
|
return 0; |
|
|
|
return !app.sendMessage(someDataString); |
|
|
|
|
|
|
|
|
|
|
|
MyMainWidget mmw; |
|
|
|
MyMainWidget mmw; |
|
|
|
|
|
|
|
|
|
|
|
app.setActivationWindow(&mmw); |
|
|
|
app.setActivationWindow(&mmw); |
|
|
|
|
|
|
|
|
|
|
|
mmw.show(); |
|
|
|
mmw.show(); |
|
|
|
return app.exec(); |
|
|
|
return app.exec(); |
|
|
|
} |
|
|
|
} |
|
|
|
\endcode |
|
|
|
\endcode |
|
|
|
|
|
|
|
|
|
|
|
Once this QtSingleApplication instance is destroyed(for example, |
|
|
|
Once this QtSingleApplication instance is destroyed (normally when |
|
|
|
when the user quits), when the user next attempts to run the |
|
|
|
the process exits or crashes), when the user next attempts to run the |
|
|
|
application this instance will not, of course, be encountered. The |
|
|
|
application this instance will not, of course, be encountered. The |
|
|
|
next instance to call isRunning() or sendMessage() will assume the |
|
|
|
next instance to call isRunning() or sendMessage() will assume the |
|
|
|
role as the new running instance. |
|
|
|
role as the new running instance. |
|
|
@ -176,6 +170,7 @@ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char * |
|
|
|
sysInit(appId); |
|
|
|
sysInit(appId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if QT_VERSION < 0x050000 |
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
/*!
|
|
|
|
Creates a QtSingleApplication object. The application identifier |
|
|
|
Creates a QtSingleApplication object. The application identifier |
|
|
@ -189,7 +184,7 @@ QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(Q_WS_X11) |
|
|
|
# if defined(Q_WS_X11) |
|
|
|
/*!
|
|
|
|
/*!
|
|
|
|
Special constructor for X11, ref. the documentation of |
|
|
|
Special constructor for X11, ref. the documentation of |
|
|
|
QApplication's corresponding constructor. The application identifier |
|
|
|
QApplication's corresponding constructor. The application identifier |
|
|
@ -227,7 +222,8 @@ QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int |
|
|
|
{ |
|
|
|
{ |
|
|
|
sysInit(appId); |
|
|
|
sysInit(appId); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
# endif // Q_WS_X11
|
|
|
|
|
|
|
|
#endif // QT_VERSION < 0x050000
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
/*!
|
|
|
|