Enable hide to systray on icon click for Linux

This commit is contained in:
Ximi1970
2020-02-17 22:23:39 +01:00
parent f31f50e6c2
commit 956b0a9022
9 changed files with 135 additions and 106 deletions

View File

@@ -1,5 +1,15 @@
#<script>
Windows
=========================================
c# remove 3rd party application from taskbar
(first answer)
https://stackoverflow.com/questions/10514882/c-sharp-remove-3rd-party-application-from-taskbar
X11
==========================================

View File

@@ -104,6 +104,7 @@ SysTrayX::SysTrayX( QObject *parent ) : QObject( parent )
connect( m_link, &SysTrayXLink::signalUnreadMail, m_tray_icon, &SysTrayXIcon::slotSetUnreadMail );
connect( m_link, &SysTrayXLink::signalShutdown, this, &SysTrayX::slotShutdown );
connect( m_link, &SysTrayXLink::signalWindowState, m_win_ctrl, &WindowCtrl::slotWindowState );
connect( m_link, &SysTrayXLink::signalTitle, m_win_ctrl, &WindowCtrl::slotWindowTitle );
/*
* Connect window signals

View File

@@ -290,6 +290,12 @@ void SysTrayXLink::DecodeMessage( const QByteArray& message )
emit signalUnreadMail( unreadMail );
}
if( jsonObject.contains( "title" ) && jsonObject[ "title" ].isString() )
{
QString title = jsonObject[ "title" ].toString();
emit signalTitle( title );
}
if( jsonObject.contains( "shutdown" ) && jsonObject[ "shutdown" ].isString() )
{
emit signalShutdown();

View File

@@ -161,6 +161,12 @@ class SysTrayXLink : public QObject
signals:
/**
* @brief signalTitle. Signal to title the app.
*/
void signalTitle( QString title );
/**
* @brief signalShutdown. Signal to shutdown the app.
*/

View File

@@ -26,16 +26,16 @@ WindowCtrlUnix::WindowCtrlUnix( QObject *parent ) : QObject( parent )
/*
* Get the Thunderbird window ID
*/
unsigned long WindowCtrlUnix::getWId()
QList< unsigned long > WindowCtrlUnix::getWIds()
{
return m_tb_window;
return m_tb_windows;
}
/*
* Find a window by title
* Display window atoms
*/
bool WindowCtrlUnix::findWindow( const QString& title, unsigned long& window )
void WindowCtrlUnix::displayWindowAtoms( const QString& title )
{
QList< WindowItem > windows = listXWindows( m_display, m_root_window );
@@ -50,11 +50,9 @@ bool WindowCtrlUnix::findWindow( const QString& title, unsigned long& window
if( win_name.contains( title, Qt::CaseInsensitive ) ) {
emit signalConsole( QString( "Found: Level %1, XID %2, Name %3" ).arg( win.level ).arg( win.window ).arg( win_name ) );
QString name = atomName( m_display, win.window );
emit signalConsole( QString( "Atom name: %1" ).arg( name ) );
QStringList types = atomWindowType( m_display, win.window );
foreach( QString type, types )
{
@@ -113,19 +111,43 @@ bool WindowCtrlUnix::findWindow( const QString& title, unsigned long& window
}
else
{
emit signalConsole( "Window State: Unknown" );
emit signalConsole( "Window State: Normal" );
}
/*
* Store and return the XID
*/
m_tb_window = win.window;
window = win.window;
return true;
}
}
}
}
/*
* Find window(s) by title
*/
bool WindowCtrlUnix::findWindow( const QString& title )
{
QList< WindowItem > windows = listXWindows( m_display, m_root_window );
m_tb_windows = QList< Window >();
foreach( WindowItem win, windows )
{
char *name = nullptr;
if( XFetchName( m_display, win.window, &name ) > 0 ) {
QString win_name( name );
XFree( name );
if( win_name.contains( title, Qt::CaseInsensitive ) ) {
/*
* Store the XID
*/
m_tb_windows.append( win.window );
}
}
}
if( m_tb_windows.length() > 0 )
{
return true;
}
return false;
}
@@ -288,7 +310,7 @@ void WindowCtrlUnix::skipTaskbarWindow( Window window, bool set )
*/
void WindowCtrlUnix::normalizeWindow( Window window )
{
// XMapRaised( m_display, m_tb_window );
// XMapRaised( m_display, window );
XMapWindow( m_display, window );
XFlush( m_display );
}
@@ -319,46 +341,6 @@ bool WindowCtrlUnix::generateEvent()
#endif
#ifdef CHANGE_PROP
// XDeleteProperty( m_display, window, prop_skip_taskbar);
void WindowCtrlUnix::setAtomState()
{
char prop_name[] = "_NET_WM_STATE";
Atom prop = XInternAtom( m_display, prop_name, True );
Atom prop_hidden = XInternAtom( m_display, WindowStates[ STATE_HIDDEN ].toUtf8(), True );
Atom type;
int format;
unsigned long remain;
unsigned long len;
unsigned char* list = nullptr;
QStringList states;
if( XGetWindowProperty( m_display, m_tb_window, prop, 0, sizeof( Atom ), False, XA_ATOM,
&type, &format, &len, &remain, &list ) == Success )
{
emit signalConsole( QString( "Atom state" ) );
if( XChangeProperty( m_display, m_tb_window, prop, XA_ATOM, format, PropModeAppend, reinterpret_cast<unsigned char*>( &prop_hidden ), 1 ) == Success )
{
emit signalConsole( QString( "Atom state appended: %1" ).arg( WindowStates[ STATE_HIDDEN ] ) );
}
emit signalConsole( QString( "Atom state done" ) );
}
if( list )
{
XFree( list );
}
XFlush( m_display );
}
#endif
/*
* Get the X11 window list

View File

@@ -111,21 +111,27 @@ class WindowCtrlUnix : public QObject
explicit WindowCtrlUnix( QObject *parent = nullptr );
/**
* @brief getWId. Get the Thunderbird windows ID.
* @brief getWIds. Get the Thunderbird window IDs.
*
* @return The ID.
* @return The list of window IDs.
*/
unsigned long getWId();
QList< unsigned long > getWIds();
/**
* @brief displayWindowAtoms. Display window atoms.
*
* @param title The window title to find.
*/
void displayWindowAtoms( const QString& title );
/**
* @brief findWindow. Find window with title.
*
* @param title The title to find.
* @param window The found XID.
*
* @return State of the find.
*/
bool findWindow( const QString& title, unsigned long& window );
bool findWindow( const QString& title );
/**
* @brief findWindow. Find window of a process.
@@ -240,9 +246,9 @@ class WindowCtrlUnix : public QObject
Window m_root_window;
/**
* @brief m_tb_window. The Thunderbird window.
* @brief m_tb_window. The Thunderbird windows.
*/
Window m_tb_window;
QList< Window > m_tb_windows;
};
#endif // WINDOWCTRLUNIX_H

View File

@@ -33,16 +33,12 @@ void WindowCtrl::slotWindowTest1()
// Do something.
unsigned long win_id;
findWindow( "Debugging with Firefox Developer Tools - Mozilla Thunderbird", win_id );
// findWindow( "Mozilla Thunderbird", win_id );
displayWindowAtoms( "- Mozilla Thunderbird" );
// findWindow( 4313 );
// captureWindow( "Debugging with Firefox Developer Tools - Mozilla Thunderbird" );
emit signalConsole("Test 1 done");
}
@@ -53,12 +49,6 @@ void WindowCtrl::slotWindowTest2()
// Do something.
unsigned long win_id = getWId();
skipTaskbarWindow( win_id, true );
minimizeWindow( win_id );
// normalizeWindow( win_id );
/*
* Disconnect container?
*/
@@ -78,20 +68,18 @@ void WindowCtrl::slotWindowTest3()
// Do something.
unsigned long win_id = getWId();
skipTaskbarWindow( win_id, false );
normalizeWindow( win_id );
emit signalConsole("Test 3 done");
}
// "Debugging with Firefox Developer Tools - Mozilla Thunderbird"
bool WindowCtrl::captureWindow( const QString& title )
{
Q_UNUSED( title )
#ifdef FF_NEET
unsigned long WinId;
if( !findWindow( title, WinId ) )
if( !findWindow( title ) )
{
return false;
}
@@ -104,18 +92,35 @@ bool WindowCtrl::captureWindow( const QString& title )
m_tb_container = QWidget::createWindowContainer( m_tb_window );
#endif
return true;
}
/*
* Handle window title signal
*/
void WindowCtrl::slotWindowTitle( QString title )
{
/*
* Store the window title
*/
m_window_title = title;
/*
* Get the window IDs
*/
findWindow( title );
}
/*
* Handle change in window state
*/
void WindowCtrl::slotWindowState( QString state )
{
m_state = state;
emit signalDebugMessage( "Win state: " + state );
}
@@ -127,20 +132,25 @@ void WindowCtrl::slotShowHide()
if( m_state == "minimized" )
{
m_state = "normal";
// emit signalWindowNormal();
if( m_tb_container )
foreach( unsigned long win_id, getWIds() )
{
m_tb_container->show();
skipTaskbarWindow( win_id, false );
normalizeWindow( win_id );
}
// emit signalWindowNormal(); // TB window control
} else {
m_state = "minimized";
// emit signalWindowMinimize();
if( m_tb_container )
foreach( unsigned long win_id, getWIds() )
{
m_tb_container->hide();
skipTaskbarWindow( win_id, true );
minimizeWindow( win_id );
}
// emit signalWindowMinimize(); // TB window control
}
}

View File

@@ -65,6 +65,13 @@ class WindowCtrl : public QObject
*/
void slotWindowTest3();
/**
* @brief slotWindowTitle. Handle the window title signal.
*
* @param state The windows title.
*/
void slotWindowTitle( QString title );
/**
* @brief slotWindowState. Handle the window state change signal.
*
@@ -89,11 +96,15 @@ class WindowCtrl : public QObject
*/
QWidget* m_tb_container;
/**
* @brief m_window_title. Title of the TB window.
*/
QString m_window_title;
/**
* @brief m_state. State of the TB window.
*/
QString m_state;
};

View File

@@ -17,17 +17,20 @@ SysTrayX.Messaging = {
SysTrayX.Messaging.getAccounts();
browser.storage.onChanged.addListener(SysTrayX.Messaging.storageChanged);
// Send the window title to app
SysTrayX.Messaging.sendTitle();
// Send preferences to app
SysTrayX.Messaging.sendPreferences();
// this.unReadMessages(this.unreadFiltersTest).then(this.unreadCb);
window.setInterval(SysTrayX.Messaging.pollAccounts, 10000);
window.setInterval(SysTrayX.Messaging.pollAccounts, 1000);
// Send the app a close command if the window closes
browser.windows.onRemoved.addListener(SysTrayX.Window.closed);
// Try to catch the window state
browser.windows.onFocusChanged.addListener(SysTrayX.Window.focusChanged);
// browser.windows.onFocusChanged.addListener(SysTrayX.Window.focusChanged);
},
//
@@ -118,6 +121,11 @@ SysTrayX.Messaging = {
SysTrayX.Link.postSysTrayXMessage({ unreadMail: count });
},
sendTitle: function() {
const title = "-" + SysTrayX.Window.startWindow.title.split("-").pop();
SysTrayX.Link.postSysTrayXMessage({ title: title });
},
sendPreferences: function() {
console.debug("Send preferences");
@@ -282,14 +290,12 @@ SysTrayX.Link = {
SysTrayX.Window = {
startWindow: undefined,
closed: function() {
closed: function(windowId) {
// Window closed
console.debug("Shutting down");
// Send it to the app
SysTrayX.Link.postSysTrayXMessage({
shutdown: ""
});
SysTrayX.Link.postSysTrayXMessage({ shutdown: "true" });
},
focusChanged: function(windowId) {
@@ -324,15 +330,6 @@ async function start() {
.getCurrent()
.then(currentWindow => currentWindow);
console.debug("Window focus: " + SysTrayX.Window.startWindow.focused);
console.debug("Window name: " + SysTrayX.Window.startWindow.title);
console.debug("Window name: " + SysTrayX.Window.startWindow.state);
// browser.windows.update(currentWindow.id, { state: "minimized" });
// browser.windows.update(currentWindow.id, { state: "normal", focused: true });
// ?? browser.windows.update(currentWindow.id, { state: "docked" });
// Setup the link first
SysTrayX.Link.init();