Had to change the time point, when widgets are

created (no longer forced). This seems to break
  wxNotebook...


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2276 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 1999-04-24 21:57:18 +00:00
parent 38444daf66
commit 2b07d71308
19 changed files with 363 additions and 206 deletions

View File

@ -474,6 +474,7 @@ m_text(NULL), m_notebook(NULL)
panel = new wxPanel(m_notebook);
m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 5, choices );
m_choice->SetBackgroundColour( "red" );
(void)new wxButton( panel, ID_CHOICE_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
(void)new wxButton( panel, ID_CHOICE_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
(void)new wxButton( panel, ID_CHOICE_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );

View File

@ -121,9 +121,6 @@ bool wxCheckBox::Create(wxWindow *parent,
PostCreation();
gtk_widget_realize( m_widgetLabel );
gtk_widget_realize( m_widgetCheckbox );
SetBackgroundColour( parent->GetBackgroundColour() );
SetForegroundColour( parent->GetForegroundColour() );
SetFont( parent->GetFont() );

View File

@ -85,9 +85,6 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
GtkWidget *item = gtk_menu_item_new_with_label( choices[i].mbc_str() );
gtk_menu_append( GTK_MENU(menu), item );
gtk_widget_realize( item );
gtk_widget_realize( GTK_BIN(item)->child );
gtk_widget_show( item );
gtk_signal_connect( GTK_OBJECT( item ), "activate",
@ -124,10 +121,13 @@ void wxChoice::AppendCommon( const wxString &item )
gtk_menu_append( GTK_MENU(menu), menu_item );
gtk_widget_realize( menu_item );
gtk_widget_realize( GTK_BIN(menu_item)->child );
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_realize( menu_item );
gtk_widget_realize( GTK_BIN(menu_item)->child );
if (m_widgetStyle) ApplyWidgetStyle();
if (m_widgetStyle) ApplyWidgetStyle();
}
gtk_signal_connect( GTK_OBJECT( menu_item ), "activate",
GTK_SIGNAL_FUNC(gtk_choice_clicked_callback), (gpointer*)this );

View File

@ -113,9 +113,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
gtk_container_add( GTK_CONTAINER(list), list_item );
gtk_widget_realize( list_item );
gtk_widget_realize( GTK_BIN(list_item)->child );
gtk_widget_show( list_item );
gtk_signal_connect( GTK_OBJECT(list_item), "select",
@ -132,10 +129,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
if (!value.IsNull()) SetValue( value );
gtk_widget_realize( GTK_COMBO(m_widget)->list );
gtk_widget_realize( GTK_COMBO(m_widget)->entry );
gtk_widget_realize( GTK_COMBO(m_widget)->button );
if (style & wxCB_READONLY)
gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(m_widget)->entry ), FALSE );
@ -176,7 +169,13 @@ void wxComboBox::AppendCommon( const wxString &item )
gtk_container_add( GTK_CONTAINER(list), list_item );
if (m_widgetStyle) ApplyWidgetStyle();
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_realize( list_item );
gtk_widget_realize( GTK_BIN(list_item)->child );
if (m_widgetStyle) ApplyWidgetStyle();
}
gtk_widget_show( list_item );
}

View File

@ -825,8 +825,6 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh
long *descent, long *externalLeading,
wxFont *theFont, bool WXUNUSED(use16) )
{
wxCHECK_RET( Ok(), _T("invalid window dc") );
wxFont fontToUse = m_font;
if (theFont) fontToUse = *theFont;
@ -839,16 +837,12 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh
long wxWindowDC::GetCharWidth()
{
wxCHECK_MSG( Ok(), 0, _T("invalid window dc") );
GdkFont *font = m_font.GetInternalFont( m_scaleY );
return long(gdk_string_width( font, "H" ) / m_scaleX);
}
long wxWindowDC::GetCharHeight()
{
wxCHECK_MSG( Ok(), 0, _T("invalid window dc") );
GdkFont *font = m_font.GetInternalFont( m_scaleY );
return long((font->ascent + font->descent) / m_scaleY);
}
@ -883,8 +877,6 @@ void wxWindowDC::Clear()
void wxWindowDC::SetFont( const wxFont &font )
{
wxCHECK_RET( Ok(), _T("invalid window dc") );
m_font = font;
}

View File

@ -82,6 +82,48 @@ static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEvent
return FALSE;
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot MWM hints before the widget has been realized,
so we do this directly after realization */
static gint
gtk_dialog_realized_callback( GtkWidget *widget, wxWindow *win )
{
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
return FALSE;
}
//-----------------------------------------------------------------------------
// wxDialog
//-----------------------------------------------------------------------------
@ -143,37 +185,12 @@ bool wxDialog::Create( wxWindow *parent,
PostCreation();
gtk_widget_realize( m_widget );
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
/* 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",
GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
if ((m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations(m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions(m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1);
/* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );

View File

@ -146,6 +146,48 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC
return FALSE;
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot MWM hints before the widget has been realized,
so we do this directly after realization */
static gint
gtk_frame_realized_callback( GtkWidget *widget, wxWindow *win )
{
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
return FALSE;
}
//-----------------------------------------------------------------------------
// InsertChild for wxFrame
//-----------------------------------------------------------------------------
@ -281,7 +323,6 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
gtk_widget_show( m_mainWidget );
GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
gtk_widget_realize( m_mainWidget );
/* m_wxwindow only represents the client area without toolbar and menubar */
m_wxwindow = gtk_myfixed_new();
@ -293,37 +334,11 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
PostCreation();
gtk_widget_realize( m_widget );
/* 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",
GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations(m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions(m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1);
/* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );

View File

@ -274,8 +274,6 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
PostCreation();
gtk_widget_realize( GTK_WIDGET(m_list) );
SetBackgroundColour( parent->GetBackgroundColour() );
SetForegroundColour( parent->GetForegroundColour() );
SetFont( parent->GetFont() );
@ -411,8 +409,6 @@ void wxListBox::AppendCommon( const wxString &item )
gtk_signal_connect( GTK_OBJECT(list_item), "deselect",
GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
if (m_widgetStyle) ApplyWidgetStyle();
gtk_signal_connect( GTK_OBJECT(list_item),
"button_press_event",
(GtkSignalFunc)gtk_listbox_button_press_callback,
@ -430,15 +426,23 @@ void wxListBox::AppendCommon( const wxString &item )
ConnectWidget( list_item );
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_realize( list_item );
gtk_widget_realize( GTK_BIN(list_item)->child );
if (m_widgetStyle) ApplyWidgetStyle();
#if wxUSE_DRAG_AND_DROP
#ifndef NEW_GTK_DND_CODE
if (m_dropTarget) m_dropTarget->RegisterWidget( list_item );
if (m_dropTarget) m_dropTarget->RegisterWidget( list_item );
#endif
#endif
#if wxUSE_TOOLTIPS
if (m_toolTip) m_toolTip->Apply( this );
if (m_toolTip) m_toolTip->Apply( this );
#endif
}
}
void wxListBox::Append( const wxString &item )

View File

@ -109,9 +109,9 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
(win->m_width == alloc->width) &&
(win->m_height == alloc->height))
{
return;
// return;
}
win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height );
if (win->GetAutoLayout()) win->Layout();

View File

@ -1294,6 +1294,40 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
return FALSE;
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot set colours, fonts and cursors before the widget has
been realized, so we do this directly after realization */
static gint
gtk_window_realized_callback( GtkWidget *widget, wxWindow *win )
{
if (win->m_font != *wxSWISS_FONT)
{
wxFont font( win->m_font );
win->m_font = wxNullFont;
win->SetFont( font );
}
if (win->m_backgroundColour != wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ))
{
wxColour bg( win->m_backgroundColour );
win->m_backgroundColour = wxNullColour;
win->SetBackgroundColour( bg );
}
if (win->m_foregroundColour != *wxBLACK)
{
wxColour fg( win->m_foregroundColour );
win->m_foregroundColour = wxNullColour;
win->SetForegroundColour( fg );
}
return FALSE;
}
//-----------------------------------------------------------------------------
// InsertChild for wxWindow.
//-----------------------------------------------------------------------------
@ -1750,13 +1784,12 @@ void wxWindow::PostCreation()
ConnectWidget( GetConnectWidget() );
/* 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 );
SetCursor( *wxSTANDARD_CURSOR );
/* we cannot set colours, fonts and cursors before the widget has
been realized, so we do this directly after realization */
gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
GTK_SIGNAL_FUNC(gtk_window_realized_callback), (gpointer) this );
m_hasVMT = TRUE;
}
@ -2071,6 +2104,8 @@ void wxWindow::ClientToScreen( int *x, int *y )
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
GdkWindow *source = (GdkWindow *) NULL;
if (m_wxwindow)
source = m_wxwindow->window;
@ -2098,6 +2133,8 @@ void wxWindow::ScreenToClient( int *x, int *y )
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
GdkWindow *source = (GdkWindow *) NULL;
if (m_wxwindow)
source = m_wxwindow->window;
@ -2351,6 +2388,8 @@ void wxWindow::Raise()
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
if (m_widget) gdk_window_raise( m_widget->window );
}
@ -2358,6 +2397,8 @@ void wxWindow::Lower()
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
if (m_widget) gdk_window_lower( m_widget->window );
}
@ -2459,8 +2500,9 @@ void wxWindow::SetCursor( const wxCursor &cursor )
*m_cursor = *wxSTANDARD_CURSOR;
}
if ((m_widget) && (m_widget->window))
gdk_window_set_cursor( m_widget->window, m_cursor->GetCursor() );
if (!m_widget->window) return;
gdk_window_set_cursor( m_widget->window, m_cursor->GetCursor() );
if ((m_wxwindow) && (m_wxwindow->window))
gdk_window_set_cursor( m_wxwindow->window, m_cursor->GetCursor() );
@ -2475,6 +2517,8 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
if (eraseBackground && m_wxwindow && m_wxwindow->window)
{
if (rect)
@ -2540,6 +2584,8 @@ void wxWindow::Clear()
{
wxCHECK_RET( m_widget != NULL, _T("invalid window") );
if (!m_widget->window) return;
if (m_wxwindow && m_wxwindow->window)
{
gdk_window_clear( m_wxwindow->window );
@ -2596,6 +2642,8 @@ void wxWindow::SetBackgroundColour( const wxColour &colour )
m_backgroundColour = colour;
if (!m_backgroundColour.Ok()) return;
if (!m_widget->window) return;
if (m_wxwindow && m_wxwindow->window)
{
/* wxMSW doesn't clear the window here. I don't do that
@ -2636,6 +2684,8 @@ void wxWindow::SetForegroundColour( const wxColour &colour )
m_foregroundColour = colour;
if (!m_foregroundColour.Ok()) return;
if (!m_widget->window) return;
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if (sysbg.Red() == colour.Red() &&
sysbg.Green() == colour.Green() &&
@ -2896,6 +2946,8 @@ void wxWindow::CaptureMouse()
wxCHECK_RET( g_capturing == FALSE, _T("CaptureMouse called twice") );
if (!m_widget->window) return;
GtkWidget *connect_widget = GetConnectWidget();
gtk_grab_add( connect_widget );
gdk_pointer_grab( connect_widget->window, FALSE,
@ -2915,6 +2967,8 @@ void wxWindow::ReleaseMouse()
wxCHECK_RET( g_capturing == TRUE, _T("ReleaseMouse called twice") );
if (!m_widget->window) return;
GtkWidget *connect_widget = GetConnectWidget();
gtk_grab_remove( connect_widget );
gdk_pointer_ungrab ( GDK_CURRENT_TIME );

View File

@ -121,9 +121,6 @@ bool wxCheckBox::Create(wxWindow *parent,
PostCreation();
gtk_widget_realize( m_widgetLabel );
gtk_widget_realize( m_widgetCheckbox );
SetBackgroundColour( parent->GetBackgroundColour() );
SetForegroundColour( parent->GetForegroundColour() );
SetFont( parent->GetFont() );

View File

@ -85,9 +85,6 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
GtkWidget *item = gtk_menu_item_new_with_label( choices[i].mbc_str() );
gtk_menu_append( GTK_MENU(menu), item );
gtk_widget_realize( item );
gtk_widget_realize( GTK_BIN(item)->child );
gtk_widget_show( item );
gtk_signal_connect( GTK_OBJECT( item ), "activate",
@ -124,10 +121,13 @@ void wxChoice::AppendCommon( const wxString &item )
gtk_menu_append( GTK_MENU(menu), menu_item );
gtk_widget_realize( menu_item );
gtk_widget_realize( GTK_BIN(menu_item)->child );
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_realize( menu_item );
gtk_widget_realize( GTK_BIN(menu_item)->child );
if (m_widgetStyle) ApplyWidgetStyle();
if (m_widgetStyle) ApplyWidgetStyle();
}
gtk_signal_connect( GTK_OBJECT( menu_item ), "activate",
GTK_SIGNAL_FUNC(gtk_choice_clicked_callback), (gpointer*)this );

View File

@ -113,9 +113,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
gtk_container_add( GTK_CONTAINER(list), list_item );
gtk_widget_realize( list_item );
gtk_widget_realize( GTK_BIN(list_item)->child );
gtk_widget_show( list_item );
gtk_signal_connect( GTK_OBJECT(list_item), "select",
@ -132,10 +129,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
if (!value.IsNull()) SetValue( value );
gtk_widget_realize( GTK_COMBO(m_widget)->list );
gtk_widget_realize( GTK_COMBO(m_widget)->entry );
gtk_widget_realize( GTK_COMBO(m_widget)->button );
if (style & wxCB_READONLY)
gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO(m_widget)->entry ), FALSE );
@ -176,7 +169,13 @@ void wxComboBox::AppendCommon( const wxString &item )
gtk_container_add( GTK_CONTAINER(list), list_item );
if (m_widgetStyle) ApplyWidgetStyle();
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_realize( list_item );
gtk_widget_realize( GTK_BIN(list_item)->child );
if (m_widgetStyle) ApplyWidgetStyle();
}
gtk_widget_show( list_item );
}

View File

@ -825,8 +825,6 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh
long *descent, long *externalLeading,
wxFont *theFont, bool WXUNUSED(use16) )
{
wxCHECK_RET( Ok(), _T("invalid window dc") );
wxFont fontToUse = m_font;
if (theFont) fontToUse = *theFont;
@ -839,16 +837,12 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh
long wxWindowDC::GetCharWidth()
{
wxCHECK_MSG( Ok(), 0, _T("invalid window dc") );
GdkFont *font = m_font.GetInternalFont( m_scaleY );
return long(gdk_string_width( font, "H" ) / m_scaleX);
}
long wxWindowDC::GetCharHeight()
{
wxCHECK_MSG( Ok(), 0, _T("invalid window dc") );
GdkFont *font = m_font.GetInternalFont( m_scaleY );
return long((font->ascent + font->descent) / m_scaleY);
}
@ -883,8 +877,6 @@ void wxWindowDC::Clear()
void wxWindowDC::SetFont( const wxFont &font )
{
wxCHECK_RET( Ok(), _T("invalid window dc") );
m_font = font;
}

View File

@ -82,6 +82,48 @@ static gint gtk_dialog_configure_callback( GtkWidget *WXUNUSED(widget), GdkEvent
return FALSE;
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot MWM hints before the widget has been realized,
so we do this directly after realization */
static gint
gtk_dialog_realized_callback( GtkWidget *widget, wxWindow *win )
{
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
return FALSE;
}
//-----------------------------------------------------------------------------
// wxDialog
//-----------------------------------------------------------------------------
@ -143,37 +185,12 @@ bool wxDialog::Create( wxWindow *parent,
PostCreation();
gtk_widget_realize( m_widget );
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
/* 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",
GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
if ((m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations(m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions(m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1);
/* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );

View File

@ -146,6 +146,48 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC
return FALSE;
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot MWM hints before the widget has been realized,
so we do this directly after realization */
static gint
gtk_frame_realized_callback( GtkWidget *widget, wxWindow *win )
{
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
return FALSE;
}
//-----------------------------------------------------------------------------
// InsertChild for wxFrame
//-----------------------------------------------------------------------------
@ -281,7 +323,6 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
gtk_widget_show( m_mainWidget );
GTK_WIDGET_UNSET_FLAGS( m_mainWidget, GTK_CAN_FOCUS );
gtk_container_add( GTK_CONTAINER(m_widget), m_mainWidget );
gtk_widget_realize( m_mainWidget );
/* m_wxwindow only represents the client area without toolbar and menubar */
m_wxwindow = gtk_myfixed_new();
@ -293,37 +334,11 @@ bool wxFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title,
PostCreation();
gtk_widget_realize( m_widget );
/* 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",
GTK_SIGNAL_FUNC(gtk_frame_realized_callback), (gpointer) this );
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
gdk_window_set_decorations(m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions(m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((m_windowStyle & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(m_widget), 1, 1, 1);
/* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_frame_size_callback), (gpointer)this );

View File

@ -274,8 +274,6 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id,
PostCreation();
gtk_widget_realize( GTK_WIDGET(m_list) );
SetBackgroundColour( parent->GetBackgroundColour() );
SetForegroundColour( parent->GetForegroundColour() );
SetFont( parent->GetFont() );
@ -411,8 +409,6 @@ void wxListBox::AppendCommon( const wxString &item )
gtk_signal_connect( GTK_OBJECT(list_item), "deselect",
GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
if (m_widgetStyle) ApplyWidgetStyle();
gtk_signal_connect( GTK_OBJECT(list_item),
"button_press_event",
(GtkSignalFunc)gtk_listbox_button_press_callback,
@ -430,15 +426,23 @@ void wxListBox::AppendCommon( const wxString &item )
ConnectWidget( list_item );
if (GTK_WIDGET_REALIZED(m_widget))
{
gtk_widget_realize( list_item );
gtk_widget_realize( GTK_BIN(list_item)->child );
if (m_widgetStyle) ApplyWidgetStyle();
#if wxUSE_DRAG_AND_DROP
#ifndef NEW_GTK_DND_CODE
if (m_dropTarget) m_dropTarget->RegisterWidget( list_item );
if (m_dropTarget) m_dropTarget->RegisterWidget( list_item );
#endif
#endif
#if wxUSE_TOOLTIPS
if (m_toolTip) m_toolTip->Apply( this );
if (m_toolTip) m_toolTip->Apply( this );
#endif
}
}
void wxListBox::Append( const wxString &item )

View File

@ -109,9 +109,9 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation*
(win->m_width == alloc->width) &&
(win->m_height == alloc->height))
{
return;
// return;
}
win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height );
if (win->GetAutoLayout()) win->Layout();

View File

@ -1294,6 +1294,40 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget,
return FALSE;
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot set colours, fonts and cursors before the widget has
been realized, so we do this directly after realization */
static gint
gtk_window_realized_callback( GtkWidget *widget, wxWindow *win )
{
if (win->m_font != *wxSWISS_FONT)
{
wxFont font( win->m_font );
win->m_font = wxNullFont;
win->SetFont( font );
}
if (win->m_backgroundColour != wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ))
{
wxColour bg( win->m_backgroundColour );
win->m_backgroundColour = wxNullColour;
win->SetBackgroundColour( bg );
}
if (win->m_foregroundColour != *wxBLACK)
{
wxColour fg( win->m_foregroundColour );
win->m_foregroundColour = wxNullColour;
win->SetForegroundColour( fg );
}
return FALSE;
}
//-----------------------------------------------------------------------------
// InsertChild for wxWindow.
//-----------------------------------------------------------------------------
@ -1750,13 +1784,12 @@ void wxWindow::PostCreation()
ConnectWidget( GetConnectWidget() );
/* 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 );
SetCursor( *wxSTANDARD_CURSOR );
/* we cannot set colours, fonts and cursors before the widget has
been realized, so we do this directly after realization */
gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
GTK_SIGNAL_FUNC(gtk_window_realized_callback), (gpointer) this );
m_hasVMT = TRUE;
}
@ -2071,6 +2104,8 @@ void wxWindow::ClientToScreen( int *x, int *y )
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
GdkWindow *source = (GdkWindow *) NULL;
if (m_wxwindow)
source = m_wxwindow->window;
@ -2098,6 +2133,8 @@ void wxWindow::ScreenToClient( int *x, int *y )
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
GdkWindow *source = (GdkWindow *) NULL;
if (m_wxwindow)
source = m_wxwindow->window;
@ -2351,6 +2388,8 @@ void wxWindow::Raise()
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
if (m_widget) gdk_window_raise( m_widget->window );
}
@ -2358,6 +2397,8 @@ void wxWindow::Lower()
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
if (m_widget) gdk_window_lower( m_widget->window );
}
@ -2459,8 +2500,9 @@ void wxWindow::SetCursor( const wxCursor &cursor )
*m_cursor = *wxSTANDARD_CURSOR;
}
if ((m_widget) && (m_widget->window))
gdk_window_set_cursor( m_widget->window, m_cursor->GetCursor() );
if (!m_widget->window) return;
gdk_window_set_cursor( m_widget->window, m_cursor->GetCursor() );
if ((m_wxwindow) && (m_wxwindow->window))
gdk_window_set_cursor( m_wxwindow->window, m_cursor->GetCursor() );
@ -2475,6 +2517,8 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
{
wxCHECK_RET( (m_widget != NULL), _T("invalid window") );
if (!m_widget->window) return;
if (eraseBackground && m_wxwindow && m_wxwindow->window)
{
if (rect)
@ -2540,6 +2584,8 @@ void wxWindow::Clear()
{
wxCHECK_RET( m_widget != NULL, _T("invalid window") );
if (!m_widget->window) return;
if (m_wxwindow && m_wxwindow->window)
{
gdk_window_clear( m_wxwindow->window );
@ -2596,6 +2642,8 @@ void wxWindow::SetBackgroundColour( const wxColour &colour )
m_backgroundColour = colour;
if (!m_backgroundColour.Ok()) return;
if (!m_widget->window) return;
if (m_wxwindow && m_wxwindow->window)
{
/* wxMSW doesn't clear the window here. I don't do that
@ -2636,6 +2684,8 @@ void wxWindow::SetForegroundColour( const wxColour &colour )
m_foregroundColour = colour;
if (!m_foregroundColour.Ok()) return;
if (!m_widget->window) return;
wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if (sysbg.Red() == colour.Red() &&
sysbg.Green() == colour.Green() &&
@ -2896,6 +2946,8 @@ void wxWindow::CaptureMouse()
wxCHECK_RET( g_capturing == FALSE, _T("CaptureMouse called twice") );
if (!m_widget->window) return;
GtkWidget *connect_widget = GetConnectWidget();
gtk_grab_add( connect_widget );
gdk_pointer_grab( connect_widget->window, FALSE,
@ -2915,6 +2967,8 @@ void wxWindow::ReleaseMouse()
wxCHECK_RET( g_capturing == TRUE, _T("ReleaseMouse called twice") );
if (!m_widget->window) return;
GtkWidget *connect_widget = GetConnectWidget();
gtk_grab_remove( connect_widget );
gdk_pointer_ungrab ( GDK_CURRENT_TIME );