diff --git a/app/SysTray-X/container.cpp b/app/SysTray-X/container.cpp index eb0d241..4041065 100644 --- a/app/SysTray-X/container.cpp +++ b/app/SysTray-X/container.cpp @@ -1,16 +1,31 @@ #include "container.h" -#include "ui_container.h" + +/* + * Local includes + */ +#include "preferences.h" + +/* + * System includes + */ /* * Qt includes */ +#include +#include #include /* * Constructor */ -Container::Container( QWidget *parent ) : QWidget( parent ) +Container::Container( Preferences* pref, QWidget *parent ) : QWidget( parent ) { + /* + * Store the preferences + */ + m_pref = pref; + /* * Construct conatainer */ @@ -21,10 +36,85 @@ Container::Container( QWidget *parent ) : QWidget( parent ) * Set properties */ setWindowIcon( QIcon( ":/files/icons/Thunderbird.png" ) ); + setWindowTitle( "Mozilla Thunderbird" ); } +/* + * Set the TB widget + */ void Container::setWidget( QWidget* widget ) { layout()->addWidget( widget ); } + + +/* + * Remove the TB widget + */ +void Container::removeWidget( QWidget* widget ) +{ + layout()->removeWidget( widget ); +} + + +/* + * Override the close event handler + */ +void Container::closeEvent( QCloseEvent *event ) +{ + if( m_minimize_close ) + { + /* + * Minimize instead of close + */ + event->ignore(); + + emit signalShowHide(); + } + else + { + /* + * Close + */ + event->accept(); + } +} + +#ifdef FF_NEET + +/* + * Override the minimize event + */ +void Container::changeEvent( QEvent * event ) +{ + switch( event->type() ) + { + case QEvent::WindowStateChange: + { + if( isMinimized() ) + { + setWindowState(reinterpret_cast(event)->oldState()); + event->accept(); + } + + break; + } + + default: + { + QWidget::changeEvent( event ); + } + } +} + +#endif + + +/** + * @brief slotMinimizeOnClose. Hnadle preference minimize on close signal. + */ +void Container::slotMinimizeOnClose() +{ + m_minimize_close = m_pref->getMinimizeOnClose(); +} diff --git a/app/SysTray-X/container.h b/app/SysTray-X/container.h index 13f9f45..c8eae11 100644 --- a/app/SysTray-X/container.h +++ b/app/SysTray-X/container.h @@ -10,6 +10,7 @@ * Predefines */ class QVBoxLayout; +class Preferences; /** * @brief The Container class. Class to hold the Thunderbird window. @@ -25,7 +26,7 @@ class Container : public QWidget * * @param parent My parent. */ - Container( QWidget *parent = nullptr ); + Container( Preferences* pref, QWidget *parent = nullptr ); /** * @brief setWidget. Set the container widget. @@ -34,7 +35,47 @@ class Container : public QWidget */ void setWidget( QWidget* widget ); + /** + * @brief removeWidget. Remove the container widget. + * + * @param widget + */ + void removeWidget( QWidget* widget ); + private: + + /** + * @brief closeEvent. Override the close event handler. + * + * @param event The event. + */ + void closeEvent( QCloseEvent *event ); + + signals: + + /** + * @brief signalShowHide. Signal show / hide window. + */ + void signalShowHide(); + + public slots: + + /** + * @brief slotMinimizeOnClose. Hnadle preference minimize on close signal. + */ + void slotMinimizeOnClose(); + + private: + + /** + * @brief m_pref. Pointer to the preferences storage. + */ + Preferences* m_pref; + + /** + * @brief m_minimize_close. Minimize on close state. + */ + bool m_minimize_close; }; #endif // CONTAINER_H diff --git a/app/SysTray-X/preferences.cpp b/app/SysTray-X/preferences.cpp index 8e2bb02..49bdd2c 100644 --- a/app/SysTray-X/preferences.cpp +++ b/app/SysTray-X/preferences.cpp @@ -14,7 +14,8 @@ Preferences::Preferences( QObject *parent ) : QObject( parent ) m_icon_mime = "image/png"; m_icon_data = QByteArray(); - m_minimize_hide = true; + m_hide_minimize = true; + m_minimize_close = true; m_debug = false; } @@ -113,27 +114,53 @@ void Preferences::setIconData( const QByteArray& icon_data ) /* - * Get the icon data. + * Get the hide on minimize state. */ -bool Preferences::getMinimizeHide() const +bool Preferences::getHideOnMinimize() const { - return m_minimize_hide; + return m_hide_minimize; } /* - * Set the minimizeHide data. + * Set the minimize on close state. */ -void Preferences::setMinimizeHide( bool state ) +void Preferences::setHideOnMinimize( bool state ) { - if( m_minimize_hide != state ) + if( m_hide_minimize != state ) { - m_minimize_hide = state; + m_hide_minimize = state; /* * Tell the world the new preference */ - emit signalMinimizeHideChange(); + emit signalHideOnMinimizeChange(); + } +} + + +/* + * Get the minimuze on close state. + */ +bool Preferences::getMinimizeOnClose() const +{ + return m_minimize_close; +} + + +/* + * Set the minimize on close data. + */ +void Preferences::setMinimizeOnClose( bool state ) +{ + if( m_minimize_close != state ) + { + m_minimize_close = state; + + /* + * Tell the world the new preference + */ + emit signalMinimizeOnCloseChange(); } } diff --git a/app/SysTray-X/preferences.h b/app/SysTray-X/preferences.h index 677727f..0d4e409 100644 --- a/app/SysTray-X/preferences.h +++ b/app/SysTray-X/preferences.h @@ -42,138 +42,162 @@ class Preferences : public QObject * * @return The state */ - bool getAppPrefChanged() const; + bool getAppPrefChanged() const; /** * @brief setAppPrefChanged. Control for sending changes to the add-on. * * @param state The state */ - void setAppPrefChanged( bool state ); + void setAppPrefChanged( bool state ); /** * @brief getIconType. Get the icon type. * * @return The icon type. */ - IconType getIconType() const; + IconType getIconType() const; /** * @brief setIconType. Set the icon type. * * @param The icon type. */ - void setIconType( IconType icon_type ); + void setIconType( IconType icon_type ); /** * @brief getIconMime. Get the icon mime. * * @return The icon mime. */ - const QString& getIconMime() const; + const QString& getIconMime() const; /** * @brief setIconMime. Set the icon mime. * * @param The icon mime. */ - void setIconMime( const QString& icon_mime ); + void setIconMime( const QString& icon_mime ); /** * @brief getIconData. Get the icon data. * * @return The icon data. */ - const QByteArray& getIconData() const; + const QByteArray& getIconData() const; /** * @brief setIconData. Set the icon data. * * @param The icon data. */ - void setIconData( const QByteArray& icon_data ); + void setIconData( const QByteArray& icon_data ); /** - * @brief getMinimizeHide. Get the minimizeHide state. + * @brief getHideOnMinimize. Get the hide on minimize state. * * @return The state. */ - bool getMinimizeHide() const; + bool getHideOnMinimize() const; /** - * @brief setMinimizeHide. Set the minimizeHide state. + * @brief setHideOnMinimize. Set the hide on minimize state. * * @param The state. */ - void setMinimizeHide( bool state ); + void setHideOnMinimize( bool state ); + + /** + * @brief getMinimizeOnClose. Get the minimize on close state. + * + * @return The state. + */ + bool getMinimizeOnClose() const; + + /** + * @brief setMinimizeOnClose. Set the minimize on close state. + * + * @param The state. + */ + void setMinimizeOnClose( bool state ); /** * @brief getDebug. Get the debug windows state. * * @return The state. */ - bool getDebug() const; + bool getDebug() const; /** * @brief setDebug. Set the debug windows state. * * @param The state. */ - void setDebug( bool state ); + void setDebug( bool state ); signals: /** * @brief signalIconTypeChange. Signal a icon type change. */ - void signalIconTypeChange(); + void signalIconTypeChange(); /** * @brief signalIconDataChange. Signal a icon data change. */ - void signalIconDataChange(); + void signalIconDataChange(); /** - * @brief signalMinimizeHideChange. Signal a minimizeHide state change. + * @brief signalHideOnMinimizeChange. Signal a hide on minimize state change. */ - void signalMinimizeHideChange(); + void signalHideOnMinimizeChange(); + + /** + * @brief signalMinimizeOnCloseChange. Signal a minimize on close state change. + */ + void signalMinimizeOnCloseChange(); /** * @brief signalDebugChange. Signal a debug state change. */ - void signalDebugChange(); + void signalDebugChange(); private: /** * @brief m_app_pref_changed. Control for sending changes to the add-on. */ - bool m_app_pref_changed; + bool m_app_pref_changed; /** * @brief m_icon_type. Selected icon type. */ - IconType m_icon_type; + IconType m_icon_type; /** * @brief m_icon_mime. Selected icon mime. */ - QString m_icon_mime; + QString m_icon_mime; /** * @brief m_icon_data. Binary data icon image. */ - QByteArray m_icon_data; + QByteArray m_icon_data; /** - * @brief m_minimize_hide. Hide the minimized window. + * @brief m_hide_minimize. Hide the minimized window. */ - bool m_minimize_hide; + bool m_hide_minimize; + + /** + * @brief m_minimize_close. Hide the closing window. + */ + bool m_minimize_close; /** * @brief m_debug. Display debug window. */ - bool m_debug; + bool m_debug; }; #endif // PREFERENCES_H diff --git a/app/SysTray-X/preferences.ui b/app/SysTray-X/preferences.ui index 1388c93..74c737b 100644 --- a/app/SysTray-X/preferences.ui +++ b/app/SysTray-X/preferences.ui @@ -57,7 +57,7 @@ - + Minimizing window hides to tray @@ -66,6 +66,16 @@ + + + + Closing window hides to tray + + + true + + + diff --git a/app/SysTray-X/preferencesdialog.cpp b/app/SysTray-X/preferencesdialog.cpp index 0a0f5a2..87657c0 100644 --- a/app/SysTray-X/preferencesdialog.cpp +++ b/app/SysTray-X/preferencesdialog.cpp @@ -59,11 +59,20 @@ void PreferencesDialog::setDebug( bool state ) /* - * Set the minimizeHide state + * Set the hide on minimize state */ -void PreferencesDialog::setMinimizeHide( bool state ) +void PreferencesDialog::setHideOnMinimize( bool state ) { - m_ui->minimizeHideCheckBox->setChecked( state ); + m_ui->hideOnMinimizeCheckBox->setChecked( state ); +} + + +/* + * Set the minimize on close state + */ +void PreferencesDialog::setMinimizeOnClose( bool state ) +{ + m_ui->minimizeOnCloseCheckBox->setChecked( state ); } @@ -128,7 +137,8 @@ void PreferencesDialog::slotAccept() m_pref->setIconMime( m_tmp_icon_mime ); m_pref->setIconData( m_tmp_icon_data ); - m_pref->setMinimizeHide( m_ui->minimizeHideCheckBox->isChecked() ); + m_pref->setHideOnMinimize( m_ui->hideOnMinimizeCheckBox->isChecked() ); + m_pref->setMinimizeOnClose( m_ui->minimizeOnCloseCheckBox->isChecked() ); m_pref->setDebug( m_ui->debugWindowCheckBox->isChecked() ); @@ -179,11 +189,20 @@ void PreferencesDialog::slotDebugChange() /* - * Handle the minimizeHide change signal + * Handle the hide on minimize change signal */ -void PreferencesDialog::slotMinimizeHideChange() +void PreferencesDialog::slotHideOnMinimizeChange() { - setMinimizeHide( m_pref->getMinimizeHide() ); + setHideOnMinimize( m_pref->getHideOnMinimize() ); +} + + +/* + * Handle the minimize on close change signal + */ +void PreferencesDialog::slotMinimizeOnCloseChange() +{ + setMinimizeOnClose( m_pref->getMinimizeOnClose() ); } diff --git a/app/SysTray-X/preferencesdialog.h b/app/SysTray-X/preferencesdialog.h index 38bc4ed..15d49be 100644 --- a/app/SysTray-X/preferencesdialog.h +++ b/app/SysTray-X/preferencesdialog.h @@ -49,11 +49,18 @@ class PreferencesDialog : public QDialog void setDebug( bool state ); /** - * @brief setMinimizeHide. Set the miniizeHide state. + * @brief setHideOnMinimize. Set the hide on minimize state. * * @param state The state. */ - void setMinimizeHide( bool state ); + void setHideOnMinimize( bool state ); + + /** + * @brief setMinimizeOnClose. Set the minimize on close state. + * + * @param state The state. + */ + void setMinimizeOnClose( bool state ); /** * @brief setIconType. Set the icon type. @@ -87,68 +94,73 @@ class PreferencesDialog : public QDialog /** * @brief signalUpdateSysTray. Signal to update the system tray icon. */ - void signalUpdateSysTrayIcon(); + void signalUpdateSysTrayIcon(); public slots: /** * @brief slotDebugChange. Slot for handling debug change signals. */ - void slotDebugChange(); + void slotDebugChange(); /** - * @brief slotMinimizeHideChange. Slot for handling minimizeHide change signals. + * @brief slotHideOnMinimizeChange. Slot for handling hide on minimize change signals. */ - void slotMinimizeHideChange(); + void slotHideOnMinimizeChange(); + + /** + * @brief slotMinimizeOnCloseChange. Slot for handling minimize on close change signals. + */ + void slotMinimizeOnCloseChange(); /** * @brief slotIconTypeChange. Slot for handling icon type change signals. */ - void slotIconTypeChange(); + void slotIconTypeChange(); /** * @brief slotIconDataChange. Slot for handling icon data change signals. */ - void slotIconDataChange(); + void slotIconDataChange(); private slots: /** * @brief slotAccept. Store the preferences on the accept signal. */ - void slotAccept(); + void slotAccept(); /** * @brief slotFileSelect. Handle the choose custom button click. */ - void slotFileSelect(); + void slotFileSelect(); private: /** * @brief m_ui. Pointer to the dialog. */ - Ui::PreferencesDialog *m_ui; + Ui::PreferencesDialog* m_ui; /** * @brief m_link. Pointer to the link. */ - SysTrayXLink *m_link; + SysTrayXLink* m_link; /** * @brief m_pref. Pointer to the preferences storage. */ - Preferences *m_pref; + Preferences* m_pref; /** * @brief m_tmp_icon_mime. Temporary storage for icon mime. */ - QString m_tmp_icon_mime; + QString m_tmp_icon_mime; /** * @brief m_tmp_icon_data. Temporary storage for icon data. */ - QByteArray m_tmp_icon_data; + QByteArray m_tmp_icon_data; }; diff --git a/app/SysTray-X/systrayx.cpp b/app/SysTray-X/systrayx.cpp index 551edef..d8032e6 100644 --- a/app/SysTray-X/systrayx.cpp +++ b/app/SysTray-X/systrayx.cpp @@ -35,7 +35,7 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent ) /* * Setup window control */ - m_tb_container = new Container(); + m_tb_container = new Container( m_preferences ); /* * Setup window control @@ -74,6 +74,7 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent ) connect( m_link, &SysTrayXLink::signalUnreadMail, m_debug, &DebugWidget::slotUnreadMail ); + connect( m_link, &SysTrayXLink::signalConsole, m_debug, &DebugWidget::slotConsole ); connect( m_link, &SysTrayXLink::signalLinkReceiveError, m_debug, &DebugWidget::slotReceiveError ); connect( m_debug, &DebugWidget::signalWriteMessage, m_link, &SysTrayXLink::slotLinkWrite ); @@ -94,17 +95,20 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent ) connect( m_preferences, &Preferences::signalIconTypeChange, m_tray_icon, &SysTrayXIcon::slotIconTypeChange ); connect( m_preferences, &Preferences::signalIconDataChange, m_tray_icon, &SysTrayXIcon::slotIconDataChange ); - connect( m_preferences, &Preferences::signalMinimizeHideChange, m_win_ctrl, &WindowCtrl::slotMinimizeHideChange ); + connect( m_preferences, &Preferences::signalHideOnMinimizeChange, m_win_ctrl, &WindowCtrl::slotHideOnMinimizeChange ); + connect( m_preferences, &Preferences::signalMinimizeOnCloseChange, m_win_ctrl, &WindowCtrl::slotMinimizeOnCloseChange ); connect( m_preferences, &Preferences::signalIconTypeChange, m_pref_dialog, &PreferencesDialog::slotIconTypeChange ); connect( m_preferences, &Preferences::signalIconDataChange, m_pref_dialog, &PreferencesDialog::slotIconDataChange ); - connect( m_preferences, &Preferences::signalMinimizeHideChange, m_pref_dialog, &PreferencesDialog::slotMinimizeHideChange ); + connect( m_preferences, &Preferences::signalHideOnMinimizeChange, m_pref_dialog, &PreferencesDialog::slotHideOnMinimizeChange ); + connect( m_preferences, &Preferences::signalMinimizeOnCloseChange, m_pref_dialog, &PreferencesDialog::slotMinimizeOnCloseChange ); connect( m_preferences, &Preferences::signalDebugChange, m_pref_dialog, &PreferencesDialog::slotDebugChange ); connect( m_preferences, &Preferences::signalIconTypeChange, m_link, &SysTrayXLink::slotIconTypeChange ); connect( m_preferences, &Preferences::signalIconDataChange, m_link, &SysTrayXLink::slotIconDataChange ); - connect( m_preferences, &Preferences::signalMinimizeHideChange, m_link, &SysTrayXLink::slotMinimizeHideChange ); + connect( m_preferences, &Preferences::signalHideOnMinimizeChange, m_link, &SysTrayXLink::slotHideOnMinimizeChange ); + connect( m_preferences, &Preferences::signalMinimizeOnCloseChange, m_link, &SysTrayXLink::slotMinimizeOnCloseChange ); connect( m_preferences, &Preferences::signalDebugChange, m_link, &SysTrayXLink::slotDebugChange ); connect( m_preferences, &Preferences::signalDebugChange, m_debug, &DebugWidget::slotDebugChange ); @@ -128,6 +132,11 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent ) */ connect( m_tray_icon, &SysTrayXIcon::signalShowHide, m_win_ctrl, &WindowCtrl::slotShowHide ); + /* + * Connect conainer signals + */ + connect( m_tb_container, &Container::signalShowHide, m_win_ctrl, &WindowCtrl::slotShowHide ); + /* * Request preferences from add-on */ @@ -220,6 +229,12 @@ void SysTrayX::createTrayIcon() */ void SysTrayX::slotShutdown() { +#ifdef ENABLE_CONTAINER + + m_win_ctrl->shutdown(); + +#endif + /* * Let's quit */ diff --git a/app/SysTray-X/systrayxlink.cpp b/app/SysTray-X/systrayxlink.cpp index cd0450c..a1d681e 100644 --- a/app/SysTray-X/systrayxlink.cpp +++ b/app/SysTray-X/systrayxlink.cpp @@ -28,6 +28,7 @@ #include #include +#include /***************************************************************************** * @@ -104,6 +105,8 @@ void SysTrayXLinkReader::stopThread() */ void SysTrayXLinkReader::slotWorker() { + int error_count = 0; + while( m_doWork ) { qint32 data_len; @@ -121,7 +124,21 @@ void SysTrayXLinkReader::slotWorker() /* * Send the data to my parent */ - emit signalReceivedMessage( data ); + if( data.at( 0 ) == '{' ) + { + emit signalReceivedMessage( data ); + + error_count = 0; + } + else + { + error_count++; + + if( error_count > 20 ) + { + emit signalShutdown(); + } + } } } @@ -165,7 +182,9 @@ SysTrayXLink::SysTrayXLink( Preferences* pref ) connect( m_reader_thread, &QThread::finished, reader, &QObject::deleteLater ); connect( reader, &SysTrayXLinkReader::signalReceivedMessage, this, &SysTrayXLink::slotLinkRead ); + connect( reader, &SysTrayXLinkReader::signalShutdown, this, &SysTrayXLink::slotShutdown ); + connect( reader, &SysTrayXLinkReader::signalConsole, this, &SysTrayXLink::slotConsole ); connect( reader, &SysTrayXLinkReader::signalDebugMessage, this, &SysTrayXLink::slotDebugMessage ); connect( reader, &SysTrayXLinkReader::signalReceivedDataLength, this, &SysTrayXLink::slotReceivedDataLength ); @@ -323,6 +342,7 @@ void SysTrayXLink::DecodeMessage( const QByteArray& message ) } else { + emit signalConsole( "Link error: " + jsonError.errorString() ); emit signalLinkReceiveError( jsonError.errorString() ); } } @@ -366,14 +386,24 @@ void SysTrayXLink::DecodePreferences( const QJsonObject& pref ) m_pref->setIconData( QByteArray::fromBase64( icon_base64.toUtf8() ) ); } - if( pref.contains( "minimizeHide" ) && pref[ "minimizeHide" ].isString() ) + if( pref.contains( "hideOnMinimize" ) && pref[ "hideOnMinimize" ].isString() ) { - bool minimize_hide = pref[ "minimizeHide" ].toString() == "true"; + bool hide_minimize = pref[ "hideOnMinimize" ].toString() == "true"; /* - * Store the new MinimizeHide state + * Store the new hide on minimize state */ - m_pref->setMinimizeHide( minimize_hide ); + m_pref->setHideOnMinimize( hide_minimize ); + } + + if( pref.contains( "minimizeOnClose" ) && pref[ "minimizeOnClose" ].isString() ) + { + bool minimize_close = pref[ "minimizeOnClose" ].toString() == "true"; + + /* + * Store the new minimize on close state + */ + m_pref->setMinimizeOnClose( minimize_close ); } if( pref.contains( "debug" ) && pref[ "debug" ].isString() ) @@ -398,7 +428,8 @@ void SysTrayXLink::EncodePreferences( const Preferences& pref ) */ QJsonObject prefObject; prefObject.insert("debug", QJsonValue::fromVariant( QString( pref.getDebug() ? "true" : "false" ) ) ); - prefObject.insert("minimizeHide", QJsonValue::fromVariant( QString( pref.getMinimizeHide() ? "true" : "false" ) ) ); + prefObject.insert("hideOnMinimize", QJsonValue::fromVariant( QString( pref.getHideOnMinimize() ? "true" : "false" ) ) ); + prefObject.insert("minimizeOnClose", QJsonValue::fromVariant( QString( pref.getMinimizeOnClose() ? "true" : "false" ) ) ); prefObject.insert("iconType", QJsonValue::fromVariant( QString::number( pref.getIconType() ) ) ); prefObject.insert("iconMime", QJsonValue::fromVariant( pref.getIconMime() ) ); prefObject.insert("icon", QJsonValue::fromVariant( QString( pref.getIconData().toBase64() ) ) ); @@ -413,6 +444,15 @@ void SysTrayXLink::EncodePreferences( const Preferences& pref ) } +/* + * Handle the console message from the reader thread + */ +void SysTrayXLink::slotConsole( QString message ) +{ + emit signalConsole( message ); +} + + /* * Handle the debug message from the reader thread */ @@ -440,6 +480,15 @@ void SysTrayXLink::slotReceivedData( QByteArray data ) } +/* + * Relay shutdown signal + */ +void SysTrayXLink::slotShutdown() +{ + emit signalShutdown(); +} + + /* * Read the input */ @@ -479,9 +528,21 @@ void SysTrayXLink::slotDebugChange() /* - * Handle a minimizeHide state change signal + * Handle a hide on minimize state change signal */ -void SysTrayXLink::slotMinimizeHideChange() +void SysTrayXLink::slotHideOnMinimizeChange() +{ + if( m_pref->getAppPrefChanged() ) + { + sendPreferences(); + } +} + + +/* + * Handle a minimize on close state change signal + */ +void SysTrayXLink::slotMinimizeOnCloseChange() { if( m_pref->getAppPrefChanged() ) { diff --git a/app/SysTray-X/systrayxlink.h b/app/SysTray-X/systrayxlink.h index a16d490..afe358d 100644 --- a/app/SysTray-X/systrayxlink.h +++ b/app/SysTray-X/systrayxlink.h @@ -57,6 +57,13 @@ class SysTrayXLinkReader : public QObject signals: + /** + * @brief signalConsole + * + * @param message The message. + */ + void signalConsole( QString message ); + /** * @brief signalDebugMessage * @@ -85,6 +92,11 @@ class SysTrayXLinkReader : public QObject */ void signalReceivedMessage( QByteArray message ); + /** + * @brief signalShutdown. Signal to shutdown the app. + */ + void signalShutdown(); + private: /** @@ -166,7 +178,6 @@ class SysTrayXLink : public QObject */ void signalTitle( QString title ); - /** * @brief signalShutdown. Signal to shutdown the app. */ @@ -205,6 +216,13 @@ class SysTrayXLink : public QObject */ void signalDebugMessage( QString message ); + /** + * @brief signalConsole. Send message to debug console. + * + * @param message The message + */ + void signalConsole( QString message ); + /** * @brief signalUnreadMail. Signal numder of unread mails. * @@ -220,9 +238,14 @@ class SysTrayXLink : public QObject void slotDebugChange(); /** - * @brief slotMinimizeHideChange. Handle a change in minimizeHide state. + * @brief slotHideOnMinimizeChange. Handle a change in hide on minimize state. */ - void slotMinimizeHideChange(); + void slotHideOnMinimizeChange(); + + /** + * @brief slotMinimizeOnCloseChange. Handle a change in minimize on close state. + */ + void slotMinimizeOnCloseChange(); /** * @brief slotLinkWrite. Write the link. @@ -252,7 +275,14 @@ class SysTrayXLink : public QObject private slots: /** - * @brief slotDebugMessage. Handle the signal for a debuf message from the reader thread. + * @brief slotConsole. Handle the signal for console message from the reader thread. + * + * @param message The message. + */ + void slotConsole( QString message ); + + /** + * @brief slotDebugMessage. Handle the signal for a debug message from the reader thread. * * @param message The message. */ @@ -277,6 +307,11 @@ class SysTrayXLink : public QObject */ void slotLinkRead( QByteArray message ); + /** + * @brief slotShutdown. Handle sahutdown signal from reader thread. + */ + void slotShutdown(); + private: /** diff --git a/app/SysTray-X/windowctrl.cpp b/app/SysTray-X/windowctrl.cpp index 55c55d6..f83f5ab 100644 --- a/app/SysTray-X/windowctrl.cpp +++ b/app/SysTray-X/windowctrl.cpp @@ -3,6 +3,8 @@ */ #include #include +#include +#include /* * Main include @@ -40,11 +42,75 @@ WindowCtrl::WindowCtrl( Container* container, Preferences* pref, QObject *parent /* * Initialize */ - m_minimize_hide = m_pref->getMinimizeHide(); + m_state = "mormal"; + m_hide_minimize = m_pref->getHideOnMinimize(); + m_tb_window = nullptr; m_tb_container = nullptr; } + +/* + * Destructor + */ +WindowCtrl::~WindowCtrl() +{ + shutdown(); +} + +/* + * Handle app shutdown + */ +void WindowCtrl::shutdown() +{ +#ifdef ENABLE_CONTAINER + + if( m_tb_window ) + { + /* + * Release the Thunderbird window + */ + m_tb_window->setParent( nullptr ); + m_tb_window->setFlags( Qt::Window ); + + /* + * Remove the TB container + */ + m_container->removeWidget( m_tb_container ); + m_container->hide(); + + /* + * Cleanup + */ + delete m_tb_container; +// delete m_tb_window; + + emit signalConsole( QString( "Container %1").arg( reinterpret_cast( m_tb_container ) ) ); + emit signalConsole( QString( "Window %1").arg( reinterpret_cast( m_tb_window ) ) ); + + + m_tb_container = nullptr; + m_tb_window = nullptr; + + /* + * Normalize the window + */ + foreach( quint64 win_id, getWinIds() ) + { + normalizeWindow( win_id ); + } + + /* + * Make sure all events for the release are handled + */ + QCoreApplication::processEvents(); + } + +#endif +} + + + void WindowCtrl::slotWindowTest1() { emit signalConsole("Test 1 started"); @@ -54,7 +120,8 @@ void WindowCtrl::slotWindowTest1() // displayWindowElements( "- Mozilla Thunderbird" ); // findWindow( 4313 ); - captureWindow( "Debugging with Firefox Developer Tools - Mozilla Thunderbird" ); +// captureWindow( "Debugging with Firefox Developer Tools - Mozilla Thunderbird" ); + captureWindow( "- Mozilla Thunderbird" ); emit signalConsole("Test 1 done"); } @@ -66,20 +133,17 @@ void WindowCtrl::slotWindowTest2() // Do something. + shutdown(); + /* + if( !m_tb_window->parent() ) + { + m_tb_window->setParent( nullptr ); + m_tb_window->setFlags( Qt::Window ); - m_tb_window->setParent( nullptr ); - m_tb_window->setFlags( Qt::Window ); - - - /* - * Disconnect container? - */ -/* - m_tb_window->setParent( nullptr ); - - delete m_tb_container; - m_tb_container = nullptr; + m_container->hide(); + } */ + emit signalConsole("Test 2 done"); } @@ -162,11 +226,20 @@ void WindowCtrl::slotWindowTitle( QString title ) /* - * Handle change in minimizeHide state + * Handle change in hide on minimize state */ -void WindowCtrl::slotMinimizeHideChange() +void WindowCtrl::slotHideOnMinimizeChange() { - m_minimize_hide = m_pref->getMinimizeHide(); + m_hide_minimize = m_pref->getHideOnMinimize(); +} + + +/* + * Handle change in minimize on close state + */ +void WindowCtrl::slotMinimizeOnCloseChange() +{ + m_minimize_close = m_pref->getMinimizeOnClose(); } @@ -188,6 +261,15 @@ void WindowCtrl::slotShowHide() { m_state = "normal"; +#ifdef ENABLE_CONTAINER + + if( m_tb_window ) + { + m_container->show(); + } + +#else + foreach( quint64 win_id, getWinIds() ) { normalizeWindow( win_id ); @@ -197,17 +279,30 @@ void WindowCtrl::slotShowHide() // emit signalWindowNormal(); // TB window control +#endif + } else { m_state = "minimized"; +#ifdef ENABLE_CONTAINER + + if( m_tb_window ) + { + m_container->hide(); + } + +#else + foreach( quint64 win_id, getWinIds() ) { - minimizeWindow( win_id, m_minimize_hide ); + minimizeWindow( win_id, m_hide_minimize ); emit signalConsole("Minimize"); } // emit signalWindowMinimize(); // TB window control +#endif + } } diff --git a/app/SysTray-X/windowctrl.h b/app/SysTray-X/windowctrl.h index d974469..53d0079 100644 --- a/app/SysTray-X/windowctrl.h +++ b/app/SysTray-X/windowctrl.h @@ -48,6 +48,11 @@ class WindowCtrl : public QObject */ explicit WindowCtrl( Container* container, Preferences* pref, QObject *parent = nullptr ); + /** + * @brief ~WindowCtrlUnix. Destructor. + */ + ~WindowCtrl(); + /** * @brief captureWindow. Capture the TB window. * @@ -57,6 +62,11 @@ class WindowCtrl : public QObject */ bool captureWindow( const QString& title ); + /** + * @brief shutdown. Handle app shutdown. + */ + void shutdown(); + public slots: /** @@ -82,11 +92,18 @@ class WindowCtrl : public QObject void slotWindowTitle( QString title ); /** - * @brief slotMinimizeHideChange. Handle the minimizeHide signal. + * @brief slotHideOnMinimizeChange. Handle the hide on minimize signal. * * @param state The state */ - void slotMinimizeHideChange(); + void slotHideOnMinimizeChange(); + + /** + * @brief slotMinimizeOnCloseChange. Handle the minimize on close signal. + * + * @param state The state + */ + void slotMinimizeOnCloseChange(); /** * @brief slotWindowState. Handle the window state change signal. @@ -128,9 +145,14 @@ class WindowCtrl : public QObject QString m_window_title; /** - * @brief m_minimize_hide. State of minimizeHide + * @brief m_hide_minimize. State of hide on minimize. */ - bool m_minimize_hide; + bool m_hide_minimize; + + /** + * @brief m_minimize_close. State of minimize on close. + */ + bool m_minimize_close; /** * @brief m_state. State of the TB window. diff --git a/webext/background.js b/webext/background.js index b1f1a7b..f51b7f0 100644 --- a/webext/background.js +++ b/webext/background.js @@ -131,7 +131,8 @@ SysTrayX.Messaging = { const getter = browser.storage.sync.get([ "debug", - "minimizeHide", + "hideOnMinimize", + "minimizeOnClose", "iconType", "iconMime", "icon" @@ -143,13 +144,15 @@ SysTrayX.Messaging = { console.debug("Get preferences from storage"); const debug = result.debug || "false"; - const minimizeHide = result.minimizeHide || "true"; + const hideOnMinimize = result.hideOnMinimize || "true"; + const minimizeOnClose = result.minimizeOnClose || "true"; const iconType = result.iconType || "0"; const iconMime = result.iconMime || "image/png"; const icon = result.icon || []; console.log(`Debug ${debug}`); - console.log(`Debug ${minimizeHide}`); + console.log(`Debug ${hideOnMinimize}`); + console.log(`Debug ${minimizeOnClose}`); console.log(`Type ${iconType}`); console.log(`Mime ${iconMime}`); console.log(icon); @@ -158,7 +161,8 @@ SysTrayX.Messaging = { SysTrayX.Link.postSysTrayXMessage({ preferences: { debug: debug, - minimizeHide: minimizeHide, + hideOnMinimize: hideOnMinimize, + minimizeOnClose: minimizeOnClose, iconType: iconType, iconMime: iconMime, icon: icon @@ -281,10 +285,17 @@ SysTrayX.Link = { }); } - const minimizeHide = response["preferences"].minimizeHide; - if (minimizeHide) { + const hideOnMinimize = response["preferences"].hideOnMinimize; + if (hideOnMinimize) { browser.storage.sync.set({ - minimizeHide: minimizeHide + hideOnMinimize: hideOnMinimize + }); + } + + const minimizeOnClose = response["preferences"].minimizeOnClose; + if (minimizeOnClose) { + browser.storage.sync.set({ + minimizeOnClose: minimizeOnClose }); } diff --git a/webext/options.html b/webext/options.html index fa6435a..07f203a 100644 --- a/webext/options.html +++ b/webext/options.html @@ -25,7 +25,9 @@

Windows

- Minimizing window + Minimizing + window hides to tray
+ Closing window hides to tray
diff --git a/webext/options.js b/webext/options.js index 72a3e4e..0b859c4 100644 --- a/webext/options.js +++ b/webext/options.js @@ -58,13 +58,22 @@ SysTrayX.SaveOptions = { console.debug("Store debug state: " + `${debug}`); // - // Save minimize hide state + // Save hide on minimize state // - let minimizeHide = document.querySelector('input[name="minimizeHide"]').checked; + let hideOnMinimize = document.querySelector('input[name="hideOnMinimize"]').checked; browser.storage.sync.set({ - minimizeHide: `${minimizeHide}` + hideOnMinimize: `${hideOnMinimize}` }); - console.debug("Store minimizeHide state: " + `${minimizeHide}`); + console.debug("Store hideOnMinimize state: " + `${hideOnMinimize}`); + + // + // Save minimize on close state + // + let minimizeOnClose = document.querySelector('input[name="minimizeOnClose"]').checked; + browser.storage.sync.set({ + minimizeOnClose: `${minimizeOnClose}` + }); + console.debug("Store minimizeOnClose state: " + `${minimizeOnClose}`); // // Save icon preferences @@ -115,12 +124,21 @@ SysTrayX.RestoreOptions = { ); // - // Restore minimize hide + // Restore hide on minimize // - const getMinimizeHide = browser.storage.sync.get("minimizeHide"); - getMinimizeHide.then( - SysTrayX.RestoreOptions.setMinimizeHide, - SysTrayX.RestoreOptions.onMinimizeHideError + const getHideOnMinimize = browser.storage.sync.get("hideOnMinimize"); + getHideOnMinimize.then( + SysTrayX.RestoreOptions.setHideOnMinimize, + SysTrayX.RestoreOptions.onHideOnMinimizeError + ); + + // + // Restore minimize on close + // + const getMinimizeOnClose = browser.storage.sync.get("minimizeOnClose"); + getMinimizeOnClose.then( + SysTrayX.RestoreOptions.setMinimizeOnClose, + SysTrayX.RestoreOptions.onMinimizeOnCloseError ); // @@ -161,19 +179,35 @@ SysTrayX.RestoreOptions = { }, // - // Restore minimize hide callbacks + // Restore hide on minimize callbacks // - setMinimizeHide: function(result) { - const minimizeHide = result.minimizeHide || "true"; + setHideOnMinimize: function(result) { + const hideOnMinimize = result.hideOnMinimize || "true"; - console.debug("MinimizeHide: " + minimizeHide); + console.debug("hideOnMinimize: " + hideOnMinimize); - const checkbox = document.querySelector(`input[name="minimizeHide"]`); - checkbox.checked = minimizeHide === "true"; + const checkbox = document.querySelector(`input[name="hideOnMinimize"]`); + checkbox.checked = hideOnMinimize === "true"; }, - onMinimizeHideError: function(error) { - console.log(`MinimizeHide Error: ${error}`); + onHideOnMinimizeError: function(error) { + console.log(`hideOnMinimize Error: ${error}`); + }, + + // + // Restore minimize on close callbacks + // + setMinimizeOnClose: function(result) { + const minimizeOnClose = result.minimizeOnClose || "true"; + + console.debug("minimizeOnClose: " + minimizeOnClose); + + const checkbox = document.querySelector(`input[name="minimizeOnClose"]`); + checkbox.checked = minimizeOnClose === "true"; + }, + + onMinimizeOnCloseError: function(error) { + console.log(`minimizeOnClose Error: ${error}`); }, // @@ -262,9 +296,14 @@ SysTrayX.StorageChanged = { }); changed_icon_mime = true; } - if (item === "minimizeHide") { - SysTrayX.RestoreOptions.setMinimizeHide({ - minimizeHide: changes[item].newValue + if (item === "hideOnMinimize") { + SysTrayX.RestoreOptions.setHideOnMinimize({ + hideOnMinimize: changes[item].newValue + }); + } + if (item === "minimizeOnClose") { + SysTrayX.RestoreOptions.setMinimizeOnClose({ + minimizeOnClose: changes[item].newValue }); } if (item === "debug") {