summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-09-01 09:27:48 +0100
committerCaolán McNamara <caolanm@redhat.com>2017-09-02 00:35:51 +0200
commit7f20ca352840c5b877f7aebdf021b5ea65835560 (patch)
tree5d549a6f7e688961ce92d4afdaff2af91a489d2e
parentd9527fd01fd2674deb6868084d056861db5447fa (diff)
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@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--vcl/inc/unx/gtk/gtkdata.hxx2
-rw-r--r--vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx33
-rw-r--r--vcl/unx/gtk/fpicker/SalGtkFilePicker.hxx2
-rw-r--r--vcl/unx/gtk/gtkdata.cxx12
-rw-r--r--vcl/unx/gtk3/gtk3gtkdata.cxx12
5 files changed, 59 insertions, 2 deletions
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 )