Hi, does anyone has an requirement that be able to change wallpaper outside plasma. I need this function so I export dbus service for DefaultDesktop. then I rewrite the kdegraphics/kolourpaint->setWallpaper to use this interface. I also need it in some other projects.
best regards Siyuan Cao
diff --exclude='*~' --exclude='*.orig' -Nur kdebase-workspace-4.1.2-orig/plasma/containments/desktop/CMakeLists.txt kdebase-workspace-4.1.2-new/plasma/containments/desktop/CMakeLists.txt --- kdebase-workspace-4.1.2-orig/plasma/containments/desktop/CMakeLists.txt 2008-11-19 11:41:07.000000000 +0800 +++ kdebase-workspace-4.1.2-new/plasma/containments/desktop/CMakeLists.txt 2008-11-19 16:50:21.000000000 +0800 @@ -15,6 +15,7 @@ set(ksmserver_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/ksmserver/org.kde.KSMServerInterface.xml) QT4_ADD_DBUS_INTERFACE(desktop_SRCS ${ksmserver_xml} ksmserver_interface) +QT4_ADD_DBUS_ADAPTOR(desktop_SRCS org.kde.plasma.desktop.xml desktop.h DefaultDesktop) kde4_add_plugin(plasma_containment_desktop ${desktop_SRCS}) if(WIN32) target_link_libraries(plasma_containment_desktop plasma ${KDE4_KNEWSTUFF2_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS} ${KDE4_THREADWEAVER_LIBRARY}) --- kdebase-workspace-4.1.2-orig/plasma/containments/desktop/desktop.cpp 2008-11-19 11:41:07.000000000 +0800 +++ kdebase-workspace-4.1.2-new/plasma/containments/desktop/desktop.cpp 2008-11-19 16:45:41.000000000 +0800 @@ -29,6 +29,7 @@ #include <QGraphicsView> #include <QPainter> #include <QTimeLine> +#include <QDBusConnection> #include <KAuthorized> #include <KComboBox> @@ -39,6 +40,7 @@ #include <KStandardDirs> #include <KWindowSystem> #include <KProcess> +#include <KDirWatch> #include "plasma/corona.h" #include "plasma/appletbrowser.h" @@ -47,6 +49,7 @@ #include "kworkspace/kworkspace.h" #include "knewstuff2/engine.h" +#include "desktopadaptor.h" #include "krunner_interface.h" #include "screensaver_interface.h" #include "ksmserver_interface.h" @@ -112,11 +115,54 @@ return QApplication::desktop()->screenGeometry(screen()).size(); } +void DefaultDesktop::changeBackground(const QString& filename, int position) +{ + kDebug() << "called with " << filename; + + // judge correct picture path + QSet<QString> suffixes; + suffixes << "png" << "jpeg" << "jpg" << "svg" << "svgz"; + + QFileInfo fi(filename); + bool validFile = fi.exists() && fi.isFile() && !suffixes.contains(fi.suffix().toLower()); + if ( validFile ) { + kDebug() << filename << " does not exists or invalid file type"; + return; + } + + if ( position < Background::Scale || position > Background::CenterTiled ) { + kDebug() << "invalid background position"; + return; + } + + KConfigGroup cg = config(); + // change background + if ( m_backgroundMode == BackgroundDialog::kStaticBackground + || m_wallpaperPath != filename + || m_wallpaperPosition != position ) { + m_wallpaperPath = filename; + m_wallpaperPosition = position; + cg.writeEntry("wallpaper", m_wallpaperPath); + cg.writeEntry("wallpaperposition", m_wallpaperPosition ); + updateBackground(); + } else if ( m_backgroundMode == BackgroundDialog::kSlideshowBackground ) { + // TODO: maybe set wallpaper to specified, and restart slideshow + } +} + void DefaultDesktop::constraintsEvent(Plasma::Constraints constraints) { if (constraints & Plasma::StartupCompletedConstraint) { qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()) + id()); - reloadConfig(); + QString cfgName = KGlobal::dirs()->locateLocal("config", config().config()->name()); + if ( !cfgName.isEmpty() ) { + KDirWatch::self()->addFile( cfgName ); + connect(KDirWatch::self(), SIGNAL(dirty(const QString&)), + this, SLOT(notifyConfigFileChange(const QString&))); + } + reloadConfig(); + new DesktopAdaptor(this); + QDBusConnection::sessionBus().registerObject( "/Desktop", this ); } if (constraints & Plasma::SizeConstraint) { @@ -245,6 +291,13 @@ } } +void DefaultDesktop::notifyConfigFileChange(const QString& file) +{ + kDebug() << file << " changed, reload configuration"; + config().config()->reparseConfiguration(); + reloadConfig(); +} + void DefaultDesktop::updateBackground() { if (m_wallpaperPath.isEmpty() && m_backgroundMode != BackgroundDialog::kNoBackground) { --- kdebase-workspace-4.1.2-orig/plasma/containments/desktop/desktop.h 2008-11-19 11:41:07.000000000 +0800 +++ kdebase-workspace-4.1.2-new/plasma/containments/desktop/desktop.h 2008-11-19 16:46:40.000000000 +0800 @@ -81,6 +81,10 @@ const QStyleOptionGraphicsItem *option, const QRect& contentsRect); +public Q_SLOTS: + // dbus interfaces + void changeBackground(const QString& filename, int position); + protected Q_SLOTS: void runKonsole(); void runCommand(); @@ -95,7 +99,8 @@ void updateBackground(int, const QImage &img); void addPanel(); - + void notifyConfigFileChange(const QString& file); + private: void reloadConfig(); QSize resolution() const; --- kdebase-workspace-4.1.2-orig/plasma/containments/desktop/org.kde.plasma.desktop.xml 1970-01-01 08:00:00.000000000 +0800 +++ kdebase-workspace-4.1.2-new/plasma/containments/desktop/org.kde.plasma.desktop.xml 2008-11-19 16:53:36.000000000 +0800 @@ -0,0 +1,10 @@ +<!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.plasma.desktop"> + <method name="changeBackground"> + <arg name="filename" type="s" direction="in"/> + <arg name="position" type="i" direction="in"/> + </method> + </interface> +</node>
diff --exclude='*~' --exclude='*.orig' -Nur kdegraphics-4.1.2-orig/kolourpaint/mainWindow/kpMainWindow_File.cpp kdegraphics-4.1.2-new/kolourpaint/mainWindow/kpMainWindow_File.cpp --- kdegraphics-4.1.2-orig/kolourpaint/mainWindow/kpMainWindow_File.cpp 2008-11-16 16:49:40.000000000 +0800 +++ kdegraphics-4.1.2-new/kolourpaint/mainWindow/kpMainWindow_File.cpp 2008-11-19 16:55:46.000000000 +0800 @@ -1424,15 +1424,15 @@ } - QByteArray data; - QDataStream dataStream (&data, QIODevice::WriteOnly); +// QByteArray data; +// QDataStream dataStream (&data, QIODevice::WriteOnly); // write path #if DEBUG_KP_MAIN_WINDOW kDebug () << "kpMainWindow::setAsWallpaper() path=" << d->document->url ().path () << endl; #endif - dataStream << QString (d->document->url ().path ()); +// dataStream << QString (d->document->url ().path ()); // write position: // @@ -1452,7 +1452,7 @@ // flexiblity. We don't want to slow down average users, who see way too // many dialogs already and probably haven't even heard of "Centered Maxpect"... // - dataStream << int (centered ? 1 : 2); + // dataStream << int (centered ? 1 : 2); // I'm going to all this trouble because the user might not have kdebase @@ -1461,14 +1461,19 @@ // COMPAT #ifdef Q_WS_X11 - int konq_screen_number = KApplication::desktop()->primaryScreen(); - QByteArray appname; - if (konq_screen_number == 0) - appname = "org.kde.kdesktop"; - else - appname = "org.kde.kdesktop-screen-" + QByteArray::number(konq_screen_number); - QDBusInterface kdesktop(appname, "/Background", "org.kde.kdesktop.Background"); - QDBusReply<void> retVal = kdesktop.call( "setWallpaper", QString (d->document->url ().path ()), int (centered ? 1 : 2) ); + QDBusInterface desktop("org.kde.plasma", "/Desktop", "org.kde.plasma.desktop"); + QDBusReply<void> retVal = desktop.call( "changeBackground", QString(d->document->url().path()), + (centered? 1: 3) ); + + // int konq_screen_number = KApplication::desktop()->primaryScreen(); + // QByteArray appname; + // if (konq_screen_number == 0) + // appname = "org.kde.kdesktop"; + // else + // appname = "org.kde.kdesktop-screen-" + QByteArray::number(konq_screen_number); + // QDBusInterface kdesktop(appname, "/Background", "org.kde.kdesktop.Background"); + // QDBusReply<void> retVal = kdesktop.call( "setWallpaper", QString (d->document->url ().path ()), int (centered ? 1 : + // 2) ); if (!retVal.isValid()) { KMessageBox::sorry (this, i18n ("Could not change wallpaper."));
_______________________________________________ Plasma-devel mailing list Plasma-devel@kde.org https://mail.kde.org/mailman/listinfo/plasma-devel