summaryrefslogtreecommitdiff
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-08 11:52:44 +0100
commitc80d34ad551efe858c47445b13370aa8223357c7 (patch)
treed7f0615be18e1998bf4f720545292d4dfd767065
parent44819f98aa39cbc8e5d9d07e112fa051077322eb (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.cxx24
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