tdf#48300 kde4+gen: bring forward the window with already opened doc
Send _NET_ACTIVE_WINDOW message to the mapped frame with the timestamp of current X11 server time (the real timestamp, not CurrentTime constant, otherwise e.g. KWin focus stealing prevention would kick in) Change-Id: I637e1c3548b874e7267f8fc71ffcca4b1a82a412 Reviewed-on: https://gerrit.libreoffice.org/44409 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
This commit is contained in:
committed by
Thorsten Behrens
parent
992bc9dfe1
commit
bb6a8dce40
@@ -299,6 +299,7 @@ protected:
|
||||
|
||||
void doDestruct();
|
||||
void addXineramaScreenUnique( int i, long i_nX, long i_nY, long i_nWidth, long i_nHeight );
|
||||
Time GetEventTimeImpl( bool bAlwaysReget = false ) const;
|
||||
public:
|
||||
static bool BestOpenGLVisual(Display* pDisplay, int nScreen, XVisualInfo& rVI);
|
||||
static bool BestVisual(Display *pDisp, int nScreen, XVisualInfo &rVI);
|
||||
@@ -355,7 +356,9 @@ public:
|
||||
RenderEntryMap& GetRenderEntries( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aRenderData; }
|
||||
const Pair &GetResolution() const { return aResolution_; }
|
||||
sal_uLong GetMaxRequestSize() const { return nMaxRequestSize_; }
|
||||
Time GetLastUserEventTime( bool bAlwaysReget = false ) const;
|
||||
Time GetLastUserEventTime() const { return GetEventTimeImpl(); }
|
||||
// this is an equivalent of gdk_x11_get_server_time()
|
||||
Time GetX11ServerTime() const { return GetEventTimeImpl( true ); }
|
||||
|
||||
bool XIfEventWithTimeout( XEvent*, XPointer, X_if_predicate ) const;
|
||||
SalXLib* GetXLib() const { return pXLib_; }
|
||||
|
||||
@@ -43,6 +43,7 @@ public:
|
||||
UTF8_STRING,
|
||||
|
||||
// atoms for extended WM hints
|
||||
NET_ACTIVE_WINDOW,
|
||||
NET_SUPPORTED,
|
||||
NET_SUPPORTING_WM_CHECK,
|
||||
NET_WM_NAME,
|
||||
@@ -286,6 +287,13 @@ public:
|
||||
* if reference frame is NULL the root window is used instead
|
||||
*/
|
||||
void changeReferenceFrame( X11SalFrame* pFrame, X11SalFrame const * pReferenceFrame ) const;
|
||||
|
||||
/*
|
||||
* Requests the change of active window by sending
|
||||
* _NET_ACTIVE_WINDOW message to the frame. The frame
|
||||
* has to be mapped
|
||||
*/
|
||||
void activateWindow( X11SalFrame *pFrame, Time nTimestamp );
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -2328,7 +2328,7 @@ extern "C"
|
||||
}
|
||||
}
|
||||
|
||||
Time SalDisplay::GetLastUserEventTime( bool i_bAlwaysReget ) const
|
||||
Time SalDisplay::GetEventTimeImpl( bool i_bAlwaysReget ) const
|
||||
{
|
||||
if( m_nLastUserEventTime == CurrentTime || i_bAlwaysReget )
|
||||
{
|
||||
|
||||
@@ -95,6 +95,7 @@ struct WMAdaptorProtocol
|
||||
static const WMAdaptorProtocol aProtocolTab[] =
|
||||
{
|
||||
{ "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", WMAdaptor::KDE_NET_WM_WINDOW_TYPE_OVERRIDE },
|
||||
{ "_NET_ACTIVE_WINDOW", WMAdaptor::NET_ACTIVE_WINDOW },
|
||||
{ "_NET_CURRENT_DESKTOP", WMAdaptor::NET_CURRENT_DESKTOP },
|
||||
{ "_NET_NUMBER_OF_DESKTOPS", WMAdaptor::NET_NUMBER_OF_DESKTOPS },
|
||||
{ "_NET_WM_DESKTOP", WMAdaptor::NET_WM_DESKTOP },
|
||||
@@ -2274,4 +2275,28 @@ void WMAdaptor::answerPing( X11SalFrame const * i_pFrame, XClientMessageEvent co
|
||||
}
|
||||
}
|
||||
|
||||
void WMAdaptor::activateWindow( X11SalFrame *pFrame, Time nTimestamp )
|
||||
{
|
||||
if (pFrame->bMapped_)
|
||||
{
|
||||
XEvent aEvent;
|
||||
|
||||
aEvent.xclient.type = ClientMessage;
|
||||
aEvent.xclient.window = pFrame->GetShellWindow();
|
||||
aEvent.xclient.message_type = m_aWMAtoms[ NET_ACTIVE_WINDOW ];
|
||||
aEvent.xclient.format = 32;
|
||||
aEvent.xclient.data.l[0] = 1;
|
||||
aEvent.xclient.data.l[1] = nTimestamp;
|
||||
aEvent.xclient.data.l[2] = None;
|
||||
aEvent.xclient.data.l[3] = 0;
|
||||
aEvent.xclient.data.l[4] = 0;
|
||||
|
||||
XSendEvent( m_pDisplay,
|
||||
m_pSalDisplay->GetRootWindow( pFrame->GetScreenNumber() ),
|
||||
False,
|
||||
SubstructureNotifyMask | SubstructureRedirectMask,
|
||||
&aEvent );
|
||||
}
|
||||
}
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||
|
||||
@@ -1274,7 +1274,7 @@ void X11SalFrame::Show( bool bVisible, bool bNoActivate )
|
||||
|
||||
Time nUserTime = 0;
|
||||
if( ! bNoActivate && !(nStyle_ & SalFrameStyleFlags::OWNERDRAWDECORATION) )
|
||||
nUserTime = pDisplay_->GetLastUserEventTime( true );
|
||||
nUserTime = pDisplay_->GetX11ServerTime();
|
||||
GetDisplay()->getWMAdaptor()->setUserTime( this, nUserTime );
|
||||
if( ! bNoActivate && (nStyle_ & SalFrameStyleFlags::TOOLWINDOW) )
|
||||
m_bSetFocusOnMap = true;
|
||||
@@ -1435,8 +1435,17 @@ void X11SalFrame::ToTop( SalFrameToTop nFlags )
|
||||
&& bMapped_ )
|
||||
{
|
||||
if( m_bXEmbed )
|
||||
{
|
||||
askForXEmbedFocus( 0 );
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
if ( nFlags & SalFrameToTop::GrabFocus )
|
||||
{
|
||||
Time nTimestamp = pDisplay_->GetX11ServerTime();
|
||||
GetDisplay()->getWMAdaptor()->activateWindow( this, nTimestamp );
|
||||
}
|
||||
else if ( nFlags & SalFrameToTop::GrabFocusOnly )
|
||||
XSetInputFocus( GetXDisplay(), aToTopWindow, RevertToParent, CurrentTime );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user