diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-06-08 11:50:42 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-06-08 11:52:44 +0100 |
commit | c80d34ad551efe858c47445b13370aa8223357c7 (patch) | |
tree | d7f0615be18e1998bf4f720545292d4dfd767065 | |
parent | 44819f98aa39cbc8e5d9d07e112fa051077322eb (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
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkframe.cxx | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index ee02b03046d1..f6f3694fdab3 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -796,8 +796,10 @@ GtkSalFrame::~GtkSalFrame() InvalidateGraphics(); - if( m_pParent ) + if (m_pParent) + { m_pParent->m_aChildren.remove( this ); + } getDisplay()->deregisterFrame( this ); @@ -1196,6 +1198,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 @@ -2343,11 +2351,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 |