virtual bool IsOwnGtkWindow( GdkWindow *window );
void ConnectWidget( GtkWidget *widget );
+ // creates a new widget style if none is there
+ // and sets m_widgetStyle to this value.
GtkStyle *GetWidgetStyle();
+
+ // called by SetFont() and SetXXXColour etc
void SetWidgetStyle();
+
+ // overridden in many GTK widgets
virtual void ApplyWidgetStyle();
#if wxUSE_TOOLTIPS
virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#endif // wxUSE_TOOLTIPS
- // called from GTK signales handlers
+ // called from GTK signales handlers. it indicates that
+ // the layouting functions have to be called later on
+ // (i.e. in idle time, implemented in OnInternalIdle() ).
void UpdateSize() { m_sizeSet = FALSE; }
- void InternalSetPosition(int x, int y) { m_x = x; m_y = y; }
- void InternalSetSize(int w, int h)
- { m_width = w; m_height = h; UpdateSize(); }
// position and size of the window
int m_x, m_y;
// scrolling stuff
GtkAdjustment *m_hAdjust,*m_vAdjust;
- float m_oldHorizontalPos,
- m_oldVerticalPos;
+ float m_oldHorizontalPos;
+ float m_oldVerticalPos;
+
+ // we need an extra XGC flag set to get exposed
+ // events from overlapping children upon moving
+ // them. this flag will be set in this GC and
+ // the GC will be used in wxWindow::ScrollWindow().
GdkGC *m_scrollGC;
// extra (wxGTK-specific) flags
bool m_isStaticBox:1; /* faster than IS_KIND_OF */
bool m_isFrame:1; /* faster than IS_KIND_OF */
bool m_acceptsFocus:1; /* ! wxStaticBox etc. */
-
+
+ // these are true if the style were set before the
+ // widget was realized (typcally in the constructor)
+ // but the actual GTK style must not be set before
+ // the widget has been "realized"
+ bool m_delayedFont:1;
+ bool m_delayedForegroundColour:1;
+ bool m_delayedBackgroundColour:1;
+ bool m_delayedCursor:1;
+
+ // contains GTK's widgets internal information
+ // about non-default widget font and colours.
+ // we create one for each widget that gets any
+ // non-default attribute set via SetFont() or
+ // SetForegroundColour() / SetBackgroundColour().
GtkStyle *m_widgetStyle;
+ // C++ has no virtual methods in the constrcutor
+ // of any class but we need different methods
+ // of inserting a child window into a wxFrame,
+ // wxMDIFrame, wxNotebook etc. this is the
+ // callback that will get used.
wxInsertChildFunction m_insertCallback;
// implement the base class pure virtuals
virtual bool IsOwnGtkWindow( GdkWindow *window );
void ConnectWidget( GtkWidget *widget );
+ // creates a new widget style if none is there
+ // and sets m_widgetStyle to this value.
GtkStyle *GetWidgetStyle();
+
+ // called by SetFont() and SetXXXColour etc
void SetWidgetStyle();
+
+ // overridden in many GTK widgets
virtual void ApplyWidgetStyle();
#if wxUSE_TOOLTIPS
virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#endif // wxUSE_TOOLTIPS
- // called from GTK signales handlers
+ // called from GTK signales handlers. it indicates that
+ // the layouting functions have to be called later on
+ // (i.e. in idle time, implemented in OnInternalIdle() ).
void UpdateSize() { m_sizeSet = FALSE; }
- void InternalSetPosition(int x, int y) { m_x = x; m_y = y; }
- void InternalSetSize(int w, int h)
- { m_width = w; m_height = h; UpdateSize(); }
// position and size of the window
int m_x, m_y;
// scrolling stuff
GtkAdjustment *m_hAdjust,*m_vAdjust;
- float m_oldHorizontalPos,
- m_oldVerticalPos;
+ float m_oldHorizontalPos;
+ float m_oldVerticalPos;
+
+ // we need an extra XGC flag set to get exposed
+ // events from overlapping children upon moving
+ // them. this flag will be set in this GC and
+ // the GC will be used in wxWindow::ScrollWindow().
GdkGC *m_scrollGC;
// extra (wxGTK-specific) flags
bool m_isStaticBox:1; /* faster than IS_KIND_OF */
bool m_isFrame:1; /* faster than IS_KIND_OF */
bool m_acceptsFocus:1; /* ! wxStaticBox etc. */
-
+
+ // these are true if the style were set before the
+ // widget was realized (typcally in the constructor)
+ // but the actual GTK style must not be set before
+ // the widget has been "realized"
+ bool m_delayedFont:1;
+ bool m_delayedForegroundColour:1;
+ bool m_delayedBackgroundColour:1;
+ bool m_delayedCursor:1;
+
+ // contains GTK's widgets internal information
+ // about non-default widget font and colours.
+ // we create one for each widget that gets any
+ // non-default attribute set via SetFont() or
+ // SetForegroundColour() / SetBackgroundColour().
GtkStyle *m_widgetStyle;
+ // C++ has no virtual methods in the constrcutor
+ // of any class but we need different methods
+ // of inserting a child window into a wxFrame,
+ // wxMDIFrame, wxNotebook etc. this is the
+ // callback that will get used.
wxInsertChildFunction m_insertCallback;
// implement the base class pure virtuals
void OnInitDialog( wxInitDialogEvent &event );
/*
- What is this doing in the platform independent part?
+ // What is this doing in the platform independent part?
+ // No doc specifies this. Of what use would that be?
- // accessors
- WXWidget GetHandle() const { return m_widget; }
-
- // the window handle (for the underlying windowing system) and the window
- // id - a number which uniquely identifies a window among its siblings
- // unless it is -1
+ // the window handle (for the underlying windowing system)
union
{
// we have 2 common names for this member, one for MSW and the other
WXWidget m_widget;
WXWidget m_hWnd;
};
+
+ // accessor
+ WXWidget GetHandle() const { return m_widget; }
+
*/
+protected:
+ // the window id - a number which uniquely identifies a window among
+ // its siblings unless it is -1
wxWindowID m_windowId;
// the parent window of this window (or NULL) and the list of the children
else
{
SetReturnCode(wxID_CANCEL);
- this->Show(FALSE);
+ Show(FALSE);
}
}
printf( "OnOK 2.\n" );
if (IsModal())
{
- printf( "OnOK: modal.\n" );
+ printf( "OnOK: modal.\n" );
EndModal(wxID_OK);
}
else
{
- printf( "OnOK: non-modal.\n" );
+ printf( "OnOK: non-modal.\n" );
SetReturnCode(wxID_OK);
this->Show(FALSE);
}
GtkOnSize( m_x, m_y, m_width, m_height );
}
- if (show != m_isShown)
- {
- if (show)
- {
- gtk_widget_show( m_widget );
- }
- else
- gtk_widget_hide( m_widget );
-
- m_isShown = show;
- }
+ bool ret = wxWindow::Show( show );
if (show) InitDialog();
- return TRUE;
+ return ret;
}
bool wxDialog::IsModal() const
if (g_isIdle)
wxapp_install_idle_handler();
- if (win->m_font != *wxSWISS_FONT)
- {
- wxFont font( win->m_font );
- win->m_font = wxNullFont;
- win->SetFont( font );
- }
+ if (win->m_delayedFont)
+ win->SetFont( win->GetFont() );
- if (win->m_backgroundColour != wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ))
- {
- wxColour bg( win->m_backgroundColour );
- win->m_backgroundColour = wxNullColour;
- win->SetBackgroundColour( bg );
- }
+ if (win->m_delayedBackgroundColour)
+ win->SetBackgroundColour( win->GetBackgroundColour() );
- if (win->m_foregroundColour != *wxBLACK)
- {
- wxColour fg( win->m_foregroundColour );
- win->m_foregroundColour = wxNullColour;
- win->SetForegroundColour( fg );
- }
+ if (win->m_delayedForegroundColour)
+ win->SetForegroundColour( win->GetForegroundColour() );
- wxCursor cursor( win->m_cursor );
- win->m_cursor = wxNullCursor;
- win->SetCursor( cursor );
+ win->SetCursor( win->GetCursor() );
return FALSE;
}
m_width = 0;
m_height = 0;
- m_font = *wxSWISS_FONT;
- m_windowName = "noname";
-
m_sizeSet = FALSE;
m_hasVMT = FALSE;
m_needParent = TRUE;
{
wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
- if ( !wxWindowBase::Show(show) )
+ if (!wxWindowBase::Show(show))
+ {
+ // nothing to do
return FALSE;
+ }
if (show)
gtk_widget_show( m_widget );
{
wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
- if ( !wxWindowBase::Enable(enable) )
+ if (!wxWindowBase::Enable(enable))
+ {
+ // nothing to do
return FALSE;
+ }
gtk_widget_set_sensitive( m_widget, enable );
if ( m_wxwindow )
{
wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
- if ( wxWindowBase::SetCursor(cursor) )
+ if (!wxWindowBase::SetCursor(cursor))
{
- if (!m_widget->window) return TRUE;
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedCursor) return FALSE;
+ }
+
+ GtkWidget *connect_widget = GetConnectWidget();
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedCursor = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
if ((m_widget) && (m_widget->window))
gdk_window_set_cursor( m_widget->window, GetCursor().GetCursor() );
if ((m_wxwindow) && (m_wxwindow->window))
gdk_window_set_cursor( m_wxwindow->window, GetCursor().GetCursor() );
- // cursor was set
- return TRUE;
- }
- else
- {
- // cursor hasn't been changed
- return FALSE;
- }
+ // cursor was set
+ return TRUE;
}
void wxWindow::WarpPointer( int WXUNUSED(x), int WXUNUSED(y) )
{
wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
- if (!wxWindowBase::SetBackgroundColour(colour)) return FALSE;
-
+ if (!wxWindowBase::SetBackgroundColour(colour))
+ {
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedBackgroundColour) return FALSE;
+ }
+
GtkWidget *connect_widget = GetConnectWidget();
- if (!connect_widget->window) return TRUE;
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedBackgroundColour = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
if (m_wxwindow && m_wxwindow->window)
{
{
wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
- if (!wxWindowBase::SetForegroundColour(colour)) return FALSE;
-
+ if (!wxWindowBase::SetForegroundColour(colour))
+ {
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedForegroundColour) return FALSE;
+ }
+
GtkWidget *connect_widget = GetConnectWidget();
- if (!connect_widget->window) return TRUE;
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedForegroundColour = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if (sysbg == m_foregroundColour)
{
wxCHECK_MSG( m_widget != NULL, FALSE, _T( "invalid window") );
- if (!wxWindowBase::SetFont(font)) return FALSE;
+ if (!wxWindowBase::SetFont(font))
+ {
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedFont) return FALSE;
+ }
GtkWidget *connect_widget = GetConnectWidget();
- if (!connect_widget->window) return TRUE;
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedFont = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if ( sysbg == m_backgroundColour )
else
{
SetReturnCode(wxID_CANCEL);
- this->Show(FALSE);
+ Show(FALSE);
}
}
printf( "OnOK 2.\n" );
if (IsModal())
{
- printf( "OnOK: modal.\n" );
+ printf( "OnOK: modal.\n" );
EndModal(wxID_OK);
}
else
{
- printf( "OnOK: non-modal.\n" );
+ printf( "OnOK: non-modal.\n" );
SetReturnCode(wxID_OK);
this->Show(FALSE);
}
GtkOnSize( m_x, m_y, m_width, m_height );
}
- if (show != m_isShown)
- {
- if (show)
- {
- gtk_widget_show( m_widget );
- }
- else
- gtk_widget_hide( m_widget );
-
- m_isShown = show;
- }
+ bool ret = wxWindow::Show( show );
if (show) InitDialog();
- return TRUE;
+ return ret;
}
bool wxDialog::IsModal() const
if (g_isIdle)
wxapp_install_idle_handler();
- if (win->m_font != *wxSWISS_FONT)
- {
- wxFont font( win->m_font );
- win->m_font = wxNullFont;
- win->SetFont( font );
- }
+ if (win->m_delayedFont)
+ win->SetFont( win->GetFont() );
- if (win->m_backgroundColour != wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ))
- {
- wxColour bg( win->m_backgroundColour );
- win->m_backgroundColour = wxNullColour;
- win->SetBackgroundColour( bg );
- }
+ if (win->m_delayedBackgroundColour)
+ win->SetBackgroundColour( win->GetBackgroundColour() );
- if (win->m_foregroundColour != *wxBLACK)
- {
- wxColour fg( win->m_foregroundColour );
- win->m_foregroundColour = wxNullColour;
- win->SetForegroundColour( fg );
- }
+ if (win->m_delayedForegroundColour)
+ win->SetForegroundColour( win->GetForegroundColour() );
- wxCursor cursor( win->m_cursor );
- win->m_cursor = wxNullCursor;
- win->SetCursor( cursor );
+ win->SetCursor( win->GetCursor() );
return FALSE;
}
m_width = 0;
m_height = 0;
- m_font = *wxSWISS_FONT;
- m_windowName = "noname";
-
m_sizeSet = FALSE;
m_hasVMT = FALSE;
m_needParent = TRUE;
{
wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
- if ( !wxWindowBase::Show(show) )
+ if (!wxWindowBase::Show(show))
+ {
+ // nothing to do
return FALSE;
+ }
if (show)
gtk_widget_show( m_widget );
{
wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
- if ( !wxWindowBase::Enable(enable) )
+ if (!wxWindowBase::Enable(enable))
+ {
+ // nothing to do
return FALSE;
+ }
gtk_widget_set_sensitive( m_widget, enable );
if ( m_wxwindow )
{
wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
- if ( wxWindowBase::SetCursor(cursor) )
+ if (!wxWindowBase::SetCursor(cursor))
{
- if (!m_widget->window) return TRUE;
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedCursor) return FALSE;
+ }
+
+ GtkWidget *connect_widget = GetConnectWidget();
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedCursor = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
if ((m_widget) && (m_widget->window))
gdk_window_set_cursor( m_widget->window, GetCursor().GetCursor() );
if ((m_wxwindow) && (m_wxwindow->window))
gdk_window_set_cursor( m_wxwindow->window, GetCursor().GetCursor() );
- // cursor was set
- return TRUE;
- }
- else
- {
- // cursor hasn't been changed
- return FALSE;
- }
+ // cursor was set
+ return TRUE;
}
void wxWindow::WarpPointer( int WXUNUSED(x), int WXUNUSED(y) )
{
wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
- if (!wxWindowBase::SetBackgroundColour(colour)) return FALSE;
-
+ if (!wxWindowBase::SetBackgroundColour(colour))
+ {
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedBackgroundColour) return FALSE;
+ }
+
GtkWidget *connect_widget = GetConnectWidget();
- if (!connect_widget->window) return TRUE;
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedBackgroundColour = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
if (m_wxwindow && m_wxwindow->window)
{
{
wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
- if (!wxWindowBase::SetForegroundColour(colour)) return FALSE;
-
+ if (!wxWindowBase::SetForegroundColour(colour))
+ {
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedForegroundColour) return FALSE;
+ }
+
GtkWidget *connect_widget = GetConnectWidget();
- if (!connect_widget->window) return TRUE;
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedForegroundColour = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if (sysbg == m_foregroundColour)
{
wxCHECK_MSG( m_widget != NULL, FALSE, _T( "invalid window") );
- if (!wxWindowBase::SetFont(font)) return FALSE;
+ if (!wxWindowBase::SetFont(font))
+ {
+ // don't leave if the GTK widget has just
+ // been realized
+ if (!m_delayedFont) return FALSE;
+ }
GtkWidget *connect_widget = GetConnectWidget();
- if (!connect_widget->window) return TRUE;
+ if (!connect_widget->window)
+ {
+ // indicate that a new style has been set
+ // but it couldn't get applied as the
+ // widget hasn't been realized yet.
+ m_delayedFont = TRUE;
+
+ // pretend we have done something
+ return TRUE;
+ }
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if ( sysbg == m_backgroundColour )