summaryrefslogtreecommitdiff
path: root/vcl/unx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-01-26 10:03:37 +0000
committerCaolán McNamara <caolanm@redhat.com>2021-01-27 10:18:50 +0100
commitdf788fcc308bbf8950ad8a22a1f8290681b64f0d (patch)
treeeac883afe20faea112046e1ca4d3999c5668ef1c /vcl/unx
parent7d506f6bb45725bff9d5a6ddf0893d826f992596 (diff)
tdf#139609 avoid fetching unnecessary xid under gtk3
because of the side effects using a bare GtkGrid as m_pSocket in vcl/unx/gtk3/gtk3gtkobject.cxx is perhaps a poor choice, getting its xid causes poor side effects wrt events belonging to its child widgets getting delivered to the SalFrame widget, so duplicate scrolling after showing a opengl slide and/or showing a video and lots of flickering we're (generally at least) not using the xid under gtk3 so don't set it unless it's explicitly asked for. Happily the gtk Player::createPlayerWindow doesn't use its arg[0] xid in any case, so don't bother setting it for that backend. Change-Id: I1c59a607a332635091782c3b49de10647558f301 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109941 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx')
-rw-r--r--vcl/unx/generic/app/i18n_ic.cxx4
-rw-r--r--vcl/unx/generic/app/saldisp.cxx2
-rw-r--r--vcl/unx/generic/gdi/cairo_xlib_cairo.cxx4
-rw-r--r--vcl/unx/generic/gdi/cairo_xlib_cairo.hxx3
-rw-r--r--vcl/unx/generic/gdi/salgdi.cxx2
-rw-r--r--vcl/unx/generic/gdi/salgdi2.cxx2
-rw-r--r--vcl/unx/generic/window/salobj.cxx6
-rw-r--r--vcl/unx/gtk3/gtk3gtkdata.cxx2
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx10
-rw-r--r--vcl/unx/gtk3/gtk3gtkobject.cxx3
-rw-r--r--vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx2
11 files changed, 25 insertions, 15 deletions
diff --git a/vcl/unx/generic/app/i18n_ic.cxx b/vcl/unx/generic/app/i18n_ic.cxx
index ce4faa918d8c..32390a888864 100644
--- a/vcl/unx/generic/app/i18n_ic.cxx
+++ b/vcl/unx/generic/app/i18n_ic.cxx
@@ -164,7 +164,7 @@ SalI18N_InputContext::SalI18N_InputContext ( SalFrame *pFrame ) :
{
const SystemEnvData* pEnv = pFrame->GetSystemData();
::Window aClientWindow = pEnv->aShellWindow;
- ::Window aFocusWindow = pEnv->GetWindowHandle();
+ ::Window aFocusWindow = pEnv->GetWindowHandle(pFrame);
// for status callbacks and commit string callbacks
#define PREEDIT_BUFSZ 16
@@ -548,7 +548,7 @@ SalI18N_InputContext::SetICFocus( SalFrame* pFocusFrame )
const SystemEnvData* pEnv = pFocusFrame->GetSystemData();
::Window aClientWindow = pEnv->aShellWindow;
- ::Window aFocusWindow = pEnv->GetWindowHandle();
+ ::Window aFocusWindow = pEnv->GetWindowHandle(pFocusFrame);
XSetICValues( maContext,
XNFocusWindow, aFocusWindow,
diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx
index dc843f34ab67..b736d0a09249 100644
--- a/vcl/unx/generic/app/saldisp.cxx
+++ b/vcl/unx/generic/app/saldisp.cxx
@@ -1849,7 +1849,7 @@ int SalDisplay::CaptureMouse( SalFrame *pCapture )
if( !pEnv || !*pEnv )
{
int ret = XGrabPointer( GetDisplay(),
- static_cast<::Window>(pEnvData->GetWindowHandle()),
+ static_cast<::Window>(pEnvData->GetWindowHandle(pCapture)),
False,
PointerMotionMask| ButtonPressMask|ButtonReleaseMask,
GrabModeAsync,
diff --git a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
index 762564fbdab0..238224007f22 100644
--- a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
+++ b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
@@ -68,9 +68,9 @@ namespace cairo
pRenderFormat(pSysDat.pXRenderFormat)
{}
- X11SysData::X11SysData( const SystemEnvData& pSysDat ) :
+ X11SysData::X11SysData( const SystemEnvData& pSysDat, const SalFrame* pReference ) :
pDisplay(pSysDat.pDisplay),
- hDrawable(pSysDat.GetWindowHandle()),
+ hDrawable(pSysDat.GetWindowHandle(pReference)),
pVisual(pSysDat.pVisual),
nScreen(pSysDat.nScreen),
pRenderFormat(nullptr)
diff --git a/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx b/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx
index 398522c1594d..9b0dfb01b759 100644
--- a/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx
+++ b/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx
@@ -25,6 +25,7 @@
#include <vcl/salgtype.hxx>
struct BitmapSystemData;
+class SalFrame;
struct SystemEnvData;
struct SystemGraphicsData;
@@ -35,7 +36,7 @@ namespace cairo {
{
X11SysData();
explicit X11SysData( const SystemGraphicsData& );
- explicit X11SysData( const SystemEnvData& );
+ explicit X11SysData( const SystemEnvData&, const SalFrame* pReference );
void* pDisplay; // the relevant display connection
Drawable hDrawable; // a drawable
diff --git a/vcl/unx/generic/gdi/salgdi.cxx b/vcl/unx/generic/gdi/salgdi.cxx
index 41a0f7dfa9b4..ef99f1d4274e 100644
--- a/vcl/unx/generic/gdi/salgdi.cxx
+++ b/vcl/unx/generic/gdi/salgdi.cxx
@@ -517,7 +517,7 @@ namespace
if( !pSysData )
return cairo::X11SysData();
else
- return cairo::X11SysData(*pSysData);
+ return cairo::X11SysData(*pSysData, rWindow.ImplGetFrame());
}
cairo::X11SysData getSysData( const VirtualDevice& rVirDev )
diff --git a/vcl/unx/generic/gdi/salgdi2.cxx b/vcl/unx/generic/gdi/salgdi2.cxx
index 03ce5331bc58..d688f00fa743 100644
--- a/vcl/unx/generic/gdi/salgdi2.cxx
+++ b/vcl/unx/generic/gdi/salgdi2.cxx
@@ -51,7 +51,7 @@ void X11SalGraphics::YieldGraphicsExpose()
for (auto pSalFrame : vcl_sal::getSalDisplay(GetGenericUnixSalData())->getFrames() )
{
const SystemEnvData* pEnvData = pSalFrame->GetSystemData();
- if( Drawable(pEnvData->GetWindowHandle()) == aWindow )
+ if( Drawable(pEnvData->GetWindowHandle(pSalFrame)) == aWindow )
{
pFrame = pSalFrame;
break;
diff --git a/vcl/unx/generic/window/salobj.cxx b/vcl/unx/generic/window/salobj.cxx
index a39c041a95ae..c24e138e5d6f 100644
--- a/vcl/unx/generic/window/salobj.cxx
+++ b/vcl/unx/generic/window/salobj.cxx
@@ -62,7 +62,7 @@ X11SalObject* X11SalObject::CreateObject( SalFrame* pParent, SystemWindowData* p
SalDisplay* pSalDisp = vcl_sal::getSalDisplay(GetGenericUnixSalData());
const SystemEnvData* pEnv = pParent->GetSystemData();
Display* pDisp = pSalDisp->GetDisplay();
- ::Window aObjectParent = static_cast<::Window>(pEnv->GetWindowHandle());
+ ::Window aObjectParent = static_cast<::Window>(pEnv->GetWindowHandle(pParent));
pObject->maParentWin = aObjectParent;
// find out on which screen that window is
@@ -332,7 +332,7 @@ X11SalObject::SetPosSize( tools::Long nX, tools::Long nY, tools::Long nWidth, to
void
X11SalObject::Show( bool bVisible )
{
- if (!maSystemChildData.GetWindowHandle())
+ if (!maSystemChildData.GetWindowHandle(mpParent))
return;
if ( bVisible ) {
@@ -353,7 +353,7 @@ void X11SalObject::GrabFocus()
{
if( mbVisible )
XSetInputFocus( static_cast<Display*>(maSystemChildData.pDisplay),
- maSystemChildData.GetWindowHandle(),
+ maSystemChildData.GetWindowHandle(mpParent),
RevertToNone,
CurrentTime );
}
diff --git a/vcl/unx/gtk3/gtk3gtkdata.cxx b/vcl/unx/gtk3/gtk3gtkdata.cxx
index 952fb503306d..1e46fd69b8bc 100644
--- a/vcl/unx/gtk3/gtk3gtkdata.cxx
+++ b/vcl/unx/gtk3/gtk3gtkdata.cxx
@@ -782,7 +782,7 @@ GtkWidget* GtkSalDisplay::findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) cons
for (auto pSalFrame : m_aFrames )
{
const SystemEnvData* pEnvData = pSalFrame->GetSystemData();
- if (pEnvData->GetWindowHandle() == hWindow)
+ if (pEnvData->GetWindowHandle(pSalFrame) == hWindow)
return GTK_WIDGET(pEnvData->pWidget);
}
return nullptr;
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 771cc0538581..7d40fd5a241b 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -2312,6 +2312,14 @@ const SystemEnvData* GtkSalFrame::GetSystemData() const
return &m_aSystemData;
}
+void GtkSalFrame::ResolveWindowHandle(SystemEnvData& rData) const
+{
+ if (!rData.pWidget)
+ return;
+ SAL_WARN("vcl.gtk3", "its undesirable to need the NativeWindowHandle, see tdf#139609");
+ rData.SetWindowHandle(GetNativeWindowHandle(static_cast<GtkWidget*>(rData.pWidget)));
+}
+
void GtkSalFrame::SetParent( SalFrame* pNewParent )
{
GtkWindow* pWindow = GTK_IS_WINDOW(m_pWindow) ? GTK_WINDOW(m_pWindow) : nullptr;
@@ -4473,7 +4481,7 @@ Size GtkSalDisplay::GetScreenSize( int nDisplayScreen )
return Size( aRect.GetWidth(), aRect.GetHeight() );
}
-sal_uIntPtr GtkSalFrame::GetNativeWindowHandle(GtkWidget *pWidget)
+sal_uIntPtr GtkSalFrame::GetNativeWindowHandle(GtkWidget *pWidget) const
{
(void) this; // Silence loplugin:staticmethods
GdkDisplay *pDisplay = getGdkDisplay();
diff --git a/vcl/unx/gtk3/gtk3gtkobject.cxx b/vcl/unx/gtk3/gtk3gtkobject.cxx
index afff5fa2291e..5dc67655568b 100644
--- a/vcl/unx/gtk3/gtk3gtkobject.cxx
+++ b/vcl/unx/gtk3/gtk3gtkobject.cxx
@@ -65,7 +65,8 @@ void GtkSalObjectBase::Init()
gtk_widget_realize( m_pSocket );
// system data
- m_aSystemData.SetWindowHandle(m_pParent->GetNativeWindowHandle(m_pSocket));
+ // tdf#139609 deliberately defer using m_pParent->GetNativeWindowHandle(m_pSocket)) to set m_aSystemData.aWindow
+ // unless its explicitly needed
m_aSystemData.aShellWindow = reinterpret_cast<sal_IntPtr>(this);
m_aSystemData.pSalFrame = nullptr;
m_aSystemData.pWidget = m_pSocket;
diff --git a/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx b/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx
index 30d1f64afefc..4bccf1e24d72 100644
--- a/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx
+++ b/vcl/unx/gtk3_kde5/gtk3_kde5_filepicker_ipc.cxx
@@ -197,7 +197,7 @@ std::function<void()> Gtk3KDE5FilePickerIpc::blockMainWindow()
if (!pSysData)
return {};
- sendCommand(Commands::SetWinId, pSysData->GetWindowHandle());
+ sendCommand(Commands::SetWinId, pSysData->GetWindowHandle(pParentWin->ImplGetFrame()));
auto* pMainWindow = static_cast<GtkWidget*>(pSysData->pWidget);
if (!pMainWindow)