diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt index 6a276d97c..ede76cb68 100644 --- a/share/CMakeLists.txt +++ b/share/CMakeLists.txt @@ -21,7 +21,7 @@ install(FILES ${DATABASE_ICONS} DESTINATION ${DATA_INSTALL_DIR}/icons/database) if(UNIX AND NOT APPLE) install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor - FILES_MATCHING PATTERN "keepassx.png" PATTERN "keepassx.svgz") + FILES_MATCHING PATTERN "keepassx*.png" PATTERN "keepassx*.svgz") install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor FILES_MATCHING PATTERN "application-x-keepassx.png" PATTERN "application-x-keepassx.svgz") install(FILES linux/keepassx.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) diff --git a/share/icons/application/scalable/apps/keepassx-locked.svgz b/share/icons/application/scalable/apps/keepassx-locked.svgz new file mode 100644 index 000000000..2c3405c9a Binary files /dev/null and b/share/icons/application/scalable/apps/keepassx-locked.svgz differ diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp index 06208b7c9..a572bace5 100644 --- a/src/core/FilePath.cpp +++ b/src/core/FilePath.cpp @@ -90,6 +90,16 @@ QIcon FilePath::applicationIcon() return icon("apps", "keepassx"); } +QIcon FilePath::trayIconLocked() +{ + return icon("apps", "keepassx-locked"); +} + +QIcon FilePath::trayIconUnlocked() +{ + return applicationIcon(); +} + QIcon FilePath::icon(const QString& category, const QString& name, bool fromTheme) { QString combinedName = category + "/" + name; diff --git a/src/core/FilePath.h b/src/core/FilePath.h index c37a90887..34edcbc93 100644 --- a/src/core/FilePath.h +++ b/src/core/FilePath.h @@ -28,6 +28,8 @@ public: QString dataPath(const QString& name); QString pluginPath(const QString& name); QIcon applicationIcon(); + QIcon trayIconLocked(); + QIcon trayIconUnlocked(); QIcon icon(const QString& category, const QString& name, bool fromTheme = true); QIcon onOffIcon(const QString& category, const QString& name); diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 1abb6b452..45bbbae83 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -610,6 +610,7 @@ void DatabaseTabWidget::insertDatabase(Database* db, const DatabaseManagerStruct connect(dbStruct.dbWidget, SIGNAL(closeRequest()), SLOT(closeDatabaseFromSender())); connect(dbStruct.dbWidget, SIGNAL(databaseChanged(Database*)), SLOT(changeDatabase(Database*))); connect(dbStruct.dbWidget, SIGNAL(unlockedDatabase()), SLOT(updateTabNameFromDbWidgetSender())); + connect(dbStruct.dbWidget, SIGNAL(unlockedDatabase()), SLOT(emitDatabaseUnlockedFromDbWidgetSender())); } DatabaseWidget* DatabaseTabWidget::currentDatabaseWidget() @@ -706,6 +707,8 @@ void DatabaseTabWidget::lockDatabases() dbWidget->lock(); // database has changed so we can't use the db variable anymore updateTabName(dbWidget->database()); + + Q_EMIT databaseLocked(dbWidget); } } @@ -764,6 +767,11 @@ void DatabaseTabWidget::emitActivateDatabaseChanged() Q_EMIT activateDatabaseChanged(currentDatabaseWidget()); } +void DatabaseTabWidget::emitDatabaseUnlockedFromDbWidgetSender() +{ + Q_EMIT databaseUnlocked(static_cast(sender())); +} + void DatabaseTabWidget::connectDatabase(Database* newDb, Database* oldDb) { if (oldDb) { diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index de4a9ca12..618b48b1c 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -80,6 +80,8 @@ Q_SIGNALS: void tabNameChanged(); void databaseWithFileClosed(QString filePath); void activateDatabaseChanged(DatabaseWidget* dbWidget); + void databaseLocked(DatabaseWidget* dbWidget); + void databaseUnlocked(DatabaseWidget* dbWidget); private Q_SLOTS: void updateTabName(Database* db); @@ -89,6 +91,7 @@ private Q_SLOTS: void toggleTabbar(); void changeDatabase(Database* newDb); void emitActivateDatabaseChanged(); + void emitDatabaseUnlockedFromDbWidgetSender(); private: bool saveDatabase(Database* db); diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 120379171..0ede41926 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -658,6 +658,7 @@ void DatabaseWidget::openDatabase(bool accepted) if (accepted) { replaceDatabase(static_cast(sender())->database()); setCurrentWidget(m_mainWidget); + Q_EMIT unlockedDatabase(); // We won't need those anymore and KeePass1OpenWidget closes // the file in its dtor. diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 6dccf1dc3..f3d41521c 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -185,6 +185,10 @@ MainWindow::MainWindow() SLOT(databaseTabChanged(int))); connect(m_ui->tabWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState())); + connect(m_ui->tabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), + SLOT(databaseStatusChanged(DatabaseWidget*))); + connect(m_ui->tabWidget, SIGNAL(databaseUnlocked(DatabaseWidget*)), + SLOT(databaseStatusChanged(DatabaseWidget*))); connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState())); connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle())); connect(m_ui->settingsWidget, SIGNAL(editFinished(bool)), SLOT(switchToDatabases())); @@ -486,6 +490,11 @@ void MainWindow::switchToSettings() m_ui->stackedWidget->setCurrentIndex(1); } +void MainWindow::databaseStatusChanged(DatabaseWidget *) +{ + updateTrayIcon(); +} + void MainWindow::databaseTabChanged(int tabIndex) { if (tabIndex != -1 && m_ui->stackedWidget->currentIndex() == 2) { @@ -573,7 +582,7 @@ void MainWindow::updateTrayIcon() { if (isTrayIconEnabled()) { if (!m_trayIcon) { - m_trayIcon = new QSystemTrayIcon(filePath()->applicationIcon(), this); + m_trayIcon = new QSystemTrayIcon(this); QMenu* menu = new QMenu(this); @@ -587,8 +596,15 @@ void MainWindow::updateTrayIcon() connect(actionToggle, SIGNAL(triggered()), SLOT(toggleWindow())); m_trayIcon->setContextMenu(menu); + m_trayIcon->setIcon(filePath()->applicationIcon()); m_trayIcon->show(); } + if (m_ui->tabWidget->hasLockableDatabases()) { + m_trayIcon->setIcon(filePath()->trayIconUnlocked()); + } + else { + m_trayIcon->setIcon(filePath()->trayIconLocked()); + } } else { if (m_trayIcon) { diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index 02019312d..7e1a18293 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -54,6 +54,7 @@ private Q_SLOTS: void showAboutDialog(); void switchToDatabases(); void switchToSettings(); + void databaseStatusChanged(DatabaseWidget *dbWidget); void databaseTabChanged(int tabIndex); void openRecentDatabase(QAction* action); void clearLastDatabases();