Update for multi win

This commit is contained in:
Ximi1970
2020-06-21 23:08:33 +02:00
parent 3ab987c369
commit 96c4e8702d
3 changed files with 134 additions and 32 deletions

View File

@@ -36,9 +36,11 @@ WindowCtrlWin::WindowCtrlWin( QObject *parent) : QObject( parent )
* Initialize
*/
m_tb_window = 0;
m_tb_windows = QList< quint64 >();
m_window_state = Preferences::STATE_UNKNOWN;
m_tb_windows = QList< quint64 >();
m_tb_window_states = QList< Preferences::WindowState >();
/*
* Setup the minimize intercept
*/
@@ -59,6 +61,26 @@ WindowCtrlWin::~WindowCtrlWin()
}
/*
* Set the window state.
*/
void WindowCtrlWin::setWindowState( int state )
{
m_window_state = state;
}
/**
* @brief getWindowState. Get the window state.
*
* @return The state.
*/
int WindowCtrlWin::getWindowState() const
{
return m_window_state;
}
/*
* Set the minimize type
*/
@@ -170,45 +192,72 @@ BOOL CALLBACK WindowCtrlWin::enumWindowsTitleProc( HWND hwnd, LPARAM lParam )
/*
* Find the window by pid
*/
bool WindowCtrlWin::findWindows( qint64 pid )
void WindowCtrlWin::findWindows( qint64 pid )
{
EnumWindowsPidProcData data;
data.pid = pid;
data.hwnd = nullptr;
m_tb_windows = QList< quint64 >();
m_tb_window_states = QList< Preferences::WindowState >();
EnumWindowsPidProcData data{ *this, pid };
EnumWindows( &enumWindowsPidProc, reinterpret_cast<LPARAM>(&data) );
if( data.hwnd == nullptr )
emit signalConsole( QString( "Number of windows found: %1" ).arg( m_tb_windows.length() ) );
for( int i = 0 ; i< m_tb_windows.length() ; ++i )
{
return false;
emit signalConsole( QString( "WinID %1, State %2" ).arg( m_tb_windows.at( i ) ).arg( m_tb_window_states.at( i ) ) );
}
/*
* Store it
*/
m_tb_window = (quint64)data.hwnd;
return true;
}
/*
* Callback for the window enumaration pid find.
*/
BOOL CALLBACK WindowCtrlWin::enumWindowsPidProc( HWND hwnd, LPARAM lParam )
BOOL CALLBACK WindowCtrlWin::enumWindowsPidProc( HWND hWnd, LPARAM lParam )
{
auto& data = *reinterpret_cast<EnumWindowsPidProcData*>(lParam);
unsigned long pid = 0;
GetWindowThreadProcessId( hwnd, &pid );
GetWindowThreadProcessId( hWnd, &pid );
if( data.pid != pid || !isMainWindow( hwnd ) )
if( data.pid != pid || !isMainWindow( hWnd ) )
{
return TRUE;
}
data.hwnd = hwnd;
/*
* Store the window id
*/
data.window_ctrl.m_tb_windows.append( (quint64)hWnd );
return FALSE;
/*
* Get the window state
*/
WINDOWPLACEMENT wp;
wp.length = sizeof( WINDOWPLACEMENT );
GetWindowPlacement( hWnd, &wp );
if( SW_SHOWMINIMIZED == wp.showCmd )
{
/*
* Window is minimized
*/
data.window_ctrl.m_tb_window_states.append( Preferences::STATE_MINIMIZED );
}
else
{
data.window_ctrl.m_tb_window_states.append( Preferences::STATE_NORMAL );
}
return TRUE;
}
/*
* Get the states of the TB windows.
*/
const QList< Preferences::WindowState >& WindowCtrlWin::getWindowStates() const
{
return m_tb_window_states;
}
@@ -217,7 +266,7 @@ BOOL CALLBACK WindowCtrlWin::enumWindowsPidProc( HWND hwnd, LPARAM lParam )
*/
BOOL WindowCtrlWin::isMainWindow( HWND hwnd )
{
return GetWindow( hwnd, GW_OWNER ) == nullptr && IsWindowVisible( hwnd );
return GetWindow( hwnd, GW_OWNER ) == nullptr && ( IsWindowVisible( hwnd ) || IsIconic( hwnd ) );
}
@@ -244,6 +293,15 @@ void WindowCtrlWin::displayWindowElements( quint64 window )
}
/*
* Get the Thunderbird window ID
*/
quint64 WindowCtrlWin::getWinId()
{
return m_tb_window;
}
/*
* Get the Thunderbird window IDs
*/
@@ -302,7 +360,7 @@ void CALLBACK WindowCtrlWin::handleWinEvent( HWINEVENTHOOK hook, DWORD event,
*/
if( m_ctrl_parent )
{
m_ctrl_parent->hookAction();
m_ctrl_parent->hookAction( hWnd );
}
}
}
@@ -312,16 +370,14 @@ void CALLBACK WindowCtrlWin::handleWinEvent( HWINEVENTHOOK hook, DWORD event,
/*
* Non-static method to use by the hook callback
*/
void WindowCtrlWin::hookAction()
void WindowCtrlWin::hookAction( HWND hWnd )
{
if( ( getWindowState() != Preferences::STATE_MINIMIZED ) && ( getMinimizeType() > 0 ) )
if( getMinimizeType() > 0 )
{
setWindowState( Preferences::STATE_MINIMIZED );
/*
* Hide to tray
*/
hideWindow( (HWND)getWinId() );
hideWindow( hWnd );
}
}

View File

@@ -40,8 +40,8 @@ class WindowCtrlWin : public QObject
struct EnumWindowsPidProcData
{
unsigned long pid;
HWND hwnd;
WindowCtrlWin& window_ctrl;
long long pid;
};
struct EnumWindowsTitleProcData
@@ -64,6 +64,20 @@ class WindowCtrlWin : public QObject
*/
~WindowCtrlWin();
/**
* @brief setWindowState. Set the window state.
*
* @param state The state.
*/
void setWindowState( int state );
/**
* @brief getWindowState. Get the window state.
*
* @return The state.
*/
int getWindowState() const;
/**
* @brief setMinimizeType
*
@@ -116,10 +130,15 @@ class WindowCtrlWin : public QObject
* @brief findWindow. Find window by pid.
*
* @param pid The pid to find.
*
* @return State of the find.
*/
bool findWindows( qint64 pid );
void findWindows( qint64 pid );
/**
* @brief getWindowStates. Get the states of the TB windows.
*
* @return The list of window states.
*/
const QList< Preferences::WindowState >& getWindowStates() const;
/**
* @brief displayWindowElements. Display window elements.
@@ -135,6 +154,13 @@ class WindowCtrlWin : public QObject
*/
void displayWindowElements( quint64 window );
/**
* @brief getWinId. Get the Thunderbird window ID.
*
* @return The TB window ID.
*/
quint64 getWinId();
/**
* @brief getWinIds. Get the Thunderbird window IDs.
*
@@ -238,7 +264,7 @@ class WindowCtrlWin : public QObject
/**
* @brief hookAction. Non-static function to be used by the hook callback.
*/
void hookAction();
void hookAction( HWND hWnd );
signals:
@@ -275,16 +301,31 @@ class WindowCtrlWin : public QObject
private:
/**
* @brief m_tb_window. The Thunderbird window.
*/
quint64 m_tb_window;
/**
* @brief m_tb_window. The Thunderbird windows.
*/
QList< quint64 > m_tb_windows;
/**
* @brief m_tb_window_states. The Thunderbird window states.
*/
QList< Preferences::WindowState > m_tb_window_states;
/**
* @brief m_minimize_type. Minimize type.
*/
Preferences::MinimizeType m_minimize_type;
/**
* @brief m_window_state. State of the TB window.
*/
int m_window_state;
/**
* @brief m_hook
*/

View File

@@ -169,6 +169,11 @@ void WindowCtrl::slotWindowState( Preferences::WindowState state )
emit signalConsole( QString( "State change to: %1" ).arg( state ) );
/*
* Update the TB windows and states
*/
findWindows( m_ppid );
#ifdef Q_OS_UNIX
/*