2ec3e50
From 8a30dab4e78b42cf3ce587965414b98a50830a78 Mon Sep 17 00:00:00 2001
6b9ef3f
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
6b9ef3f
Date: Mon, 14 Dec 2015 11:36:50 +0000
2ec3e50
Subject: [PATCH 1/2] Related: rhbz#1290014 gtk3: use gtk_window_set_modal on
2ec3e50
 modal dialogs
6b9ef3f
MIME-Version: 1.0
6b9ef3f
Content-Type: text/plain; charset=UTF-8
6b9ef3f
Content-Transfer-Encoding: 8bit
6b9ef3f
6b9ef3f
which makes modal dialogs (which are most of them) place correctly
6b9ef3f
under wayland. Modeless ones are still uselessly shoved far to the
6b9ef3f
left, but this makes things near usable and gives the same "graying
6b9ef3f
into the bg" effect for the main window as other gtk apps
6b9ef3f
6b9ef3f
Change-Id: If1486feb7631c5a0c2aa6efac3a6b9dd1b215daf
6b9ef3f
Reviewed-on: https://gerrit.libreoffice.org/20699
6b9ef3f
Tested-by: Jenkins <ci@libreoffice.org>
6b9ef3f
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
6b9ef3f
Tested-by: Caolán McNamara <caolanm@redhat.com>
6b9ef3f
(cherry picked from commit 8d5822983e9b6a1e04874ce4d2c807fd0cf1ee04)
6b9ef3f
Reviewed-on: https://gerrit.libreoffice.org/20700
6b9ef3f
---
6b9ef3f
 vcl/inc/salframe.hxx          | 4 ++++
6b9ef3f
 vcl/inc/unx/gtk/gtkframe.hxx  | 4 ++++
6b9ef3f
 vcl/source/window/dialog.cxx  | 3 ++-
6b9ef3f
 vcl/unx/gtk3/gtk3gtkframe.cxx | 7 +++++++
6b9ef3f
 4 files changed, 17 insertions(+), 1 deletion(-)
6b9ef3f
6b9ef3f
diff --git a/vcl/inc/salframe.hxx b/vcl/inc/salframe.hxx
2ec3e50
index 4e52fe4..484504c 100644
6b9ef3f
--- a/vcl/inc/salframe.hxx
6b9ef3f
+++ b/vcl/inc/salframe.hxx
2ec3e50
@@ -233,6 +233,10 @@ public:
6b9ef3f
     // done setting up the clipregion
6b9ef3f
     virtual void            EndSetClipRegion() = 0;
6b9ef3f
 
6b9ef3f
+    virtual void            SetModal(bool /*bModal*/)
6b9ef3f
+    {
6b9ef3f
+    }
6b9ef3f
+
6b9ef3f
     // Callbacks (indepent part in vcl/source/window/winproc.cxx)
6b9ef3f
     // for default message handling return 0
6b9ef3f
     void                    SetCallback( vcl::Window* pWindow, SALFRAMEPROC pProc );
6b9ef3f
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
2ec3e50
index 3bd5353..ee19e6c 100644
6b9ef3f
--- a/vcl/inc/unx/gtk/gtkframe.hxx
6b9ef3f
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
2ec3e50
@@ -465,6 +465,10 @@ public:
6b9ef3f
     // done setting up the clipregion
2ec3e50
     virtual void                EndSetClipRegion() SAL_OVERRIDE;
6b9ef3f
 
6b9ef3f
+#if GTK_CHECK_VERSION(3,0,0)
6b9ef3f
+    virtual void                SetModal(bool bModal) override;
6b9ef3f
+#endif
6b9ef3f
+
6b9ef3f
     static GtkSalFrame         *getFromWindow( GtkWindow *pWindow );
6b9ef3f
 
2ec3e50
     virtual Window              GetX11Window() SAL_OVERRIDE;
6b9ef3f
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
2ec3e50
index 4ce15de..cd1f0da 100644
6b9ef3f
--- a/vcl/source/window/dialog.cxx
6b9ef3f
+++ b/vcl/source/window/dialog.cxx
6b9ef3f
@@ -46,6 +46,7 @@
6b9ef3f
 #include <vcl/msgbox.hxx>
6b9ef3f
 #include <vcl/unowrap.hxx>
6b9ef3f
 #include <vcl/settings.hxx>
6b9ef3f
+#include <salframe.hxx>
6b9ef3f
 
6b9ef3f
 #include <iostream>
6b9ef3f
 
2ec3e50
@@ -1001,7 +1002,6 @@ void Dialog::SetModalInputMode( bool bModal )
6b9ef3f
             mpDialogParent = pParent->mpWindowImpl->mpFrameWindow;
6b9ef3f
             mpDialogParent->ImplIncModalCount();
6b9ef3f
         }
6b9ef3f
-
6b9ef3f
     }
6b9ef3f
     else
6b9ef3f
     {
2ec3e50
@@ -1037,6 +1037,7 @@ void Dialog::SetModalInputMode( bool bModal )
6b9ef3f
             }
6b9ef3f
         }
6b9ef3f
     }
6b9ef3f
+    ImplGetFrame()->SetModal(bModal);
6b9ef3f
 }
6b9ef3f
 
6b9ef3f
 void Dialog::SetModalInputMode( bool bModal, bool bSubModalDialogs )
6b9ef3f
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
2ec3e50
index 1443054..ca9d371 100644
6b9ef3f
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
6b9ef3f
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
2ec3e50
@@ -2616,6 +2616,13 @@ void GtkSalFrame::EndSetClipRegion()
6b9ef3f
         gdk_window_shape_combine_region( widget_get_window(m_pWindow), m_pRegion, 0, 0 );
6b9ef3f
 }
6b9ef3f
 
6b9ef3f
+void GtkSalFrame::SetModal(bool bModal)
6b9ef3f
+{
6b9ef3f
+    if (!m_pWindow)
6b9ef3f
+        return;
6b9ef3f
+    gtk_window_set_modal(GTK_WINDOW(m_pWindow), bModal);
6b9ef3f
+}
6b9ef3f
+
6b9ef3f
 gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer frame )
6b9ef3f
 {
6b9ef3f
     GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
6b9ef3f
-- 
6b9ef3f
2.5.0
6b9ef3f