wxapp_install_idle_handler();
if (win->IsEnabled() &&
- (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)))
+ (g_openDialogs == 0 || (win->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG) ||
+ win->IsGrabbed()))
win->Close();
return TRUE;
// wxTopLevelWindowGTK itself
// ----------------------------------------------------------------------------
-BEGIN_EVENT_TABLE(wxTopLevelWindowGTK, wxTopLevelWindowBase)
- EVT_SET_FOCUS(wxTopLevelWindowGTK::OnSetFocus)
-END_EVENT_TABLE()
-
//-----------------------------------------------------------------------------
// InsertChild for wxTopLevelWindowGTK
//-----------------------------------------------------------------------------
m_miniTitle = 0;
m_mainWidget = (GtkWidget*) NULL;
m_insertInClientArea = TRUE;
- m_isFrame = TRUE;
m_isIconized = FALSE;
m_fsIsShowing = FALSE;
m_themeEnabled = TRUE;
m_gdkDecor = m_gdkFunc = 0;
+ m_grabbed = FALSE;
}
bool wxTopLevelWindowGTK::Create( wxWindow *parent,
wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
{
+ if (m_grabbed)
+ {
+ wxASSERT_MSG( FALSE, "Window still grabbed");
+ RemoveGrab();
+ }
+
m_isBeingDeleted = TRUE;
// it may also be GtkScrolledWindow in the case of an MDI child
// set the focus if not done yet and if we can already do it
if ( GTK_WIDGET_REALIZED(m_wxwindow) )
{
- if ( g_delayedFocus && wxGetTopLevelParent(g_delayedFocus) == this )
+ if ( g_delayedFocus &&
+ wxGetTopLevelParent((wxWindow*)g_delayedFocus) == this )
{
g_delayedFocus->SetFocus();
g_delayedFocus = NULL;
wxWindow::OnInternalIdle();
}
-void wxTopLevelWindowGTK::OnSetFocus(wxFocusEvent& event)
-{
-#if 0
- if ( !g_delayedFocus || wxGetTopLevelParent(g_delayedFocus) != this )
- {
- // let the base class version set the focus to the first child which
- // accepts it
- event.Skip();
- }
- //else: the focus will be really set from OnInternalIdle() later
-#endif
-}
-
// ----------------------------------------------------------------------------
// frame title/icon
// ----------------------------------------------------------------------------
}
}
+void wxTopLevelWindowGTK::AddGrab()
+{
+ if (!m_grabbed)
+ {
+ m_grabbed = TRUE;
+ gtk_grab_add( m_widget );
+ gtk_main();
+ gtk_grab_remove( m_widget );
+ }
+}
+
+void wxTopLevelWindowGTK::RemoveGrab()
+{
+ if (m_grabbed)
+ {
+ gtk_main_quit();
+ m_grabbed = FALSE;
+ }
+}