[Libreoffice-commits] core.git: vcl/inc vcl/unx

Caolán McNamara caolanm at redhat.com
Fri Sep 1 22:36:12 UTC 2017


 vcl/inc/unx/gtk/gtkdata.hxx              |    2 +
 vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx |   33 ++++++++++++++++++++++++++++++-
 vcl/unx/gtk/fpicker/SalGtkFilePicker.hxx |    2 -
 vcl/unx/gtk/gtkdata.cxx                  |   12 +++++++++++
 vcl/unx/gtk3/gtk3gtkdata.cxx             |   12 +++++++++++
 5 files changed, 59 insertions(+), 2 deletions(-)

New commits:
commit 7f20ca352840c5b877f7aebdf021b5ea65835560
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Sep 1 09:27:48 2017 +0100

    Use FPicker parentwindow argument to set file picker parent
    
    the secret argument of xParentWindow already exists
    
    here we use XSystemDependentWindowPeer and getWindowHandle to get the window
    handle (which is a bit spurious in the wayland case but close enough) and then
    look up all our toplevel frames for a matching one in order to get the
    associated widget to use a a parent window
    
    If the fpicker was still in fpicker we could get the vcl::Window for the
    xParentWindow and get the frame directly from that but that necessitates
    linking to toolkit, so do it this way instead
    
    Change-Id: Ia6f51e6d2016587c1f314d7a0b1f9a20269facd0
    Reviewed-on: https://gerrit.libreoffice.org/41808
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/inc/unx/gtk/gtkdata.hxx b/vcl/inc/unx/gtk/gtkdata.hxx
index 249bc1add2bf..60a0940d9439 100644
--- a/vcl/inc/unx/gtk/gtkdata.hxx
+++ b/vcl/inc/unx/gtk/gtkdata.hxx
@@ -147,6 +147,8 @@ public:
 
     GtkSalSystem* getSystem() const { return m_pSys; }
 
+    GtkWidget* findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) const;
+
     virtual void deregisterFrame( SalFrame* pFrame ) override;
     GdkCursor *getCursor( PointerStyle ePointerStyle );
 #if GTK_CHECK_VERSION(3,0,0)
diff --git a/vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx b/vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx
index f487bed1670e..2c648a6b9c67 100644
--- a/vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx
+++ b/vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx
@@ -25,19 +25,24 @@
 
 #include <config_gio.h>
 
+#include <com/sun/star/awt/SystemDependentXWindow.hpp>
 #include <com/sun/star/awt/Toolkit.hpp>
+#include <com/sun/star/awt/XSystemDependentWindowPeer.hpp>
 #include <com/sun/star/frame/Desktop.hpp>
 #include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/SystemDependent.hpp>
 #include <com/sun/star/uno/XComponentContext.hpp>
 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
 #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
 #include <osl/diagnose.h>
 #include <osl/process.h>
+#include <rtl/process.h>
 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
 #include <com/sun/star/ui/dialogs/ControlActions.hpp>
 #include <com/sun/star/uno/Any.hxx>
 #include <comphelper/string.hxx>
+#include "unx/gtk/gtkdata.hxx"
 #include "unx/gtk/gtkinst.hxx"
 
 #include <vcl/svapp.hxx>
@@ -78,6 +83,7 @@ SalGtkFilePicker::SalGtkFilePicker( const uno::Reference< uno::XComponentContext
     SalGtkPicker( xContext ),
     SalGtkFilePicker_Base( m_rbHelperMtx ),
     m_pFilterList( nullptr ),
+    m_pParentWidget ( nullptr ),
     m_pVBox ( nullptr ),
     mnHID_FolderChange( 0 ),
     mnHID_SelectionChange( 0 ),
@@ -891,7 +897,12 @@ sal_Int16 SAL_CALL SalGtkFilePicker::execute()
         frame::Desktop::create(m_xContext),
         UNO_QUERY_THROW );
 
-    GtkWindow *pParent = RunDialog::GetTransientFor();
+    GtkWindow *pParent = GTK_WINDOW(m_pParentWidget);
+    if (!pParent)
+    {
+        SAL_WARN( "vcl.gtk", "no parent widget set");
+        pParent = RunDialog::GetTransientFor();
+    }
     if (pParent)
         gtk_window_set_transient_for(GTK_WINDOW(m_pDialog), pParent);
     RunDialog* pRunDialog = new RunDialog(m_pDialog, xToolkit, xDesktop);
@@ -1559,6 +1570,26 @@ void SAL_CALL SalGtkFilePicker::initialize( const uno::Sequence<uno::Any>& aArgu
     sal_Int16 templateId = -1;
     aAny >>= templateId;
 
+    css::uno::Reference<css::awt::XWindow> xParentWindow;
+    if (aArguments.getLength() > 1)
+    {
+        aArguments[1] >>= xParentWindow;
+    }
+
+    if (xParentWindow.is())
+    {
+        css::uno::Reference<css::awt::XSystemDependentWindowPeer> xSysDepWin(xParentWindow, css::uno::UNO_QUERY);
+        if (xSysDepWin.is())
+        {
+            css::uno::Sequence<sal_Int8> aProcessIdent(16);
+            rtl_getGlobalProcessId(reinterpret_cast<sal_uInt8*>(aProcessIdent.getArray()));
+            aAny = xSysDepWin->getWindowHandle(aProcessIdent, css::lang::SystemDependent::SYSTEM_XWINDOW);
+            css::awt::SystemDependentXWindow tmp;
+            aAny >>= tmp;
+            m_pParentWidget = GetGtkSalData()->GetGtkDisplay()->findGtkWidgetForNativeHandle(tmp.WindowHandle);
+        }
+    }
+
     GtkFileChooserAction eAction = GTK_FILE_CHOOSER_ACTION_OPEN;
     const gchar *first_button_text = GTK_STOCK_OPEN;
 
diff --git a/vcl/unx/gtk/fpicker/SalGtkFilePicker.hxx b/vcl/unx/gtk/fpicker/SalGtkFilePicker.hxx
index 03ee6f5e7346..e03ff2928720 100644
--- a/vcl/unx/gtk/fpicker/SalGtkFilePicker.hxx
+++ b/vcl/unx/gtk/fpicker/SalGtkFilePicker.hxx
@@ -152,8 +152,8 @@ class SalGtkFilePicker : public SalGtkPicker, public SalGtkFilePicker_Base
             m_xListener;
         OUString msPlayLabel;
         FilterList *m_pFilterList;
+        GtkWidget  *m_pParentWidget;
         GtkWidget  *m_pVBox;
-
         GtkWidget  *m_pFilterExpander;
         GtkWidget  *m_pFilterView;
         GtkListStore *m_pFilterStore;
diff --git a/vcl/unx/gtk/gtkdata.cxx b/vcl/unx/gtk/gtkdata.cxx
index afc0aa8c7dce..4eb6b6c2de8f 100644
--- a/vcl/unx/gtk/gtkdata.cxx
+++ b/vcl/unx/gtk/gtkdata.cxx
@@ -877,6 +877,18 @@ void GtkSalDisplay::PostUserEvent()
     GetGtkSalData()->PostUserEvent();
 }
 
+GtkWidget* GtkSalDisplay::findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) const
+{
+    for (auto it = m_aFrames.begin(); it != m_aFrames.end(); ++it)
+    {
+        SalFrame* pFrame = *it;
+        const SystemEnvData* pEnvData = pFrame->GetSystemData();
+        if (pEnvData->aWindow == hWindow)
+            return GTK_WIDGET(pEnvData->pWidget);
+    }
+    return nullptr;
+}
+
 void GtkSalDisplay::deregisterFrame( SalFrame* pFrame )
 {
     if( m_pCapture == pFrame )
diff --git a/vcl/unx/gtk3/gtk3gtkdata.cxx b/vcl/unx/gtk3/gtk3gtkdata.cxx
index 5308d57be70f..29937ef036b2 100644
--- a/vcl/unx/gtk3/gtk3gtkdata.cxx
+++ b/vcl/unx/gtk3/gtk3gtkdata.cxx
@@ -839,6 +839,18 @@ void GtkSalDisplay::PostUserEvent()
     GetGtkSalData()->PostUserEvent();
 }
 
+GtkWidget* GtkSalDisplay::findGtkWidgetForNativeHandle(sal_uIntPtr hWindow) const
+{
+    for (auto it = m_aFrames.begin(); it != m_aFrames.end(); ++it)
+    {
+        SalFrame* pFrame = *it;
+        const SystemEnvData* pEnvData = pFrame->GetSystemData();
+        if (pEnvData->aWindow == hWindow)
+            return GTK_WIDGET(pEnvData->pWidget);
+    }
+    return nullptr;
+}
+
 void GtkSalDisplay::deregisterFrame( SalFrame* pFrame )
 {
     if( m_pCapture == pFrame )


More information about the Libreoffice-commits mailing list