summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk
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 /vcl/unx/gtk
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>
Diffstat (limited to 'vcl/unx/gtk')
-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
3 files changed, 45 insertions, 2 deletions
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 )