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-10 12:20:45 +0100 |
commit | 1d3efb7ee79e8a516945328da1ec3b5fd8ce95b4 (patch) | |
tree | 2645686cacc41923185a4aed1a5988b837ee04d7 /vcl | |
parent | ec0adaa492fdc1b07c876cc5618420df9b50eb84 (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.cxx | 24 |
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 |