Dolphin is now a KUniqueApplication. A lot of thanks go to Oscar Blumberg, who submitted this patch.

svn path=/trunk/KDE/kdebase/apps/; revision=634862
This commit is contained in:
Peter Penz 2007-02-18 17:01:36 +00:00
parent fd43139134
commit abf17941f7
8 changed files with 119 additions and 28 deletions

View file

@ -56,6 +56,12 @@ kde4_add_kcfg_files(dolphin_SRCS
iconsmodesettings.kcfgc iconsmodesettings.kcfgc
detailsmodesettings.kcfgc ) detailsmodesettings.kcfgc )
qt4_add_dbus_adaptor(dolphin_SRCS
org.kde.dolphin.Application.xml
dolphinapplication.h DolphinApplication)
qt4_add_dbus_adaptor(dolphin_SRCS
org.kde.dolphin.MainWindow.xml
dolphinmainwindow.h DolphinMainWindow)
kde4_add_executable(dolphin ${dolphin_SRCS}) kde4_add_executable(dolphin ${dolphin_SRCS})
target_link_libraries(dolphin ${KDE4_KDECORE_LIBS} ${KDE4_KDEPRINT_LIBS} konq ) target_link_libraries(dolphin ${KDE4_KDECORE_LIBS} ${KDE4_KDEPRINT_LIBS} konq )

View file

@ -21,8 +21,15 @@
#include "dolphinapplication.h" #include "dolphinapplication.h"
#include "dolphinmainwindow.h" #include "dolphinmainwindow.h"
DolphinApplication::DolphinApplication() #include <applicationadaptor.h>
#include <kurl.h>
#include <QDBusConnection>
DolphinApplication::DolphinApplication() :
m_lastId(0)
{ {
new ApplicationAdaptor(this);
QDBusConnection::sessionBus().registerObject("/dolphin/Application", this);
} }
DolphinApplication::~DolphinApplication() DolphinApplication::~DolphinApplication()
@ -40,13 +47,24 @@ DolphinApplication* DolphinApplication::app()
DolphinMainWindow* DolphinApplication::createMainWindow() DolphinMainWindow* DolphinApplication::createMainWindow()
{ {
DolphinMainWindow* mainWindow = new DolphinMainWindow(); DolphinMainWindow* mainWindow = new DolphinMainWindow(m_lastId);
++m_lastId;
mainWindow->init(); mainWindow->init();
m_mainWindows.append(mainWindow); m_mainWindows.append(mainWindow);
return mainWindow; return mainWindow;
} }
int DolphinApplication::openWindow(const QString& url)
{
DolphinMainWindow* win = createMainWindow();
if ((win->activeView() != 0) && !url.isEmpty()) {
win->activeView()->setUrl(KUrl(url));
}
win->show();
return win->getId();
}
void DolphinApplication::removeMainWindow(DolphinMainWindow* mainWindow) void DolphinApplication::removeMainWindow(DolphinMainWindow* mainWindow)
{ {
m_mainWindows.removeAll(mainWindow); m_mainWindows.removeAll(mainWindow);

View file

@ -22,7 +22,7 @@
#ifndef _DOLPHIN_APPLICATION_H #ifndef _DOLPHIN_APPLICATION_H
#define _DOLPHIN_APPLICATION_H #define _DOLPHIN_APPLICATION_H
#include <kapplication.h> #include <kuniqueapplication.h>
class DolphinMainWindow; class DolphinMainWindow;
@ -32,9 +32,10 @@ class DolphinMainWindow;
* we will delete on application exit. * we will delete on application exit.
*/ */
class DolphinApplication : public KApplication class DolphinApplication : public KUniqueApplication
{ {
Q_OBJECT Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.dolphin.Application")
friend class DolphinMainWindow; friend class DolphinMainWindow;
public: public:
@ -50,12 +51,16 @@ public:
DolphinMainWindow* createMainWindow(); DolphinMainWindow* createMainWindow();
void refreshMainWindows(); void refreshMainWindows();
public slots:
int openWindow(const QString& url);
protected: protected:
/** Called by the DolphinMainWindow to deregister. */ /** Called by the DolphinMainWindow to deregister. */
void removeMainWindow(DolphinMainWindow* mainWindow); void removeMainWindow(DolphinMainWindow* mainWindow);
private: private:
QList<DolphinMainWindow*> m_mainWindows; QList<DolphinMainWindow*> m_mainWindows;
int m_lastId;
}; };
#endif #endif

View file

@ -36,6 +36,7 @@
#include "generalsettings.h" #include "generalsettings.h"
#include "viewpropertiesdialog.h" #include "viewpropertiesdialog.h"
#include "viewproperties.h" #include "viewproperties.h"
#include "mainwindowadaptor.h"
#include <kaction.h> #include <kaction.h>
#include <kactioncollection.h> #include <kactioncollection.h>
@ -70,16 +71,20 @@
#include <QSplitter> #include <QSplitter>
#include <QDockWidget> #include <QDockWidget>
DolphinMainWindow::DolphinMainWindow() : DolphinMainWindow::DolphinMainWindow(int id) :
KMainWindow(0), KMainWindow(0),
m_newMenu(0), m_newMenu(0),
m_splitter(0), m_splitter(0),
m_activeView(0) m_activeView(0),
m_id(id)
{ {
setObjectName("Dolphin"); setObjectName("Dolphin");
m_view[PrimaryIdx] = 0; m_view[PrimaryIdx] = 0;
m_view[SecondaryIdx] = 0; m_view[SecondaryIdx] = 0;
new MainWindowAdaptor(this);
QDBusConnection::sessionBus().registerObject(QString("/dolphin/MainWindow%1").arg(m_id), this);
KonqUndoManager::incRef(); KonqUndoManager::incRef();
KonqUndoManager* undoManager = KonqUndoManager::self(); KonqUndoManager* undoManager = KonqUndoManager::self();
@ -231,6 +236,13 @@ void DolphinMainWindow::refreshViews()
emit activeViewChanged(); emit activeViewChanged();
} }
void DolphinMainWindow::changeUrl(const QString& url)
{
if (activeView() != 0) {
activeView()->setUrl(KUrl(url));
}
}
void DolphinMainWindow::slotViewModeChanged() void DolphinMainWindow::slotViewModeChanged()
{ {
updateViewActions(); updateViewActions();

View file

@ -47,13 +47,14 @@ class DolphinApplication;
* @short Main window for Dolphin. * @short Main window for Dolphin.
* *
* Handles the menus, toolbars and Dolphin views. * Handles the menus, toolbars and Dolphin views.
* */
* @author Peter Penz <peter.penz@gmx.at>
*/
class DolphinMainWindow: public KMainWindow class DolphinMainWindow: public KMainWindow
{ {
Q_OBJECT Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.dolphin.MainWindow")
Q_PROPERTY(int id READ getId SCRIPTABLE true)
friend class DolphinApplication; friend class DolphinApplication;
public: public:
virtual ~DolphinMainWindow(); virtual ~DolphinMainWindow();
@ -97,6 +98,20 @@ public:
*/ */
KNewMenu* newMenu() const { return m_newMenu; } KNewMenu* newMenu() const { return m_newMenu; }
public slots:
/**
* Returns the main windows ID, mainly used throught DBus.
*/
int getId() const { return m_id; }
/**
* Changes the URL of the current active DolphinView to \a url.
*/
void changeUrl(const QString& url);
/** Stores all settings and quits Dolphin. */
void quit();
signals: signals:
/** /**
* Is send if the active view has been changed in * Is send if the active view has been changed in
@ -147,9 +162,6 @@ private slots:
*/ */
void properties(); void properties();
/** Stores all settings and quits Dolphin. */
void quit();
/** /**
* Shows the error information of the job \a job * Shows the error information of the job \a job
* in the status bar. * in the status bar.
@ -338,7 +350,7 @@ private slots:
void openNewMainWindow(); void openNewMainWindow();
private: private:
DolphinMainWindow(); DolphinMainWindow(int id);
void init(); void init();
void loadSettings(); void loadSettings();
@ -392,6 +404,7 @@ private:
KNewMenu* m_newMenu; KNewMenu* m_newMenu;
QSplitter* m_splitter; QSplitter* m_splitter;
DolphinView* m_activeView; DolphinView* m_activeView;
int m_id;
DolphinView* m_view[SecondaryIdx + 1]; DolphinView* m_view[SecondaryIdx + 1];

View file

@ -24,6 +24,8 @@
#include <kcmdlineargs.h> #include <kcmdlineargs.h>
#include <klocale.h> #include <klocale.h>
#include <krun.h> #include <krun.h>
#include <QDBusInterface>
#include <QDBusReply>
static KCmdLineOptions options[] = static KCmdLineOptions options[] =
{ {
@ -31,6 +33,18 @@ static KCmdLineOptions options[] =
KCmdLineLastOption KCmdLineLastOption
}; };
void openWindow(DolphinApplication* app, const QString& url = QString())
{
if (app != 0) {
app->openWindow(url);
return;
}
static QDBusInterface dbusIface("org.kde.dolphin", "/dolphin/Application", "",
QDBusConnection::connectToBus(QDBusConnection::SessionBus, "session_bus"));
QDBusReply<int> reply = dbusIface.call("openWindow", url);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
KAboutData about("dolphin", KAboutData about("dolphin",
@ -53,8 +67,10 @@ int main(int argc, char **argv)
KCmdLineArgs::init(argc, argv, &about); KCmdLineArgs::init(argc, argv, &about);
KCmdLineArgs::addCmdLineOptions(options); KCmdLineArgs::addCmdLineOptions(options);
DolphinApplication *app = 0;
DolphinApplication app; if (DolphinApplication::start()) {
app = new DolphinApplication();
}
#warning TODO, SessionManagement #warning TODO, SessionManagement
@ -68,18 +84,17 @@ int main(int argc, char **argv)
} else { } else {
#endif #endif
KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); KCmdLineArgs* args = KCmdLineArgs::parsedArgs();
if (args->count() > 0) { if (args->count() > 0) {
for (int i = 0; i < args->count(); ++i) { for (int i = 0; i < args->count(); ++i) {
DolphinMainWindow *win = app.createMainWindow(); openWindow(app, args->arg(i));
win->activeView()->setUrl(args->url(i));
win->show();
}
} else {
DolphinMainWindow* mainWin = app.createMainWindow();
mainWin->show();
} }
args->clear(); }
else {
return app.exec(); openWindow(app);
}
args->clear();
if (app != 0) {
return app->exec();
}
} }

View file

@ -0,0 +1,9 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.kde.dolphin.Application">
<method name="openWindow">
<arg type="i" direction="out"/>
<arg name="url" type="s" direction="in"/>
</method>
</interface>
</node>

View file

@ -0,0 +1,13 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.kde.dolphin.MainWindow">
<method name="getId">
<arg type="i" direction="out"/>
</method>
<method name="changeUrl">
<arg name="url" type="s" direction="in"/>
</method>
<method name="quit">
</method>
</interface>
</node>