X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/43a18898651f71010606d8682fdf88cfc1c02193..cce4b3fe2b05e1d928d7a5930c33c624b2f3a667:/src/gtk/dialog.cpp?ds=inline diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index 5df777a91e..e1da79d411 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -14,6 +14,9 @@ #include "wx/dialog.h" #include "wx/frame.h" #include "wx/app.h" + +#include "gdk/gdk.h" +#include "gtk/gtk.h" #include "wx/gtk/win_gtk.h" //----------------------------------------------------------------------------- @@ -38,6 +41,42 @@ bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED return TRUE; } +//----------------------------------------------------------------------------- +// "size_allocate" +//----------------------------------------------------------------------------- + +static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxDialog *win ) +{ + if (!win->HasVMT()) return; + +/* + printf( "OnDialogResize from " ); + if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) + printf( win->GetClassInfo()->GetClassName() ); + printf( ".\n" ); +*/ + + win->GtkOnSize( alloc->x, alloc->y, alloc->width, alloc->height ); +} + +//----------------------------------------------------------------------------- +// "configure_event" +//----------------------------------------------------------------------------- + +static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventConfigure *event, wxDialog *win ) +{ + if (!win->HasVMT()) return FALSE; + + win->m_x = event->x; + win->m_y = event->y; + + wxMoveEvent mevent( wxPoint(win->m_x,win->m_y), win->GetId() ); + mevent.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( mevent ); + + return FALSE; +} + //----------------------------------------------------------------------------- // wxDialog //----------------------------------------------------------------------------- @@ -46,6 +85,7 @@ BEGIN_EVENT_TABLE(wxDialog,wxPanel) EVT_BUTTON (wxID_OK, wxDialog::OnOK) EVT_BUTTON (wxID_CANCEL, wxDialog::OnCancel) EVT_BUTTON (wxID_APPLY, wxDialog::OnApply) + EVT_SIZE (wxDialog::OnSize) EVT_CLOSE (wxDialog::OnCloseWindow) END_EVENT_TABLE() @@ -55,7 +95,6 @@ wxDialog::wxDialog() { m_title = ""; m_modalShowing = FALSE; - wxTopLevelWindows.Insert( this ); } wxDialog::wxDialog( wxWindow *parent, @@ -64,7 +103,6 @@ wxDialog::wxDialog( wxWindow *parent, long style, const wxString &name ) { m_modalShowing = FALSE; - wxTopLevelWindows.Insert( this ); Create( parent, id, title, pos, size, style, name ); } @@ -73,6 +111,8 @@ bool wxDialog::Create( wxWindow *parent, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { + wxTopLevelWindows.Append( this ); + m_needParent = FALSE; PreCreation( parent, id, pos, size, style, name ); @@ -98,9 +138,14 @@ bool wxDialog::Create( wxWindow *parent, gtk_widget_set_usize( m_widget, m_width, m_height ); + gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", + GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event", + GTK_SIGNAL_FUNC(gtk_dialog_configure_callback), (gpointer)this ); + if (m_parent) m_parent->AddChild( this ); - PostCreation(); return TRUE; @@ -109,7 +154,16 @@ bool wxDialog::Create( wxWindow *parent, wxDialog::~wxDialog() { wxTopLevelWindows.DeleteObject( this ); - if (wxTopLevelWindows.Number() == 0) wxTheApp->ExitMainLoop(); + + if (wxTheApp->GetTopWindow() == this) + { + wxTheApp->SetTopWindow( (wxWindow*) NULL ); + } + + if (wxTopLevelWindows.Number() == 0) + { + wxTheApp->ExitMainLoop(); + } } void wxDialog::SetTitle( const wxString& title ) @@ -194,6 +248,66 @@ void wxDialog::OnCloseWindow( wxCloseEvent& event ) } } +void wxDialog::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height ) +{ + // due to a bug in gtk, x,y are always 0 + // m_x = x; + // m_y = y; + + if ((m_height == height) && (m_width == width) && + (m_sizeSet)) return; + if (!m_wxwindow) return; + + m_width = width; + m_height = height; + + if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; + if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; + if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth; + if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; + + gtk_widget_set_usize( m_widget, m_width, m_height ); + + m_sizeSet = TRUE; + + wxSizeEvent event( wxSize(m_width,m_height), GetId() ); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent( event ); +} + +void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) ) +{ + wxASSERT_MSG( (m_widget != NULL), "invalid dialog" ); + + if (GetAutoLayout()) + { + Layout(); + } + else + { + // no child: go out ! + if (!GetChildren().First()) return; + + // do we have exactly one child? + wxWindow *child = (wxWindow *) NULL; + for(wxNode *node = GetChildren().First(); node; node = node->Next()) + { + wxWindow *win = (wxWindow *)node->Data(); + if (!wxIS_KIND_OF(win,wxFrame) && !wxIS_KIND_OF(win,wxDialog)) + { + // it's the second one: do nothing + if (child) return; + child = win; + } + } + + // yes: set it's size to fill all the frame + int client_x, client_y; + GetClientSize( &client_x, &client_y ); + child->SetSize( 1, 1, client_x-2, client_y); + } +} + void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -236,8 +350,8 @@ void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; - if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_minWidth; - if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_minHeight; + if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth; + if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; if ((m_x != -1) || (m_y != -1)) { @@ -254,7 +368,7 @@ void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) wxSizeEvent event( wxSize(m_width,m_height), GetId() ); event.SetEventObject( this ); - ProcessEvent( event ); + GetEventHandler()->ProcessEvent( event ); m_resizing = FALSE; }