summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-06-08 11:50:42 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-06-10 12:20:45 +0100
commit1d3efb7ee79e8a516945328da1ec3b5fd8ce95b4 (patch)
tree2645686cacc41923185a4aed1a5988b837ee04d7 /vcl
parentec0adaa492fdc1b07c876cc5618420df9b50eb84 (diff)
gtk3: use window groups so modal dialog are modal to their toplevel frame only
so e.g. launching help from a modal dialog gives a new toplevel window which is not blocked by the modal dialog on the other window. likesize can go from one blocked e.g. writer window to calc and type away in there happily Change-Id: Id9376b393514e91dfd667dfce132f1f37367084e (cherry picked from commit c80d34ad551efe858c47445b13370aa8223357c7)
Diffstat (limited to 'vcl')
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx24
1 files changed, 19 insertions, 5 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 8e72d6a54b79..7f7c425ad642 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -799,8 +799,10 @@ GtkSalFrame::~GtkSalFrame()
InvalidateGraphics();
- if( m_pParent )
+ if (m_pParent)
+ {
m_pParent->m_aChildren.remove( this );
+ }
getDisplay()->deregisterFrame( this );
@@ -1198,6 +1200,12 @@ void GtkSalFrame::Init( SalFrame* pParent, SalFrameStyleFlags nStyle )
if (!(m_pParent->m_nStyle & SalFrameStyleFlags::PLUG))
gtk_window_set_transient_for( GTK_WINDOW(m_pWindow), GTK_WINDOW(m_pParent->m_pWindow) );
m_pParent->m_aChildren.push_back( this );
+ gtk_window_group_add_window(gtk_window_get_group(GTK_WINDOW(m_pParent->m_pWindow)), GTK_WINDOW(m_pWindow));
+ }
+ else
+ {
+ gtk_window_group_add_window(gtk_window_group_new(), GTK_WINDOW(m_pWindow));
+ g_object_unref(gtk_window_get_group(GTK_WINDOW(m_pWindow)));
}
// set window type
@@ -2346,11 +2354,17 @@ const SystemEnvData* GtkSalFrame::GetSystemData() const
void GtkSalFrame::SetParent( SalFrame* pNewParent )
{
- if( m_pParent )
- m_pParent->m_aChildren.remove( this );
+ if (m_pParent)
+ {
+ gtk_window_group_remove_window(gtk_window_get_group(GTK_WINDOW(m_pParent->m_pWindow)), GTK_WINDOW(m_pWindow));
+ m_pParent->m_aChildren.remove(this);
+ }
m_pParent = static_cast<GtkSalFrame*>(pNewParent);
- if( m_pParent )
- m_pParent->m_aChildren.push_back( this );
+ if (m_pParent)
+ {
+ m_pParent->m_aChildren.push_back(this);
+ gtk_window_group_add_window(gtk_window_get_group(GTK_WINDOW(m_pParent->m_pWindow)), GTK_WINDOW(m_pWindow));
+ }
if( ! isChild() )
gtk_window_set_transient_for( GTK_WINDOW(m_pWindow),
(m_pParent && ! m_pParent->isChild(true,false)) ? GTK_WINDOW(m_pParent->m_pWindow) : nullptr