diff --git a/linux/icons/128x128/apps/ckb-next-monochrome.png b/linux/icons/128x128/apps/ckb-next-monochrome.png new file mode 100644 index 00000000..cf12d631 Binary files /dev/null and b/linux/icons/128x128/apps/ckb-next-monochrome.png differ diff --git a/linux/icons/128x128/apps/ckb-next.png b/linux/icons/128x128/apps/ckb-next.png new file mode 100644 index 00000000..2987ca94 Binary files /dev/null and b/linux/icons/128x128/apps/ckb-next.png differ diff --git a/linux/icons/16x16/apps/ckb-next-monochrome.png b/linux/icons/16x16/apps/ckb-next-monochrome.png new file mode 100644 index 00000000..8288d404 Binary files /dev/null and b/linux/icons/16x16/apps/ckb-next-monochrome.png differ diff --git a/linux/icons/16x16/apps/ckb-next.png b/linux/icons/16x16/apps/ckb-next.png new file mode 100644 index 00000000..0edab82f Binary files /dev/null and b/linux/icons/16x16/apps/ckb-next.png differ diff --git a/linux/icons/22x22/apps/ckb-next-monochrome.png b/linux/icons/22x22/apps/ckb-next-monochrome.png new file mode 100644 index 00000000..8eabf3ba Binary files /dev/null and b/linux/icons/22x22/apps/ckb-next-monochrome.png differ diff --git a/linux/icons/22x22/apps/ckb-next.png b/linux/icons/22x22/apps/ckb-next.png new file mode 100644 index 00000000..8279095d Binary files /dev/null and b/linux/icons/22x22/apps/ckb-next.png differ diff --git a/linux/icons/256x256/apps/ckb-next-monochrome.png b/linux/icons/256x256/apps/ckb-next-monochrome.png new file mode 100644 index 00000000..2a1fec3d Binary files /dev/null and b/linux/icons/256x256/apps/ckb-next-monochrome.png differ diff --git a/linux/icons/256x256/apps/ckb-next.png b/linux/icons/256x256/apps/ckb-next.png new file mode 100644 index 00000000..fd0c08ff Binary files /dev/null and b/linux/icons/256x256/apps/ckb-next.png differ diff --git a/linux/icons/32x32/apps/ckb-next-monochrome.png b/linux/icons/32x32/apps/ckb-next-monochrome.png new file mode 100644 index 00000000..eaf23ff1 Binary files /dev/null and b/linux/icons/32x32/apps/ckb-next-monochrome.png differ diff --git a/linux/icons/32x32/apps/ckb-next.png b/linux/icons/32x32/apps/ckb-next.png new file mode 100644 index 00000000..4936afbf Binary files /dev/null and b/linux/icons/32x32/apps/ckb-next.png differ diff --git a/linux/icons/48x48/apps/ckb-next-monochrome.png b/linux/icons/48x48/apps/ckb-next-monochrome.png new file mode 100644 index 00000000..f98bc234 Binary files /dev/null and b/linux/icons/48x48/apps/ckb-next-monochrome.png differ diff --git a/linux/icons/48x48/apps/ckb-next.png b/linux/icons/48x48/apps/ckb-next.png new file mode 100644 index 00000000..f1fc9ff9 Binary files /dev/null and b/linux/icons/48x48/apps/ckb-next.png differ diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 2fd281b3..25c40cc7 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -571,8 +571,20 @@ if (MACOS) GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) elseif (LINUX) + install(DIRECTORY "${CMAKE_SOURCE_DIR}/linux/icons/" + DESTINATION "share/icons/hicolor" + FILE_PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ + WORLD_READ + DIRECTORY_PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + install( FILES "${CMAKE_CURRENT_BINARY_DIR}/ckb-next.png" + "${CMAKE_CURRENT_BINARY_DIR}/ckb-next-monochrome.png" DESTINATION "share/icons/hicolor/512x512/apps" PERMISSIONS OWNER_READ OWNER_WRITE diff --git a/src/gui/ckbsystemtrayicon.cpp b/src/gui/ckbsystemtrayicon.cpp index 89eb6939..08559fd8 100644 --- a/src/gui/ckbsystemtrayicon.cpp +++ b/src/gui/ckbsystemtrayicon.cpp @@ -2,25 +2,39 @@ #include "ckbsystemtrayicon.h" #include #include -CkbSystemTrayIcon::CkbSystemTrayIcon(const QIcon& icon, QObject*parent) : KStatusNotifierItem("ckb-next", parent), previousPath("") +CkbSystemTrayIcon::CkbSystemTrayIcon(const QIcon& icon, const QString iconName, QObject*parent) : KStatusNotifierItem("ckb-next", parent), previousPath("") { - setIcon(icon); + setIcon(icon, iconName); } // Not all implementations support passing icons by pixmap // Save the icon to /tmp/ and use that instead -void CkbSystemTrayIcon::setIcon(QIcon icon) +void CkbSystemTrayIcon::setIcon(QIcon icon, QString name) { + // Check if the icon can be found in the theme + QIcon::setThemeName("hicolor"); + QIcon themeicon = QIcon::fromTheme(name); + + // GTK's icon search can return icons even if the name doesn't fully match + if(!themeicon.isNull() && themeicon.name() == name){ + // If the icon was found, just pass the name to kstatusnotifier. The DE should do the rest + KStatusNotifierItem::setIconByName(name); + return; + } + + // If not, load the internal ones + qDebug() << "Indicator icon not found in theme hicolor"; QList availSizes = icon.availableSizes(); if(!availSizes.length()) return; - QPixmap pm = icon.pixmap(availSizes.at(0)); + // Make sure to scale down to 22x22, otherwise some desktop environments will just display the whole + // 512x512 in the tray... + QPixmap pm = icon.pixmap(availSizes.at(0)).scaled(22, 22, Qt::KeepAspectRatio, Qt::SmoothTransformation); QString path; // Keep trying until we find a path that doesn't conflict int i; - for(i = 0; i < 5; i++) - { + for(i = 0; i < 5; i++){ path = QDir::tempPath() + QString("/ckb-next-tray-%1.png").arg(qrand()); if(!QFile::exists(path)) break; @@ -32,7 +46,7 @@ void CkbSystemTrayIcon::setIcon(QIcon icon) if(!pm.save(path)) return; - setIconByName(path); + KStatusNotifierItem::setIconByName(path); // Delete the old file QFile f(previousPath); @@ -40,10 +54,13 @@ void CkbSystemTrayIcon::setIcon(QIcon icon) f.remove(); previousPath = path; + return; } CkbSystemTrayIcon::~CkbSystemTrayIcon() { + if(previousPath.isEmpty()) + return; QFile f(previousPath); if(f.exists()) f.remove(); diff --git a/src/gui/ckbsystemtrayicon.h b/src/gui/ckbsystemtrayicon.h index 66980e13..eea29848 100644 --- a/src/gui/ckbsystemtrayicon.h +++ b/src/gui/ckbsystemtrayicon.h @@ -13,33 +13,35 @@ class CkbSystemTrayIcon : public QSystemTrayIcon { #endif Q_OBJECT - public: +public: #ifdef USE_DBUS_MENU - CkbSystemTrayIcon(const QIcon& icon, QObject* parent = 0); - inline void show() { setStatus(KStatusNotifierItem::Active); } - inline void setVisible(bool visible) { setStatus((visible ? KStatusNotifierItem::Active : KStatusNotifierItem::Passive)); } - void setIcon(QIcon icon); - ~CkbSystemTrayIcon(); + void setIcon(QIcon icon, QString name); + CkbSystemTrayIcon(const QIcon& icon, const QString iconName, QObject* parent = 0); + inline void show() { setStatus(KStatusNotifierItem::Active); } + inline void setVisible(bool visible) { setStatus((visible ? KStatusNotifierItem::Active : KStatusNotifierItem::Passive)); } + ~CkbSystemTrayIcon(); signals: - // This is never emitted by KStatusNotifierItem - void activated(QSystemTrayIcon::ActivationReason); - private: - QString previousPath; + // This is never emitted by KStatusNotifierItem + void activated(QSystemTrayIcon::ActivationReason); +private: + QString previousPath; #else - CkbSystemTrayIcon(const QIcon& icon, QObject* parent = 0) : QSystemTrayIcon(icon, parent) {} - virtual bool event(QEvent* evt) - { - if(evt->type() == QEvent::Wheel) { - QWheelEvent* wheelEvt = static_cast(evt); - emit scrollRequested(wheelEvt->delta(), wheelEvt->orientation()); - return true; - } - return QSystemTrayIcon::event(evt); + CkbSystemTrayIcon(const QIcon& icon, const QString iconName, QObject* parent = 0) : QSystemTrayIcon(icon, parent) {} + virtual bool event(QEvent* evt) + { + if(evt->type() == QEvent::Wheel) { + QWheelEvent* wheelEvt = static_cast(evt); + emit scrollRequested(wheelEvt->delta(), wheelEvt->orientation()); + return true; } + return QSystemTrayIcon::event(evt); + } - signals: - void scrollRequested(int delta, Qt::Orientation orientation); +signals: + void scrollRequested(int delta, Qt::Orientation orientation); +public: + void setIcon(QIcon icon, QString name) { QSystemTrayIcon::setIcon(icon); } #endif }; diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 23d2ce54..9b1246ad 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -133,7 +133,7 @@ MainWindow::MainWindow(QWidget *parent) : trayIconMenu = new QMenu(this); trayIconMenu->addAction(restoreAction); trayIconMenu->addAction(closeAction); - trayIcon = new CkbSystemTrayIcon(getIcon(), this); + trayIcon = new CkbSystemTrayIcon(getIcon(), getIconName(), this); trayIcon->setContextMenu(trayIconMenu); trayIcon->show(); connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconClicked(QSystemTrayIcon::ActivationReason))); @@ -451,15 +451,20 @@ void MainWindow::quitApp(){ } QIcon MainWindow::getIcon() { - // on initial launch (first time using ckb) this association checked - // will not be present, so force it to true, as we do not want to break default behaviour + // on initial launch (first time using ckb) this association checked + // will not be present, so force it to true, as we do not want to break default behaviour + if (CkbSettings::get("Program/RGBIcon", QVariant(true)).toBool()) + return QIcon(":/img/ckb-next.png"); - // If the icon is RGB then the menu should present a monochrome option - if (CkbSettings::get("Program/RGBIcon", QVariant(true)).toBool()){ - return QIcon(":/img/ckb-next.png"); - } - // If the icon is monochrome then the menu should present an RGB option - return QIcon(":/img/ckb-next-monochrome.png"); + return QIcon(":/img/ckb-next-monochrome.png"); +} + +QString MainWindow::getIconName() { + // Same as above but return QStrings + if (CkbSettings::get("Program/RGBIcon", QVariant(true)).toBool()) + return "ckb-next"; + + return "ckb-next-monochrome"; } void MainWindow::cleanup(){ @@ -512,5 +517,5 @@ void MainWindow::checkedForNewVer(QString ver, QString changelog){ } void MainWindow::syncTrayIcon(){ - trayIcon->setIcon(getIcon()); + trayIcon->setIcon(getIcon(), getIconName()); } diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index f0ac51c3..b5c43972 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -56,6 +56,7 @@ private: #endif static QIcon getIcon(); + static QString getIconName(); public slots: void showWindow();