Fix menu crash

This commit is contained in:
Ximi1970
2020-06-05 19:37:15 +02:00
parent 58a9b2b842
commit 608e226eae
9 changed files with 193 additions and 91 deletions

View File

@@ -52,7 +52,8 @@ Preferences::Preferences( QObject *parent ) : QObject( parent )
m_start_minimized = false;
m_minimize_on_close = true;
m_debug = false;
// m_debug = false;
m_debug = true;
m_version_major = QLatin1String( APP_VERSION_MAJOR );
m_version_minor = QLatin1String( APP_VERSION_MINOR );

View File

@@ -33,7 +33,9 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
* Initialize
*/
m_tray_icon = nullptr;
m_tray_icon2 = nullptr;
m_kde_tray_icon = nullptr;
m_tray_icon_menu = nullptr;
/*
* Setup preferences storage
@@ -67,13 +69,6 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
*/
m_pref_dialog = new PreferencesDialog( m_link, m_preferences );
/*
* Setup tray icon
*/
createMenu();
// showTrayIcon();
showTrayIconKDE();
/*
* Setup debug window
*/
@@ -86,9 +81,6 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
* Connect debug link signals
*/
connect( m_link, &SysTrayXLink::signalUnreadMail, m_debug, &DebugWidget::slotUnreadMail );
// connect( m_link, &SysTrayXLink::signalUnreadMail, this, &SysTrayX::slotUnreadMail );
// connect( m_win_ctrl, &WindowCtrl::signalShow, this, &SysTrayX::slotShow );
// connect( m_win_ctrl, &WindowCtrl::signalHide, this, &SysTrayX::slotHide );
connect( this, &SysTrayX::signalConsole, m_debug, &DebugWidget::slotConsole );
connect( m_preferences, &Preferences::signalConsole, m_debug, &DebugWidget::slotConsole );
@@ -100,6 +92,9 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
connect( m_debug, &DebugWidget::signalTest2ButtonClicked, m_win_ctrl, &WindowCtrl::slotWindowTest2 );
connect( m_debug, &DebugWidget::signalTest3ButtonClicked, m_win_ctrl, &WindowCtrl::slotWindowTest3 );
connect( m_win_ctrl, &WindowCtrl::signalHideDefaultIconChange, this, &SysTrayX::slotSelectIconObject );
connect( this, &SysTrayX::signalConsole, m_debug, &DebugWidget::slotConsole );
/*
* Connect preferences signals
*/
@@ -134,6 +129,8 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
connect( m_preferences, &Preferences::signalMinimizeOnCloseChange, m_link, &SysTrayXLink::slotMinimizeOnCloseChange );
connect( m_preferences, &Preferences::signalDebugChange, m_link, &SysTrayXLink::slotDebugChange );
connect( m_preferences, &Preferences::signalHideDefaultIconChange, this, &SysTrayX::slotSelectIconObjectPref );
connect( m_preferences, &Preferences::signalDebugChange, m_debug, &DebugWidget::slotDebugChange );
/*
@@ -141,6 +138,7 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
*/
connect( m_link, &SysTrayXLink::signalAddOnShutdown, this, &SysTrayX::slotAddOnShutdown );
connect( m_link, &SysTrayXLink::signalWindowState, m_win_ctrl, &WindowCtrl::slotWindowState );
connect( m_link, &SysTrayXLink::signalKdeIntegration, this, &SysTrayX::slotSelectIconObject );
connect( m_link, &SysTrayXLink::signalTitle, m_win_ctrl, &WindowCtrl::slotWindowTitle );
connect( m_link, &SysTrayXLink::signalVersion, this, &SysTrayX::slotVersion );
@@ -204,6 +202,19 @@ void SysTrayX::createMenu()
}
/*
* Destroy the icon menu
*/
void SysTrayX::destroyMenu()
{
if( m_tray_icon_menu )
{
delete m_tray_icon_menu;
m_tray_icon_menu = nullptr;
}
}
/*
* Show / create tray icon
*/
@@ -211,6 +222,11 @@ void SysTrayX::showTrayIcon()
{
if( !m_tray_icon )
{
/*
* Setup tray menu
*/
createMenu();
/*
* Create system tray icon
*/
@@ -286,6 +302,11 @@ void SysTrayX::hideTrayIcon()
*/
delete m_tray_icon;
m_tray_icon = nullptr;
/*
* Destroy the mennu
*/
destroyMenu();
}
}
@@ -293,46 +314,51 @@ void SysTrayX::hideTrayIcon()
/*
* Show / create tray icon
*/
void SysTrayX::showTrayIconKDE()
void SysTrayX::showKdeTrayIcon()
{
if( !m_tray_icon2 )
if( !m_kde_tray_icon )
{
/*
* Setup tray menu
*/
createMenu();
/*
* Create system tray icon
*/
m_tray_icon2 = new SysTrayXStatusNotifier( m_link, m_preferences );
m_tray_icon2->setStandardActionsEnabled( false );
m_tray_icon2->setContextMenu( m_tray_icon_menu );
m_kde_tray_icon = new SysTrayXStatusNotifier( m_link, m_preferences );
m_kde_tray_icon->setStandardActionsEnabled( false );
m_kde_tray_icon->setContextMenu( m_tray_icon_menu );
/*
* Set default icon
*/
m_tray_icon2->setDefaultIconMime( m_preferences->getDefaultIconMime() );
m_tray_icon2->setDefaultIconData( m_preferences->getDefaultIconData() );
m_tray_icon2->setDefaultIconType( m_preferences->getDefaultIconType() );
m_kde_tray_icon->setDefaultIconMime( m_preferences->getDefaultIconMime() );
m_kde_tray_icon->setDefaultIconData( m_preferences->getDefaultIconData() );
m_kde_tray_icon->setDefaultIconType( m_preferences->getDefaultIconType() );
/*
* Set icon
*/
m_tray_icon2->setIconMime( m_preferences->getIconMime() );
m_tray_icon2->setIconData( m_preferences->getIconData() );
m_tray_icon2->setIconType( m_preferences->getIconType() );
m_kde_tray_icon->setIconMime( m_preferences->getIconMime() );
m_kde_tray_icon->setIconData( m_preferences->getIconData() );
m_kde_tray_icon->setIconType( m_preferences->getIconType() );
/*
* Connect the world
*/
connect( m_tray_icon2, &SysTrayXStatusNotifier::signalShowHide, m_win_ctrl, &WindowCtrl::slotShowHide );
connect( m_kde_tray_icon, &SysTrayXStatusNotifier::signalShowHide, m_win_ctrl, &WindowCtrl::slotShowHide );
connect( m_preferences, &Preferences::signalDefaultIconTypeChange, m_tray_icon2, &SysTrayXStatusNotifier::slotDefaultIconTypeChange );
connect( m_preferences, &Preferences::signalDefaultIconDataChange, m_tray_icon2, &SysTrayXStatusNotifier::slotDefaultIconDataChange );
connect( m_preferences, &Preferences::signalHideDefaultIconChange, m_tray_icon2, &SysTrayXStatusNotifier::slotHideDefaultIconChange );
connect( m_preferences, &Preferences::signalIconTypeChange, m_tray_icon2, &SysTrayXStatusNotifier::slotIconTypeChange );
connect( m_preferences, &Preferences::signalIconDataChange, m_tray_icon2, &SysTrayXStatusNotifier::slotIconDataChange );
connect( m_preferences, &Preferences::signalShowNumberChange, m_tray_icon2, &SysTrayXStatusNotifier::slotShowNumberChange );
connect( m_preferences, &Preferences::signalNumberColorChange, m_tray_icon2, &SysTrayXStatusNotifier::slotNumberColorChange );
connect( m_preferences, &Preferences::signalNumberSizeChange, m_tray_icon2, &SysTrayXStatusNotifier::slotNumberSizeChange );
connect( m_preferences, &Preferences::signalDefaultIconTypeChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotDefaultIconTypeChange );
connect( m_preferences, &Preferences::signalDefaultIconDataChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotDefaultIconDataChange );
connect( m_preferences, &Preferences::signalHideDefaultIconChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotHideDefaultIconChange );
connect( m_preferences, &Preferences::signalIconTypeChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotIconTypeChange );
connect( m_preferences, &Preferences::signalIconDataChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotIconDataChange );
connect( m_preferences, &Preferences::signalShowNumberChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotShowNumberChange );
connect( m_preferences, &Preferences::signalNumberColorChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotNumberColorChange );
connect( m_preferences, &Preferences::signalNumberSizeChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotNumberSizeChange );
connect( m_link, &SysTrayXLink::signalUnreadMail, m_tray_icon2, &SysTrayXStatusNotifier::slotSetUnreadMail );
connect( m_link, &SysTrayXLink::signalUnreadMail, m_kde_tray_icon, &SysTrayXStatusNotifier::slotSetUnreadMail );
}
}
@@ -340,73 +366,72 @@ void SysTrayX::showTrayIconKDE()
/*
* Hide / remove tray icon
*/
void SysTrayX::hideTrayIconKDE()
void SysTrayX::hideKdeTrayIcon()
{
if( m_tray_icon2 )
if( m_kde_tray_icon )
{
/*
* Disconnect all signals
*/
disconnect( m_tray_icon2, &SysTrayXStatusNotifier::signalShowHide, m_win_ctrl, &WindowCtrl::slotShowHide );
disconnect( m_kde_tray_icon, &SysTrayXStatusNotifier::signalShowHide, m_win_ctrl, &WindowCtrl::slotShowHide );
disconnect( m_preferences, &Preferences::signalDefaultIconTypeChange, m_tray_icon2, &SysTrayXStatusNotifier::slotDefaultIconTypeChange );
disconnect( m_preferences, &Preferences::signalDefaultIconDataChange, m_tray_icon2, &SysTrayXStatusNotifier::slotDefaultIconDataChange );
disconnect( m_preferences, &Preferences::signalHideDefaultIconChange, m_tray_icon2, &SysTrayXStatusNotifier::slotHideDefaultIconChange );
disconnect( m_preferences, &Preferences::signalIconTypeChange, m_tray_icon2, &SysTrayXStatusNotifier::slotIconTypeChange );
disconnect( m_preferences, &Preferences::signalIconDataChange, m_tray_icon2, &SysTrayXStatusNotifier::slotIconDataChange );
disconnect( m_preferences, &Preferences::signalShowNumberChange, m_tray_icon2, &SysTrayXStatusNotifier::slotShowNumberChange );
disconnect( m_preferences, &Preferences::signalNumberColorChange, m_tray_icon2, &SysTrayXStatusNotifier::slotNumberColorChange );
disconnect( m_preferences, &Preferences::signalNumberSizeChange, m_tray_icon2, &SysTrayXStatusNotifier::slotNumberSizeChange );
disconnect( m_preferences, &Preferences::signalDefaultIconTypeChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotDefaultIconTypeChange );
disconnect( m_preferences, &Preferences::signalDefaultIconDataChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotDefaultIconDataChange );
disconnect( m_preferences, &Preferences::signalHideDefaultIconChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotHideDefaultIconChange );
disconnect( m_preferences, &Preferences::signalIconTypeChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotIconTypeChange );
disconnect( m_preferences, &Preferences::signalIconDataChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotIconDataChange );
disconnect( m_preferences, &Preferences::signalShowNumberChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotShowNumberChange );
disconnect( m_preferences, &Preferences::signalNumberColorChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotNumberColorChange );
disconnect( m_preferences, &Preferences::signalNumberSizeChange, m_kde_tray_icon, &SysTrayXStatusNotifier::slotNumberSizeChange );
disconnect( m_link, &SysTrayXLink::signalUnreadMail, m_tray_icon2, &SysTrayXStatusNotifier::slotSetUnreadMail );
disconnect( m_link, &SysTrayXLink::signalUnreadMail, m_kde_tray_icon, &SysTrayXStatusNotifier::slotSetUnreadMail );
/*
* Remove the notifier icon
*/
delete m_tray_icon2;
m_tray_icon2 = nullptr;
delete m_kde_tray_icon;
m_kde_tray_icon = nullptr;
/*
* Destroy the mennu
*/
m_tray_icon_menu = nullptr;
//destroyMenu();
}
}
/*
* Handle icon show signal
* Select the prefered icon
*/
void SysTrayX::slotShow()
void SysTrayX::slotSelectIconObjectPref()
{
showTrayIcon();
slotSelectIconObject( m_preferences->getHideDefaultIcon() );
}
/*
* Handle icon hide signal
*/
void SysTrayX::slotHide()
void SysTrayX::slotSelectIconObject( bool state )
{
hideTrayIcon();
}
/*
* Hndle the unread mail signal
*/
void SysTrayX::slotUnreadMail( int unread_mail )
{
if( m_preferences->getDefaultIconType() == Preferences::PREF_DEFAULT_ICON_HIDE )
if( state )
{
if( unread_mail > 0 )
{
showTrayIcon();
}
else
{
hideTrayIcon();
}
// Use the KDE icon object
emit signalConsole("Enable KDE icon");
// Remove the Qt tray icon
hideTrayIcon();
// Setup KDE tray icon
showKdeTrayIcon();
}
else
{
showTrayIcon();
// Use default Qt system tray icon
emit signalConsole("Enable Qt icon");
// Remove KDE trsy icon
hideKdeTrayIcon();
// Setup the Qt tray icon
showTrayIcon();
}
}
@@ -501,9 +526,9 @@ void SysTrayX::slotVersion( QString version )
QSystemTrayIcon::Warning );
}
if( m_tray_icon2 )
if( m_kde_tray_icon )
{
m_tray_icon2->showMessage("SysTray-X Warning", "Version mismatch addon and app", ":/files/icons/dialog-warning.png" );
m_kde_tray_icon->showMessage("SysTray-X Warning", "Version mismatch addon and app", ":/files/icons/dialog-warning.png" );
}
}
}

View File

@@ -59,6 +59,11 @@ class SysTrayX : public QObject
*/
void createMenu();
/**
* @brief destroyMenu. Destroy the menu.
*/
void destroyMenu();
/**
* @brief showTrayIcon. Create and show the icon.
*/
@@ -70,14 +75,14 @@ class SysTrayX : public QObject
void hideTrayIcon();
/**
* @brief showTrayIconKDE. Create and show the KDE icon.
* @brief showKdeTrayIcon. Create and show the KDE icon.
*/
void showTrayIconKDE();
void showKdeTrayIcon();
/**
* @brief hideTrayIcon. Hide and destroy the KDE icon.
* @brief hideKdeTrayIcon. Hide and destroy the KDE icon.
*/
void hideTrayIconKDE();
void hideKdeTrayIcon();
signals:
@@ -102,15 +107,13 @@ class SysTrayX : public QObject
private slots:
void slotShow();
void slotHide();
/**
* @brief slotUnreadMail. Handle unread mail signal.
* @brief slotSelectIconObject. Select the prefered icon.
*
* @param unread_mail Number of unread mail.
* @param state The state.
*/
void slotUnreadMail( int unread_mail );
void slotSelectIconObjectPref();
void slotSelectIconObject( bool state );
/**
* @brief slotAddOnShutdown. Handle shutdown request from the add-on.
@@ -165,9 +168,9 @@ class SysTrayX : public QObject
SysTrayXIcon* m_tray_icon;
/**
* @brief m_tray_icon2. Pointer to the KDE system tray icon.
* @brief m_kde_tray_icon. Pointer to the KDE system tray icon.
*/
SysTrayXStatusNotifier* m_tray_icon2;
SysTrayXStatusNotifier* m_kde_tray_icon;
/**
* @brief m_tray_icon_menu. Pointer to the tray icon menu.

View File

@@ -262,6 +262,13 @@ void SysTrayXLink::DecodeMessage( const QByteArray& message )
{
QJsonObject jsonObject = jsonResponse.object();
/*
QStringList list = jsonObject.keys();
for( int i = 0 ; i < list.length() ; ++i )
{
emit signalConsole( QString("Message %1").arg(list.at(i)) );
}
*/
if( jsonObject.contains( "unreadMail" ) && jsonObject[ "unreadMail" ].isDouble() )
{
int unreadMail = jsonObject[ "unreadMail" ].toInt();
@@ -331,6 +338,18 @@ void SysTrayXLink::DecodeMessage( const QByteArray& message )
emit signalWindowState( window_state );
}
if( jsonObject.contains( "hideDefaultIcon" ) && jsonObject[ "hideDefaultIcon" ].isBool() )
{
bool hide_default_icon = jsonObject[ "hideDefaultIcon" ].toBool();
emit signalConsole(QString("hideDefaultIcon %1").arg(hide_default_icon));
/*
* Signal the KDE integration or hide default icon
*/
emit signalKdeIntegration( hide_default_icon );
}
if( jsonObject.contains( "platformInfo" ) && jsonObject[ "platformInfo" ].isObject() )
{
DecodePlatform( jsonObject[ "platformInfo" ].toObject() );
@@ -343,6 +362,8 @@ void SysTrayXLink::DecodeMessage( const QByteArray& message )
if( jsonObject.contains( "preferences" ) && jsonObject[ "preferences" ].isObject() )
{
emit signalConsole( QString("preferences") );
DecodePreferences( jsonObject[ "preferences" ].toObject() );
}
}
@@ -481,6 +502,8 @@ void SysTrayXLink::DecodePreferences( const QJsonObject& pref )
{
bool hide_default_icon = pref[ "hideDefaultIcon" ].toString() == "true";
emit signalConsole(QString("hideDefaultIcon %1").arg(hide_default_icon));
/*
* Store the new start minimized state
*/

View File

@@ -181,6 +181,13 @@ class SysTrayXLink : public QObject
*/
void signalWindowState( int state );
/**
* @brief signalKdeIntegration. Signal KDE integration (and use the KStatusNotifierItem icon)
*
* @param state The prefered state
*/
void signalKdeIntegration( bool state );
/**
* @brief signalUnreadMail. Signal numder of unread mails.
*

View File

@@ -68,6 +68,8 @@ void WindowCtrl::slotWindowTest1()
// Do something.
signalHideDefaultIconChange( true );
// emit signalShow();
// emit signalConsole( QString( "Found Ppid: %1" ).arg( getPpid() ) );
@@ -91,6 +93,8 @@ void WindowCtrl::slotWindowTest2()
// Do something.
signalHideDefaultIconChange( false );
// emit signalHide();
// hideWindow( getWinId(), true );

View File

@@ -49,8 +49,10 @@ class WindowCtrl : public QObject
signals:
void signalShow();
void signalHide();
// void signalShow();
// void signalHide();
void signalHideDefaultIconChange(bool hide );
public slots:

View File

@@ -3,6 +3,8 @@ var SysTrayX = {
startupState: undefined,
hideDefaultIcon: false,
platformInfo: undefined,
browserInfo: undefined,
@@ -31,6 +33,9 @@ SysTrayX.Messaging = {
// Send version to app
SysTrayX.Messaging.sendVersion();
// Send hide default icon preference
SysTrayX.Messaging.sendHideDefaultIcon();
// Send preferences to app
SysTrayX.Messaging.sendPreferences();
@@ -137,6 +142,14 @@ SysTrayX.Messaging = {
SysTrayX.Link.postSysTrayXMessage({ version: SysTrayX.version });
},
sendHideDefaultIcon: function () {
console.debug("HideIcon:" + SysTrayX.hideDefaultIcon);
SysTrayX.Link.postSysTrayXMessage({
hideDefaultIcon: SysTrayX.hideDefaultIcon,
});
},
sendPreferences: function () {
const getter = browser.storage.sync.get([
"debug",
@@ -401,6 +414,10 @@ async function start() {
);
}
// Hide the default icon
const hideDefaultIcon = await getHideDefaultIcon();
SysTrayX.hideDefaultIcon = hideDefaultIcon;
// Set platform
SysTrayX.platformInfo = await browser.runtime
.getPlatformInfo()

View File

@@ -146,6 +146,26 @@ async function getMinimizeOnClose() {
);
}
//
// Get KDE integration, default icon hide
//
async function getHideDefaultIcon() {
function getHideDefaultIconPref(result) {
const hideDefaultIcon = result.hideDefaultIcon || "false";
return hideDefaultIcon === "true";
}
function onHideDefaultIconPrefError() {
return false;
}
const getState = browser.storage.sync.get("hideDefaultIcon");
return await getState.then(
getHideDefaultIconPref,
onHideDefaultIconPrefError
);
}
// Check if the filters are for existing accounts
function checkAccountFilters(filters) {
let filtersChanged = false;