From d017bfb0a0c0d535ff935a59c2d81aba78f925f0 Mon Sep 17 00:00:00 2001 From: Ximi1970 Date: Sun, 28 Jun 2020 23:23:12 +0200 Subject: [PATCH] Extend options for close --- app/SysTray-X/preferences.cpp | 18 +++--- app/SysTray-X/preferences.h | 29 +++++++--- app/SysTray-X/preferences.ui | 87 ++++++++++++++++++++++++----- app/SysTray-X/preferencesdialog.cpp | 26 +++++++-- app/SysTray-X/preferencesdialog.h | 10 ++-- app/SysTray-X/systrayx.cpp | 55 ++++++++++-------- app/SysTray-X/systrayxlink.cpp | 14 ++--- app/SysTray-X/systrayxlink.h | 4 +- app/SysTray-X/windowctrl-unix.cpp | 17 ++++++ app/SysTray-X/windowctrl-unix.h | 7 +++ app/SysTray-X/windowctrl.cpp | 9 +++ app/SysTray-X/windowctrl.h | 7 +++ webext/background.js | 10 ++++ webext/css/options.css | 8 +++ webext/options.html | 41 ++++++++++++++ webext/options.js | 45 +++++++++++++++ 16 files changed, 313 insertions(+), 74 deletions(-) diff --git a/app/SysTray-X/preferences.cpp b/app/SysTray-X/preferences.cpp index 9fac480..ff9304d 100644 --- a/app/SysTray-X/preferences.cpp +++ b/app/SysTray-X/preferences.cpp @@ -51,7 +51,7 @@ Preferences::Preferences( QObject *parent ) : QObject( parent ) m_minimize_type = PREF_DEFAULT_MINIMIZE; m_start_minimized = false; - m_minimize_on_close = true; + m_close_type = PREF_MINIMIZE_ALL_WINDOWS; m_debug = false; @@ -474,27 +474,27 @@ void Preferences::setStartMinimized( bool state ) /* - * Get the minmize on close pref. + * Get the close type pref. */ -bool Preferences::getMinimizeOnClose() const +Preferences::CloseType Preferences::getCloseType() const { - return m_minimize_on_close; + return m_close_type; } /* - * Set the minmize on close pref. + * Set the close type pref. */ -void Preferences::setMinimizeOnClose( bool state ) +void Preferences::setCloseType( CloseType close_type ) { - if( m_minimize_on_close != state ) + if( m_close_type != close_type ) { - m_minimize_on_close = state; + m_close_type = close_type; /* * Tell the world the new preference */ - emit signalMinimizeOnCloseChange(); + emit signalCloseTypeChange(); } } diff --git a/app/SysTray-X/preferences.h b/app/SysTray-X/preferences.h index b0f9ea1..b1cc890 100644 --- a/app/SysTray-X/preferences.h +++ b/app/SysTray-X/preferences.h @@ -21,6 +21,17 @@ class Preferences : public QObject public: + /* + * Close types + */ + enum CloseType { + PREF_CLOSE_WINDOW = 0, + PREF_CLOSE_ALL_WINDOWS, + PREF_CLOSE_ALL_MINIMIZE_LAST, + PREF_MINIMIZE_WINDOW, + PREF_MINIMIZE_ALL_WINDOWS + }; + /* * Minimize types */ @@ -327,18 +338,18 @@ class Preferences : public QObject void setStartMinimized( bool state ); /** - * @brief getMinimizeOnClose. Get the minimize on close state. + * @brief getCloseType. Get the close type. * * @return The state. */ - bool getMinimizeOnClose() const; + CloseType getCloseType() const; /** - * @brief setMinimizeOnClose. Set the minimize on close state. + * @brief setCloseType. Set the close type. * - * @param The state. + * @param The close type. */ - void setMinimizeOnClose( bool state ); + void setCloseType( CloseType close_type ); /** * @brief getDebug. Get the debug windows state. @@ -447,9 +458,9 @@ class Preferences : public QObject void signalStartMinimizedChange(); /** - * @brief signalMinimizeOnCloseChange. Signal a minimize on close state change. + * @brief signalCloseTypeChange. Signal a close type change. */ - void signalMinimizeOnCloseChange(); + void signalCloseTypeChange(); /** * @brief signalDebugChange. Signal a debug state change. @@ -544,9 +555,9 @@ class Preferences : public QObject bool m_start_minimized; /** - * @brief m_minimize_on_close. Minimize TB instead of closing. + * @brief m_close_type. Closing type for TB. */ - bool m_minimize_on_close; + CloseType m_close_type; /** * @brief m_debug. Display debug window. diff --git a/app/SysTray-X/preferences.ui b/app/SysTray-X/preferences.ui index 87af2ef..e914699 100644 --- a/app/SysTray-X/preferences.ui +++ b/app/SysTray-X/preferences.ui @@ -6,8 +6,8 @@ 0 0 - 543 - 600 + 515 + 696 @@ -271,7 +271,7 @@ - Minimize + Minimize action @@ -317,6 +317,72 @@ + + + + Close action + + + + + + + + Close windows individually + + + closeTypeGroup + + + + + + + Close all windows + + + closeTypeGroup + + + + + + + Close all, minimize last + + + closeTypeGroup + + + + + + + Minimize windows individually + + + closeTypeGroup + + + + + + + Minimize all windows + + + true + + + closeTypeGroup + + + + + + + + @@ -326,16 +392,6 @@ - - - - Minimize on close - - - true - - - @@ -507,9 +563,10 @@ - - + + + diff --git a/app/SysTray-X/preferencesdialog.cpp b/app/SysTray-X/preferencesdialog.cpp index f5ba68c..e1df6f0 100644 --- a/app/SysTray-X/preferencesdialog.cpp +++ b/app/SysTray-X/preferencesdialog.cpp @@ -30,6 +30,15 @@ PreferencesDialog::PreferencesDialog( SysTrayXLink *link, Preferences *pref, QWi m_link = link; m_pref = pref; + /* + * Set close type button Ids + */ + m_ui->closeTypeGroup->setId( m_ui->closeWindowRadioButton, Preferences::PREF_CLOSE_WINDOW); + m_ui->closeTypeGroup->setId( m_ui->closeAllWindowsRadioButton, Preferences::PREF_CLOSE_ALL_WINDOWS ); + m_ui->closeTypeGroup->setId( m_ui->closeAllMinimizeLastRadioButton, Preferences::PREF_CLOSE_ALL_MINIMIZE_LAST ); + m_ui->closeTypeGroup->setId( m_ui->minimizeWindowRadioButton, Preferences::PREF_MINIMIZE_WINDOW ); + m_ui->closeTypeGroup->setId( m_ui->minimizeAllWindowsRadioButton, Preferences::PREF_MINIMIZE_ALL_WINDOWS ); + /* * Set minimize type button Ids */ @@ -46,6 +55,13 @@ PreferencesDialog::PreferencesDialog( SysTrayXLink *link, Preferences *pref, QWi #endif +#ifdef Q_OS_LINUX + + m_ui->minimizeMethod1RadioButton->setText( "Minimize to tray" ); + m_ui->minimizeMethod2RadioButton->hide(); + +#endif + #if defined( Q_OS_UNIX ) && defined( NO_KDE_INTEGRATION ) m_ui->hideDefaultIconCheckBox->hide(); @@ -143,9 +159,9 @@ void PreferencesDialog::setStartMinimized( bool state ) /* * Set the minimize on close state */ -void PreferencesDialog::setMinimizeOnClose( bool state ) +void PreferencesDialog::setCloseType( Preferences::CloseType close_type ) { - m_ui->minimizeOnCloseCheckBox->setChecked( state ); + ( m_ui->closeTypeGroup->button( close_type ) )->setChecked( true ); } @@ -313,7 +329,7 @@ void PreferencesDialog::slotAccept() m_pref->setMinimizeType( static_cast< Preferences::MinimizeType >( m_ui->minimizeTypeGroup->checkedId() ) ); m_pref->setStartMinimized( m_ui->startMinimizedCheckBox->isChecked() ); - m_pref->setMinimizeOnClose( m_ui->minimizeOnCloseCheckBox->isChecked() ); + m_pref->setCloseType( static_cast< Preferences::CloseType >( m_ui->closeTypeGroup->checkedId() ) ); m_pref->setShowNumber( m_ui->showNumberCheckBox->isChecked() ); m_pref->setNumberColor( m_number_color ); @@ -442,9 +458,9 @@ void PreferencesDialog::slotStartMinimizedChange() /* * Handle the minimize on close change signal */ -void PreferencesDialog::slotMinimizeOnCloseChange() +void PreferencesDialog::slotCloseTypeChange() { - setMinimizeOnClose( m_pref->getMinimizeOnClose() ); + setCloseType( m_pref->getCloseType() ); } diff --git a/app/SysTray-X/preferencesdialog.h b/app/SysTray-X/preferencesdialog.h index 28857d9..17171c9 100644 --- a/app/SysTray-X/preferencesdialog.h +++ b/app/SysTray-X/preferencesdialog.h @@ -63,11 +63,11 @@ class PreferencesDialog : public QDialog void setStartMinimized( bool state ); /** - * @brief setMinimizeOnClose. Set the minimize on close state. + * @brief setCloseType. Set the close type. * - * @param state The state. + * @param state The close type. */ - void setMinimizeOnClose( bool state ); + void setCloseType( Preferences::CloseType close_type ); /** * @brief setIconType. Set the icon type. @@ -176,9 +176,9 @@ class PreferencesDialog : public QDialog void slotStartMinimizedChange(); /** - * @brief slotMinimizeOnCloseChange. Slot for handling minimize on close change signals. + * @brief slotCloseTypeChange. Slot for handling close type change signals. */ - void slotMinimizeOnCloseChange(); + void slotCloseTypeChange(); /** * @brief slotIconTypeChange. Slot for handling icon type change signals. diff --git a/app/SysTray-X/systrayx.cpp b/app/SysTray-X/systrayx.cpp index 017f6ad..7187cbe 100644 --- a/app/SysTray-X/systrayx.cpp +++ b/app/SysTray-X/systrayx.cpp @@ -119,7 +119,7 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent ) connect( m_preferences, &Preferences::signalCountTypeChange, m_pref_dialog, &PreferencesDialog::slotCountTypeChange ); connect( m_preferences, &Preferences::signalMinimizeTypeChange, m_pref_dialog, &PreferencesDialog::slotMinimizeTypeChange ); connect( m_preferences, &Preferences::signalStartMinimizedChange, m_pref_dialog, &PreferencesDialog::slotStartMinimizedChange ); - connect( m_preferences, &Preferences::signalMinimizeOnCloseChange, m_pref_dialog, &PreferencesDialog::slotMinimizeOnCloseChange ); + connect( m_preferences, &Preferences::signalCloseTypeChange, m_pref_dialog, &PreferencesDialog::slotCloseTypeChange ); connect( m_preferences, &Preferences::signalDebugChange, m_pref_dialog, &PreferencesDialog::slotDebugChange ); connect( m_preferences, &Preferences::signalDefaultIconTypeChange, m_link, &SysTrayXLink::slotDefaultIconTypeChange ); @@ -133,7 +133,7 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent ) connect( m_preferences, &Preferences::signalCountTypeChange, m_link, &SysTrayXLink::slotCountTypeChange ); connect( m_preferences, &Preferences::signalMinimizeTypeChange, m_link, &SysTrayXLink::slotMinimizeTypeChange ); connect( m_preferences, &Preferences::signalStartMinimizedChange, m_link, &SysTrayXLink::slotStartMinimizedChange ); - connect( m_preferences, &Preferences::signalMinimizeOnCloseChange, m_link, &SysTrayXLink::slotMinimizeOnCloseChange ); + connect( m_preferences, &Preferences::signalCloseTypeChange, m_link, &SysTrayXLink::slotCloseTypeChange ); connect( m_preferences, &Preferences::signalDebugChange, m_link, &SysTrayXLink::slotDebugChange ); connect( m_preferences, &Preferences::signalHideDefaultIconChange, this, &SysTrayX::slotSelectIconObjectPref ); @@ -514,30 +514,41 @@ void SysTrayX::slotAddOnShutdown() */ void SysTrayX::slotShutdown() { - - if( m_preferences->getMinimizeOnClose() ) + /* + * What shall we do? + */ + switch( m_preferences->getCloseType() ) { - m_link->sendShutdown(); - } - else - { - /* - * Hide systray icon to prevent ghost systray icon in Windows - */ - if( m_tray_icon ) + case Preferences::PREF_CLOSE_WINDOW: + case Preferences::PREF_CLOSE_ALL_WINDOWS: { - m_tray_icon->hide(); + /* + * Hide systray icon to prevent ghost systray icon in Windows + */ + if( m_tray_icon ) + { + m_tray_icon->hide(); + } + + /* + * Close the TB window + */ + emit signalClose(); + + /* + * Let's quit + */ + QCoreApplication::quit(); + break; } - /* - * Close the TB window - */ - emit signalClose(); - - /* - * Let's quit - */ - QCoreApplication::quit(); + case Preferences::PREF_CLOSE_ALL_MINIMIZE_LAST: + case Preferences::PREF_MINIMIZE_WINDOW: + case Preferences::PREF_MINIMIZE_ALL_WINDOWS: + { + m_link->sendShutdown(); + break; + } } } diff --git a/app/SysTray-X/systrayxlink.cpp b/app/SysTray-X/systrayxlink.cpp index a5f81c1..0791751 100644 --- a/app/SysTray-X/systrayxlink.cpp +++ b/app/SysTray-X/systrayxlink.cpp @@ -619,14 +619,14 @@ void SysTrayXLink::DecodePreferences( const QJsonObject& pref ) m_pref->setStartMinimized( start_minimized ); } - if( pref.contains( "minimizeOnClose" ) && pref[ "minimizeOnClose" ].isString() ) + if( pref.contains( "closeType" ) && pref[ "closeType" ].isString() ) { - bool minimize_on_close = pref[ "minimizeOnClose" ].toString() == "true"; + Preferences::CloseType close_type = static_cast< Preferences::CloseType >( pref[ "closeType" ].toString().toInt() ); /* - * Store the new start minimized state + * Store the new close type */ - m_pref->setMinimizeOnClose( minimize_on_close ); + m_pref->setCloseType( close_type ); } if( pref.contains( "debug" ) && pref[ "debug" ].isString() ) @@ -653,7 +653,7 @@ void SysTrayXLink::EncodePreferences( const Preferences& pref ) prefObject.insert("debug", QJsonValue::fromVariant( QString( pref.getDebug() ? "true" : "false" ) ) ); prefObject.insert("minimizeType", QJsonValue::fromVariant( QString::number( pref.getMinimizeType() ) ) ); prefObject.insert("startMinimized", QJsonValue::fromVariant( QString( pref.getStartMinimized() ? "true" : "false" ) ) ); - prefObject.insert("minimizeOnClose", QJsonValue::fromVariant( QString( pref.getMinimizeOnClose() ? "true" : "false" ) ) ); + prefObject.insert("closeType", QJsonValue::fromVariant( QString::number( pref.getCloseType() ) ) ); prefObject.insert("defaultIconType", QJsonValue::fromVariant( QString::number( pref.getDefaultIconType() ) ) ); prefObject.insert("defaultIconMime", QJsonValue::fromVariant( pref.getDefaultIconMime() ) ); prefObject.insert("defaultIcon", QJsonValue::fromVariant( QString( pref.getDefaultIconData().toBase64() ) ) ); @@ -734,9 +734,9 @@ void SysTrayXLink::slotStartMinimizedChange() /* - * Handle a minimize on close state change signal + * Handle a close type change signal */ -void SysTrayXLink::slotMinimizeOnCloseChange() +void SysTrayXLink::slotCloseTypeChange() { if( m_pref->getAppPrefChanged() ) { diff --git a/app/SysTray-X/systrayxlink.h b/app/SysTray-X/systrayxlink.h index 1cb540c..a48c4ca 100644 --- a/app/SysTray-X/systrayxlink.h +++ b/app/SysTray-X/systrayxlink.h @@ -218,9 +218,9 @@ class SysTrayXLink : public QObject void slotStartMinimizedChange(); /** - * @brief slotMinimizeOnCloseChange. Handle a change in start minimized state. + * @brief slotCloseTypeChange. Slot for handling close type change signals. */ - void slotMinimizeOnCloseChange(); + void slotCloseTypeChange(); /** * @brief slotDefaultIconTypeChange. Slot for handling default icon type change signals. diff --git a/app/SysTray-X/windowctrl-unix.cpp b/app/SysTray-X/windowctrl-unix.cpp index 24f3e65..808d0b3 100644 --- a/app/SysTray-X/windowctrl-unix.cpp +++ b/app/SysTray-X/windowctrl-unix.cpp @@ -67,6 +67,23 @@ bool WindowCtrlUnix::isThunderbird( qint64 pid ) const } +/* + * Get the number of visible windows. + */ +int WindowCtrlUnix::getVisibleWindows() +{ + /* + * Get the TB windows and states + */ + findWindows( getppid() ); + + /* + * Count the visible states + */ + return m_tb_window_states.count( Preferences::STATE_NORMAL ); +} + + /* * Get the process name */ diff --git a/app/SysTray-X/windowctrl-unix.h b/app/SysTray-X/windowctrl-unix.h index 9f23cc4..ade8a67 100644 --- a/app/SysTray-X/windowctrl-unix.h +++ b/app/SysTray-X/windowctrl-unix.h @@ -156,6 +156,13 @@ class WindowCtrlUnix : public QObject */ bool isThunderbird( qint64 pid ) const; + /** + * @brief visibleWindows. Get the number of visible windows. + * + * @return The number of windows. + */ + int getVisibleWindows(); + /** * @brief getProcessName. Get the name of the proces by pid. * diff --git a/app/SysTray-X/windowctrl.cpp b/app/SysTray-X/windowctrl.cpp index 525ca6e..f2278d3 100644 --- a/app/SysTray-X/windowctrl.cpp +++ b/app/SysTray-X/windowctrl.cpp @@ -59,6 +59,15 @@ bool WindowCtrl::thunderbirdStart() const } +/* + * Get the number of visible windows. + */ +int WindowCtrl::visibleWindows() +{ + return getVisibleWindows(); +} + + /* * Test func 1 */ diff --git a/app/SysTray-X/windowctrl.h b/app/SysTray-X/windowctrl.h index 9177a59..534b383 100644 --- a/app/SysTray-X/windowctrl.h +++ b/app/SysTray-X/windowctrl.h @@ -47,6 +47,13 @@ class WindowCtrl : public QObject */ bool thunderbirdStart() const; + /** + * @brief visibleWindows. Get the number of visible windows. + * + * @return The number of windows. + */ + int visibleWindows(); + signals: // void signalShow(); diff --git a/webext/background.js b/webext/background.js index d863f5f..afe79d4 100644 --- a/webext/background.js +++ b/webext/background.js @@ -155,6 +155,7 @@ SysTrayX.Messaging = { const getter = browser.storage.sync.get([ "debug", "minimizeType", + "closeType", "startMinimized", "minimizeOnClose", "defaultIconType", @@ -175,6 +176,7 @@ SysTrayX.Messaging = { sendPreferencesStorage: function (result) { const debug = result.debug || "false"; const minimizeType = result.minimizeType || "1"; + const closeType = result.closeType || "4"; const startMinimized = result.startMinimized || "false"; const minimizeOnClose = result.minimizeOnClose || "true"; const defaultIconType = result.defaultIconType || "0"; @@ -194,6 +196,7 @@ SysTrayX.Messaging = { preferences: { debug: debug, minimizeType: minimizeType, + closeType: closeType, startMinimized: startMinimized, minimizeOnClose: minimizeOnClose, defaultIconType: defaultIconType, @@ -369,6 +372,13 @@ SysTrayX.Link = { }); } + const closeType = response["preferences"].closeType; + if (closeType) { + browser.storage.sync.set({ + closeType: closeType, + }); + } + const startMinimized = response["preferences"].startMinimized; if (startMinimized) { browser.storage.sync.set({ diff --git a/webext/css/options.css b/webext/css/options.css index 9778677..f83ba25 100644 --- a/webext/css/options.css +++ b/webext/css/options.css @@ -68,6 +68,14 @@ body { padding: 10px 10px 10px 10px; } +#closeselect { + width: 20em; + border-style: solid; + border-width: 1px; + margin: 10px 10px 10px 10px; + padding: 10px 10px 10px 10px; +} + #defaulticonselect { width: 20em; border-style: solid; diff --git a/webext/options.html b/webext/options.html index c30b6db..4d6a32c 100644 --- a/webext/options.html +++ b/webext/options.html @@ -62,6 +62,47 @@ + + + + + + + + + + + + + + + + + +
+ Close action +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ Start application minimized
diff --git a/webext/options.js b/webext/options.js index 25d7508..ddf7a92 100644 --- a/webext/options.js +++ b/webext/options.js @@ -65,6 +65,18 @@ SysTrayX.SaveOptions = { minimizeType: minimizeType, }); + // + // Save close preferences + // + const closeType = document.querySelector( + 'input[name="closeType"]:checked' + ).value; + + // Store minimize preferences + browser.storage.sync.set({ + closeType: closeType, + }); + // // Save start minimized state // @@ -205,6 +217,17 @@ SysTrayX.RestoreOptions = { SysTrayX.RestoreOptions.onMinimizeTypeError ); + // + // Restore close type + // + const getCloseType = browser.storage.sync.get( + "closeType", + ); + getCloseType.then( + SysTrayX.RestoreOptions.setCloseType, + SysTrayX.RestoreOptions.onCloseTypeError + ); + // // Restore start minimized // @@ -364,6 +387,22 @@ SysTrayX.RestoreOptions = { console.log(`Minimize type Error: ${error}`); }, + // + // Restore close type callbacks + // + setCloseType: function (result) { + const closeType = result.closeType || "4"; + + const radioButton = document.querySelector( + `input[name="closeType"][value="${closeType}"]` + ); + radioButton.checked = true; + }, + + onCloseTypeError: function (error) { + console.log(`Close type Error: ${error}`); + }, + // // Restore hide on minimize callbacks // @@ -749,6 +788,11 @@ SysTrayX.StorageChanged = { minimizeType: changes[item].newValue, }); } + if (item === "closeType") { + SysTrayX.RestoreOptions.setCloseType({ + closeType: changes[item].newValue, + }); + } if (item === "startMinimized") { SysTrayX.RestoreOptions.setStartMinimized({ startMinimized: changes[item].newValue, @@ -781,6 +825,7 @@ SysTrayX.StorageChanged = { document.getElementById("defaulticonselect").className = "active"; document.getElementById("iconselect").className = "active"; document.getElementById("minimizeselect").className = "active"; + document.getElementById("closeselect").className = "active"; }, };