From abf17941f7a052d25788d2f2f3c84e5aae935e29 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 18 Feb 2007 17:01:36 +0000 Subject: [PATCH] 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 --- src/CMakeLists.txt | 6 ++++ src/dolphinapplication.cpp | 22 ++++++++++++-- src/dolphinapplication.h | 9 ++++-- src/dolphinmainwindow.cpp | 16 ++++++++-- src/dolphinmainwindow.h | 27 ++++++++++++----- src/main.cpp | 45 +++++++++++++++++++---------- src/org.kde.dolphin.Application.xml | 9 ++++++ src/org.kde.dolphin.MainWindow.xml | 13 +++++++++ 8 files changed, 119 insertions(+), 28 deletions(-) create mode 100644 src/org.kde.dolphin.Application.xml create mode 100644 src/org.kde.dolphin.MainWindow.xml diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b2ea5561f3..ba6ed88fad 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -56,6 +56,12 @@ kde4_add_kcfg_files(dolphin_SRCS iconsmodesettings.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}) target_link_libraries(dolphin ${KDE4_KDECORE_LIBS} ${KDE4_KDEPRINT_LIBS} konq ) diff --git a/src/dolphinapplication.cpp b/src/dolphinapplication.cpp index 439a6fd218..cad0056304 100644 --- a/src/dolphinapplication.cpp +++ b/src/dolphinapplication.cpp @@ -21,8 +21,15 @@ #include "dolphinapplication.h" #include "dolphinmainwindow.h" -DolphinApplication::DolphinApplication() +#include +#include +#include + +DolphinApplication::DolphinApplication() : + m_lastId(0) { + new ApplicationAdaptor(this); + QDBusConnection::sessionBus().registerObject("/dolphin/Application", this); } DolphinApplication::~DolphinApplication() @@ -40,13 +47,24 @@ DolphinApplication* DolphinApplication::app() DolphinMainWindow* DolphinApplication::createMainWindow() { - DolphinMainWindow* mainWindow = new DolphinMainWindow(); + DolphinMainWindow* mainWindow = new DolphinMainWindow(m_lastId); + ++m_lastId; mainWindow->init(); m_mainWindows.append(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) { m_mainWindows.removeAll(mainWindow); diff --git a/src/dolphinapplication.h b/src/dolphinapplication.h index fc1a564c89..fa6a1ceeef 100644 --- a/src/dolphinapplication.h +++ b/src/dolphinapplication.h @@ -22,7 +22,7 @@ #ifndef _DOLPHIN_APPLICATION_H #define _DOLPHIN_APPLICATION_H -#include +#include class DolphinMainWindow; @@ -32,9 +32,10 @@ class DolphinMainWindow; * we will delete on application exit. */ -class DolphinApplication : public KApplication +class DolphinApplication : public KUniqueApplication { Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.kde.dolphin.Application") friend class DolphinMainWindow; public: @@ -50,12 +51,16 @@ public: DolphinMainWindow* createMainWindow(); void refreshMainWindows(); +public slots: + int openWindow(const QString& url); + protected: /** Called by the DolphinMainWindow to deregister. */ void removeMainWindow(DolphinMainWindow* mainWindow); private: QList m_mainWindows; + int m_lastId; }; #endif diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index bd91de09a3..a25c610381 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -36,6 +36,7 @@ #include "generalsettings.h" #include "viewpropertiesdialog.h" #include "viewproperties.h" +#include "mainwindowadaptor.h" #include #include @@ -70,16 +71,20 @@ #include #include -DolphinMainWindow::DolphinMainWindow() : +DolphinMainWindow::DolphinMainWindow(int id) : KMainWindow(0), m_newMenu(0), m_splitter(0), - m_activeView(0) + m_activeView(0), + m_id(id) { setObjectName("Dolphin"); m_view[PrimaryIdx] = 0; m_view[SecondaryIdx] = 0; + new MainWindowAdaptor(this); + QDBusConnection::sessionBus().registerObject(QString("/dolphin/MainWindow%1").arg(m_id), this); + KonqUndoManager::incRef(); KonqUndoManager* undoManager = KonqUndoManager::self(); @@ -231,6 +236,13 @@ void DolphinMainWindow::refreshViews() emit activeViewChanged(); } +void DolphinMainWindow::changeUrl(const QString& url) +{ + if (activeView() != 0) { + activeView()->setUrl(KUrl(url)); + } +} + void DolphinMainWindow::slotViewModeChanged() { updateViewActions(); diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index 4cfe310771..7a71b685c2 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -47,13 +47,14 @@ class DolphinApplication; * @short Main window for Dolphin. * * Handles the menus, toolbars and Dolphin views. - * - * @author Peter Penz -*/ + */ class DolphinMainWindow: public KMainWindow { Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.kde.dolphin.MainWindow") + Q_PROPERTY(int id READ getId SCRIPTABLE true) friend class DolphinApplication; + public: virtual ~DolphinMainWindow(); @@ -97,6 +98,20 @@ public: */ 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: /** * Is send if the active view has been changed in @@ -147,9 +162,6 @@ private slots: */ void properties(); - /** Stores all settings and quits Dolphin. */ - void quit(); - /** * Shows the error information of the job \a job * in the status bar. @@ -338,7 +350,7 @@ private slots: void openNewMainWindow(); private: - DolphinMainWindow(); + DolphinMainWindow(int id); void init(); void loadSettings(); @@ -392,6 +404,7 @@ private: KNewMenu* m_newMenu; QSplitter* m_splitter; DolphinView* m_activeView; + int m_id; DolphinView* m_view[SecondaryIdx + 1]; diff --git a/src/main.cpp b/src/main.cpp index f5a51ee30b..9de7b609a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include static KCmdLineOptions options[] = { @@ -31,6 +33,18 @@ static KCmdLineOptions options[] = 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 reply = dbusIface.call("openWindow", url); +} + int main(int argc, char **argv) { KAboutData about("dolphin", @@ -53,8 +67,10 @@ int main(int argc, char **argv) KCmdLineArgs::init(argc, argv, &about); KCmdLineArgs::addCmdLineOptions(options); - - DolphinApplication app; + DolphinApplication *app = 0; + if (DolphinApplication::start()) { + app = new DolphinApplication(); + } #warning TODO, SessionManagement @@ -68,18 +84,17 @@ int main(int argc, char **argv) } else { #endif - KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); - if (args->count() > 0) { - for (int i = 0; i < args->count(); ++i) { - DolphinMainWindow *win = app.createMainWindow(); - win->activeView()->setUrl(args->url(i)); - win->show(); - } - } else { - DolphinMainWindow* mainWin = app.createMainWindow(); - mainWin->show(); + KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + if (args->count() > 0) { + for (int i = 0; i < args->count(); ++i) { + openWindow(app, args->arg(i)); } - args->clear(); - - return app.exec(); + } + else { + openWindow(app); + } + args->clear(); + if (app != 0) { + return app->exec(); + } } diff --git a/src/org.kde.dolphin.Application.xml b/src/org.kde.dolphin.Application.xml new file mode 100644 index 0000000000..2b8c5316a0 --- /dev/null +++ b/src/org.kde.dolphin.Application.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/org.kde.dolphin.MainWindow.xml b/src/org.kde.dolphin.MainWindow.xml new file mode 100644 index 0000000000..b05b25298d --- /dev/null +++ b/src/org.kde.dolphin.MainWindow.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + +