mirror of
https://github.com/Ximi1970/systray-x.git
synced 2025-10-26 07:46:09 +01:00
Enable hide to systray on icon click for Linux
This commit is contained in:
@@ -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
|
||||
==========================================
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user