diff --git a/icon/CMakeLists.txt b/icon/CMakeLists.txt
index d9f06dae..496e739d 100644
--- a/icon/CMakeLists.txt
+++ b/icon/CMakeLists.txt
@@ -1,47 +1,56 @@
-ecm_install_icons(
-ICONS
+set(APP_ICONS
256-apps-kdeconnect.png
128-apps-kdeconnect.png
32-apps-kdeconnect.png
64-apps-kdeconnect.png
48-apps-kdeconnect.png
22-apps-kdeconnect.png
16-apps-kdeconnect.png
sc-apps-kdeconnect.svgz
sc-apps-kdeconnectindicator.svg
- sc-apps-kdeconnectindicatordark.svg
+)
+
+if(WIN32)
+ list(APPEND APP_ICONS sc-apps-kdeconnectindicatorwin.svg)
+else()
+ list(APPEND APP_ICONS sc-apps-kdeconnectindicatordark.svg)
+endif()
+
+ecm_install_icons(
+ICONS
+ ${APP_ICONS}
DESTINATION
${ICON_INSTALL_DIR}
)
ecm_install_icons(
ICONS
32-status-laptopconnected.png
32-status-laptopdisconnected.png
32-status-laptoptrusted.png
32-status-smartphoneconnected.png
32-status-smartphonedisconnected.png
32-status-smartphonetrusted.png
32-status-tabletconnected.png
32-status-tabletdisconnected.png
32-status-tablettrusted.png
32-status-tvconnected.png
32-status-tvdisconnected.png
32-status-tvtrusted.png
sc-status-laptopconnected.svg
sc-status-laptopdisconnected.svg
sc-status-laptoptrusted.svg
sc-status-smartphoneconnected.svg
sc-status-smartphonedisconnected.svg
sc-status-smartphonetrusted.svg
sc-status-tabletconnected.svg
sc-status-tabletdisconnected.svg
sc-status-tablettrusted.svg
sc-status-tvconnected.svg
sc-status-tvdisconnected.svg
sc-status-tvtrusted.svg
DESTINATION
${ICON_INSTALL_DIR}
)
diff --git a/icon/sc-apps-kdeconnectindicatorwin.svg b/icon/sc-apps-kdeconnectindicatorwin.svg
new file mode 100644
index 00000000..ea0dc8f5
--- /dev/null
+++ b/icon/sc-apps-kdeconnectindicatorwin.svg
@@ -0,0 +1,21 @@
+
+
+
diff --git a/indicator/CMakeLists.txt b/indicator/CMakeLists.txt
index db3960c1..ec4ac7d5 100644
--- a/indicator/CMakeLists.txt
+++ b/indicator/CMakeLists.txt
@@ -1,25 +1,27 @@
set(indicator_SRCS
main.cpp
deviceindicator.cpp
)
include(ECMAddAppIcon)
ecm_add_app_icon(indicator_SRCS ICONS
../icon/16-apps-kdeconnect.png
../icon/22-apps-kdeconnect.png
../icon/32-apps-kdeconnect.png
../icon/48-apps-kdeconnect.png
../icon/64-apps-kdeconnect.png
../icon/128-apps-kdeconnect.png
../icon/256-apps-kdeconnect.png
)
add_executable(kdeconnect-indicator ${indicator_SRCS})
target_include_directories(kdeconnect-indicator PUBLIC ${CMAKE_BINARY_DIR})
target_link_libraries(kdeconnect-indicator Qt5::Widgets KF5::CoreAddons KF5::I18n KF5::Notifications KF5::DBusAddons KF5::KCMUtils kdeconnectinterfaces kdeconnectcore)
if (APPLE)
target_link_libraries(kdeconnect-indicator "-framework CoreFoundation")
endif()
-
+if (WIN32)
+ add_compile_definitions(QSYSTRAY)
+endif()
install(TARGETS kdeconnect-indicator ${INSTALL_TARGETS_DEFAULT_ARGS})
install(PROGRAMS org.kde.kdeconnect.nonplasma.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
diff --git a/indicator/main.cpp b/indicator/main.cpp
index c9bb94ce..40d149b4 100644
--- a/indicator/main.cpp
+++ b/indicator/main.cpp
@@ -1,196 +1,200 @@
/*
* Copyright 2016 Aleix Pol Gonzalez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#ifdef QSYSTRAY
#include
#else
#include
#endif
#include
#include
#include
#include
#include "interfaces/devicesmodel.h"
#include "interfaces/dbusinterfaces.h"
#include "kdeconnect-version.h"
#include "deviceindicator.h"
#ifdef Q_OS_MAC
#include
#endif
#include
int main(int argc, char** argv)
{
QApplication app(argc, argv);
KAboutData about(QStringLiteral("kdeconnect-indicator"),
i18n("KDE Connect Indicator"),
QStringLiteral(KDECONNECT_VERSION_STRING),
i18n("KDE Connect Indicator tool"),
KAboutLicense::GPL,
i18n("(C) 2016 Aleix Pol Gonzalez"));
KAboutData::setApplicationData(about);
#ifdef Q_OS_WIN
QProcess kdeconnectd;
kdeconnectd.start(QStringLiteral("kdeconnectd.exe"));
#endif
#ifdef Q_OS_MAC
// Unset launchctl env, avoid block
DbusHelper::macosUnsetLaunchctlEnv();
// Get bundle path
CFURLRef url = (CFURLRef)CFAutorelease((CFURLRef)CFBundleCopyBundleURL(CFBundleGetMainBundle()));
QString basePath = QUrl::fromCFURL(url).path();
// Start kdeconnectd
QProcess kdeconnectdProcess;
kdeconnectdProcess.start(basePath + QStringLiteral("Contents/MacOS/kdeconnectd"));
// Wait for dbus daemon env
QProcess getLaunchdDBusEnv;
int retry = 0;
do {
getLaunchdDBusEnv.setProgram(QStringLiteral("launchctl"));
getLaunchdDBusEnv.setArguments({
QStringLiteral("getenv"),
QStringLiteral(KDECONNECT_SESSION_DBUS_LAUNCHD_ENV)
});
getLaunchdDBusEnv.start();
getLaunchdDBusEnv.waitForFinished();
QString launchdDBusEnv = QString::fromLocal8Bit(getLaunchdDBusEnv.readAllStandardOutput());
if (launchdDBusEnv.length() > 0) {
break;
} else if (retry >= 10) {
// Show a warning and exit
qCritical() << "Fail to get launchctl" << KDECONNECT_SESSION_DBUS_LAUNCHD_ENV << "env";
QMessageBox::critical(nullptr, i18n("KDE Connect"),
i18n("Cannot connect to DBus\n"
"KDE Connect will quit"),
QMessageBox::Abort,
QMessageBox::Abort);
return -1;
} else {
QThread::sleep(1); // Retry after 1s
retry++;
}
} while(true);
#endif
#ifndef USE_PRIVATE_DBUS
KDBusService dbusService(KDBusService::Unique);
#endif
DevicesModel model;
model.setDisplayFilter(DevicesModel::Reachable | DevicesModel::Paired);
QMenu* menu = new QMenu;
DaemonDbusInterface iface;
auto refreshMenu = [&iface, &model, &menu]() {
menu->clear();
auto configure = menu->addAction(QIcon::fromTheme(QStringLiteral("configure")), i18n("Configure..."));
QObject::connect(configure, &QAction::triggered, configure, [](){
KCMultiDialog* dialog = new KCMultiDialog;
dialog->addModule(QStringLiteral("kcm_kdeconnect"));
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
});
for (int i=0, count = model.rowCount(); iaddMenu(indicator);
}
const QStringList requests = iface.pairingRequests();
if (!requests.isEmpty()) {
menu->addSection(i18n("Pairing requests"));
for(const auto& req: requests) {
DeviceDbusInterface* dev = new DeviceDbusInterface(req, menu);
auto pairMenu = menu->addMenu(dev->name());
pairMenu->addAction(i18n("Pair"), dev, &DeviceDbusInterface::acceptPairing);
pairMenu->addAction(i18n("Reject"), dev, &DeviceDbusInterface::rejectPairing);
}
}
#if (defined Q_OS_MAC || defined Q_OS_WIN)
// Add quit menu
menu->addAction(i18n("Quit"), [](){
QCoreApplication::quit(); // Close this application
});
#endif
};
QObject::connect(&iface, &DaemonDbusInterface::pairingRequestsChangedProxy, &model, refreshMenu);
QObject::connect(&model, &DevicesModel::rowsInserted, &model, refreshMenu);
QObject::connect(&model, &DevicesModel::rowsRemoved, &model, refreshMenu);
#ifdef Q_OS_MAC
QStringList themeSearchPaths = QIcon::themeSearchPaths();
themeSearchPaths << basePath + QStringLiteral("Contents/Resources/icons/");
QIcon::setThemeSearchPaths(themeSearchPaths);
#endif
#ifdef QSYSTRAY
QSystemTrayIcon systray;
+#ifdef Q_OS_WIN
+ systray.setIcon(QIcon(QStandardPaths::locate(QStandardPaths::AppLocalDataLocation, QStringLiteral("icons/hicolor/scalable/apps/kdeconnectindicatorwin.svg"))));
+#else
systray.setIcon(QIcon::fromTheme(QStringLiteral("kdeconnectindicatordark")));
+#endif
systray.setVisible(true);
systray.setToolTip(QStringLiteral("KDE Connect"));
QObject::connect(&model, &DevicesModel::rowsChanged, &model, [&systray, &model]() {
systray.setToolTip(i18np("%1 device connected", "%1 devices connected", model.rowCount()));
});
systray.setContextMenu(menu);
#else
KStatusNotifierItem systray;
systray.setIconByName(QStringLiteral("kdeconnectindicatordark"));
systray.setToolTip(QStringLiteral("kdeconnect"), QStringLiteral("KDE Connect"), QStringLiteral("KDE Connect"));
systray.setCategory(KStatusNotifierItem::Communications);
systray.setStatus(KStatusNotifierItem::Passive);
systray.setStandardActionsEnabled(false);
QObject::connect(&model, &DevicesModel::rowsChanged, &model, [&systray, &model]() {
const auto count = model.rowCount();
systray.setStatus(count == 0 ? KStatusNotifierItem::Passive : KStatusNotifierItem::Active);
systray.setToolTip(QStringLiteral("kdeconnect"), QStringLiteral("KDE Connect"), i18np("%1 device connected", "%1 devices connected", count));
});
systray.setContextMenu(menu);
#endif
refreshMenu();
app.setQuitOnLastWindowClosed(false);
return app.exec();
}