From e6892a6c730d72d3b18c41a369db72957b5cc7a4 Mon Sep 17 00:00:00 2001 From: Alf Gaida Date: Tue, 5 Dec 2017 00:16:39 +0100 Subject: [PATCH] Cherry-picking upstream version 0.12.0. --- AUTHORS | 2 +- CHANGELOG | 31 ++- CMakeLists.txt | 18 +- src/CMakeLists.txt | 6 +- src/lxqtfiledialoghelper.cpp | 224 ++++++++++++++++++ src/lxqtfiledialoghelper.h | 50 ++++ src/lxqtplatformtheme.cpp | 37 ++- src/lxqtplatformtheme.h | 3 +- src/lxqtsystemtrayicon.cpp | 4 +- src/statusnotifieritem/statusnotifieritem.cpp | 62 +++-- src/statusnotifieritem/statusnotifieritem.h | 8 +- 11 files changed, 393 insertions(+), 52 deletions(-) create mode 100644 src/lxqtfiledialoghelper.cpp create mode 100644 src/lxqtfiledialoghelper.h diff --git a/AUTHORS b/AUTHORS index 717d2f2..36411ef 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,7 +3,7 @@ Upstream Authors: Hong Jen Yee (PCMan) Copyright: - Copyright (c) 2013-2016 LXQt team + Copyright (c) 2013-2017 LXQt team License: LGPL-2.1+ The full text of the licenses can be found in the 'COPYING' file. diff --git a/CHANGELOG b/CHANGELOG index 9715f51..0e6ff9a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,36 @@ -lxqt-qtplugin-0.11.1 / 2016-12-11 +lxqt-qtplugin-0.12.0 / 2017-10-21 ================================= + * Set an informal patch version + * Don't export github templates + * Flag unused vars in onServiceOwnerChanged + * Fix missing variable declaration + * Handle QML (as @PCMan suggested) + * Use mime functions added by @PCMan + * Loading and saving window/splitter size + * Central positioning with respect to parent + * Set window title correctly + * Qt version conditions + * Just made it compilable + * Handle mime-type filters for file dialog. Set custom file dialog labels. + * Update options properly. + * Implement a basic file dialog helper using libfm-qt's Fm::FileDialog. + * Avoid using Qt-specific keywords such as signal/slot and foreach. Instead, use macros. + * LXQtPlatformTheme: Make Qt use default palette (#22) + * LXQtPlatformTheme: Add icon FollowColorScheme config (#21) + * Prevent a possible C++11 range for detach (#20) + * Use the CMake MODULE library type. + * LXQtPlatformTheme: Propagate wheelScrollLines + * LXQtPlatformTheme: Do not provide own palette + * Fix multiple StatusNotifierItems. + * Bump year + * Updates lxqt-build-tools required version + +0.11.1 / 2016-12-11 +=================== + + * Release 0.11.1: Update changelog * Use lxqt-build-tools * Use the new lxqt-build-tools package * Remove cpack (#14) diff --git a/CMakeLists.txt b/CMakeLists.txt index e0a05ee..23ce33e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,18 +3,24 @@ project(lxqt-qtplugin) include(GNUInstallDirs) -set(LXQTBT_MINIMUM_VERSION "0.1.0") +set(LXQTBT_MINIMUM_VERSION "0.4.0") set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) -find_package(Qt5Widgets REQUIRED QUIET) -find_package(Qt5LinguistTools REQUIRED QUIET) -find_package(Qt5DBus REQUIRED QUIET) -find_package(dbusmenu-qt5 REQUIRED QUIET) +find_package(Qt5Widgets REQUIRED) +find_package(Qt5LinguistTools REQUIRED) +find_package(Qt5DBus REQUIRED) +find_package(dbusmenu-qt5 REQUIRED) find_package(lxqt-build-tools ${LXQTBT_MINIMUM_VERSION} REQUIRED) -find_package(Qt5XdgIconLoader REQUIRED QUIET) +find_package(Qt5XdgIconLoader REQUIRED) + +# Patch Version 0 + +# for file dialog support +find_package(Qt5X11Extras REQUIRED) +find_package(fm-qt REQUIRED) include(LXQtCompilerSettings NO_POLICY_SCOPE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7723c04..def833c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories( set(qtlxqt_HDRS lxqtplatformtheme.h lxqtsystemtrayicon.h + lxqtfiledialoghelper.h statusnotifieritem/statusnotifieritem.h statusnotifieritem/dbustypes.h ) @@ -14,6 +15,7 @@ set(qtlxqt_SRCS main.cpp lxqtplatformtheme.cpp lxqtsystemtrayicon.cpp + lxqtfiledialoghelper.cpp statusnotifieritem/statusnotifieritem.cpp statusnotifieritem/dbustypes.cpp ) @@ -24,15 +26,17 @@ qt5_add_dbus_adaptor(qtlxqt_SRCS StatusNotifierItem ) -add_library(qtlxqt SHARED ${qtlxqt_HDRS} ${qtlxqt_SRCS}) +add_library(qtlxqt MODULE ${qtlxqt_HDRS} ${qtlxqt_SRCS}) target_link_libraries(qtlxqt Qt5::Widgets Qt5::DBus dbusmenu-qt5 Qt5XdgIconLoader + fm-qt ) + # there is no standard way to get the plugin dir of Qt5 with cmake # The best way is get_target_property(QT_PLUGINS_DIR Qt5::QGtk2ThemePlugin LOCATION). # This directly returns the platformthemes dir. However, this does not work diff --git a/src/lxqtfiledialoghelper.cpp b/src/lxqtfiledialoghelper.cpp new file mode 100644 index 0000000..4cc0376 --- /dev/null +++ b/src/lxqtfiledialoghelper.cpp @@ -0,0 +1,224 @@ +#include "lxqtfiledialoghelper.h" + +#include +#include + +#include +#include +#include +#include + +#include + +static std::unique_ptr libfmQtContext_; + +LXQtFileDialogHelper::LXQtFileDialogHelper() { + if(!libfmQtContext_) { + // initialize libfm-qt only once + libfmQtContext_ = std::unique_ptr{new Fm::LibFmQt()}; + } + + // can only be used after libfm-qt initialization + dlg_ = std::unique_ptr(new Fm::FileDialog()); + connect(dlg_.get(), &Fm::FileDialog::accepted, [this]() { + saveSettings(); + accept(); + }); + connect(dlg_.get(), &Fm::FileDialog::rejected, [this]() { + saveSettings(); + reject(); + }); + + connect(dlg_.get(), &Fm::FileDialog::fileSelected, this, &LXQtFileDialogHelper::fileSelected); + connect(dlg_.get(), &Fm::FileDialog::filesSelected, this, &LXQtFileDialogHelper::filesSelected); + connect(dlg_.get(), &Fm::FileDialog::currentChanged, this, &LXQtFileDialogHelper::currentChanged); + connect(dlg_.get(), &Fm::FileDialog::directoryEntered, this, &LXQtFileDialogHelper::directoryEntered); + connect(dlg_.get(), &Fm::FileDialog::filterSelected, this, &LXQtFileDialogHelper::filterSelected); +} + +LXQtFileDialogHelper::~LXQtFileDialogHelper() { +} + +void LXQtFileDialogHelper::exec() { + dlg_->exec(); +} + +bool LXQtFileDialogHelper::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow* parent) { + dlg_->setAttribute(Qt::WA_NativeWindow, true); // without this, sometimes windowHandle() will return nullptr + + dlg_->setWindowFlags(windowFlags); + dlg_->setWindowModality(windowModality); + + // Reference: KDE implementation + // https://github.com/KDE/plasma-integration/blob/master/src/platformtheme/kdeplatformfiledialoghelper.cpp + dlg_->windowHandle()->setTransientParent(parent); + + loadSettings(); + // central positioning with respect to the parent window + if(parent && parent->isVisible()) { + dlg_->move(parent->x() + (parent->width() - dlg_->width()) / 2, + parent->y() + (parent->height() - dlg_->height()) / 2); + } + + applyOptions(); + + // NOTE: the timer here is required as a workaround borrowed from KDE. Without this, the dialog UI will be blocked. + // QFileDialog calls our platform plugin to show our own native file dialog instead of showing its widget. + // However, it still creates a hidden dialog internally, and then make it modal. + // So user input from all other windows that are not the children of the QFileDialog widget will be blocked. + // This includes our own dialog. After the return of this show() method, QFileDialog creates its own window and + // then make it modal, which blocks our UI. The timer schedule a delayed popup of our file dialog, so we can + // show again after QFileDialog and override the modal state. Then our UI can be unblocked. + QTimer::singleShot(0, dlg_.get(), &QDialog::show); + dlg_->setFocus(); + return true; +} + +void LXQtFileDialogHelper::hide() { + dlg_->hide(); +} + +bool LXQtFileDialogHelper::defaultNameFilterDisables() const { + return false; +} + +void LXQtFileDialogHelper::setDirectory(const QUrl& directory) { + dlg_->setDirectory(directory); +} + +QUrl LXQtFileDialogHelper::directory() const { + return dlg_->directory(); +} + +void LXQtFileDialogHelper::selectFile(const QUrl& filename) { + dlg_->selectFile(filename); +} + +QList LXQtFileDialogHelper::selectedFiles() const { + return dlg_->selectedFiles(); +} + +void LXQtFileDialogHelper::setFilter() { + // FIXME: what's this? + // The gtk+ 3 file dialog helper in Qt5 update options in this method. + applyOptions(); +} + +void LXQtFileDialogHelper::selectNameFilter(const QString& filter) { + dlg_->selectNameFilter(filter); +} + +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) +QString LXQtFileDialogHelper::selectedMimeTypeFilter() const { + return dlg_->selectedMimeTypeFilter(); +} + +void LXQtFileDialogHelper::selectMimeTypeFilter(const QString& filter) { + dlg_->selectMimeTypeFilter(filter); +} +#endif + +QString LXQtFileDialogHelper::selectedNameFilter() const { + return dlg_->selectedNameFilter(); +} + +bool LXQtFileDialogHelper::isSupportedUrl(const QUrl& url) const { + return dlg_->isSupportedUrl(url); +} + +void LXQtFileDialogHelper::applyOptions() { + auto& opt = options(); + + // set title + if(opt->windowTitle().isEmpty()) { + dlg_->setWindowTitle(opt->acceptMode() == QFileDialogOptions::AcceptOpen ? tr("Open File") + : tr("Save File")); + } + else { + dlg_->setWindowTitle(opt->windowTitle()); + } + + dlg_->setFilter(opt->filter()); + dlg_->setViewMode(opt->viewMode() == QFileDialogOptions::Detail ? Fm::FolderView::DetailedListMode + : Fm::FolderView::CompactMode); + dlg_->setFileMode(QFileDialog::FileMode(opt->fileMode())); + dlg_->setAcceptMode(QFileDialog::AcceptMode(opt->acceptMode())); // also sets a default label for accept button + // bool useDefaultNameFilters() const; + dlg_->setNameFilters(opt->nameFilters()); + if(!opt->mimeTypeFilters().empty()) { + dlg_->setMimeTypeFilters(opt->mimeTypeFilters()); + } + + dlg_->setDefaultSuffix(opt->defaultSuffix()); + // QStringList history() const; + + // explicitly set labels + for(int i = 0; i < QFileDialogOptions::DialogLabelCount; ++i) { + auto label = static_cast(i); + if(opt->isLabelExplicitlySet(label)) { + dlg_->setLabelText(static_cast(label), opt->labelText(label)); + } + } + + auto url = opt->initialDirectory(); + if(url.isValid()) { + dlg_->setDirectory(url); + } + + +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + auto filter = opt->initiallySelectedMimeTypeFilter(); + if(!filter.isEmpty()) { + selectMimeTypeFilter(filter); + } + else { + filter = opt->initiallySelectedNameFilter(); + if(!filter.isEmpty()) { + selectNameFilter(opt->initiallySelectedNameFilter()); + } + } +#else + auto filter = opt->initiallySelectedNameFilter(); + if(!filter.isEmpty()) { + selectNameFilter(filter); + } +#endif + + auto selectedFiles = opt->initiallySelectedFiles(); + for(const auto& selectedFile: selectedFiles) { + selectFile(selectedFile); + } + // QStringList supportedSchemes() const; +} + +void LXQtFileDialogHelper::loadSettings() { + QSettings settings(QSettings::UserScope, "lxqt", "filedialog"); + settings.beginGroup ("Sizes"); + dlg_->resize(settings.value("WindowSize", QSize(700, 500)).toSize()); + dlg_->setSplitterPos(settings.value("SplitterPos", 200).toInt()); + settings.endGroup(); +} + +void LXQtFileDialogHelper::saveSettings() { + QSettings settings(QSettings::UserScope, "lxqt", "filedialog"); + settings.beginGroup ("Sizes"); + QSize windowSize = dlg_->size(); + if(settings.value("WindowSize") != windowSize) { // no redundant write + settings.setValue("WindowSize", windowSize); + } + int splitterPos = dlg_->splitterPos(); + if(settings.value("SplitterPos") != splitterPos) { + settings.setValue("SplitterPos", splitterPos); + } + settings.endGroup(); +} + +/* +FileDialogPlugin::FileDialogPlugin() { + +} + +QPlatformFileDialogHelper *FileDialogPlugin::createHelper() { + return new LXQtFileDialogHelper(); +} +*/ diff --git a/src/lxqtfiledialoghelper.h b/src/lxqtfiledialoghelper.h new file mode 100644 index 0000000..1d5c071 --- /dev/null +++ b/src/lxqtfiledialoghelper.h @@ -0,0 +1,50 @@ +#ifndef LXQTFILEDIALOGHELPER_H +#define LXQTFILEDIALOGHELPER_H + +#include // this private header is subject to changes +#include + +namespace Fm { +class FileDialog; +} + +class Q_GUI_EXPORT LXQtFileDialogHelper : public QPlatformFileDialogHelper { + Q_OBJECT + +public: + LXQtFileDialogHelper(); + + virtual ~LXQtFileDialogHelper(); + + // QPlatformDialogHelper + void exec() override; + bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) override; + void hide() override; + + // QPlatformFileDialogHelper + bool defaultNameFilterDisables() const override; + void setDirectory(const QUrl &directory) override; + QUrl directory() const override; + void selectFile(const QUrl &filename) override; + QList selectedFiles() const override; + void setFilter() override; + void selectNameFilter(const QString &filter) override; +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + QString selectedMimeTypeFilter() const override; + void selectMimeTypeFilter(const QString &filter) override; +#endif + QString selectedNameFilter() const override; + + bool isSupportedUrl(const QUrl &url) const override; + +private: + void applyOptions(); + void loadSettings(); + void saveSettings(); + +private: + std::unique_ptr dlg_; +}; + + +#endif // LXQTFILEDIALOGHELPER_H diff --git a/src/lxqtplatformtheme.cpp b/src/lxqtplatformtheme.cpp index 34d38cb..5b1a72e 100644 --- a/src/lxqtplatformtheme.cpp +++ b/src/lxqtplatformtheme.cpp @@ -46,8 +46,11 @@ #include #include +#include "lxqtfiledialoghelper.h" + LXQtPlatformTheme::LXQtPlatformTheme(): - settingsWatcher_(NULL) + iconFollowColorScheme_(true) + , settingsWatcher_(NULL) { // When the plugin is loaded, it seems that the app is not yet running and // QThread environment is not completely set up. So creating filesystem watcher @@ -80,6 +83,7 @@ void LXQtPlatformTheme::loadSettings() { // icon theme iconTheme_ = settings.value("icon_theme", "oxygen").toString(); + iconFollowColorScheme_ = settings.value("icon_follow_color_scheme", iconFollowColorScheme_).toBool(); // read other widget related settings form LxQt settings. QByteArray tb_style = settings.value("tool_button_style").toByteArray(); @@ -164,6 +168,7 @@ void LXQtPlatformTheme::onSettingsChanged() { if(iconTheme_ != oldIconTheme) { // the icon theme is changed XdgIconLoader::instance()->updateSystemTheme(); // this is a private internal API of Qt5. } + XdgIconLoader::instance()->setFollowColorScheme(iconFollowColorScheme_); // if font is changed if(oldFont != fontStr_ || oldFixedFont != fixedFontStr_){ @@ -184,6 +189,8 @@ void LXQtPlatformTheme::onSettingsChanged() { QApplication::setFont(font_); } + QApplication::setWheelScrollLines(wheelScrollLines_.toInt()); + // emit a ThemeChange event to all widgets Q_FOREACH(QWidget* widget, QApplication::allWidgets()) { // Qt5 added a QEvent::ThemeChange event. @@ -193,21 +200,26 @@ void LXQtPlatformTheme::onSettingsChanged() { } bool LXQtPlatformTheme::usePlatformNativeDialog(DialogType type) const { + if(type == FileDialog + && qobject_cast(QCoreApplication::instance())) { // QML may not have qApp + // use our own file dialog + return true; + } return false; } -#if 0 + QPlatformDialogHelper *LXQtPlatformTheme::createPlatformDialogHelper(DialogType type) const { - return 0; + if(type == FileDialog + && qobject_cast(QCoreApplication::instance())) { // QML may not have qApp + // use our own file dialog + return new LXQtFileDialogHelper(); + } + return nullptr; } -#endif const QPalette *LXQtPlatformTheme::palette(Palette type) const { - - if (type == QPlatformTheme::SystemPalette) - // the default constructor uses the default palette - return new QPalette; - return QPlatformTheme::palette(type); + return nullptr; } const QFont *LXQtPlatformTheme::font(Font type) const { @@ -288,6 +300,9 @@ QVariant LXQtPlatformTheme::themeHint(ThemeHint hint) const { break; case MouseDoubleClickDistance: break; + case WheelScrollLines: + return wheelScrollLines_; + break; default: break; } @@ -320,9 +335,9 @@ QStringList LXQtPlatformTheme::xdgIconThemePaths() const xdgDataDirs = QLatin1String("/usr/local/share/:/usr/share/"); xdgDirs.append(xdgDataDirs); - foreach (const QString &s, xdgDirs) { + for (const auto &s: xdgDirs) { const QStringList r = s.split(QLatin1Char(':'), QString::SkipEmptyParts); - foreach (const QString &xdgDir, r) { + for (const auto& xdgDir: r) { const QFileInfo xdgIconsDir(xdgDir + QStringLiteral("/icons")); if (xdgIconsDir.isDir()) paths.append(xdgIconsDir.absoluteFilePath()); diff --git a/src/lxqtplatformtheme.h b/src/lxqtplatformtheme.h index 956d11c..3c07c46 100644 --- a/src/lxqtplatformtheme.h +++ b/src/lxqtplatformtheme.h @@ -48,7 +48,7 @@ public: // virtual QPlatformMenuBar* createPlatformMenuBar() const; virtual bool usePlatformNativeDialog(DialogType type) const; - // virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const; + virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const; virtual const QPalette *palette(Palette type = SystemPalette) const; @@ -90,6 +90,7 @@ private: QString iconTheme_; Qt::ToolButtonStyle toolButtonStyle_; bool singleClickActivate_; + bool iconFollowColorScheme_; // other Qt settings // widget diff --git a/src/lxqtsystemtrayicon.cpp b/src/lxqtsystemtrayicon.cpp index fd9e5b5..104b10c 100644 --- a/src/lxqtsystemtrayicon.cpp +++ b/src/lxqtsystemtrayicon.cpp @@ -297,12 +297,12 @@ void LXQtSystemTrayIcon::init() connect(mSni, &StatusNotifierItem::activateRequested, [this](const QPoint &) { - emit activated(QPlatformSystemTrayIcon::Trigger); + Q_EMIT activated(QPlatformSystemTrayIcon::Trigger); }); connect(mSni, &StatusNotifierItem::secondaryActivateRequested, [this](const QPoint &) { - emit activated(QPlatformSystemTrayIcon::MiddleClick); + Q_EMIT activated(QPlatformSystemTrayIcon::MiddleClick); }); } } diff --git a/src/statusnotifieritem/statusnotifieritem.cpp b/src/statusnotifieritem/statusnotifieritem.cpp index 88b9d7f..e7ebc13 100644 --- a/src/statusnotifieritem/statusnotifieritem.cpp +++ b/src/statusnotifieritem/statusnotifieritem.cpp @@ -43,17 +43,23 @@ StatusNotifierItem::StatusNotifierItem(QString id, QObject *parent) mTitle("Test"), mStatus("Active"), mMenu(nullptr), - mMenuExporter(nullptr) + mMenuExporter(nullptr), + mSessionBus(QDBusConnection::connectToBus(QDBusConnection::SessionBus, mService)) { + // Separate DBus connection to the session bus is created, because QDbus does not provide + // a way to register different objects for different services with the same paths. + // For status notifiers we need different /StatusNotifierItem for each service. + // register service - QDBusConnection::sessionBus().registerService(mService); - QDBusConnection::sessionBus().registerObject("/StatusNotifierItem", this); + + mSessionBus.registerService(mService); + mSessionBus.registerObject(QLatin1String("/StatusNotifierItem"), this); registerToHost(); // monitor the watcher service in case the host restarts QDBusServiceWatcher *watcher = new QDBusServiceWatcher("org.kde.StatusNotifierWatcher", - QDBusConnection::sessionBus(), + mSessionBus, QDBusServiceWatcher::WatchForOwnerChange, this); connect(watcher, &QDBusServiceWatcher::serviceOwnerChanged, @@ -62,9 +68,9 @@ StatusNotifierItem::StatusNotifierItem(QString id, QObject *parent) StatusNotifierItem::~StatusNotifierItem() { - QDBusConnection::sessionBus().unregisterObject("/StatusNotifierItem"); - QDBusConnection::sessionBus().unregisterService(mService); - QDBusConnection::sessionBus().disconnectFromBus(mService); + mSessionBus.unregisterObject(QLatin1String("/StatusNotifierItem")); + mSessionBus.unregisterService(mService); + QDBusConnection::disconnectFromBus(mService); } void StatusNotifierItem::registerToHost() @@ -72,13 +78,16 @@ void StatusNotifierItem::registerToHost() QDBusInterface interface("org.kde.StatusNotifierWatcher", "/StatusNotifierWatcher", "org.kde.StatusNotifierWatcher", - QDBusConnection::sessionBus()); + mSessionBus); interface.asyncCall("RegisterStatusNotifierItem", mService); } void StatusNotifierItem::onServiceOwnerChanged(const QString& service, const QString& oldOwner, const QString& newOwner) { + Q_UNUSED(service); + Q_UNUSED(oldOwner); + if (!newOwner.isEmpty()) registerToHost(); } @@ -95,7 +104,7 @@ void StatusNotifierItem::setTitle(const QString &title) return; mTitle = title; - emit mAdaptor->NewTitle(); + Q_EMIT mAdaptor->NewTitle(); } void StatusNotifierItem::setStatus(const QString &status) @@ -104,7 +113,7 @@ void StatusNotifierItem::setStatus(const QString &status) return; mStatus = status; - emit mAdaptor->NewStatus(mStatus); + Q_EMIT mAdaptor->NewStatus(mStatus); } void StatusNotifierItem::setMenuPath(const QString& path) @@ -118,7 +127,7 @@ void StatusNotifierItem::setIconByName(const QString &name) return; mIconName = name; - emit mAdaptor->NewIcon(); + Q_EMIT mAdaptor->NewIcon(); } void StatusNotifierItem::setIconByPixmap(const QIcon &icon) @@ -129,7 +138,7 @@ void StatusNotifierItem::setIconByPixmap(const QIcon &icon) mIconCacheKey = icon.cacheKey(); mIcon = iconToPixmapList(icon); mIconName.clear(); - emit mAdaptor->NewIcon(); + Q_EMIT mAdaptor->NewIcon(); } void StatusNotifierItem::setOverlayIconByName(const QString &name) @@ -138,7 +147,7 @@ void StatusNotifierItem::setOverlayIconByName(const QString &name) return; mOverlayIconName = name; - emit mAdaptor->NewOverlayIcon(); + Q_EMIT mAdaptor->NewOverlayIcon(); } void StatusNotifierItem::setOverlayIconByPixmap(const QIcon &icon) @@ -149,7 +158,7 @@ void StatusNotifierItem::setOverlayIconByPixmap(const QIcon &icon) mOverlayIconCacheKey = icon.cacheKey(); mOverlayIcon = iconToPixmapList(icon); mOverlayIconName.clear(); - emit mAdaptor->NewOverlayIcon(); + Q_EMIT mAdaptor->NewOverlayIcon(); } void StatusNotifierItem::setAttentionIconByName(const QString &name) @@ -158,7 +167,7 @@ void StatusNotifierItem::setAttentionIconByName(const QString &name) return; mAttentionIconName = name; - emit mAdaptor->NewAttentionIcon(); + Q_EMIT mAdaptor->NewAttentionIcon(); } void StatusNotifierItem::setAttentionIconByPixmap(const QIcon &icon) @@ -169,7 +178,7 @@ void StatusNotifierItem::setAttentionIconByPixmap(const QIcon &icon) mAttentionIconCacheKey = icon.cacheKey(); mAttentionIcon = iconToPixmapList(icon); mAttentionIconName.clear(); - emit mAdaptor->NewAttentionIcon(); + Q_EMIT mAdaptor->NewAttentionIcon(); } void StatusNotifierItem::setToolTipTitle(const QString &title) @@ -178,7 +187,7 @@ void StatusNotifierItem::setToolTipTitle(const QString &title) return; mTooltipTitle = title; - emit mAdaptor->NewToolTip(); + Q_EMIT mAdaptor->NewToolTip(); } void StatusNotifierItem::setToolTipSubTitle(const QString &subTitle) @@ -187,7 +196,7 @@ void StatusNotifierItem::setToolTipSubTitle(const QString &subTitle) return; mTooltipSubtitle = subTitle; - emit mAdaptor->NewToolTip(); + Q_EMIT mAdaptor->NewToolTip(); } void StatusNotifierItem::setToolTipIconByName(const QString &name) @@ -196,7 +205,7 @@ void StatusNotifierItem::setToolTipIconByName(const QString &name) return; mTooltipIconName = name; - emit mAdaptor->NewToolTip(); + Q_EMIT mAdaptor->NewToolTip(); } void StatusNotifierItem::setToolTipIconByPixmap(const QIcon &icon) @@ -207,7 +216,7 @@ void StatusNotifierItem::setToolTipIconByPixmap(const QIcon &icon) mTooltipIconCacheKey = icon.cacheKey(); mTooltipIcon = iconToPixmapList(icon); mTooltipIconName.clear(); - emit mAdaptor->NewToolTip(); + Q_EMIT mAdaptor->NewToolTip(); } void StatusNotifierItem::setContextMenu(QMenu* menu) @@ -227,7 +236,7 @@ void StatusNotifierItem::setContextMenu(QMenu* menu) if (nullptr != mMenu) { connect(mMenu, &QObject::destroyed, this, &StatusNotifierItem::onMenuDestroyed); - mMenuExporter = new DBusMenuExporter{this->menu().path(), mMenu}; + mMenuExporter = new DBusMenuExporter{this->menu().path(), mMenu, mSessionBus}; } } @@ -236,7 +245,7 @@ void StatusNotifierItem::Activate(int x, int y) if (mStatus == "NeedsAttention") mStatus = "Active"; - emit activateRequested(QPoint(x, y)); + Q_EMIT activateRequested(QPoint(x, y)); } void StatusNotifierItem::SecondaryActivate(int x, int y) @@ -244,7 +253,7 @@ void StatusNotifierItem::SecondaryActivate(int x, int y) if (mStatus == "NeedsAttention") mStatus = "Active"; - emit secondaryActivateRequested(QPoint(x, y)); + Q_EMIT secondaryActivateRequested(QPoint(x, y)); } void StatusNotifierItem::ContextMenu(int x, int y) @@ -264,14 +273,14 @@ void StatusNotifierItem::Scroll(int delta, const QString &orientation) if (orientation.toLower() == "horizontal") orient = Qt::Horizontal; - emit scrollRequested(delta, orient); + Q_EMIT scrollRequested(delta, orient); } void StatusNotifierItem::showMessage(const QString& title, const QString& msg, const QString& iconName, int secs) { QDBusInterface interface("org.freedesktop.Notifications", "/org/freedesktop/Notifications", - "org.freedesktop.Notifications", QDBusConnection::sessionBus()); + "org.freedesktop.Notifications", mSessionBus); interface.call("Notify", mTitle, (uint) 0, iconName, title, msg, QStringList(), QVariantMap(), secs); } @@ -281,7 +290,8 @@ IconPixmapList StatusNotifierItem::iconToPixmapList(const QIcon& icon) IconPixmapList pixmapList; // long live KDE! - for (const QSize &size : icon.availableSizes()) + const QList sizes = icon.availableSizes(); + for (const QSize &size : sizes) { QImage image = icon.pixmap(size).toImage(); diff --git a/src/statusnotifieritem/statusnotifieritem.h b/src/statusnotifieritem/statusnotifieritem.h index 8706c19..1111153 100644 --- a/src/statusnotifieritem/statusnotifieritem.h +++ b/src/statusnotifieritem/statusnotifieritem.h @@ -32,6 +32,7 @@ #include #include #include +#include #include "dbustypes.h" @@ -132,7 +133,7 @@ public: */ void setContextMenu(QMenu *menu); -public slots: +public Q_SLOTS: void Activate(int x, int y); void SecondaryActivate(int x, int y); void ContextMenu(int x, int y); @@ -144,12 +145,12 @@ private: void registerToHost(); IconPixmapList iconToPixmapList(const QIcon &icon); -private slots: +private Q_SLOTS: void onServiceOwnerChanged(const QString &service, const QString &oldOwner, const QString &newOwner); void onMenuDestroyed(); -signals: +Q_SIGNALS: void activateRequested(const QPoint &pos); void secondaryActivateRequested(const QPoint &pos); void scrollRequested(int delta, Qt::Orientation orientation); @@ -176,6 +177,7 @@ private: QMenu *mMenu; QDBusObjectPath mMenuPath; DBusMenuExporter *mMenuExporter; + QDBusConnection mSessionBus; static int mServiceCounter; };