so we do this directly after realization */
static gint
-gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
+gtk_dialog_realized_callback( GtkWidget * WXUNUSED(widget), wxDialog *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
- /* I haven't been able to set the position of
- the dialog before it is shown, so I set the
- position in "realize" */
- gtk_widget_set_uposition( widget, win->m_x, win->m_y );
-
/* all this is for Motif Window Manager "hints" and is supposed to be
recognized by other WM as well. not tested. */
long decor = (long) GDK_DECOR_BORDER;
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
- /* set size hints */
- gint flag = 0; // GDK_HINT_POS;
- if ((win->GetMinWidth() != -1) || (win->GetMinHeight() != -1)) flag |= GDK_HINT_MIN_SIZE;
- if ((win->GetMaxWidth() != -1) || (win->GetMaxHeight() != -1)) flag |= GDK_HINT_MAX_SIZE;
- if (flag)
- {
- gdk_window_set_hints( win->m_widget->window,
- win->m_x, win->m_y,
- win->GetMinWidth(), win->GetMinHeight(),
- win->GetMaxWidth(), win->GetMaxHeight(),
- flag );
- }
-
/* reset the icon */
if (win->m_icon != wxNullIcon)
{
m_returnCode = 0;
m_sizeSet = FALSE;
m_modalShowing = FALSE;
- m_isFrame = TRUE;
+ m_themeEnabled = TRUE;
}
wxDialog::wxDialog( wxWindow *parent,
const wxPoint &pos, const wxSize &size,
long style, const wxString &name )
{
- g_openDialogs++;
-
wxTopLevelWindows.Append( this );
m_needParent = FALSE;
PostCreation();
+ if ((m_x != -1) || (m_y != -1))
+ gtk_widget_set_uposition( m_widget, m_x, m_y );
+ gtk_widget_set_usize( m_widget, m_width, m_height );
+
/* we cannot set MWM hints before the widget has
been realized, so we do this directly after realization */
gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
wxDialog::~wxDialog()
{
- m_isBeingDeleted = TRUE;
-
- wxTopLevelWindows.DeleteObject( this );
-
- if (wxTheApp->GetTopWindow() == this)
- {
- wxTheApp->SetTopWindow( (wxWindow*) NULL );
- }
+ CleanUp();
if ((wxTopLevelWindows.Number() == 0) &&
(wxTheApp->GetExitOnFrameDelete()))
{
wxTheApp->ExitMainLoop();
}
-
- g_openDialogs--;
}
void wxDialog::SetTitle( const wxString& title )
{
m_title = title;
- if (m_title.IsNull()) m_title = wxT("");
gtk_window_set_title( GTK_WINDOW(m_widget), m_title.mbc_str() );
}
wxString wxDialog::GetTitle() const
{
- return (wxString&)m_title;
+ return m_title;
}
void wxDialog::OnApply( wxCommandEvent &WXUNUSED(event) )
else
{
SetReturnCode(wxID_OK);
- this->Show(FALSE);
+ Show(FALSE);
}
}
}
bool wxDialog::Destroy()
{
- if (!wxPendingDelete.Member(this)) wxPendingDelete.Append(this);
+ // schedule the dialog for the deletion
+ if ( !wxPendingDelete.Member(this) )
+ {
+ wxPendingDelete.Append(this);
+ }
+
+ // don't leave a dangling pointer as the app top window, we can be deleted
+ // any moment at all now!
+ CleanUp();
return TRUE;
}
+void wxDialog::CleanUp()
+{
+ m_isBeingDeleted = TRUE;
+
+ if ( wxTheApp->GetTopWindow() == this )
+ {
+ wxTheApp->SetTopWindow( (wxWindow*) NULL );
+ }
+
+ wxTopLevelWindows.DeleteObject( this );
+}
+
void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) )
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid dialog") );
{
wxFAIL_MSG( wxT("DoMoveWindow called for wxDialog") );
}
-
+
void wxDialog::DoSetSize( int x, int y, int width, int height, int sizeFlags )
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid dialog") );
if ((m_width != old_width) || (m_height != old_height))
{
+ gtk_widget_set_usize( m_widget, m_width, m_height );
+
/* actual resizing is deferred to GtkOnSize in idle time and
when showing the dialog */
m_sizeSet = FALSE;
if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
- /* we actually set the size of a frame here and no-where else */
- gtk_widget_set_usize( m_widget, m_width, m_height );
+ /* set size hints */
+ gint flag = 0; // GDK_HINT_POS;
+ if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
+ if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
+ GdkGeometry geom;
+ geom.min_width = m_minWidth;
+ geom.min_height = m_minHeight;
+ geom.max_width = m_maxWidth;
+ geom.max_height = m_maxHeight;
+ gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
+ (GtkWidget*) NULL,
+ &geom,
+ (GdkWindowHints) flag );
m_sizeSet = TRUE;
return GetReturnCode();
}
+ // use the apps top level window as parent if none given unless explicitly
+ // forbidden
+ if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
+ {
+ wxWindow *parent = wxTheApp->GetTopWindow();
+ if ( parent && parent != this )
+ {
+ m_parent = parent;
+ gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(parent->m_widget) );
+ }
+ }
+
wxBusyCursorSuspender cs; // temporarily suppress the busy cursor
Show( TRUE );
m_modalShowing = TRUE;
+ g_openDialogs++;
+
gtk_grab_add( m_widget );
gtk_main();
gtk_grab_remove( m_widget );
+ g_openDialogs--;
+
return GetReturnCode();
}
Show( FALSE );
}
-void wxDialog::InitDialog()
-{
- wxWindow::InitDialog();
-}
-
void wxDialog::SetIcon( const wxIcon &icon )
{
m_icon = icon;