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 @@
+
+
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";
},
};