From de8113d9a3b19159fe06e1f3321c799085c8d47d Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 17 Feb 1999 16:42:36 +0000 Subject: [PATCH] Let's face it, GTK's resizing is broken and I cannot repair it. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1707 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/defs.h | 5 +- include/wx/gtk/checklst.h | 4 ++ include/wx/gtk/dialog.h | 1 + include/wx/gtk/frame.h | 2 +- include/wx/gtk/spinbutt.h | 2 +- include/wx/gtk/window.h | 2 +- include/wx/gtk1/checklst.h | 4 ++ include/wx/gtk1/dialog.h | 1 + include/wx/gtk1/frame.h | 2 +- include/wx/gtk1/spinbutt.h | 2 +- include/wx/gtk1/window.h | 2 +- src/gtk/app.cpp | 2 +- src/gtk/dialog.cpp | 123 +++++++++++++++++++++---------------- src/gtk/frame.cpp | 62 ++++++++----------- src/gtk/window.cpp | 5 +- src/gtk1/app.cpp | 2 +- src/gtk1/dialog.cpp | 123 +++++++++++++++++++++---------------- src/gtk1/frame.cpp | 62 ++++++++----------- src/gtk1/window.cpp | 5 +- 19 files changed, 221 insertions(+), 190 deletions(-) diff --git a/include/wx/defs.h b/include/wx/defs.h index 10fe0fa316..394a4e1d37 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -26,7 +26,8 @@ // ---------------------------------------------------------------------------- // OS -#if defined(__HPUX__) || defined(____SVR4____) || defined(__LINUX__) || defined(__sgi ) || defined(__unix__) +#if defined(__HPUX__) || defined(____SVR4____) || defined(__LINUX__) || defined(__sgi ) || \ + defined(__unix__) || defined(sun) || defined(__SUN__) #ifndef __UNIX__ #define __UNIX__ #endif // Unix @@ -166,7 +167,7 @@ typedef unsigned int bool; #endif -#elif defined(__SUNCC__) +#elif defined(__SUNCC__) || defined(__SUNPRO_CC) #ifdef __SUNPRO_CC // starting from version 5.0 Sun CC understands 'bool' #if __SUNPRO_CC <= 0x0420 diff --git a/include/wx/gtk/checklst.h b/include/wx/gtk/checklst.h index b1856957a5..7dc24e2716 100644 --- a/include/wx/gtk/checklst.h +++ b/include/wx/gtk/checklst.h @@ -41,7 +41,11 @@ public: const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int nStrings = 0, +#if defined(__SUNCC__) + const wxString choices[] = NULL, +#else const wxString choices[] = (const wxString *) NULL, +#endif long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxListBoxNameStr); diff --git a/include/wx/gtk/dialog.h b/include/wx/gtk/dialog.h index be05cebb0f..0c7ea69240 100644 --- a/include/wx/gtk/dialog.h +++ b/include/wx/gtk/dialog.h @@ -94,6 +94,7 @@ public: // implementation virtual void GtkOnSize( int x, int y, int width, int height ); + virtual void OnInternalIdle(); bool m_modalShowing; wxString m_title; diff --git a/include/wx/gtk/frame.h b/include/wx/gtk/frame.h index 0486e2670e..671e1b783a 100644 --- a/include/wx/gtk/frame.h +++ b/include/wx/gtk/frame.h @@ -65,7 +65,7 @@ public: virtual void GetClientSize( int *width, int *height ) const; wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); } - virtual void SetClientSize( int const width, int const height ); + virtual void SetClientSize( int width, int height ); virtual void SetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO ); diff --git a/include/wx/gtk/spinbutt.h b/include/wx/gtk/spinbutt.h index 4192465863..88161fd770 100644 --- a/include/wx/gtk/spinbutt.h +++ b/include/wx/gtk/spinbutt.h @@ -63,7 +63,7 @@ public: GtkAdjustment *m_adjust; float m_oldPos; - DECLARE_EVENT_TABLE(); + DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- diff --git a/include/wx/gtk/window.h b/include/wx/gtk/window.h index 6d460d0530..b2d326bf5a 100644 --- a/include/wx/gtk/window.h +++ b/include/wx/gtk/window.h @@ -152,7 +152,7 @@ public: virtual void GetSize( int *width, int *height ) const; wxSize GetSize() const { int w, h; GetSize(& w, & h); return wxSize(w, h); } - virtual void SetClientSize( int const width, int const height ); + virtual void SetClientSize( int width, int height ); virtual void GetClientSize( int *width, int *height ) const; wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); } diff --git a/include/wx/gtk1/checklst.h b/include/wx/gtk1/checklst.h index b1856957a5..7dc24e2716 100644 --- a/include/wx/gtk1/checklst.h +++ b/include/wx/gtk1/checklst.h @@ -41,7 +41,11 @@ public: const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int nStrings = 0, +#if defined(__SUNCC__) + const wxString choices[] = NULL, +#else const wxString choices[] = (const wxString *) NULL, +#endif long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxListBoxNameStr); diff --git a/include/wx/gtk1/dialog.h b/include/wx/gtk1/dialog.h index be05cebb0f..0c7ea69240 100644 --- a/include/wx/gtk1/dialog.h +++ b/include/wx/gtk1/dialog.h @@ -94,6 +94,7 @@ public: // implementation virtual void GtkOnSize( int x, int y, int width, int height ); + virtual void OnInternalIdle(); bool m_modalShowing; wxString m_title; diff --git a/include/wx/gtk1/frame.h b/include/wx/gtk1/frame.h index 0486e2670e..671e1b783a 100644 --- a/include/wx/gtk1/frame.h +++ b/include/wx/gtk1/frame.h @@ -65,7 +65,7 @@ public: virtual void GetClientSize( int *width, int *height ) const; wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); } - virtual void SetClientSize( int const width, int const height ); + virtual void SetClientSize( int width, int height ); virtual void SetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO ); diff --git a/include/wx/gtk1/spinbutt.h b/include/wx/gtk1/spinbutt.h index 4192465863..88161fd770 100644 --- a/include/wx/gtk1/spinbutt.h +++ b/include/wx/gtk1/spinbutt.h @@ -63,7 +63,7 @@ public: GtkAdjustment *m_adjust; float m_oldPos; - DECLARE_EVENT_TABLE(); + DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- diff --git a/include/wx/gtk1/window.h b/include/wx/gtk1/window.h index 6d460d0530..b2d326bf5a 100644 --- a/include/wx/gtk1/window.h +++ b/include/wx/gtk1/window.h @@ -152,7 +152,7 @@ public: virtual void GetSize( int *width, int *height ) const; wxSize GetSize() const { int w, h; GetSize(& w, & h); return wxSize(w, h); } - virtual void SetClientSize( int const width, int const height ); + virtual void SetClientSize( int width, int height ); virtual void GetClientSize( int *width, int *height ) const; wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); } diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 78eef6efe3..0f4c0825c3 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -31,7 +31,7 @@ #include "unistd.h" // add more here if you run into problems -#if defined(__SUN__) && !defined(__SunOs_5_6) && !defined(__SunOs_5_7) +#if defined(__SUN__) && !defined(__SunOs_5_6) && !defined(__SunOs_5_7) && !defined(__SUNPRO_CC) extern "C" { void usleep(unsigned long usec); diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index 2efbf3b285..2c7594587c 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -56,7 +56,12 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation printf( ".\n" ); */ - win->GtkOnSize( alloc->x, alloc->y, alloc->width, alloc->height ); + if ((win->m_width != alloc->width) || (win->m_height != alloc->height)) + { + win->m_sizeSet = FALSE; + win->m_width = alloc->width; + win->m_height = alloc->height; + } } //----------------------------------------------------------------------------- @@ -94,6 +99,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxPanel) wxDialog::wxDialog() { m_title = ""; + m_sizeSet = FALSE; m_modalShowing = FALSE; } @@ -103,6 +109,7 @@ wxDialog::wxDialog( wxWindow *parent, long style, const wxString &name ) { m_modalShowing = FALSE; + m_sizeSet = FALSE; Create( parent, id, title, pos, size, style, name ); } @@ -133,10 +140,11 @@ bool wxDialog::Create( wxWindow *parent, SetTitle( title ); - if ((m_x != -1) || (m_y != -1)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); + if (m_parent) m_parent->AddChild( this ); - gtk_widget_set_usize( m_widget, m_width, m_height ); + PostCreation(); + + gtk_widget_realize( m_widget ); gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this ); @@ -144,10 +152,6 @@ bool wxDialog::Create( wxWindow *parent, 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; } @@ -253,33 +257,6 @@ bool wxDialog::Destroy() return TRUE; } -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" ); @@ -290,23 +267,23 @@ void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) ) } else { - // no child: go out ! + /* no child: go out ! */ if (!GetChildren().First()) return; - // do we have exactly one child? + /* 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 + /* it's the second one: do nothing */ if (child) return; child = win; } } - // yes: set it's size to fill all the frame + /* 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); @@ -315,12 +292,10 @@ void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) ) void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - - // Don't do anything for children of wxMDIChildFrame - if (!m_wxwindow) return; + wxASSERT_MSG( (m_widget != NULL), "invalid dialog" ); + wxASSERT_MSG( (m_wxwindow != NULL), "invalid dialog" ); - if (m_resizing) return; // I don't like recursions + if (m_resizing) return; /* I don't like recursions */ m_resizing = TRUE; int old_x = m_x; @@ -361,20 +336,17 @@ void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_x != -1) || (m_y != -1)) { if ((m_x != old_x) || (m_y != old_y)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); + { + /* m_sizeSet = FALSE; */ + gtk_widget_set_uposition( m_widget, m_x, m_y ); + } } if ((m_width != old_width) || (m_height != old_height)) { - gtk_widget_set_usize( m_widget, m_width, m_height ); + m_sizeSet = FALSE; } - m_sizeSet = TRUE; - - wxSizeEvent event( wxSize(m_width,m_height), GetId() ); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); - m_resizing = FALSE; } @@ -383,6 +355,33 @@ void wxDialog::SetSize( int width, int height ) SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); } +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; + + /* we actually set the size of a frame here and no-where else */ + 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::Centre( int direction ) { wxASSERT_MSG( (m_widget != NULL), "invalid dialog" ); @@ -396,15 +395,31 @@ void wxDialog::Centre( int direction ) Move( x, y ); } +void wxDialog::OnInternalIdle() +{ + if (!m_sizeSet) + GtkOnSize( m_x, m_y, m_width, m_height ); +} + bool wxDialog::Show( bool show ) { if (!show && IsModal()) { - EndModal( wxID_CANCEL ); + EndModal( wxID_CANCEL ); } - wxWindow::Show( show ); + if (show && !m_sizeSet) + { + /* by calling GtkOnSize here, we don't have to call + either after showing the frame, which would entail + much ugly flicker nor from within the size_allocate + handler, because GTK 1.1.X forbids that. */ + GtkOnSize( m_x, m_y, m_width, m_height ); + } + + wxWindow::Show( show ); + if (show) InitDialog(); return TRUE; diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index 796b55629f..77cce846da 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -152,15 +152,6 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title, m_widget = gtk_window_new( win_type ); -#ifdef __WXDEBUG__ - debug_focus_in( m_widget, "wxFrame::m_widget", name ); -#endif - - if ((size.x != -1) && (size.y != -1)) - gtk_widget_set_usize( m_widget, m_width, m_height ); - if ((pos.x != -1) && (pos.y != -1)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); - gtk_window_set_title( GTK_WINDOW(m_widget), title ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); @@ -173,22 +164,20 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title, gtk_widget_show( m_wxwindow ); GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); -#ifdef __WXDEBUG__ - debug_focus_in( m_wxwindow, "wxFrame::m_wxwindow", name ); -#endif - gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow ); + if (m_parent) m_parent->AddChild( this ); + + PostCreation(); + + gtk_widget_realize( m_widget ); + gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event", GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this ); - if (m_parent) m_parent->AddChild( this ); - - PostCreation(); - return TRUE; } @@ -262,9 +251,9 @@ wxPoint wxFrame::GetClientAreaOrigin() const void wxFrame::SetSize( int x, int y, int width, int height, int sizeFlags ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); - /* Don't do anything for children of wxMDIChildFrame */ + /* don't do anything for children of wxMDIChildFrame */ if (!m_wxwindow) return; if (m_resizing) return; // I don't like recursions @@ -308,12 +297,16 @@ void wxFrame::SetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_x != -1) || (m_y != -1)) { if ((m_x != old_x) || (m_y != old_y)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); + { + /* m_sizeSet = FALSE; */ + gtk_widget_set_uposition( m_widget, m_x, m_y ); + } } if ((m_width != old_width) || (m_height != old_height)) { - m_sizeSet = FALSE; + /* we set the size in GtkOnSize */ + m_sizeSet = FALSE; } m_resizing = FALSE; @@ -360,7 +353,7 @@ void wxFrame::GetClientSize( int *width, int *height ) const } } -void wxFrame::SetClientSize( int const width, int const height ) +void wxFrame::SetClientSize( int width, int height ) { wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); @@ -390,18 +383,16 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_width = width; m_height = height; + /* check if size is in legal range */ 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 ); - gdk_window_resize( m_widget->window, m_width, m_height ); - - // this emulates the new wxMSW behaviour of placing all - // frame-subwindows (menu, toolbar..) on one native window - // OK, this hurts in the eye, but I don't want to call SetSize() - // because I don't want to call any non-native functions here. + /* this emulates the new wxMSW behaviour of placing all + * frame-subwindows (menu, toolbar..) on one native window + * this hurts in the eye, but I don't want to call SetSize() + * because I don't want to call any non-native functions here. */ if (m_frameMenuBar) { @@ -451,16 +442,17 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height gtk_widget_set_usize( m_frameStatusBar->m_widget, ww, hh ); } + /* we actually set the size of a frame here and no-where else */ + gtk_widget_set_usize( m_widget, m_width, m_height ); + m_sizeSet = TRUE; /* send size event to frame */ - wxSizeEvent event( wxSize(m_width,m_height), GetId() ); event.SetEventObject( this ); GetEventHandler()->ProcessEvent( event ); /* send size event to status bar */ - if (m_frameStatusBar) { wxSizeEvent event2( wxSize(m_frameStatusBar->m_width,m_frameStatusBar->m_height), m_frameStatusBar->GetId() ); @@ -496,10 +488,10 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) } else { - // no child: go out ! + /* no child: go out ! */ if (!GetChildren().First()) return; - // do we have exactly one child? + /* do we have exactly one child? */ wxWindow *child = (wxWindow *) NULL; for(wxNode *node = GetChildren().First(); node; node = node->Next()) { @@ -512,13 +504,13 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) #endif ) { - // it's the second one: do nothing + /* it's the second one: do nothing */ if (child) return; child = win; } } - // yes: set it's size to fill all the frame + /* 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-2 ); diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index cc76aac9fb..807f497abf 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1691,6 +1691,8 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, void wxWindow::PostCreation() { + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + if (m_wxwindow) { gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event", @@ -1702,7 +1704,8 @@ void wxWindow::PostCreation() ConnectWidget( GetConnectWidget() ); - if (m_widget && m_parent) gtk_widget_realize( m_widget ); + /* we force the creation of wxFrame and wxDialog in the respective code */ + if (m_parent) gtk_widget_realize( m_widget ); if (m_wxwindow) gtk_widget_realize( m_wxwindow ); diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index 78eef6efe3..0f4c0825c3 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -31,7 +31,7 @@ #include "unistd.h" // add more here if you run into problems -#if defined(__SUN__) && !defined(__SunOs_5_6) && !defined(__SunOs_5_7) +#if defined(__SUN__) && !defined(__SunOs_5_6) && !defined(__SunOs_5_7) && !defined(__SUNPRO_CC) extern "C" { void usleep(unsigned long usec); diff --git a/src/gtk1/dialog.cpp b/src/gtk1/dialog.cpp index 2efbf3b285..2c7594587c 100644 --- a/src/gtk1/dialog.cpp +++ b/src/gtk1/dialog.cpp @@ -56,7 +56,12 @@ static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation printf( ".\n" ); */ - win->GtkOnSize( alloc->x, alloc->y, alloc->width, alloc->height ); + if ((win->m_width != alloc->width) || (win->m_height != alloc->height)) + { + win->m_sizeSet = FALSE; + win->m_width = alloc->width; + win->m_height = alloc->height; + } } //----------------------------------------------------------------------------- @@ -94,6 +99,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxPanel) wxDialog::wxDialog() { m_title = ""; + m_sizeSet = FALSE; m_modalShowing = FALSE; } @@ -103,6 +109,7 @@ wxDialog::wxDialog( wxWindow *parent, long style, const wxString &name ) { m_modalShowing = FALSE; + m_sizeSet = FALSE; Create( parent, id, title, pos, size, style, name ); } @@ -133,10 +140,11 @@ bool wxDialog::Create( wxWindow *parent, SetTitle( title ); - if ((m_x != -1) || (m_y != -1)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); + if (m_parent) m_parent->AddChild( this ); - gtk_widget_set_usize( m_widget, m_width, m_height ); + PostCreation(); + + gtk_widget_realize( m_widget ); gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this ); @@ -144,10 +152,6 @@ bool wxDialog::Create( wxWindow *parent, 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; } @@ -253,33 +257,6 @@ bool wxDialog::Destroy() return TRUE; } -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" ); @@ -290,23 +267,23 @@ void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) ) } else { - // no child: go out ! + /* no child: go out ! */ if (!GetChildren().First()) return; - // do we have exactly one child? + /* 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 + /* it's the second one: do nothing */ if (child) return; child = win; } } - // yes: set it's size to fill all the frame + /* 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); @@ -315,12 +292,10 @@ void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) ) void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - - // Don't do anything for children of wxMDIChildFrame - if (!m_wxwindow) return; + wxASSERT_MSG( (m_widget != NULL), "invalid dialog" ); + wxASSERT_MSG( (m_wxwindow != NULL), "invalid dialog" ); - if (m_resizing) return; // I don't like recursions + if (m_resizing) return; /* I don't like recursions */ m_resizing = TRUE; int old_x = m_x; @@ -361,20 +336,17 @@ void wxDialog::SetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_x != -1) || (m_y != -1)) { if ((m_x != old_x) || (m_y != old_y)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); + { + /* m_sizeSet = FALSE; */ + gtk_widget_set_uposition( m_widget, m_x, m_y ); + } } if ((m_width != old_width) || (m_height != old_height)) { - gtk_widget_set_usize( m_widget, m_width, m_height ); + m_sizeSet = FALSE; } - m_sizeSet = TRUE; - - wxSizeEvent event( wxSize(m_width,m_height), GetId() ); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); - m_resizing = FALSE; } @@ -383,6 +355,33 @@ void wxDialog::SetSize( int width, int height ) SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); } +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; + + /* we actually set the size of a frame here and no-where else */ + 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::Centre( int direction ) { wxASSERT_MSG( (m_widget != NULL), "invalid dialog" ); @@ -396,15 +395,31 @@ void wxDialog::Centre( int direction ) Move( x, y ); } +void wxDialog::OnInternalIdle() +{ + if (!m_sizeSet) + GtkOnSize( m_x, m_y, m_width, m_height ); +} + bool wxDialog::Show( bool show ) { if (!show && IsModal()) { - EndModal( wxID_CANCEL ); + EndModal( wxID_CANCEL ); } - wxWindow::Show( show ); + if (show && !m_sizeSet) + { + /* by calling GtkOnSize here, we don't have to call + either after showing the frame, which would entail + much ugly flicker nor from within the size_allocate + handler, because GTK 1.1.X forbids that. */ + GtkOnSize( m_x, m_y, m_width, m_height ); + } + + wxWindow::Show( show ); + if (show) InitDialog(); return TRUE; diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index 796b55629f..77cce846da 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -152,15 +152,6 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title, m_widget = gtk_window_new( win_type ); -#ifdef __WXDEBUG__ - debug_focus_in( m_widget, "wxFrame::m_widget", name ); -#endif - - if ((size.x != -1) && (size.y != -1)) - gtk_widget_set_usize( m_widget, m_width, m_height ); - if ((pos.x != -1) && (pos.y != -1)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); - gtk_window_set_title( GTK_WINDOW(m_widget), title ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); @@ -173,22 +164,20 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title, gtk_widget_show( m_wxwindow ); GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); -#ifdef __WXDEBUG__ - debug_focus_in( m_wxwindow, "wxFrame::m_wxwindow", name ); -#endif - gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow ); + if (m_parent) m_parent->AddChild( this ); + + PostCreation(); + + gtk_widget_realize( m_widget ); + gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(m_widget), "configure_event", GTK_SIGNAL_FUNC(gtk_frame_configure_callback), (gpointer)this ); - if (m_parent) m_parent->AddChild( this ); - - PostCreation(); - return TRUE; } @@ -262,9 +251,9 @@ wxPoint wxFrame::GetClientAreaOrigin() const void wxFrame::SetSize( int x, int y, int width, int height, int sizeFlags ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); - /* Don't do anything for children of wxMDIChildFrame */ + /* don't do anything for children of wxMDIChildFrame */ if (!m_wxwindow) return; if (m_resizing) return; // I don't like recursions @@ -308,12 +297,16 @@ void wxFrame::SetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_x != -1) || (m_y != -1)) { if ((m_x != old_x) || (m_y != old_y)) - gtk_widget_set_uposition( m_widget, m_x, m_y ); + { + /* m_sizeSet = FALSE; */ + gtk_widget_set_uposition( m_widget, m_x, m_y ); + } } if ((m_width != old_width) || (m_height != old_height)) { - m_sizeSet = FALSE; + /* we set the size in GtkOnSize */ + m_sizeSet = FALSE; } m_resizing = FALSE; @@ -360,7 +353,7 @@ void wxFrame::GetClientSize( int *width, int *height ) const } } -void wxFrame::SetClientSize( int const width, int const height ) +void wxFrame::SetClientSize( int width, int height ) { wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); @@ -390,18 +383,16 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_width = width; m_height = height; + /* check if size is in legal range */ 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 ); - gdk_window_resize( m_widget->window, m_width, m_height ); - - // this emulates the new wxMSW behaviour of placing all - // frame-subwindows (menu, toolbar..) on one native window - // OK, this hurts in the eye, but I don't want to call SetSize() - // because I don't want to call any non-native functions here. + /* this emulates the new wxMSW behaviour of placing all + * frame-subwindows (menu, toolbar..) on one native window + * this hurts in the eye, but I don't want to call SetSize() + * because I don't want to call any non-native functions here. */ if (m_frameMenuBar) { @@ -451,16 +442,17 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height gtk_widget_set_usize( m_frameStatusBar->m_widget, ww, hh ); } + /* we actually set the size of a frame here and no-where else */ + gtk_widget_set_usize( m_widget, m_width, m_height ); + m_sizeSet = TRUE; /* send size event to frame */ - wxSizeEvent event( wxSize(m_width,m_height), GetId() ); event.SetEventObject( this ); GetEventHandler()->ProcessEvent( event ); /* send size event to status bar */ - if (m_frameStatusBar) { wxSizeEvent event2( wxSize(m_frameStatusBar->m_width,m_frameStatusBar->m_height), m_frameStatusBar->GetId() ); @@ -496,10 +488,10 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) } else { - // no child: go out ! + /* no child: go out ! */ if (!GetChildren().First()) return; - // do we have exactly one child? + /* do we have exactly one child? */ wxWindow *child = (wxWindow *) NULL; for(wxNode *node = GetChildren().First(); node; node = node->Next()) { @@ -512,13 +504,13 @@ void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) #endif ) { - // it's the second one: do nothing + /* it's the second one: do nothing */ if (child) return; child = win; } } - // yes: set it's size to fill all the frame + /* 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-2 ); diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index cc76aac9fb..807f497abf 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1691,6 +1691,8 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, void wxWindow::PostCreation() { + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + if (m_wxwindow) { gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event", @@ -1702,7 +1704,8 @@ void wxWindow::PostCreation() ConnectWidget( GetConnectWidget() ); - if (m_widget && m_parent) gtk_widget_realize( m_widget ); + /* we force the creation of wxFrame and wxDialog in the respective code */ + if (m_parent) gtk_widget_realize( m_widget ); if (m_wxwindow) gtk_widget_realize( m_wxwindow ); -- 2.45.2