crash in GTK 1.0 on multiline text ctrl creation fixed

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2378 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-05-09 18:00:35 +00:00
parent 404d805e79
commit 3358d36e06
2 changed files with 130 additions and 116 deletions

View File

@@ -174,8 +174,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
gtk_widget_show(hscrollbar);
#if (GTK_MINOR_VERSION > 0)
/* don't wrap lines, otherwise we wouldn't need the scrollbar */
gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
/* don't wrap lines, otherwise we wouldn't need the scrollbar */
gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
#endif
}
@@ -222,19 +222,26 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
if (!value.IsEmpty())
{
gint tmp = 0;
#if GTK_MINOR_VERSION == 0
// if we don't realize it, GTK 1.0.6 dies with a SIGSEGV in
// gtk_editable_insert_text()
gtk_widget_realize(m_text);
#endif // GTK 1.0
#if wxUSE_UNICODE
wxWX2MBbuf val = value.mbc_str();
wxWX2MBbuf val = value.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), val, strlen(val), &tmp );
#else
#else // !Unicode
gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &tmp );
#endif
#endif // Unicode/!Unicode
if (multi_line)
{
/* bring editable's cursor uptodate. bug in GTK. */
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
}
if (style & wxTE_PASSWORD)
@@ -319,7 +326,7 @@ void wxTextCtrl::SetValue( const wxString &value )
gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len );
len = 0;
#if wxUSE_UNICODE
wxWX2MBbuf tmpbuf = tmp.mbc_str();
wxWX2MBbuf tmpbuf = tmp.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), tmpbuf, strlen(tmpbuf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), tmp.mbc_str(), tmp.Length(), &len );
@@ -340,34 +347,34 @@ void wxTextCtrl::WriteText( const wxString &text )
if (m_windowStyle & wxTE_MULTILINE)
{
/* this moves the cursor pos to behind the inserted text */
gint len = GTK_EDITABLE(m_text)->current_pos;
gint len = GTK_EDITABLE(m_text)->current_pos;
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
wxWX2MBbuf buf = text.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
#endif
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
else
{
/* this moves the cursor pos to behind the inserted text */
gint len = GTK_EDITABLE(m_text)->current_pos;
gint len = GTK_EDITABLE(m_text)->current_pos;
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
wxWX2MBbuf buf = text.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
#endif
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos += text.Len();
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos += text.Len();
/* bring entry's cursor uptodate. bug in GTK. */
gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos );
/* bring entry's cursor uptodate. bug in GTK. */
gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos );
}
}
@@ -380,14 +387,14 @@ void wxTextCtrl::AppendText( const wxString &text )
/* we'll insert at the last position */
gint len = gtk_text_get_length( GTK_TEXT(m_text) );
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
wxWX2MBbuf buf = text.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
#endif
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
else
{
@@ -628,33 +635,33 @@ void wxTextCtrl::SetInsertionPoint( long pos )
if (m_windowStyle & wxTE_MULTILINE)
{
/* seems to be broken in GTK 1.0.X:
gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */
gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */
gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* we fake a set_point by inserting and deleting. as the user
isn't supposed to get to know about thos non-sense, we
disconnect so that no events are sent to the user program. */
isn't supposed to get to know about thos non-sense, we
disconnect so that no events are sent to the user program. */
gint tmp = (gint)pos;
gtk_editable_insert_text( GTK_EDITABLE(m_text), " ", 1, &tmp );
gtk_editable_delete_text( GTK_EDITABLE(m_text), tmp-1, tmp );
gtk_editable_delete_text( GTK_EDITABLE(m_text), tmp-1, tmp );
gtk_signal_connect( GTK_OBJECT(m_text), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* bring editable's cursor uptodate. another bug in GTK. */
/* bring editable's cursor uptodate. another bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
else
{
gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos );
/* bring editable's cursor uptodate. bug in GTK. */
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = pos;
GTK_EDITABLE(m_text)->current_pos = pos;
}
}
@@ -976,7 +983,7 @@ void wxTextCtrl::SetBackgroundColour( const wxColour &colour )
if (m_windowStyle & wxTE_MULTILINE)
{
GdkWindow *window = GTK_TEXT(m_text)->text_area;
if (!window) return;
if (!window) return;
m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
gdk_window_set_background( window, m_backgroundColour.GetColor() );
gdk_window_clear( window );

View File

@@ -174,8 +174,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
gtk_widget_show(hscrollbar);
#if (GTK_MINOR_VERSION > 0)
/* don't wrap lines, otherwise we wouldn't need the scrollbar */
gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
/* don't wrap lines, otherwise we wouldn't need the scrollbar */
gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
#endif
}
@@ -222,19 +222,26 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
if (!value.IsEmpty())
{
gint tmp = 0;
#if GTK_MINOR_VERSION == 0
// if we don't realize it, GTK 1.0.6 dies with a SIGSEGV in
// gtk_editable_insert_text()
gtk_widget_realize(m_text);
#endif // GTK 1.0
#if wxUSE_UNICODE
wxWX2MBbuf val = value.mbc_str();
wxWX2MBbuf val = value.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), val, strlen(val), &tmp );
#else
#else // !Unicode
gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &tmp );
#endif
#endif // Unicode/!Unicode
if (multi_line)
{
/* bring editable's cursor uptodate. bug in GTK. */
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
}
if (style & wxTE_PASSWORD)
@@ -319,7 +326,7 @@ void wxTextCtrl::SetValue( const wxString &value )
gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len );
len = 0;
#if wxUSE_UNICODE
wxWX2MBbuf tmpbuf = tmp.mbc_str();
wxWX2MBbuf tmpbuf = tmp.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), tmpbuf, strlen(tmpbuf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), tmp.mbc_str(), tmp.Length(), &len );
@@ -340,34 +347,34 @@ void wxTextCtrl::WriteText( const wxString &text )
if (m_windowStyle & wxTE_MULTILINE)
{
/* this moves the cursor pos to behind the inserted text */
gint len = GTK_EDITABLE(m_text)->current_pos;
gint len = GTK_EDITABLE(m_text)->current_pos;
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
wxWX2MBbuf buf = text.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
#endif
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
else
{
/* this moves the cursor pos to behind the inserted text */
gint len = GTK_EDITABLE(m_text)->current_pos;
gint len = GTK_EDITABLE(m_text)->current_pos;
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
wxWX2MBbuf buf = text.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
#endif
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos += text.Len();
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos += text.Len();
/* bring entry's cursor uptodate. bug in GTK. */
gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos );
/* bring entry's cursor uptodate. bug in GTK. */
gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos );
}
}
@@ -380,14 +387,14 @@ void wxTextCtrl::AppendText( const wxString &text )
/* we'll insert at the last position */
gint len = gtk_text_get_length( GTK_TEXT(m_text) );
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
wxWX2MBbuf buf = text.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
#endif
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
else
{
@@ -628,33 +635,33 @@ void wxTextCtrl::SetInsertionPoint( long pos )
if (m_windowStyle & wxTE_MULTILINE)
{
/* seems to be broken in GTK 1.0.X:
gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */
gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */
gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* we fake a set_point by inserting and deleting. as the user
isn't supposed to get to know about thos non-sense, we
disconnect so that no events are sent to the user program. */
isn't supposed to get to know about thos non-sense, we
disconnect so that no events are sent to the user program. */
gint tmp = (gint)pos;
gtk_editable_insert_text( GTK_EDITABLE(m_text), " ", 1, &tmp );
gtk_editable_delete_text( GTK_EDITABLE(m_text), tmp-1, tmp );
gtk_editable_delete_text( GTK_EDITABLE(m_text), tmp-1, tmp );
gtk_signal_connect( GTK_OBJECT(m_text), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* bring editable's cursor uptodate. another bug in GTK. */
/* bring editable's cursor uptodate. another bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
}
else
{
gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos );
/* bring editable's cursor uptodate. bug in GTK. */
/* bring editable's cursor uptodate. bug in GTK. */
GTK_EDITABLE(m_text)->current_pos = pos;
GTK_EDITABLE(m_text)->current_pos = pos;
}
}
@@ -976,7 +983,7 @@ void wxTextCtrl::SetBackgroundColour( const wxColour &colour )
if (m_windowStyle & wxTE_MULTILINE)
{
GdkWindow *window = GTK_TEXT(m_text)->text_area;
if (!window) return;
if (!window) return;
m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
gdk_window_set_background( window, m_backgroundColour.GetColor() );
gdk_window_clear( window );