Fix maximize restore

This commit is contained in:
Ximi1970
2023-11-04 23:41:35 +01:00
parent 880dcaa809
commit 60e5f6cd5c
5 changed files with 104 additions and 22 deletions

View File

@@ -329,15 +329,11 @@ void SysTrayXLink::DecodeMessage( const QByteArray& message )
if( mailCount.contains( "unread" ) && mailCount[ "unread" ].isDouble() )
{
unreadMail = mailCount[ "unread" ].toInt();
emit signalConsole( QString("Unread %1").arg( unreadMail ) );
}
if( mailCount.contains( "new" ) && mailCount[ "new" ].isDouble() )
{
newMail = mailCount[ "new" ].toInt();
emit signalConsole( QString("New %1").arg( newMail ) );
}
emit signalMailCount( unreadMail, newMail );

View File

@@ -367,6 +367,18 @@ void WindowCtrlUnix::minimizeWindowToTaskbar( quint64 window )
*/
GetWMNormalHints( m_display, window, &m_tb_window_hints[ window ] );
/*
* Get the X11 window state
*/
QStringList atoms = getWindowStateX11( window );
if( atoms.contains( "_NET_WM_STATE_MAXIMIZED_VERT" ) && atoms.contains( "_NET_WM_STATE_MAXIMIZED_HORZ" ) )
{
/*
* Window is maximized
*/
m_tb_window_hints[ window ].flags = -1;
}
/*
* Minimize the window
*/
@@ -407,6 +419,18 @@ void WindowCtrlUnix::minimizeWindowToTray( quint64 window )
*/
GetWMNormalHints( m_display, window, &m_tb_window_hints[ window ] );
/*
* Get the X11 window state
*/
QStringList atoms = getWindowStateX11( window );
if( atoms.contains( "_NET_WM_STATE_MAXIMIZED_VERT" ) && atoms.contains( "_NET_WM_STATE_MAXIMIZED_HORZ" ) )
{
/*
* Window is maximized
*/
m_tb_window_hints[ window ].flags = -1;
}
/*
* Set the flags (GNOME, Wayland?)
*/
@@ -452,14 +476,24 @@ void WindowCtrlUnix::normalizeWindow( quint64 window )
{
MapWindow( m_display, window );
SetWMNormalHints( m_display, window, m_tb_window_hints[ window ] );
/*
* Reset the hide flags
*/
SendEvent( m_display, window, "_NET_WM_STATE", _NET_WM_STATE_REMOVE, _ATOM_SKIP_TASKBAR );
SendEvent( m_display, window, "_NET_WM_STATE", _NET_WM_STATE_REMOVE, _ATOM_SKIP_PAGER );
/*
* Was the window maximized?
*/
if( m_tb_window_hints[ window ].flags == -1 )
{
SendEvent( m_display, window, "_NET_WM_STATE", _NET_WM_STATE_ADD, _ATOM_MAXIMIZED );
}
else
{
SetWMNormalHints( m_display, window, m_tb_window_hints[ window ] );
}
Flush( m_display );
}
@@ -622,4 +656,42 @@ QList< WindowCtrlUnix::WindowItem > WindowCtrlUnix::listXWindows( void* displa
return windows;
}
/*
* Get the window state from X11
*/
QStringList WindowCtrlUnix::getWindowStateX11( quint64 window )
{
qint32 n_net_wm_state;
void* net_wm_state_ptr = GetWindowProperty( m_display, window, "_NET_WM_STATE", &n_net_wm_state );
/*
* Get the atoms
*/
QStringList atom_list;
if( net_wm_state_ptr != nullptr )
{
for( qint32 i = 0 ; i < n_net_wm_state ; ++i )
{
char* atom_name = GetAtomName( m_display, reinterpret_cast<long *>( net_wm_state_ptr )[ i ] );
atom_list.append( atom_name );
if( atom_name )
{
Free( atom_name );
}
}
Free( net_wm_state_ptr );
}
/*
for( int i = 0 ; i < atom_list.length() ; ++i )
{
emit signalConsole( QString( "Atom: %1").arg( atom_list.at( i ) ) );
}
*/
return atom_list;
}
#endif // Q_OS_UNIX

View File

@@ -238,15 +238,6 @@ class WindowCtrlUnix : public QObject
*/
const Preferences::WindowState& getWindowState( const quint64 window );
/**
* @brief getWindowState. Get the state of a TB windows.
*
* @param window Window ID.
*
* @return The window state.
*/
const Preferences::WindowState& getWindowStateX11( const quint64 window );
/**
* @brief updatePositions. Update the window positions.
*/
@@ -287,11 +278,6 @@ class WindowCtrlUnix : public QObject
*/
void setPositions( QList< QPoint > window_positions );
/**
* @brief updateX11WindowStates. Update the x11 window states.
*/
void updateX11WindowStates( CheckType check_type );
private:
/**
@@ -310,6 +296,13 @@ class WindowCtrlUnix : public QObject
*/
QList< WindowItem > listXWindows( void* display, quint64 window, int level = 0 );
/**
* @brief getWindowStateX11. Get the window state from X11
*
* @param window The window.
*/
QStringList getWindowStateX11( quint64 window );
signals:
/**

View File

@@ -352,6 +352,25 @@ void SendEvent( void* display, quint64 window, const char* msg_type,
break;
}
case _ATOM_MAXIMIZED_VERT:
{
event.xclient.data.l[1] = XInternAtom( dsp, "_NET_WM_STATE_MAXIMIZED_VERT", False );
break;
}
case _ATOM_MAXIMIZED_HORZ:
{
event.xclient.data.l[1] = XInternAtom( dsp, "_NET_WM_STATE_MAXIMIZED_HORZ", False );
break;
}
case _ATOM_MAXIMIZED:
{
event.xclient.data.l[1] = XInternAtom( dsp, "_NET_WM_STATE_MAXIMIZED_VERT", False );
event.xclient.data.l[2] = XInternAtom( dsp, "_NET_WM_STATE_MAXIMIZED_HORZ", False );
break;
}
default:
{
return;

View File

@@ -36,10 +36,12 @@ enum StateActions
enum StateAtoms
{
_ATOM_SKIP_TASKBAR = 0,
_ATOM_SKIP_PAGER
_ATOM_SKIP_PAGER,
_ATOM_MAXIMIZED_VERT,
_ATOM_MAXIMIZED_HORZ,
_ATOM_MAXIMIZED
};
/*
* Protocol atoms
*/