Lots of updates for Unicode and GTK 2.0 support.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16373 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2002-08-05 17:59:20 +00:00
parent dd398cd02c
commit fab591c5cc
50 changed files with 796 additions and 478 deletions

View File

@@ -544,7 +544,7 @@ bool wxApp::SendIdleEvents( wxWindow* win )
event.SetEventObject(win); event.SetEventObject(win);
win->GetEventHandler()->ProcessEvent(event); win->GetEventHandler()->ProcessEvent(event);
if (event.MoreRequested()) if (event.MoreRequested())
needMore = TRUE; needMore = TRUE;

View File

@@ -109,10 +109,8 @@ bool wxButton::Create( wxWindow *parent, wxWindowID id, const wxString &label,
SetLabel( label ); SetLabel( label );
#if (GTK_MINOR_VERSION > 0)
if (style & wxNO_BORDER) if (style & wxNO_BORDER)
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE ); gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
#endif
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this ); GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this );
@@ -162,7 +160,7 @@ void wxButton::SetLabel( const wxString &label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_label_set( GTK_LABEL( BUTTON_CHILD(m_widget) ), GetLabel().mbc_str() ); gtk_label_set( GTK_LABEL( BUTTON_CHILD(m_widget) ), wxGTK_CONV( GetLabel() ) );
} }
bool wxButton::Enable( bool enable ) bool wxButton::Enable( bool enable )

View File

@@ -94,7 +94,7 @@ bool wxCheckBox::Create(wxWindow *parent,
// left of it // left of it
m_widgetCheckbox = gtk_check_button_new(); m_widgetCheckbox = gtk_check_button_new();
m_widgetLabel = gtk_label_new(m_label.mbc_str()); m_widgetLabel = gtk_label_new( wxGTK_CONV( m_label ) );
gtk_misc_set_alignment(GTK_MISC(m_widgetLabel), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(m_widgetLabel), 0.0, 0.5);
m_widget = gtk_hbox_new(FALSE, 0); m_widget = gtk_hbox_new(FALSE, 0);
@@ -106,7 +106,7 @@ bool wxCheckBox::Create(wxWindow *parent,
} }
else else
{ {
m_widgetCheckbox = gtk_check_button_new_with_label( m_label.mbc_str() ); m_widgetCheckbox = gtk_check_button_new_with_label( wxGTK_CONV( m_label ) );
m_widgetLabel = BUTTON_CHILD( m_widgetCheckbox ); m_widgetLabel = BUTTON_CHILD( m_widgetCheckbox );
m_widget = m_widgetCheckbox; m_widget = m_widgetCheckbox;
} }
@@ -166,7 +166,7 @@ void wxCheckBox::SetLabel( const wxString& label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_label_set( GTK_LABEL(m_widgetLabel), GetLabel().mbc_str() ); gtk_label_set( GTK_LABEL(m_widgetLabel), wxGTK_CONV( GetLabel() ) );
} }
bool wxCheckBox::Enable( bool enable ) bool wxCheckBox::Enable( bool enable )

View File

@@ -16,6 +16,7 @@
#if wxUSE_CHECKLISTBOX #if wxUSE_CHECKLISTBOX
#include "wx/checklst.h" #include "wx/checklst.h"
#include "wx/gtk/private.h"
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -54,7 +55,7 @@ bool wxCheckListBox::IsChecked( int index ) const
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(label->label,*wxConvCurrent); wxString str( wxGTK_CONV_BACK( label->label ) );
return str.GetChar(1) == wxCHECKLBOX_CHECKED; return str.GetChar(1) == wxCHECKLBOX_CHECKED;
} }
@@ -73,14 +74,14 @@ void wxCheckListBox::Check( int index, bool check )
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(label->label,*wxConvCurrent); wxString str( wxGTK_CONV_BACK( label->label ) );
if (check == (str.GetChar(1) == wxCHECKLBOX_CHECKED)) if (check == (str.GetChar(1) == wxCHECKLBOX_CHECKED))
return; return;
str.SetChar( 1, check ? wxCHECKLBOX_CHECKED : wxCHECKLBOX_UNCHECKED ); str.SetChar( 1, check ? wxCHECKLBOX_CHECKED : wxCHECKLBOX_UNCHECKED );
gtk_label_set( label, str.mbc_str() ); gtk_label_set( label, wxGTK_CONV( str ) );
return; return;
} }

View File

@@ -256,8 +256,9 @@ int wxChoice::FindString( const wxString &string ) const
label = GTK_LABEL( BUTTON_CHILD(m_widget) ); label = GTK_LABEL( BUTTON_CHILD(m_widget) );
wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") );
if (string == wxString(label->label,*wxConvCurrent)) wxString tmp( wxGTK_CONV_BACK( label->label ) );
if (string == tmp)
return count; return count;
child = child->next; child = child->next;
@@ -312,7 +313,7 @@ wxString wxChoice::GetString( int n ) const
wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") );
return wxString(label->label,*wxConvCurrent); return wxString( wxGTK_CONV_BACK(label->label) );
} }
child = child->next; child = child->next;
count++; count++;
@@ -375,7 +376,7 @@ void wxChoice::ApplyWidgetStyle()
size_t wxChoice::GtkAppendHelper(GtkWidget *menu, const wxString& item) size_t wxChoice::GtkAppendHelper(GtkWidget *menu, const wxString& item)
{ {
GtkWidget *menu_item = gtk_menu_item_new_with_label( item.mbc_str() ); GtkWidget *menu_item = gtk_menu_item_new_with_label( wxGTK_CONV( item ) );
size_t index; size_t index;
if ( m_strings ) if ( m_strings )
@@ -439,7 +440,8 @@ wxSize wxChoice::DoGetBestSize() const
size_t count = GetCount(); size_t count = GetCount();
for ( size_t n = 0; n < count; n++ ) for ( size_t n = 0; n < count; n++ )
{ {
width = (wxCoord)gdk_string_width(font, GetString(n).mbc_str()); // FIXME GTK 2.0
width = (wxCoord)gdk_string_width(font, wxGTK_CONV( GetString(n) ) );
if ( width > ret.x ) if ( width > ret.x )
ret.x = width; ret.x = width;
} }
@@ -461,7 +463,7 @@ wxSize wxChoice::DoGetBestSize() const
if ( ret.x < 80 ) if ( ret.x < 80 )
ret.x = 80; ret.x = 80;
ret.y = 16 + gdk_char_height(GET_STYLE_FONT( m_widget->style ), 'H'); ret.y = 16 + gdk_char_height(GET_STYLE_FONT( m_widget->style ), 'H' );
return ret; return ret;
} }

View File

@@ -256,7 +256,7 @@ selection_handler( GtkWidget *WXUNUSED(widget),
{ {
const wchar_t *wstr = (const wchar_t *)d; const wchar_t *wstr = (const wchar_t *)d;
size_t len = wxConvCurrent->WC2MB(NULL, wstr, 0); size_t len = wxConvCurrent->WC2MB(NULL, wstr, 0);
char *str = malloc(len + 1); char *str = (char*) malloc(len + 1);
wxConvCurrent->WC2MB(str, wstr, len); wxConvCurrent->WC2MB(str, wstr, len);
str[len] = '\0'; str[len] = '\0';

View File

@@ -139,7 +139,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
inserting the first item */ inserting the first item */
m_alreadySent = TRUE; m_alreadySent = TRUE;
GtkWidget *list_item = gtk_list_item_new_with_label( choices[i].mbc_str() ); GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( choices[i] ) );
m_clientDataList.Append( (wxObject*)NULL ); m_clientDataList.Append( (wxObject*)NULL );
m_clientObjectList.Append( (wxObject*)NULL ); m_clientObjectList.Append( (wxObject*)NULL );
@@ -213,7 +213,7 @@ void wxComboBox::AppendCommon( const wxString &item )
GtkWidget *list = GTK_COMBO(m_widget)->list; GtkWidget *list = GTK_COMBO(m_widget)->list;
GtkWidget *list_item = gtk_list_item_new_with_label( item.mbc_str() ); GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( item ) );
gtk_container_add( GTK_CONTAINER(list), list_item ); gtk_container_add( GTK_CONTAINER(list), list_item );
@@ -483,7 +483,7 @@ void wxComboBox::SetValue( const wxString& value )
GtkWidget *entry = GTK_COMBO(m_widget)->entry; GtkWidget *entry = GTK_COMBO(m_widget)->entry;
wxString tmp = wxT(""); wxString tmp = wxT("");
if (!value.IsNull()) tmp = value; if (!value.IsNull()) tmp = value;
gtk_entry_set_text( GTK_ENTRY(entry), tmp.mbc_str() ); gtk_entry_set_text( GTK_ENTRY(entry), wxGTK_CONV( tmp ) );
} }
void wxComboBox::Copy() void wxComboBox::Copy()
@@ -541,6 +541,7 @@ void wxComboBox::Replace( long from, long to, const wxString& value )
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
// FIXME: not quite sure how to do this method right in multibyte mode // FIXME: not quite sure how to do this method right in multibyte mode
// FIXME GTK 2.0
GtkWidget *entry = GTK_COMBO(m_widget)->entry; GtkWidget *entry = GTK_COMBO(m_widget)->entry;
gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to );
@@ -713,7 +714,7 @@ wxSize wxComboBox::DoGetBestSize() const
size_t count = Number(); size_t count = Number();
for ( size_t n = 0; n < count; n++ ) for ( size_t n = 0; n < count; n++ )
{ {
width = (wxCoord)gdk_string_width(font, GetString(n).mbc_str()); width = (wxCoord)gdk_string_width(font, wxGTK_CONV( GetString(n) ) );
if ( width > ret.x ) if ( width > ret.x )
ret.x = width; ret.x = width;
} }

View File

@@ -214,9 +214,9 @@ wxFontRefData::wxFontRefData(const wxString& fontname)
{ {
// the test below catches all of BOLD, EXTRABOLD, DEMIBOLD, ULTRABOLD // the test below catches all of BOLD, EXTRABOLD, DEMIBOLD, ULTRABOLD
// and BLACK // and BLACK
if ( ((w[0u] == _T('B') && (!strcmp(w.c_str() + 1, _T("OLD")) || if ( ((w[0u] == _T('B') && (!wxStrcmp(w.c_str() + 1, wxT("OLD")) ||
!strcmp(w.c_str() + 1, _T("LACK"))))) || !wxStrcmp(w.c_str() + 1, wxT("LACK"))))) ||
strstr(w.c_str() + 1, _T("BOLD")) ) wxStrstr(w.c_str() + 1, _T("BOLD")) )
{ {
m_weight = wxFONTWEIGHT_BOLD; m_weight = wxFONTWEIGHT_BOLD;
} }

View File

@@ -57,7 +57,6 @@ bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUN
// "clicked" for OK-button // "clicked" for OK-button
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#ifdef __WXGTK12__
static static
void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dialog ) void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dialog )
{ {
@@ -84,7 +83,6 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial
event.SetEventObject( dialog ); event.SetEventObject( dialog );
dialog->GetEventHandler()->ProcessEvent( event ); dialog->GetEventHandler()->ProcessEvent( event );
} }
#endif // GTK+ 1.2 and later only
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" for Cancel-button // "clicked" for Cancel-button
@@ -120,7 +118,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
} }
wxString m_message( _("Choose font") ); wxString m_message( _("Choose font") );
m_widget = gtk_font_selection_dialog_new( m_message.mbc_str() ); m_widget = gtk_font_selection_dialog_new( wxGTK_CONV( m_message ) );
int x = (gdk_screen_width () - 400) / 2; int x = (gdk_screen_width () - 400) / 2;
int y = (gdk_screen_height () - 400) / 2; int y = (gdk_screen_height () - 400) / 2;
@@ -131,14 +129,18 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
gtk_signal_connect( GTK_OBJECT(sel->ok_button), "clicked", gtk_signal_connect( GTK_OBJECT(sel->ok_button), "clicked",
GTK_SIGNAL_FUNC(gtk_fontdialog_ok_callback), (gpointer*)this ); GTK_SIGNAL_FUNC(gtk_fontdialog_ok_callback), (gpointer*)this );
#ifndef __WXGTK20__
// strange way to internationalize // strange way to internationalize
gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->ok_button) ), wxConvCurrent->cWX2MB(_("OK")) ); gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->ok_button) ), _("OK") );
#endif
gtk_signal_connect( GTK_OBJECT(sel->cancel_button), "clicked", gtk_signal_connect( GTK_OBJECT(sel->cancel_button), "clicked",
GTK_SIGNAL_FUNC(gtk_fontdialog_cancel_callback), (gpointer*)this ); GTK_SIGNAL_FUNC(gtk_fontdialog_cancel_callback), (gpointer*)this );
#ifndef __WXGTK20__
// strange way to internationalize // strange way to internationalize
gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->cancel_button) ), wxConvCurrent->cWX2MB(_("Cancel")) ); gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->cancel_button) ), _("Cancel") );
#endif
gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event", gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
GTK_SIGNAL_FUNC(gtk_fontdialog_delete_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_fontdialog_delete_callback), (gpointer)this );

View File

@@ -39,9 +39,9 @@ wxJoystick::wxJoystick(int joystick)
{ {
wxString dev_name; wxString dev_name;
// Assume it's the same device name on all Linux systems ... // Assume it's the same device name on all Linux systems ...
dev_name.Printf("/dev/js%d", (joystick == wxJOYSTICK1) ? 0 : 1); dev_name.Printf( wxT("/dev/js%d"), (joystick == wxJOYSTICK1) ? 0 : 1); // FIXME Unicode?
m_joystick = open(dev_name, O_RDWR); m_joystick = open(dev_name.fn_str(), O_RDWR);
m_lastposition = wxPoint(-1, -1); m_lastposition = wxPoint(-1, -1);
for (int i=0;i<15;i++) for (int i=0;i<15;i++)
m_axe[i] = 0; m_axe[i] = 0;
@@ -186,8 +186,8 @@ int wxJoystick::GetNumberJoysticks(void) const
int fd, j; int fd, j;
for (j=0;j<2;j++) { for (j=0;j<2;j++) {
dev_name.Printf("/dev/js%d", j); dev_name.Printf(wxT("/dev/js%d"), j);
fd = open(dev_name, O_RDONLY); fd = open(dev_name.fn_str(), O_RDONLY);
if (fd == -1) if (fd == -1)
return j; return j;
close(fd); close(fd);

View File

@@ -21,6 +21,7 @@
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/checklst.h" #include "wx/checklst.h"
#include "wx/settings.h" #include "wx/settings.h"
#include "wx/gtk/private.h"
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
#include "wx/tooltip.h" #include "wx/tooltip.h"
@@ -537,7 +538,7 @@ void wxListBox::GtkAddItem( const wxString &item, int pos )
} }
#endif // wxUSE_CHECKLISTBOX #endif // wxUSE_CHECKLISTBOX
list_item = gtk_list_item_new_with_label( label.mbc_str() ); list_item = gtk_list_item_new_with_label( wxGTK_CONV( label ) );
GList *gitem_list = g_list_alloc (); GList *gitem_list = g_list_alloc ();
gitem_list->data = list_item; gitem_list->data = list_item;
@@ -737,7 +738,7 @@ void wxListBox::SetString( int n, const wxString &string )
#endif // wxUSE_CHECKLISTBOX #endif // wxUSE_CHECKLISTBOX
str += string; str += string;
gtk_label_set( label, str.mbc_str() ); gtk_label_set( label, wxGTK_CONV( str ) );
} }
else else
{ {
@@ -755,7 +756,7 @@ wxString wxListBox::GetString( int n ) const
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(GET_REAL_LABEL(label->label),*wxConvCurrent); wxString str = wxGTK_CONV_BACK( GET_REAL_LABEL(label->label) );
return str; return str;
} }
@@ -784,7 +785,7 @@ int wxListBox::FindString( const wxString &item ) const
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(GET_REAL_LABEL(label->label),*wxConvCurrent); wxString str = wxGTK_CONV_BACK( GET_REAL_LABEL(label->label) );
if (str == item) if (str == item)
return count; return count;

View File

@@ -18,6 +18,7 @@
#include "wx/dialog.h" #include "wx/dialog.h"
#include "wx/menu.h" #include "wx/menu.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/gtk/private.h"
#include <glib.h> #include <glib.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
@@ -399,7 +400,7 @@ void wxMDIChildFrame::SetTitle( const wxString &title )
wxMDIParentFrame* parent = (wxMDIParentFrame*) GetParent(); wxMDIParentFrame* parent = (wxMDIParentFrame*) GetParent();
GtkNotebook* notebook = GTK_NOTEBOOK(parent->m_widget); GtkNotebook* notebook = GTK_NOTEBOOK(parent->m_widget);
gtk_notebook_set_tab_label_text(notebook, m_widget, title.mbc_str()); gtk_notebook_set_tab_label_text(notebook, m_widget, wxGTK_CONV( title ) );
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@@ -241,14 +241,12 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
{ {
menu->SetInvokingWindow( (wxWindow*) NULL ); menu->SetInvokingWindow( (wxWindow*) NULL );
#if GTK_CHECK_VERSION(1, 2, 0)
wxWindow *top_frame = win; wxWindow *top_frame = win;
while (top_frame->GetParent() && !(top_frame->IsTopLevel())) while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
top_frame = top_frame->GetParent(); top_frame = top_frame->GetParent();
/* support for native hot keys */ /* support for native hot keys */
gtk_accel_group_detach( menu->m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) ); gtk_accel_group_detach( menu->m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) );
#endif
wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst(); wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst();
while (node) while (node)
@@ -347,12 +345,12 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
/* GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has. */ /* GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has. */
#if GTK_CHECK_VERSION(1, 2, 1) #if GTK_CHECK_VERSION(1, 2, 1)
/* local buffer in multibyte form */
wxString buf; wxString buf;
buf << wxT('/') << str.c_str(); buf << wxT('/') << str.c_str();
char *cbuf = new char[buf.Length()+1]; /* local buffer in multibyte form */
strcpy(cbuf, buf.mbc_str()); char cbuf[400];
strcpy(cbuf, wxGTK_CONV(buf) );
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
entry.path = (gchar *)cbuf; // const_cast entry.path = (gchar *)cbuf; // const_cast
@@ -374,12 +372,11 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
pc++; pc++;
tmp << *pc; tmp << *pc;
} }
menu->m_owner = gtk_item_factory_get_item( m_factory, tmp.mb_str() ); menu->m_owner = gtk_item_factory_get_item( m_factory, wxGTK_CONV( tmp ) );
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu );
delete [] cbuf;
#else #else
menu->m_owner = gtk_menu_item_new_with_label( str.mb_str() ); menu->m_owner = gtk_menu_item_new_with_label( wxGTK_CONV( str ) );
gtk_widget_show( menu->m_owner ); gtk_widget_show( menu->m_owner );
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu );
@@ -400,7 +397,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
if ( !wxMenuBarBase::Insert(pos, menu, title) ) if ( !wxMenuBarBase::Insert(pos, menu, title) )
return FALSE; return FALSE;
#if __WXGTK12__
// GTK+ doesn't have a function to insert a menu using GtkItemFactory (as // GTK+ doesn't have a function to insert a menu using GtkItemFactory (as
// of version 1.2.6), so we first append the item and then change its // of version 1.2.6), so we first append the item and then change its
// index // index
@@ -416,14 +412,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
menu_shell->children = g_list_insert(menu_shell->children, data, pos); menu_shell->children = g_list_insert(menu_shell->children, data, pos);
return TRUE; return TRUE;
#else // GTK < 1.2
// this should be easy to do with GTK 1.0 - can use standard functions for
// this and don't need any hacks like above, but as I don't have GTK 1.0
// any more I can't do it
wxFAIL_MSG( wxT("TODO") );
return FALSE;
#endif // GTK 1.2/1.0
} }
wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
@@ -564,7 +552,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const
wxString label; wxString label;
wxString text( menu->GetTitle() ); wxString text( menu->GetTitle() );
#if GTK_CHECK_VERSION(1, 2, 0)
for ( const wxChar *pc = text.c_str(); *pc; pc++ ) for ( const wxChar *pc = text.c_str(); *pc; pc++ )
{ {
if ( *pc == wxT('_') || *pc == wxT('&') ) if ( *pc == wxT('_') || *pc == wxT('&') )
@@ -576,9 +563,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const
label += *pc; label += *pc;
} }
#else // GTK+ 1.0
label = text;
#endif // GTK+ 1.2/1.0
return label; return label;
} }
@@ -600,10 +584,10 @@ void wxMenuBar::SetLabelTop( size_t pos, const wxString& label )
GtkLabel *label = GTK_LABEL( GTK_BIN(menu->m_owner)->child ); GtkLabel *label = GTK_LABEL( GTK_BIN(menu->m_owner)->child );
/* set new text */ /* set new text */
gtk_label_set( label, str.mb_str()); gtk_label_set( label, wxGTK_CONV( str ) );
/* reparse key accel */ /* reparse key accel */
(void)gtk_label_parse_uline (GTK_LABEL(label), str.mb_str() ); (void)gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( str ) );
gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) ); gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) );
} }
@@ -805,10 +789,10 @@ void wxMenuItem::SetText( const wxString& str )
label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); label = GTK_LABEL( GTK_BIN(m_menuItem)->child );
/* set new text */ /* set new text */
gtk_label_set( label, m_text.mb_str()); gtk_label_set( label, wxGTK_CONV( m_text ) );
/* reparse key accel */ /* reparse key accel */
(void)gtk_label_parse_uline (GTK_LABEL(label), m_text.mb_str() ); (void)gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( m_text ) );
gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) ); gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) );
} }
} }
@@ -854,16 +838,13 @@ void wxMenuItem::DoSetText( const wxString& str )
m_text << *pc; m_text << *pc;
} }
/* only GTK 1.2 knows about hot keys */
m_hotKey = wxT(""); m_hotKey = wxT("");
#if GTK_CHECK_VERSION(1, 2, 0)
if(*pc == wxT('\t')) if(*pc == wxT('\t'))
{ {
pc++; pc++;
m_hotKey = pc; m_hotKey = pc;
} }
#endif // GTK+ 1.2.0+
} }
#if wxUSE_ACCEL #if wxUSE_ACCEL
@@ -952,17 +933,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler)
void wxMenu::Init() void wxMenu::Init()
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
m_accel = gtk_accel_group_new(); m_accel = gtk_accel_group_new();
m_factory = gtk_item_factory_new( GTK_TYPE_MENU, "<main>", m_accel ); m_factory = gtk_item_factory_new( GTK_TYPE_MENU, "<main>", m_accel );
m_menu = gtk_item_factory_get_widget( m_factory, "<main>" ); m_menu = gtk_item_factory_get_widget( m_factory, "<main>" );
#else
m_menu = gtk_menu_new(); // Do not show!
#endif
m_owner = (GtkWidget*) NULL; m_owner = (GtkWidget*) NULL;
#if GTK_CHECK_VERSION(1, 2, 0)
/* Tearoffs are entries, just like separators. So if we want this /* Tearoffs are entries, just like separators. So if we want this
menu to be a tear-off one, we just append a tearoff entry menu to be a tear-off one, we just append a tearoff entry
immediately. */ immediately. */
@@ -977,7 +953,6 @@ void wxMenu::Init()
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
//GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "<main>/tearoff" ); //GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "<main>/tearoff" );
} }
#endif // GTK+ 1.2.0+
// append the title as the very first entry if we have it // append the title as the very first entry if we have it
if ( !!m_title ) if ( !!m_title )
@@ -1004,14 +979,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
bool appended = FALSE; bool appended = FALSE;
#endif #endif
#if GTK_CHECK_VERSION(1, 2, 0)
// does this item terminate the current radio group? // does this item terminate the current radio group?
bool endOfRadioGroup = TRUE; bool endOfRadioGroup = TRUE;
#endif // GTK+ >= 1.2
if ( mitem->IsSeparator() ) if ( mitem->IsSeparator() )
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
entry.path = (char *)"/sep"; entry.path = (char *)"/sep";
entry.callback = (GtkItemFactoryCallback) NULL; entry.callback = (GtkItemFactoryCallback) NULL;
@@ -1026,20 +998,16 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
// we might have a separator inside a radio group // we might have a separator inside a radio group
endOfRadioGroup = FALSE; endOfRadioGroup = FALSE;
#else // GTK+ 1.0
menuItem = gtk_menu_item_new();
#endif // GTK 1.2/1.0
} }
else if ( mitem->IsSubMenu() ) else if ( mitem->IsSubMenu() )
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
/* text has "_" instead of "&" after mitem->SetText() */ /* text has "_" instead of "&" after mitem->SetText() */
wxString text( mitem->GetText() ); wxString text( mitem->GetText() );
/* local buffer in multibyte form */ /* local buffer in multibyte form */
char buf[200]; char buf[200];
strcpy( buf, "/" ); strcpy( buf, "/" );
strcat( buf, text.mb_str() ); strcat( buf, wxGTK_CONV( text ) );
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
entry.path = buf; entry.path = buf;
@@ -1051,10 +1019,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
wxString path( mitem->GetFactoryPath() ); wxString path( mitem->GetFactoryPath() );
menuItem = gtk_item_factory_get_item( m_factory, path.mb_str() ); menuItem = gtk_item_factory_get_item( m_factory, wxGTK_CONV( path ) );
#else // GTK+ 1.0
menuItem = gtk_menu_item_new_with_label(mitem->GetText().mbc_str());
#endif // GTK 1.2/1.0
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), mitem->GetSubMenu()->m_menu ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), mitem->GetSubMenu()->m_menu );
@@ -1071,10 +1036,10 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
const wxBitmap *bitmap = &mitem->GetBitmap(); const wxBitmap *bitmap = &mitem->GetBitmap();
menuItem = gtk_pixmap_menu_item_new (); menuItem = gtk_pixmap_menu_item_new ();
GtkWidget *label = gtk_accel_label_new (text.mb_str()); GtkWidget *label = gtk_accel_label_new ( wxGTK_CONV( text ) );
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_container_add (GTK_CONTAINER (menuItem), label); gtk_container_add (GTK_CONTAINER (menuItem), label);
guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), text.mb_str() ); guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( text ) );
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), menuItem); gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), menuItem);
if (accel_key != GDK_VoidSymbol) if (accel_key != GDK_VoidSymbol)
{ {
@@ -1103,14 +1068,13 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
#endif // USE_MENU_BITMAPS #endif // USE_MENU_BITMAPS
else // a normal item else // a normal item
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
/* text has "_" instead of "&" after mitem->SetText() */ /* text has "_" instead of "&" after mitem->SetText() */
wxString text( mitem->GetText() ); wxString text( mitem->GetText() );
/* local buffer in multibyte form */ /* local buffer in multibyte form */
char buf[200]; char buf[200];
strcpy( buf, "/" ); strcpy( buf, "/" );
strncat( buf, text.mb_str(), WXSIZEOF(buf) - 2 ); strncat( buf, wxGTK_CONV(text), WXSIZEOF(buf) - 2 );
buf[WXSIZEOF(buf) - 1] = '\0'; buf[WXSIZEOF(buf) - 1] = '\0';
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
@@ -1119,6 +1083,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
entry.callback_action = 0; entry.callback_action = 0;
wxString pathRadio; wxString pathRadio;
char buf2[200];
const char *item_type; const char *item_type;
switch ( mitem->GetKind() ) switch ( mitem->GetKind() )
{ {
@@ -1136,9 +1101,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
else // continue the radio group else // continue the radio group
{ {
pathRadio = m_pathLastRadio; pathRadio = m_pathLastRadio;
pathRadio.Replace("_", ""); pathRadio.Replace(wxT("_"), wxT(""));
pathRadio.Prepend("<main>/"); pathRadio.Prepend(wxT("<main>/"));
item_type = pathRadio; strncat( buf2, wxGTK_CONV(pathRadio), WXSIZEOF(buf2) - 2 );
buf2[WXSIZEOF(buf2) - 1] = '\0';
item_type = buf2;
} }
// continue the existing radio group, if any // continue the existing radio group, if any
@@ -1161,9 +1128,9 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
// due to an apparent bug in GTK+, we have to use a static buffer here - // due to an apparent bug in GTK+, we have to use a static buffer here -
// otherwise GTK+ 1.2.2 manages to override the memory we pass to it // otherwise GTK+ 1.2.2 manages to override the memory we pass to it
// somehow! (VZ) // somehow! (VZ)
static char s_accel[50]; // must be big enougg static char s_accel[50]; // must be big enough
wxString tmp( GetHotKey(*mitem) ); wxString tmp( GetHotKey(*mitem) );
strncpy(s_accel, tmp.mb_str(), WXSIZEOF(s_accel)); strncpy(s_accel, wxGTK_CONV( tmp ), WXSIZEOF(s_accel));
entry.accelerator = s_accel; entry.accelerator = s_accel;
#else // !wxUSE_ACCEL #else // !wxUSE_ACCEL
entry.accelerator = (char*) NULL; entry.accelerator = (char*) NULL;
@@ -1172,15 +1139,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
wxString path( mitem->GetFactoryPath() ); wxString path( mitem->GetFactoryPath() );
menuItem = gtk_item_factory_get_widget( m_factory, path.mb_str() ); menuItem = gtk_item_factory_get_widget( m_factory, wxGTK_CONV( path ) );
#else // GTK+ 1.0
menuItem = checkable ? gtk_check_menu_item_new_with_label( mitem->GetText().mb_str() )
: gtk_menu_item_new_with_label( mitem->GetText().mb_str() );
gtk_signal_connect( GTK_OBJECT(menuItem), "activate",
GTK_SIGNAL_FUNC(gtk_menu_clicked_callback),
(gpointer)this );
#endif // GTK+ 1.2/1.0
} }
if ( !mitem->IsSeparator() ) if ( !mitem->IsSeparator() )
@@ -1194,22 +1153,12 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
(gpointer)this ); (gpointer)this );
} }
#if !GTK_CHECK_VERSION(1, 2, 0)
if (!appended)
{
gtk_menu_append( GTK_MENU(m_menu), menuItem );
gtk_widget_show( menuItem );
}
#endif // GTK+ 1.0
mitem->SetMenuItem(menuItem); mitem->SetMenuItem(menuItem);
#if GTK_CHECK_VERSION(1, 2, 0)
if ( endOfRadioGroup ) if ( endOfRadioGroup )
{ {
m_pathLastRadio.clear(); m_pathLastRadio.clear();
} }
#endif // GTK+ >= 1.2
return TRUE; return TRUE;
} }

View File

@@ -19,6 +19,7 @@
#include "gtk/gtk.h" #include "gtk/gtk.h"
#include "wx/gtk/win_gtk.h" #include "wx/gtk/win_gtk.h"
#include "wx/gtk/private.h"
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gdk/gdkprivate.h> #include <gdk/gdkprivate.h>
@@ -100,7 +101,7 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g
gdk_draw_string( pizza->bin_window, font, gc, gdk_draw_string( pizza->bin_window, font, gc,
6, 6,
3+font->ascent, 3+font->ascent,
win->m_title.mb_str() ); wxGTK_CONV( win->m_title ) );
gdk_gc_unref( gc ); gdk_gc_unref( gc );
} }
@@ -144,7 +145,7 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
gdk_draw_string( pizza->bin_window, font, gc, gdk_draw_string( pizza->bin_window, font, gc,
6, 6,
3+font->ascent, 3+font->ascent,
win->m_title.mb_str() ); wxGTK_CONV( win->m_title ) );
gdk_gc_unref( gc ); gdk_gc_unref( gc );
} }

View File

@@ -394,7 +394,7 @@ bool wxNotebook::SetPageText( int page, const wxString &text )
nb_page->m_text = text; nb_page->m_text = text;
gtk_label_set( nb_page->m_label, nb_page->m_text.mbc_str() ); gtk_label_set( nb_page->m_label, wxGTK_CONV( nb_page->m_text ) );
return TRUE; return TRUE;
} }
@@ -617,7 +617,7 @@ bool wxNotebook::InsertPage( int position,
page->m_text = text; page->m_text = text;
if (page->m_text.IsEmpty()) page->m_text = wxT(""); if (page->m_text.IsEmpty()) page->m_text = wxT("");
page->m_label = GTK_LABEL( gtk_label_new(page->m_text.mbc_str()) ); page->m_label = GTK_LABEL( gtk_label_new( wxGTK_CONV( page->m_text ) ) );
gtk_box_pack_end( GTK_BOX(page->m_box), GTK_WIDGET(page->m_label), FALSE, FALSE, 3 ); gtk_box_pack_end( GTK_BOX(page->m_box), GTK_WIDGET(page->m_label), FALSE, FALSE, 3 );
/* show the label */ /* show the label */

View File

@@ -180,7 +180,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
return FALSE; return FALSE;
} }
m_widget = gtk_frame_new( title.mbc_str() ); m_widget = gtk_frame_new( wxGTK_CONV( title ) );
// majorDim may be 0 if all trailing parameters were omitted, so don't // majorDim may be 0 if all trailing parameters were omitted, so don't
// assert here but just use the correct value for it // assert here but just use the correct value for it
@@ -202,7 +202,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
label += *pc; label += *pc;
} }
m_radio = GTK_RADIO_BUTTON( gtk_radio_button_new_with_label( radio_button_group, label.mbc_str() ) ); m_radio = GTK_RADIO_BUTTON( gtk_radio_button_new_with_label( radio_button_group, wxGTK_CONV( label ) ) );
gtk_signal_connect( GTK_OBJECT(m_radio), "key_press_event", gtk_signal_connect( GTK_OBJECT(m_radio), "key_press_event",
GTK_SIGNAL_FUNC(gtk_radiobox_keypress_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_radiobox_keypress_callback), (gpointer)this );
@@ -514,7 +514,7 @@ void wxRadioBox::SetLabel( const wxString& label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_frame_set_label( GTK_FRAME(m_widget), wxControl::GetLabel().mbc_str() ); gtk_frame_set_label( GTK_FRAME(m_widget), wxGTK_CONV( wxControl::GetLabel() ) );
} }
void wxRadioBox::SetString( int item, const wxString& label ) void wxRadioBox::SetString( int item, const wxString& label )
@@ -527,7 +527,7 @@ void wxRadioBox::SetString( int item, const wxString& label )
GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(node->Data()) ); GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(node->Data()) );
gtk_label_set( g_label, label.mbc_str() ); gtk_label_set( g_label, wxGTK_CONV( label ) );
} }
bool wxRadioBox::Enable( bool enable ) bool wxRadioBox::Enable( bool enable )

View File

@@ -118,7 +118,7 @@ bool wxRadioButton::Create( wxWindow *parent,
} }
} }
m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, label.mbc_str() ); m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, wxGTK_CONV( label ) );
SetLabel(label); SetLabel(label);
@@ -154,7 +154,7 @@ void wxRadioButton::SetLabel( const wxString& label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(m_widget) ); GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(m_widget) );
gtk_label_set( g_label, GetLabel().mbc_str() ); gtk_label_set( g_label, wxGTK_CONV( GetLabel() ) );
} }
void wxRadioButton::SetValue( bool val ) void wxRadioButton::SetValue( bool val )

View File

@@ -208,7 +208,7 @@ void wxSpinCtrl::SetValue( const wxString& value )
{ {
// invalid number - set text as is (wxMSW compatible) // invalid number - set text as is (wxMSW compatible)
GtkDisableEvents(); GtkDisableEvents();
gtk_entry_set_text( GTK_ENTRY(m_widget), value.mbc_str() ); gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) );
GtkEnableEvents(); GtkEnableEvents();
} }
} }

View File

@@ -16,6 +16,7 @@
#if wxUSE_STATBOX #if wxUSE_STATBOX
#include "wx/statbox.h" #include "wx/statbox.h"
#include "wx/gtk/private.h"
#include "gdk/gdk.h" #include "gdk/gdk.h"
#include "gtk/gtk.h" #include "gtk/gtk.h"
@@ -60,7 +61,7 @@ bool wxStaticBox::Create( wxWindow *parent,
wxControl::SetLabel(label); wxControl::SetLabel(label);
m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : m_label.mbc_str()); m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : (const char*) wxGTK_CONV( m_label ) );
m_parent->DoAddChild( this ); m_parent->DoAddChild( this );
@@ -90,7 +91,7 @@ void wxStaticBox::SetLabel( const wxString &label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_frame_set_label( GTK_FRAME( m_widget ), gtk_frame_set_label( GTK_FRAME( m_widget ),
m_label.empty() ? (char *)NULL : m_label.mbc_str() ); m_label.empty() ? (char *)NULL : (const char*) wxGTK_CONV( m_label ) );
} }
void wxStaticBox::ApplyWidgetStyle() void wxStaticBox::ApplyWidgetStyle()

View File

@@ -17,6 +17,7 @@
#if wxUSE_STATTEXT #if wxUSE_STATTEXT
#include "wx/stattext.h" #include "wx/stattext.h"
#include "wx/gtk/private.h"
#include "gdk/gdk.h" #include "gdk/gdk.h"
#include "gtk/gtk.h" #include "gtk/gtk.h"

View File

@@ -445,10 +445,10 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
widget, widget,
tool->GetLabel().empty() tool->GetLabel().empty()
? NULL ? NULL
: tool->GetLabel().mbc_str(), : (const char*) wxGTK_CONV( tool->GetLabel() ),
tool->GetShortHelp().empty() tool->GetShortHelp().empty()
? NULL ? NULL
: tool->GetShortHelp().mbc_str(), : (const char*) wxGTK_CONV( tool->GetShortHelp() ),
"", // tooltip_private_text (?) "", // tooltip_private_text (?)
tool->m_pixmap, tool->m_pixmap,
(GtkSignalFunc)gtk_toolbar_callback, (GtkSignalFunc)gtk_toolbar_callback,
@@ -526,14 +526,12 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable) void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable)
{ {
#if (GTK_MINOR_VERSION > 0)
wxToolBarTool *tool = (wxToolBarTool *)toolBase; wxToolBarTool *tool = (wxToolBarTool *)toolBase;
/* we don't disable the tools for GTK 1.0 as the bitmaps don't get
greyed anyway and this also disables tooltips */
if (tool->m_item) if (tool->m_item)
{
gtk_widget_set_sensitive( tool->m_item, enable ); gtk_widget_set_sensitive( tool->m_item, enable );
#endif }
} }
void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle ) void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
@@ -611,7 +609,7 @@ void wxToolBar::SetToolShortHelp( int id, const wxString& helpString )
{ {
(void)tool->SetShortHelp(helpString); (void)tool->SetShortHelp(helpString);
gtk_tooltips_set_tip(m_toolbar->tooltips, tool->m_item, gtk_tooltips_set_tip(m_toolbar->tooltips, tool->m_item,
helpString.mbc_str(), ""); wxGTK_CONV( helpString ), "");
} }
} }

View File

@@ -17,17 +17,13 @@
#include "wx/log.h" #include "wx/log.h"
#include "wx/settings.h" #include "wx/settings.h"
#include "wx/panel.h" #include "wx/panel.h"
#include "wx/strconv.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <ctype.h> #include <ctype.h>
#include <math.h> // for fabs #include <math.h> // for fabs
// TODO: reimplement wxTextCtrl using GtkTextView
#ifdef __WXGTK20__
#define GTK_ENABLE_BROKEN // need this to get GtkText at all
#endif // __WXGTK20__
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h>
@@ -55,6 +51,7 @@ static void wxGtkTextInsert(GtkWidget *text,
const char *txt, const char *txt,
size_t len) size_t len)
{ {
#ifndef __WXGTK__
GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont() GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont()
: NULL; : NULL;
@@ -66,6 +63,7 @@ static void wxGtkTextInsert(GtkWidget *text,
: NULL; : NULL;
gtk_text_insert( GTK_TEXT(text), font, colFg, colBg, txt, len ); gtk_text_insert( GTK_TEXT(text), font, colFg, colBg, txt, len );
#endif
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -122,10 +120,10 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win )
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
win->SetModified(); win->SetModified();
win->UpdateFontIfNeeded(); win->UpdateFontIfNeeded();
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
event.SetEventObject( win ); event.SetEventObject( win );
event.SetString( win->GetValue() ); event.SetString( win->GetValue() );
@@ -136,6 +134,7 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win )
// "changed" from vertical scrollbar // "changed" from vertical scrollbar
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#ifndef __WXGTK20__
static void static void
gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
{ {
@@ -146,6 +145,7 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
win->CalculateScrollbar(); win->CalculateScrollbar();
} }
#endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// redraw callback for multiline text // redraw callback for multiline text
@@ -248,20 +248,41 @@ bool wxTextCtrl::Create( wxWindow *parent,
m_vScrollbarVisible = FALSE; m_vScrollbarVisible = FALSE;
bool multi_line = (style & wxTE_MULTILINE) != 0; bool multi_line = (style & wxTE_MULTILINE) != 0;
if (multi_line)
{ #ifdef __WXGTK20__
#ifdef __WXGTK13__ GtkTextBuffer *buffer = NULL;
/* a multi-line edit control: create a vertical scrollbar by default and
horizontal if requested */
bool bHasHScrollbar = (style & wxHSCROLL) != 0;
#else
bool bHasHScrollbar = FALSE;
#endif #endif
/* create our control ... */ if (multi_line)
{
#ifdef __WXGTK20__
// Create view
m_text = gtk_text_view_new();
buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
// create scrolled window
m_widget = gtk_scrolled_window_new( NULL, NULL );
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( m_widget ),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
// Insert view into scrolled window
gtk_container_add( GTK_CONTAINER(m_widget), m_text );
// Global settings which can be overridden by tags, I guess.
if (HasFlag( wxHSCROLL ))
gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( m_text ), GTK_WRAP_NONE );
else
gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( m_text ), GTK_WRAP_WORD );
if (!HasFlag(wxNO_BORDER))
gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW(m_widget), GTK_SHADOW_IN );
#else
// create our control ...
m_text = gtk_text_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); m_text = gtk_text_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
/* ... and put into the upper left hand corner of the table */ // ... and put into the upper left hand corner of the table
bool bHasHScrollbar = FALSE;
m_widget = gtk_table_new(bHasHScrollbar ? 2 : 1, 2, FALSE); m_widget = gtk_table_new(bHasHScrollbar ? 2 : 1, 2, FALSE);
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
gtk_table_attach( GTK_TABLE(m_widget), m_text, 0, 1, 0, 1, gtk_table_attach( GTK_TABLE(m_widget), m_text, 0, 1, 0, 1,
@@ -269,37 +290,21 @@ bool wxTextCtrl::Create( wxWindow *parent,
(GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK),
0, 0); 0, 0);
/* always wrap words */ // always wrap words
gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE ); gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE );
#ifdef __WXGTK13__ // finally, put the vertical scrollbar in the upper right corner
/* put the horizontal scrollbar in the lower left hand corner */
if (bHasHScrollbar)
{
GtkWidget *hscrollbar = gtk_hscrollbar_new(GTK_TEXT(m_text)->hadj);
GTK_WIDGET_UNSET_FLAGS( hscrollbar, GTK_CAN_FOCUS );
gtk_table_attach(GTK_TABLE(m_widget), hscrollbar, 0, 1, 1, 2,
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
GTK_FILL,
0, 0);
gtk_widget_show(hscrollbar);
/* don't wrap lines, otherwise we wouldn't need the scrollbar */
gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
}
#endif
/* finally, put the vertical scrollbar in the upper right corner */
m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj ); m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1, gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1,
GTK_FILL, GTK_FILL,
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
0, 0); 0, 0);
#endif
} }
else else
{ {
/* a single-line text control: no need for scrollbars */ // a single-line text control: no need for scrollbars
m_widget = m_widget =
m_text = gtk_entry_new(); m_text = gtk_entry_new();
} }
@@ -324,12 +329,12 @@ bool wxTextCtrl::Create( wxWindow *parent,
if (multi_line) if (multi_line)
gtk_widget_show(m_text); gtk_widget_show(m_text);
#ifndef __WXGTK20__
if (multi_line) if (multi_line)
{ {
gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed", gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed",
(GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this ); (GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this );
#ifndef __WXGTK20__
// only initialize gs_gtk_text_draw once, starting from the next the // only initialize gs_gtk_text_draw once, starting from the next the
// klass::draw will already be wxgtk_text_draw // klass::draw will already be wxgtk_text_draw
if ( !gs_gtk_text_draw ) if ( !gs_gtk_text_draw )
@@ -341,12 +346,14 @@ bool wxTextCtrl::Create( wxWindow *parent,
draw = wxgtk_text_draw; draw = wxgtk_text_draw;
} }
#endif // GTK+ 1.x
} }
#endif // GTK+ 1.x
if (!value.IsEmpty()) if (!value.IsEmpty())
{ {
gint tmp = 0; #ifdef __WXGTK20__
SetValue( value );
#else
#if !GTK_CHECK_VERSION(1, 2, 0) #if !GTK_CHECK_VERSION(1, 2, 0)
// if we don't realize it, GTK 1.0.6 dies with a SIGSEGV in // if we don't realize it, GTK 1.0.6 dies with a SIGSEGV in
@@ -354,18 +361,21 @@ bool wxTextCtrl::Create( wxWindow *parent,
gtk_widget_realize(m_text); gtk_widget_realize(m_text);
#endif // GTK 1.0 #endif // GTK 1.0
gint tmp = 0;
#if wxUSE_UNICODE #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 ); gtk_editable_insert_text( GTK_EDITABLE(m_text), val, strlen(val), &tmp );
#else // !Unicode #else
gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &tmp ); gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &tmp );
#endif // Unicode/!Unicode #endif
if (multi_line) if (multi_line)
{ {
/* bring editable's cursor uptodate. bug in GTK. */ // Bring editable's cursor uptodate. Bug in GTK.
SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) ));
} }
#endif
} }
if (style & wxTE_PASSWORD) if (style & wxTE_PASSWORD)
@@ -378,19 +388,35 @@ bool wxTextCtrl::Create( wxWindow *parent,
{ {
if (!multi_line) if (!multi_line)
gtk_entry_set_editable( GTK_ENTRY(m_text), FALSE ); gtk_entry_set_editable( GTK_ENTRY(m_text), FALSE );
#ifdef __WXGTK20__
else
gtk_text_view_set_editable( GTK_TEXT_VIEW( m_text), FALSE);
}
#else
} }
else else
{ {
if (multi_line) if (multi_line)
gtk_text_set_editable( GTK_TEXT(m_text), 1 ); gtk_text_set_editable( GTK_TEXT(m_text), 1 );
} }
#endif
/* we want to be notified about text changes */ // We want to be notified about text changes.
#ifdef __WXGTK20__
if (multi_line)
{
g_signal_connect( G_OBJECT(buffer), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
}
else
#endif
{
gtk_signal_connect( GTK_OBJECT(m_text), "changed", gtk_signal_connect( GTK_OBJECT(m_text), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
}
/* we don't set a valid background colour, because the window // we don't set a valid background colour, because the window
manager should use a default one */ // manager should use a default one
m_backgroundColour = wxColour(); m_backgroundColour = wxColour();
wxColour colFg = parent->GetForegroundColour(); wxColour colFg = parent->GetForegroundColour();
@@ -398,8 +424,10 @@ bool wxTextCtrl::Create( wxWindow *parent,
m_cursor = wxCursor( wxCURSOR_IBEAM ); m_cursor = wxCursor( wxCURSOR_IBEAM );
#ifndef __WXGTK20__
wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() ); wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() );
SetDefaultStyle( attrDef ); SetDefaultStyle( attrDef );
#endif
Show( TRUE ); Show( TRUE );
@@ -408,6 +436,7 @@ bool wxTextCtrl::Create( wxWindow *parent,
void wxTextCtrl::CalculateScrollbar() void wxTextCtrl::CalculateScrollbar()
{ {
#ifndef __WXGTK20__
if ((m_windowStyle & wxTE_MULTILINE) == 0) return; if ((m_windowStyle & wxTE_MULTILINE) == 0) return;
GtkAdjustment *adj = GTK_TEXT(m_text)->vadj; GtkAdjustment *adj = GTK_TEXT(m_text)->vadj;
@@ -428,6 +457,7 @@ void wxTextCtrl::CalculateScrollbar()
m_vScrollbarVisible = TRUE; m_vScrollbarVisible = TRUE;
} }
} }
#endif
} }
wxString wxTextCtrl::GetValue() const wxString wxTextCtrl::GetValue() const
@@ -437,15 +467,35 @@ wxString wxTextCtrl::GetValue() const
wxString tmp; wxString tmp;
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter start;
gtk_text_buffer_get_start_iter( text_buffer, &start );
GtkTextIter end;
gtk_text_buffer_get_end_iter( text_buffer, &end );
gchar *text = gtk_text_buffer_get_text( text_buffer, &start, &end, TRUE );
#if wxUSE_UNICODE
wxWCharBuffer buffer( wxConvUTF8.cMB2WX( text ) );
#else
wxCharBuffer buffer( wxConvLocal.cWC2WX( wxConvUTF8.cMB2WC( text ) ) );
#endif
tmp = buffer;
g_free( text );
#else
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
tmp = wxString(text,*wxConvCurrent); tmp = text;
g_free( text ); g_free( text );
#endif
} }
else else
{ {
tmp = wxString(gtk_entry_get_text( GTK_ENTRY(m_text) ),*wxConvCurrent); tmp = wxGTK_CONV_BACK( gtk_entry_get_text( GTK_ENTRY(m_text) ) );
} }
return tmp; return tmp;
} }
@@ -455,26 +505,33 @@ void wxTextCtrl::SetValue( const wxString &value )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
#if wxUSE_UNICODE
wxCharBuffer buffer( wxConvUTF8.cWX2MB( value) );
#else
wxCharBuffer buffer( wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( value ) ) );
#endif
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
gtk_text_buffer_set_text( text_buffer, buffer, strlen(buffer) );
#else
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len ); gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len );
len = 0; len = 0;
#if wxUSE_UNICODE
wxWX2MBbuf tmpbuf = value.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), tmpbuf, strlen(tmpbuf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), value.mbc_str(), value.Length(), &len ); gtk_editable_insert_text( GTK_EDITABLE(m_text), value.mbc_str(), value.Length(), &len );
#endif #endif
} }
else else
{ {
gtk_entry_set_text( GTK_ENTRY(m_text), value.mbc_str() ); gtk_entry_set_text( GTK_ENTRY(m_text), wxGTK_CONV( value ) );
} }
// GRG, Jun/2000: Changed this after a lot of discussion in // GRG, Jun/2000: Changed this after a lot of discussion in
// the lists. wxWindows 2.2 will have a set of flags to // the lists. wxWindows 2.2 will have a set of flags to
// customize this behaviour. // customize this behaviour.
SetInsertionPoint(0); SetInsertionPoint(0);
m_modified = FALSE; m_modified = FALSE;
} }
@@ -485,33 +542,48 @@ void wxTextCtrl::WriteText( const wxString &text )
if ( text.empty() ) if ( text.empty() )
return; return;
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
const char *txt = buf;
size_t txtlen = strlen(buf);
#else
const char *txt = text;
size_t txtlen = text.length();
#endif
if ( m_windowStyle & wxTE_MULTILINE ) if ( m_windowStyle & wxTE_MULTILINE )
{ {
#ifdef __WXGTK20__
#if wxUSE_UNICODE
wxCharBuffer buffer( wxConvUTF8.cWX2MB( text ) );
#else
wxCharBuffer buffer( wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) ) );
#endif
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
gtk_text_buffer_insert_at_cursor( text_buffer, buffer, strlen(buffer) );
#else
// After cursor movements, gtk_text_get_point() is wrong by one. // After cursor movements, gtk_text_get_point() is wrong by one.
gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) ); gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) );
// always use m_defaultStyle, even if it is empty as otherwise // always use m_defaultStyle, even if it is empty as otherwise
// resetting the style and appending some more text wouldn't work: if // resetting the style and appending some more text wouldn't work: if
// we don't specify the style explicitly, the old style would be used // we don't specify the style explicitly, the old style would be used
wxGtkTextInsert(m_text, m_defaultStyle, txt, txtlen); wxGtkTextInsert(m_text, m_defaultStyle, text.c_str(), text.Len());
// Bring editable's cursor back uptodate. // Bring editable's cursor back uptodate.
SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) ));
#endif
} }
else // single line else // single line
{ {
// This moves the cursor pos to behind the inserted text. // This moves the cursor pos to behind the inserted text.
gint len = GET_EDITABLE_POS(m_text); gint len = GET_EDITABLE_POS(m_text);
gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len );
#ifdef __WXGTK20__
#if wxUSE_UNICODE
wxCharBuffer buffer( wxConvUTF8.cWX2MB( text ) );
#else
wxCharBuffer buffer( wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) ) );
#endif
gtk_editable_insert_text( GTK_EDITABLE(m_text), buffer, strlen(buffer), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text.c_str(), text.Len(), &len );
#endif
// Bring editable's cursor uptodate. // Bring editable's cursor uptodate.
len += text.Len(); len += text.Len();
@@ -533,6 +605,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
{ {
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifndef __WXGTK20__
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
@@ -553,6 +626,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
return buf; return buf;
} }
else else
#endif
{ {
return wxEmptyString; return wxEmptyString;
} }
@@ -634,6 +708,11 @@ int wxTextCtrl::GetNumberOfLines() const
{ {
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
GtkTextBuffer *buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
return gtk_text_buffer_get_line_count( buffer );
#else
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
@@ -654,6 +733,7 @@ int wxTextCtrl::GetNumberOfLines() const
{ {
return 0; return 0;
} }
#endif
} }
else else
{ {
@@ -667,14 +747,17 @@ void wxTextCtrl::SetInsertionPoint( long pos )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
/* seems to be broken in GTK 1.0.X: #ifdef __WXGTK20__
gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */ GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset( text_buffer, &iter, pos );
gtk_text_buffer_place_cursor( text_buffer, &iter );
#else
gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* we fake a set_point by inserting and deleting. as the user /* we fake a set_point by inserting and deleting. as the user
isn't supposed to get to know about thos non-sense, we isn't supposed to get to know about this non-sense, we
disconnect so that no events are sent to the user program. */ disconnect so that no events are sent to the user program. */
gint tmp = (gint)pos; gint tmp = (gint)pos;
@@ -684,16 +767,15 @@ void wxTextCtrl::SetInsertionPoint( long pos )
gtk_signal_connect( GTK_OBJECT(m_text), "changed", gtk_signal_connect( GTK_OBJECT(m_text), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* bring editable's cursor uptodate. another bug in GTK. */ // bring editable's cursor uptodate. Bug in GTK.
SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) ));
#endif
} }
else else
{ {
gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos ); 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.
SET_EDITABLE_POS(m_text, (guint32)pos); SET_EDITABLE_POS(m_text, (guint32)pos);
} }
} }
@@ -703,9 +785,20 @@ void wxTextCtrl::SetInsertionPointEnd()
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter end;
gtk_text_buffer_get_end_iter( text_buffer, &end );
gtk_text_buffer_place_cursor( text_buffer, &end );
#else
SetInsertionPoint(gtk_text_get_length(GTK_TEXT(m_text))); SetInsertionPoint(gtk_text_get_length(GTK_TEXT(m_text)));
#endif
}
else else
{
gtk_entry_set_position( GTK_ENTRY(m_text), -1 ); gtk_entry_set_position( GTK_ENTRY(m_text), -1 );
}
} }
void wxTextCtrl::SetEditable( bool editable ) void wxTextCtrl::SetEditable( bool editable )
@@ -713,9 +806,17 @@ void wxTextCtrl::SetEditable( bool editable )
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
gtk_text_view_set_editable( GTK_TEXT_VIEW(m_text), editable );
#else
gtk_text_set_editable( GTK_TEXT(m_text), editable ); gtk_text_set_editable( GTK_TEXT(m_text), editable );
#endif
}
else else
{
gtk_entry_set_editable( GTK_ENTRY(m_text), editable ); gtk_entry_set_editable( GTK_ENTRY(m_text), editable );
}
} }
bool wxTextCtrl::Enable( bool enable ) bool wxTextCtrl::Enable( bool enable )
@@ -728,8 +829,12 @@ bool wxTextCtrl::Enable( bool enable )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
SetEditable( enable );
#else
gtk_text_set_editable( GTK_TEXT(m_text), enable ); gtk_text_set_editable( GTK_TEXT(m_text), enable );
OnParentEnable(enable); OnParentEnable(enable);
#endif
} }
else else
{ {
@@ -823,6 +928,7 @@ void wxTextCtrl::SetSelection( long from, long to )
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
if ( (m_windowStyle & wxTE_MULTILINE) && if ( (m_windowStyle & wxTE_MULTILINE) &&
!GTK_TEXT(m_text)->line_start_cache ) !GTK_TEXT(m_text)->line_start_cache )
{ {
@@ -830,12 +936,25 @@ void wxTextCtrl::SetSelection( long from, long to )
wxLogDebug(_T("Can't call SetSelection() before realizing the control")); wxLogDebug(_T("Can't call SetSelection() before realizing the control"));
return; return;
} }
#endif
gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to ); if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
// ????
#else
gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
#endif
}
else
{
gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
}
} }
void wxTextCtrl::ShowPosition( long pos ) void wxTextCtrl::ShowPosition( long pos )
{ {
#ifndef __WXGTK20__
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
GtkAdjustment *vp = GTK_TEXT(m_text)->vadj; GtkAdjustment *vp = GTK_TEXT(m_text)->vadj;
@@ -847,13 +966,33 @@ void wxTextCtrl::ShowPosition( long pos )
float p = (posLine/totalLines)*(vp->upper - vp->lower) + vp->lower; float p = (posLine/totalLines)*(vp->upper - vp->lower) + vp->lower;
gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p); gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p);
} }
#endif
} }
long wxTextCtrl::GetInsertionPoint() const long wxTextCtrl::GetInsertionPoint() const
{ {
wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") ); wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") );
#ifdef __WXGTK20__
if (m_windowStyle & wxTE_MULTILINE)
{
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
// There is no direct accessor for the cursor, but
// internally, the cursor is the "mark" called
// "insert" in the text view's btree structure.
GtkTextMark *mark = gtk_text_buffer_get_insert( text_buffer );
GtkTextIter cursor;
gtk_text_buffer_get_iter_at_mark( text_buffer, &cursor, mark );
return gtk_text_iter_get_offset( &cursor );
}
else
#endif
{
return (long) GET_EDITABLE_POS(m_text); return (long) GET_EDITABLE_POS(m_text);
}
} }
long wxTextCtrl::GetLastPosition() const long wxTextCtrl::GetLastPosition() const
@@ -861,10 +1000,23 @@ long wxTextCtrl::GetLastPosition() const
wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") ); wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") );
int pos = 0; int pos = 0;
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter end;
gtk_text_buffer_get_end_iter( text_buffer, &end );
pos = gtk_text_iter_get_offset( &end );
#else
pos = gtk_text_get_length( GTK_TEXT(m_text) ); pos = gtk_text_get_length( GTK_TEXT(m_text) );
#endif
}
else else
{
pos = GTK_ENTRY(m_text)->text_length; pos = GTK_ENTRY(m_text)->text_length;
}
return (long)pos; return (long)pos;
} }
@@ -873,13 +1025,16 @@ void wxTextCtrl::Remove( long from, long to )
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
#endif
} }
void wxTextCtrl::Replace( long from, long to, const wxString &value ) void wxTextCtrl::Replace( long from, long to, const wxString &value )
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
if (!value.IsEmpty()) if (!value.IsEmpty())
@@ -892,27 +1047,34 @@ void wxTextCtrl::Replace( long from, long to, const wxString &value )
gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos ); gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
#endif #endif
} }
#endif
} }
void wxTextCtrl::Cut() void wxTextCtrl::Cut()
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
#endif
} }
void wxTextCtrl::Copy() void wxTextCtrl::Copy()
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
#endif
} }
void wxTextCtrl::Paste() void wxTextCtrl::Paste()
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
#endif
} }
// Undo/redo // Undo/redo
@@ -1045,9 +1207,17 @@ GtkWidget* wxTextCtrl::GetConnectWidget()
bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window ) bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window )
{ {
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
return window == gtk_text_view_get_window( GTK_TEXT_VIEW( m_text ), GTK_TEXT_WINDOW_TEXT ); // pure guesswork
#else
return (window == GTK_TEXT(m_text)->text_area); return (window == GTK_TEXT(m_text)->text_area);
#endif
}
else else
{
return (window == GTK_ENTRY(m_text)->text_area); return (window == GTK_ENTRY(m_text)->text_area);
}
} }
// the font will change for subsequent text insertiongs // the font will change for subsequent text insertiongs
@@ -1130,12 +1300,14 @@ bool wxTextCtrl::SetBackgroundColour( const wxColour &colour )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifndef __WXGTK__
GdkWindow *window = GTK_TEXT(m_text)->text_area; GdkWindow *window = GTK_TEXT(m_text)->text_area;
if (!window) if (!window)
return FALSE; return FALSE;
m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
gdk_window_set_background( window, m_backgroundColour.GetColor() ); gdk_window_set_background( window, m_backgroundColour.GetColor() );
gdk_window_clear( window ); gdk_window_clear( window );
#endif
} }
// change active background color too // change active background color too
@@ -1150,6 +1322,7 @@ bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr& style )
with styling (FIXME) */ with styling (FIXME) */
if ( m_windowStyle & wxTE_MULTILINE ) if ( m_windowStyle & wxTE_MULTILINE )
{ {
#ifndef __WXGTK20__
if ( style.IsDefault() ) if ( style.IsDefault() )
{ {
// nothing to do // nothing to do
@@ -1189,6 +1362,7 @@ bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr& style )
/* does not seem to help under GTK+ 1.2 !!! /* does not seem to help under GTK+ 1.2 !!!
gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */ gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */
SetInsertionPoint( old_pos ); SetInsertionPoint( old_pos );
#endif
return TRUE; return TRUE;
} }
else // singe line else // singe line
@@ -1268,6 +1442,7 @@ void wxTextCtrl::OnInternalIdle()
if (cursor.Ok()) if (cursor.Ok())
{ {
#ifndef __WXGTK20__
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (HasFlag(wxTE_MULTILINE)) if (HasFlag(wxTE_MULTILINE))
window = GTK_TEXT(m_text)->text_area; window = GTK_TEXT(m_text)->text_area;
@@ -1283,6 +1458,7 @@ void wxTextCtrl::OnInternalIdle()
window = m_widget->window; window = m_widget->window;
if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget))) if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget)))
gdk_window_set_cursor( window, cursor.GetCursor() ); gdk_window_set_cursor( window, cursor.GetCursor() );
#endif
} }
if (g_delayedFocus == this) if (g_delayedFocus == this)
@@ -1310,20 +1486,24 @@ wxSize wxTextCtrl::DoGetBestSize() const
void wxTextCtrl::Freeze() void wxTextCtrl::Freeze()
{ {
#ifndef __WXGTK20__
if ( HasFlag(wxTE_MULTILINE) ) if ( HasFlag(wxTE_MULTILINE) )
{ {
gtk_text_freeze(GTK_TEXT(m_text)); gtk_text_freeze(GTK_TEXT(m_text));
} }
#endif
} }
void wxTextCtrl::Thaw() void wxTextCtrl::Thaw()
{ {
#ifndef __WXGTK20__
if ( HasFlag(wxTE_MULTILINE) ) if ( HasFlag(wxTE_MULTILINE) )
{ {
GTK_TEXT(m_text)->vadj->value = 0.0; GTK_TEXT(m_text)->vadj->value = 0.0;
gtk_text_thaw(GTK_TEXT(m_text)); gtk_text_thaw(GTK_TEXT(m_text));
} }
#endif
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -1332,11 +1512,16 @@ void wxTextCtrl::Thaw()
GtkAdjustment *wxTextCtrl::GetVAdj() const GtkAdjustment *wxTextCtrl::GetVAdj() const
{ {
#ifdef __WXGTK20__
return NULL;
#else
return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL; return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL;
#endif
} }
bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff) bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff)
{ {
#ifndef __WXGTK20__
float value = adj->value + diff; float value = adj->value + diff;
if ( value < 0 ) if ( value < 0 )
@@ -1357,11 +1542,15 @@ bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff)
gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed"); gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed");
#endif
return TRUE; return TRUE;
} }
bool wxTextCtrl::ScrollLines(int lines) bool wxTextCtrl::ScrollLines(int lines)
{ {
#ifdef __WXGTK20__
return FALSE;
#else
GtkAdjustment *adj = GetVAdj(); GtkAdjustment *adj = GetVAdj();
if ( !adj ) if ( !adj )
return FALSE; return FALSE;
@@ -1370,14 +1559,19 @@ bool wxTextCtrl::ScrollLines(int lines)
static const int KEY_SCROLL_PIXELS = 10; static const int KEY_SCROLL_PIXELS = 10;
return DoScroll(adj, lines*KEY_SCROLL_PIXELS); return DoScroll(adj, lines*KEY_SCROLL_PIXELS);
#endif
} }
bool wxTextCtrl::ScrollPages(int pages) bool wxTextCtrl::ScrollPages(int pages)
{ {
#ifdef __WXGTK20__
return FALSE;
#else
GtkAdjustment *adj = GetVAdj(); GtkAdjustment *adj = GetVAdj();
if ( !adj ) if ( !adj )
return FALSE; return FALSE;
return DoScroll(adj, (int)ceil(pages*adj->page_increment)); return DoScroll(adj, (int)ceil(pages*adj->page_increment));
#endif
} }

View File

@@ -63,7 +63,7 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
wxControl::SetLabel(label); wxControl::SetLabel(label);
// Create the gtk widget. // Create the gtk widget.
m_widget = gtk_toggle_button_new_with_label(m_label.mbc_str()); m_widget = gtk_toggle_button_new_with_label( wxGTK_CONV( m_label ) );
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
@@ -123,7 +123,7 @@ void wxToggleButton::SetLabel(const wxString& label)
wxControl::SetLabel(label); wxControl::SetLabel(label);
gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), GetLabel().mbc_str()); gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), wxGTK_CONV( GetLabel() ) );
} }
bool wxToggleButton::Enable(bool enable /*=TRUE*/) bool wxToggleButton::Enable(bool enable /*=TRUE*/)

View File

@@ -29,6 +29,7 @@
#include "wx/control.h" #include "wx/control.h"
#include "wx/app.h" #include "wx/app.h"
#include "wx/dcclient.h" #include "wx/dcclient.h"
#include "wx/gtk/private.h"
#include <glib.h> #include <glib.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
@@ -368,9 +369,9 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
} }
if (!name.IsEmpty()) if (!name.IsEmpty())
gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() ); gtk_window_set_wmclass( GTK_WINDOW(m_widget), wxGTK_CONV( name ), wxGTK_CONV( name ) );
gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() ); gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event", gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
@@ -517,37 +518,38 @@ static Atom gs_XA_WIN_LAYER = 0;
static void wx_win_hints_set_layer(GtkWidget *window, int layer) static void wx_win_hints_set_layer(GtkWidget *window, int layer)
{ {
XEvent xev; #ifndef __WXGTK20__
GdkWindowPrivate *priv; XEvent xev;
gint prev_error; GdkWindowPrivate *priv;
gint prev_error;
prev_error = gdk_error_warnings; prev_error = gdk_error_warnings;
gdk_error_warnings = 0; gdk_error_warnings = 0;
priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window); priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window);
if (GTK_WIDGET_MAPPED(window)) if (GTK_WIDGET_MAPPED(window))
{ {
xev.type = ClientMessage; xev.type = ClientMessage;
xev.xclient.type = ClientMessage; xev.xclient.type = ClientMessage;
xev.xclient.window = priv->xwindow; xev.xclient.window = priv->xwindow;
xev.xclient.message_type = gs_XA_WIN_LAYER; xev.xclient.message_type = gs_XA_WIN_LAYER;
xev.xclient.format = 32; xev.xclient.format = 32;
xev.xclient.data.l[0] = (long)layer; xev.xclient.data.l[0] = (long)layer;
xev.xclient.data.l[1] = gdk_time_get(); xev.xclient.data.l[1] = gdk_time_get();
XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False,
SubstructureNotifyMask, (XEvent*) &xev); SubstructureNotifyMask, (XEvent*) &xev);
} }
else else
{ {
long data[1]; long data[1];
data[0] = layer; data[0] = layer;
XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER, XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER,
XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1);
1);
} }
gdk_error_warnings = prev_error; gdk_error_warnings = prev_error;
#endif
} }
bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style )
@@ -860,7 +862,7 @@ void wxTopLevelWindowGTK::SetTitle( const wxString &title )
wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
m_title = title; m_title = title;
gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() ); gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) );
} }
void wxTopLevelWindowGTK::DoSetIcon( const wxIcon &icon ) void wxTopLevelWindowGTK::DoSetIcon( const wxIcon &icon )

View File

@@ -54,6 +54,7 @@
#endif #endif
#include <math.h> #include <math.h>
#include <ctype.h>
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include <gdk/gdkprivate.h> #include <gdk/gdkprivate.h>
@@ -3139,7 +3140,7 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") ); wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") );
GdkFont *font = fontToUse.GetInternalFont( 1.0 ); GdkFont *font = fontToUse.GetInternalFont( 1.0 );
if (x) (*x) = gdk_string_width( font, string.mbc_str() ); if (x) (*x) = gdk_string_width( font, wxGTK_CONV( string ) );
if (y) (*y) = font->ascent + font->descent; if (y) (*y) = font->ascent + font->descent;
if (descent) (*descent) = font->descent; if (descent) (*descent) = font->descent;
if (externalLeading) (*externalLeading) = 0; // ?? if (externalLeading) (*externalLeading) = 0; // ??
@@ -3411,7 +3412,8 @@ void wxWindowGTK::GtkSendPaintEvents()
// Clip to paint region in wxClientDC // Clip to paint region in wxClientDC
m_clipPaintRegion = TRUE; m_clipPaintRegion = TRUE;
#ifndef __WXGTK20__
if (GetThemeEnabled()) if (GetThemeEnabled())
{ {
// find ancestor from which to steal background // find ancestor from which to steal background
@@ -3443,7 +3445,10 @@ void wxWindowGTK::GtkSendPaintEvents()
} }
} }
else else
// if (!m_clearRegion.IsEmpty()) // always send an erase event #endif
#ifdef __WXGTK20__
if (!m_clearRegion.IsEmpty()) // Always send an erase event under GTK 1.2
#endif
{ {
wxWindowDC dc( (wxWindow*)this ); wxWindowDC dc( (wxWindow*)this );
if (m_clearRegion.IsEmpty()) if (m_clearRegion.IsEmpty())
@@ -3456,6 +3461,7 @@ void wxWindowGTK::GtkSendPaintEvents()
if (!GetEventHandler()->ProcessEvent(erase_event)) if (!GetEventHandler()->ProcessEvent(erase_event))
{ {
#ifndef __WXGTK20__
if (!g_eraseGC) if (!g_eraseGC)
{ {
g_eraseGC = gdk_gc_new( pizza->bin_window ); g_eraseGC = gdk_gc_new( pizza->bin_window );
@@ -3470,6 +3476,7 @@ void wxWindowGTK::GtkSendPaintEvents()
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
upd ++; upd ++;
} }
#endif
} }
m_clearRegion.Clear(); m_clearRegion.Clear();
} }

View File

@@ -544,7 +544,7 @@ bool wxApp::SendIdleEvents( wxWindow* win )
event.SetEventObject(win); event.SetEventObject(win);
win->GetEventHandler()->ProcessEvent(event); win->GetEventHandler()->ProcessEvent(event);
if (event.MoreRequested()) if (event.MoreRequested())
needMore = TRUE; needMore = TRUE;

View File

@@ -109,10 +109,8 @@ bool wxButton::Create( wxWindow *parent, wxWindowID id, const wxString &label,
SetLabel( label ); SetLabel( label );
#if (GTK_MINOR_VERSION > 0)
if (style & wxNO_BORDER) if (style & wxNO_BORDER)
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE ); gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
#endif
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this ); GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this );
@@ -162,7 +160,7 @@ void wxButton::SetLabel( const wxString &label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_label_set( GTK_LABEL( BUTTON_CHILD(m_widget) ), GetLabel().mbc_str() ); gtk_label_set( GTK_LABEL( BUTTON_CHILD(m_widget) ), wxGTK_CONV( GetLabel() ) );
} }
bool wxButton::Enable( bool enable ) bool wxButton::Enable( bool enable )

View File

@@ -94,7 +94,7 @@ bool wxCheckBox::Create(wxWindow *parent,
// left of it // left of it
m_widgetCheckbox = gtk_check_button_new(); m_widgetCheckbox = gtk_check_button_new();
m_widgetLabel = gtk_label_new(m_label.mbc_str()); m_widgetLabel = gtk_label_new( wxGTK_CONV( m_label ) );
gtk_misc_set_alignment(GTK_MISC(m_widgetLabel), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(m_widgetLabel), 0.0, 0.5);
m_widget = gtk_hbox_new(FALSE, 0); m_widget = gtk_hbox_new(FALSE, 0);
@@ -106,7 +106,7 @@ bool wxCheckBox::Create(wxWindow *parent,
} }
else else
{ {
m_widgetCheckbox = gtk_check_button_new_with_label( m_label.mbc_str() ); m_widgetCheckbox = gtk_check_button_new_with_label( wxGTK_CONV( m_label ) );
m_widgetLabel = BUTTON_CHILD( m_widgetCheckbox ); m_widgetLabel = BUTTON_CHILD( m_widgetCheckbox );
m_widget = m_widgetCheckbox; m_widget = m_widgetCheckbox;
} }
@@ -166,7 +166,7 @@ void wxCheckBox::SetLabel( const wxString& label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_label_set( GTK_LABEL(m_widgetLabel), GetLabel().mbc_str() ); gtk_label_set( GTK_LABEL(m_widgetLabel), wxGTK_CONV( GetLabel() ) );
} }
bool wxCheckBox::Enable( bool enable ) bool wxCheckBox::Enable( bool enable )

View File

@@ -16,6 +16,7 @@
#if wxUSE_CHECKLISTBOX #if wxUSE_CHECKLISTBOX
#include "wx/checklst.h" #include "wx/checklst.h"
#include "wx/gtk/private.h"
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -54,7 +55,7 @@ bool wxCheckListBox::IsChecked( int index ) const
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(label->label,*wxConvCurrent); wxString str( wxGTK_CONV_BACK( label->label ) );
return str.GetChar(1) == wxCHECKLBOX_CHECKED; return str.GetChar(1) == wxCHECKLBOX_CHECKED;
} }
@@ -73,14 +74,14 @@ void wxCheckListBox::Check( int index, bool check )
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(label->label,*wxConvCurrent); wxString str( wxGTK_CONV_BACK( label->label ) );
if (check == (str.GetChar(1) == wxCHECKLBOX_CHECKED)) if (check == (str.GetChar(1) == wxCHECKLBOX_CHECKED))
return; return;
str.SetChar( 1, check ? wxCHECKLBOX_CHECKED : wxCHECKLBOX_UNCHECKED ); str.SetChar( 1, check ? wxCHECKLBOX_CHECKED : wxCHECKLBOX_UNCHECKED );
gtk_label_set( label, str.mbc_str() ); gtk_label_set( label, wxGTK_CONV( str ) );
return; return;
} }

View File

@@ -256,8 +256,9 @@ int wxChoice::FindString( const wxString &string ) const
label = GTK_LABEL( BUTTON_CHILD(m_widget) ); label = GTK_LABEL( BUTTON_CHILD(m_widget) );
wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") );
if (string == wxString(label->label,*wxConvCurrent)) wxString tmp( wxGTK_CONV_BACK( label->label ) );
if (string == tmp)
return count; return count;
child = child->next; child = child->next;
@@ -312,7 +313,7 @@ wxString wxChoice::GetString( int n ) const
wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") );
return wxString(label->label,*wxConvCurrent); return wxString( wxGTK_CONV_BACK(label->label) );
} }
child = child->next; child = child->next;
count++; count++;
@@ -375,7 +376,7 @@ void wxChoice::ApplyWidgetStyle()
size_t wxChoice::GtkAppendHelper(GtkWidget *menu, const wxString& item) size_t wxChoice::GtkAppendHelper(GtkWidget *menu, const wxString& item)
{ {
GtkWidget *menu_item = gtk_menu_item_new_with_label( item.mbc_str() ); GtkWidget *menu_item = gtk_menu_item_new_with_label( wxGTK_CONV( item ) );
size_t index; size_t index;
if ( m_strings ) if ( m_strings )
@@ -439,7 +440,8 @@ wxSize wxChoice::DoGetBestSize() const
size_t count = GetCount(); size_t count = GetCount();
for ( size_t n = 0; n < count; n++ ) for ( size_t n = 0; n < count; n++ )
{ {
width = (wxCoord)gdk_string_width(font, GetString(n).mbc_str()); // FIXME GTK 2.0
width = (wxCoord)gdk_string_width(font, wxGTK_CONV( GetString(n) ) );
if ( width > ret.x ) if ( width > ret.x )
ret.x = width; ret.x = width;
} }
@@ -461,7 +463,7 @@ wxSize wxChoice::DoGetBestSize() const
if ( ret.x < 80 ) if ( ret.x < 80 )
ret.x = 80; ret.x = 80;
ret.y = 16 + gdk_char_height(GET_STYLE_FONT( m_widget->style ), 'H'); ret.y = 16 + gdk_char_height(GET_STYLE_FONT( m_widget->style ), 'H' );
return ret; return ret;
} }

View File

@@ -256,7 +256,7 @@ selection_handler( GtkWidget *WXUNUSED(widget),
{ {
const wchar_t *wstr = (const wchar_t *)d; const wchar_t *wstr = (const wchar_t *)d;
size_t len = wxConvCurrent->WC2MB(NULL, wstr, 0); size_t len = wxConvCurrent->WC2MB(NULL, wstr, 0);
char *str = malloc(len + 1); char *str = (char*) malloc(len + 1);
wxConvCurrent->WC2MB(str, wstr, len); wxConvCurrent->WC2MB(str, wstr, len);
str[len] = '\0'; str[len] = '\0';

View File

@@ -139,7 +139,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
inserting the first item */ inserting the first item */
m_alreadySent = TRUE; m_alreadySent = TRUE;
GtkWidget *list_item = gtk_list_item_new_with_label( choices[i].mbc_str() ); GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( choices[i] ) );
m_clientDataList.Append( (wxObject*)NULL ); m_clientDataList.Append( (wxObject*)NULL );
m_clientObjectList.Append( (wxObject*)NULL ); m_clientObjectList.Append( (wxObject*)NULL );
@@ -213,7 +213,7 @@ void wxComboBox::AppendCommon( const wxString &item )
GtkWidget *list = GTK_COMBO(m_widget)->list; GtkWidget *list = GTK_COMBO(m_widget)->list;
GtkWidget *list_item = gtk_list_item_new_with_label( item.mbc_str() ); GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( item ) );
gtk_container_add( GTK_CONTAINER(list), list_item ); gtk_container_add( GTK_CONTAINER(list), list_item );
@@ -483,7 +483,7 @@ void wxComboBox::SetValue( const wxString& value )
GtkWidget *entry = GTK_COMBO(m_widget)->entry; GtkWidget *entry = GTK_COMBO(m_widget)->entry;
wxString tmp = wxT(""); wxString tmp = wxT("");
if (!value.IsNull()) tmp = value; if (!value.IsNull()) tmp = value;
gtk_entry_set_text( GTK_ENTRY(entry), tmp.mbc_str() ); gtk_entry_set_text( GTK_ENTRY(entry), wxGTK_CONV( tmp ) );
} }
void wxComboBox::Copy() void wxComboBox::Copy()
@@ -541,6 +541,7 @@ void wxComboBox::Replace( long from, long to, const wxString& value )
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
// FIXME: not quite sure how to do this method right in multibyte mode // FIXME: not quite sure how to do this method right in multibyte mode
// FIXME GTK 2.0
GtkWidget *entry = GTK_COMBO(m_widget)->entry; GtkWidget *entry = GTK_COMBO(m_widget)->entry;
gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to );
@@ -713,7 +714,7 @@ wxSize wxComboBox::DoGetBestSize() const
size_t count = Number(); size_t count = Number();
for ( size_t n = 0; n < count; n++ ) for ( size_t n = 0; n < count; n++ )
{ {
width = (wxCoord)gdk_string_width(font, GetString(n).mbc_str()); width = (wxCoord)gdk_string_width(font, wxGTK_CONV( GetString(n) ) );
if ( width > ret.x ) if ( width > ret.x )
ret.x = width; ret.x = width;
} }

View File

@@ -214,9 +214,9 @@ wxFontRefData::wxFontRefData(const wxString& fontname)
{ {
// the test below catches all of BOLD, EXTRABOLD, DEMIBOLD, ULTRABOLD // the test below catches all of BOLD, EXTRABOLD, DEMIBOLD, ULTRABOLD
// and BLACK // and BLACK
if ( ((w[0u] == _T('B') && (!strcmp(w.c_str() + 1, _T("OLD")) || if ( ((w[0u] == _T('B') && (!wxStrcmp(w.c_str() + 1, wxT("OLD")) ||
!strcmp(w.c_str() + 1, _T("LACK"))))) || !wxStrcmp(w.c_str() + 1, wxT("LACK"))))) ||
strstr(w.c_str() + 1, _T("BOLD")) ) wxStrstr(w.c_str() + 1, _T("BOLD")) )
{ {
m_weight = wxFONTWEIGHT_BOLD; m_weight = wxFONTWEIGHT_BOLD;
} }

View File

@@ -57,7 +57,6 @@ bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUN
// "clicked" for OK-button // "clicked" for OK-button
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#ifdef __WXGTK12__
static static
void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dialog ) void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dialog )
{ {
@@ -84,7 +83,6 @@ void gtk_fontdialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFontDialog *dial
event.SetEventObject( dialog ); event.SetEventObject( dialog );
dialog->GetEventHandler()->ProcessEvent( event ); dialog->GetEventHandler()->ProcessEvent( event );
} }
#endif // GTK+ 1.2 and later only
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// "clicked" for Cancel-button // "clicked" for Cancel-button
@@ -120,7 +118,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
} }
wxString m_message( _("Choose font") ); wxString m_message( _("Choose font") );
m_widget = gtk_font_selection_dialog_new( m_message.mbc_str() ); m_widget = gtk_font_selection_dialog_new( wxGTK_CONV( m_message ) );
int x = (gdk_screen_width () - 400) / 2; int x = (gdk_screen_width () - 400) / 2;
int y = (gdk_screen_height () - 400) / 2; int y = (gdk_screen_height () - 400) / 2;
@@ -131,14 +129,18 @@ bool wxFontDialog::DoCreate(wxWindow *parent)
gtk_signal_connect( GTK_OBJECT(sel->ok_button), "clicked", gtk_signal_connect( GTK_OBJECT(sel->ok_button), "clicked",
GTK_SIGNAL_FUNC(gtk_fontdialog_ok_callback), (gpointer*)this ); GTK_SIGNAL_FUNC(gtk_fontdialog_ok_callback), (gpointer*)this );
#ifndef __WXGTK20__
// strange way to internationalize // strange way to internationalize
gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->ok_button) ), wxConvCurrent->cWX2MB(_("OK")) ); gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->ok_button) ), _("OK") );
#endif
gtk_signal_connect( GTK_OBJECT(sel->cancel_button), "clicked", gtk_signal_connect( GTK_OBJECT(sel->cancel_button), "clicked",
GTK_SIGNAL_FUNC(gtk_fontdialog_cancel_callback), (gpointer*)this ); GTK_SIGNAL_FUNC(gtk_fontdialog_cancel_callback), (gpointer*)this );
#ifndef __WXGTK20__
// strange way to internationalize // strange way to internationalize
gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->cancel_button) ), wxConvCurrent->cWX2MB(_("Cancel")) ); gtk_label_set( GTK_LABEL( BUTTON_CHILD(sel->cancel_button) ), _("Cancel") );
#endif
gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event", gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
GTK_SIGNAL_FUNC(gtk_fontdialog_delete_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_fontdialog_delete_callback), (gpointer)this );

View File

@@ -39,9 +39,9 @@ wxJoystick::wxJoystick(int joystick)
{ {
wxString dev_name; wxString dev_name;
// Assume it's the same device name on all Linux systems ... // Assume it's the same device name on all Linux systems ...
dev_name.Printf("/dev/js%d", (joystick == wxJOYSTICK1) ? 0 : 1); dev_name.Printf( wxT("/dev/js%d"), (joystick == wxJOYSTICK1) ? 0 : 1); // FIXME Unicode?
m_joystick = open(dev_name, O_RDWR); m_joystick = open(dev_name.fn_str(), O_RDWR);
m_lastposition = wxPoint(-1, -1); m_lastposition = wxPoint(-1, -1);
for (int i=0;i<15;i++) for (int i=0;i<15;i++)
m_axe[i] = 0; m_axe[i] = 0;
@@ -186,8 +186,8 @@ int wxJoystick::GetNumberJoysticks(void) const
int fd, j; int fd, j;
for (j=0;j<2;j++) { for (j=0;j<2;j++) {
dev_name.Printf("/dev/js%d", j); dev_name.Printf(wxT("/dev/js%d"), j);
fd = open(dev_name, O_RDONLY); fd = open(dev_name.fn_str(), O_RDONLY);
if (fd == -1) if (fd == -1)
return j; return j;
close(fd); close(fd);

View File

@@ -21,6 +21,7 @@
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/checklst.h" #include "wx/checklst.h"
#include "wx/settings.h" #include "wx/settings.h"
#include "wx/gtk/private.h"
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
#include "wx/tooltip.h" #include "wx/tooltip.h"
@@ -537,7 +538,7 @@ void wxListBox::GtkAddItem( const wxString &item, int pos )
} }
#endif // wxUSE_CHECKLISTBOX #endif // wxUSE_CHECKLISTBOX
list_item = gtk_list_item_new_with_label( label.mbc_str() ); list_item = gtk_list_item_new_with_label( wxGTK_CONV( label ) );
GList *gitem_list = g_list_alloc (); GList *gitem_list = g_list_alloc ();
gitem_list->data = list_item; gitem_list->data = list_item;
@@ -737,7 +738,7 @@ void wxListBox::SetString( int n, const wxString &string )
#endif // wxUSE_CHECKLISTBOX #endif // wxUSE_CHECKLISTBOX
str += string; str += string;
gtk_label_set( label, str.mbc_str() ); gtk_label_set( label, wxGTK_CONV( str ) );
} }
else else
{ {
@@ -755,7 +756,7 @@ wxString wxListBox::GetString( int n ) const
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(GET_REAL_LABEL(label->label),*wxConvCurrent); wxString str = wxGTK_CONV_BACK( GET_REAL_LABEL(label->label) );
return str; return str;
} }
@@ -784,7 +785,7 @@ int wxListBox::FindString( const wxString &item ) const
GtkBin *bin = GTK_BIN( child->data ); GtkBin *bin = GTK_BIN( child->data );
GtkLabel *label = GTK_LABEL( bin->child ); GtkLabel *label = GTK_LABEL( bin->child );
wxString str = wxString(GET_REAL_LABEL(label->label),*wxConvCurrent); wxString str = wxGTK_CONV_BACK( GET_REAL_LABEL(label->label) );
if (str == item) if (str == item)
return count; return count;

View File

@@ -18,6 +18,7 @@
#include "wx/dialog.h" #include "wx/dialog.h"
#include "wx/menu.h" #include "wx/menu.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/gtk/private.h"
#include <glib.h> #include <glib.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
@@ -399,7 +400,7 @@ void wxMDIChildFrame::SetTitle( const wxString &title )
wxMDIParentFrame* parent = (wxMDIParentFrame*) GetParent(); wxMDIParentFrame* parent = (wxMDIParentFrame*) GetParent();
GtkNotebook* notebook = GTK_NOTEBOOK(parent->m_widget); GtkNotebook* notebook = GTK_NOTEBOOK(parent->m_widget);
gtk_notebook_set_tab_label_text(notebook, m_widget, title.mbc_str()); gtk_notebook_set_tab_label_text(notebook, m_widget, wxGTK_CONV( title ) );
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@@ -241,14 +241,12 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
{ {
menu->SetInvokingWindow( (wxWindow*) NULL ); menu->SetInvokingWindow( (wxWindow*) NULL );
#if GTK_CHECK_VERSION(1, 2, 0)
wxWindow *top_frame = win; wxWindow *top_frame = win;
while (top_frame->GetParent() && !(top_frame->IsTopLevel())) while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
top_frame = top_frame->GetParent(); top_frame = top_frame->GetParent();
/* support for native hot keys */ /* support for native hot keys */
gtk_accel_group_detach( menu->m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) ); gtk_accel_group_detach( menu->m_accel, ACCEL_OBJ_CAST(top_frame->m_widget) );
#endif
wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst(); wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst();
while (node) while (node)
@@ -347,12 +345,12 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
/* GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has. */ /* GTK 1.2.0 doesn't have gtk_item_factory_get_item(), but GTK 1.2.1 has. */
#if GTK_CHECK_VERSION(1, 2, 1) #if GTK_CHECK_VERSION(1, 2, 1)
/* local buffer in multibyte form */
wxString buf; wxString buf;
buf << wxT('/') << str.c_str(); buf << wxT('/') << str.c_str();
char *cbuf = new char[buf.Length()+1]; /* local buffer in multibyte form */
strcpy(cbuf, buf.mbc_str()); char cbuf[400];
strcpy(cbuf, wxGTK_CONV(buf) );
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
entry.path = (gchar *)cbuf; // const_cast entry.path = (gchar *)cbuf; // const_cast
@@ -374,12 +372,11 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title)
pc++; pc++;
tmp << *pc; tmp << *pc;
} }
menu->m_owner = gtk_item_factory_get_item( m_factory, tmp.mb_str() ); menu->m_owner = gtk_item_factory_get_item( m_factory, wxGTK_CONV( tmp ) );
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu );
delete [] cbuf;
#else #else
menu->m_owner = gtk_menu_item_new_with_label( str.mb_str() ); menu->m_owner = gtk_menu_item_new_with_label( wxGTK_CONV( str ) );
gtk_widget_show( menu->m_owner ); gtk_widget_show( menu->m_owner );
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu );
@@ -400,7 +397,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
if ( !wxMenuBarBase::Insert(pos, menu, title) ) if ( !wxMenuBarBase::Insert(pos, menu, title) )
return FALSE; return FALSE;
#if __WXGTK12__
// GTK+ doesn't have a function to insert a menu using GtkItemFactory (as // GTK+ doesn't have a function to insert a menu using GtkItemFactory (as
// of version 1.2.6), so we first append the item and then change its // of version 1.2.6), so we first append the item and then change its
// index // index
@@ -416,14 +412,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
menu_shell->children = g_list_insert(menu_shell->children, data, pos); menu_shell->children = g_list_insert(menu_shell->children, data, pos);
return TRUE; return TRUE;
#else // GTK < 1.2
// this should be easy to do with GTK 1.0 - can use standard functions for
// this and don't need any hacks like above, but as I don't have GTK 1.0
// any more I can't do it
wxFAIL_MSG( wxT("TODO") );
return FALSE;
#endif // GTK 1.2/1.0
} }
wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
@@ -564,7 +552,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const
wxString label; wxString label;
wxString text( menu->GetTitle() ); wxString text( menu->GetTitle() );
#if GTK_CHECK_VERSION(1, 2, 0)
for ( const wxChar *pc = text.c_str(); *pc; pc++ ) for ( const wxChar *pc = text.c_str(); *pc; pc++ )
{ {
if ( *pc == wxT('_') || *pc == wxT('&') ) if ( *pc == wxT('_') || *pc == wxT('&') )
@@ -576,9 +563,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const
label += *pc; label += *pc;
} }
#else // GTK+ 1.0
label = text;
#endif // GTK+ 1.2/1.0
return label; return label;
} }
@@ -600,10 +584,10 @@ void wxMenuBar::SetLabelTop( size_t pos, const wxString& label )
GtkLabel *label = GTK_LABEL( GTK_BIN(menu->m_owner)->child ); GtkLabel *label = GTK_LABEL( GTK_BIN(menu->m_owner)->child );
/* set new text */ /* set new text */
gtk_label_set( label, str.mb_str()); gtk_label_set( label, wxGTK_CONV( str ) );
/* reparse key accel */ /* reparse key accel */
(void)gtk_label_parse_uline (GTK_LABEL(label), str.mb_str() ); (void)gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( str ) );
gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) ); gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) );
} }
@@ -805,10 +789,10 @@ void wxMenuItem::SetText( const wxString& str )
label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); label = GTK_LABEL( GTK_BIN(m_menuItem)->child );
/* set new text */ /* set new text */
gtk_label_set( label, m_text.mb_str()); gtk_label_set( label, wxGTK_CONV( m_text ) );
/* reparse key accel */ /* reparse key accel */
(void)gtk_label_parse_uline (GTK_LABEL(label), m_text.mb_str() ); (void)gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( m_text ) );
gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) ); gtk_accel_label_refetch( GTK_ACCEL_LABEL(label) );
} }
} }
@@ -854,16 +838,13 @@ void wxMenuItem::DoSetText( const wxString& str )
m_text << *pc; m_text << *pc;
} }
/* only GTK 1.2 knows about hot keys */
m_hotKey = wxT(""); m_hotKey = wxT("");
#if GTK_CHECK_VERSION(1, 2, 0)
if(*pc == wxT('\t')) if(*pc == wxT('\t'))
{ {
pc++; pc++;
m_hotKey = pc; m_hotKey = pc;
} }
#endif // GTK+ 1.2.0+
} }
#if wxUSE_ACCEL #if wxUSE_ACCEL
@@ -952,17 +933,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler)
void wxMenu::Init() void wxMenu::Init()
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
m_accel = gtk_accel_group_new(); m_accel = gtk_accel_group_new();
m_factory = gtk_item_factory_new( GTK_TYPE_MENU, "<main>", m_accel ); m_factory = gtk_item_factory_new( GTK_TYPE_MENU, "<main>", m_accel );
m_menu = gtk_item_factory_get_widget( m_factory, "<main>" ); m_menu = gtk_item_factory_get_widget( m_factory, "<main>" );
#else
m_menu = gtk_menu_new(); // Do not show!
#endif
m_owner = (GtkWidget*) NULL; m_owner = (GtkWidget*) NULL;
#if GTK_CHECK_VERSION(1, 2, 0)
/* Tearoffs are entries, just like separators. So if we want this /* Tearoffs are entries, just like separators. So if we want this
menu to be a tear-off one, we just append a tearoff entry menu to be a tear-off one, we just append a tearoff entry
immediately. */ immediately. */
@@ -977,7 +953,6 @@ void wxMenu::Init()
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
//GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "<main>/tearoff" ); //GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "<main>/tearoff" );
} }
#endif // GTK+ 1.2.0+
// append the title as the very first entry if we have it // append the title as the very first entry if we have it
if ( !!m_title ) if ( !!m_title )
@@ -1004,14 +979,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
bool appended = FALSE; bool appended = FALSE;
#endif #endif
#if GTK_CHECK_VERSION(1, 2, 0)
// does this item terminate the current radio group? // does this item terminate the current radio group?
bool endOfRadioGroup = TRUE; bool endOfRadioGroup = TRUE;
#endif // GTK+ >= 1.2
if ( mitem->IsSeparator() ) if ( mitem->IsSeparator() )
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
entry.path = (char *)"/sep"; entry.path = (char *)"/sep";
entry.callback = (GtkItemFactoryCallback) NULL; entry.callback = (GtkItemFactoryCallback) NULL;
@@ -1026,20 +998,16 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
// we might have a separator inside a radio group // we might have a separator inside a radio group
endOfRadioGroup = FALSE; endOfRadioGroup = FALSE;
#else // GTK+ 1.0
menuItem = gtk_menu_item_new();
#endif // GTK 1.2/1.0
} }
else if ( mitem->IsSubMenu() ) else if ( mitem->IsSubMenu() )
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
/* text has "_" instead of "&" after mitem->SetText() */ /* text has "_" instead of "&" after mitem->SetText() */
wxString text( mitem->GetText() ); wxString text( mitem->GetText() );
/* local buffer in multibyte form */ /* local buffer in multibyte form */
char buf[200]; char buf[200];
strcpy( buf, "/" ); strcpy( buf, "/" );
strcat( buf, text.mb_str() ); strcat( buf, wxGTK_CONV( text ) );
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
entry.path = buf; entry.path = buf;
@@ -1051,10 +1019,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
wxString path( mitem->GetFactoryPath() ); wxString path( mitem->GetFactoryPath() );
menuItem = gtk_item_factory_get_item( m_factory, path.mb_str() ); menuItem = gtk_item_factory_get_item( m_factory, wxGTK_CONV( path ) );
#else // GTK+ 1.0
menuItem = gtk_menu_item_new_with_label(mitem->GetText().mbc_str());
#endif // GTK 1.2/1.0
gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), mitem->GetSubMenu()->m_menu ); gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), mitem->GetSubMenu()->m_menu );
@@ -1071,10 +1036,10 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
const wxBitmap *bitmap = &mitem->GetBitmap(); const wxBitmap *bitmap = &mitem->GetBitmap();
menuItem = gtk_pixmap_menu_item_new (); menuItem = gtk_pixmap_menu_item_new ();
GtkWidget *label = gtk_accel_label_new (text.mb_str()); GtkWidget *label = gtk_accel_label_new ( wxGTK_CONV( text ) );
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_container_add (GTK_CONTAINER (menuItem), label); gtk_container_add (GTK_CONTAINER (menuItem), label);
guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), text.mb_str() ); guint accel_key = gtk_label_parse_uline (GTK_LABEL(label), wxGTK_CONV( text ) );
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), menuItem); gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), menuItem);
if (accel_key != GDK_VoidSymbol) if (accel_key != GDK_VoidSymbol)
{ {
@@ -1103,14 +1068,13 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
#endif // USE_MENU_BITMAPS #endif // USE_MENU_BITMAPS
else // a normal item else // a normal item
{ {
#if GTK_CHECK_VERSION(1, 2, 0)
/* text has "_" instead of "&" after mitem->SetText() */ /* text has "_" instead of "&" after mitem->SetText() */
wxString text( mitem->GetText() ); wxString text( mitem->GetText() );
/* local buffer in multibyte form */ /* local buffer in multibyte form */
char buf[200]; char buf[200];
strcpy( buf, "/" ); strcpy( buf, "/" );
strncat( buf, text.mb_str(), WXSIZEOF(buf) - 2 ); strncat( buf, wxGTK_CONV(text), WXSIZEOF(buf) - 2 );
buf[WXSIZEOF(buf) - 1] = '\0'; buf[WXSIZEOF(buf) - 1] = '\0';
GtkItemFactoryEntry entry; GtkItemFactoryEntry entry;
@@ -1119,6 +1083,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
entry.callback_action = 0; entry.callback_action = 0;
wxString pathRadio; wxString pathRadio;
char buf2[200];
const char *item_type; const char *item_type;
switch ( mitem->GetKind() ) switch ( mitem->GetKind() )
{ {
@@ -1136,9 +1101,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
else // continue the radio group else // continue the radio group
{ {
pathRadio = m_pathLastRadio; pathRadio = m_pathLastRadio;
pathRadio.Replace("_", ""); pathRadio.Replace(wxT("_"), wxT(""));
pathRadio.Prepend("<main>/"); pathRadio.Prepend(wxT("<main>/"));
item_type = pathRadio; strncat( buf2, wxGTK_CONV(pathRadio), WXSIZEOF(buf2) - 2 );
buf2[WXSIZEOF(buf2) - 1] = '\0';
item_type = buf2;
} }
// continue the existing radio group, if any // continue the existing radio group, if any
@@ -1161,9 +1128,9 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
// due to an apparent bug in GTK+, we have to use a static buffer here - // due to an apparent bug in GTK+, we have to use a static buffer here -
// otherwise GTK+ 1.2.2 manages to override the memory we pass to it // otherwise GTK+ 1.2.2 manages to override the memory we pass to it
// somehow! (VZ) // somehow! (VZ)
static char s_accel[50]; // must be big enougg static char s_accel[50]; // must be big enough
wxString tmp( GetHotKey(*mitem) ); wxString tmp( GetHotKey(*mitem) );
strncpy(s_accel, tmp.mb_str(), WXSIZEOF(s_accel)); strncpy(s_accel, wxGTK_CONV( tmp ), WXSIZEOF(s_accel));
entry.accelerator = s_accel; entry.accelerator = s_accel;
#else // !wxUSE_ACCEL #else // !wxUSE_ACCEL
entry.accelerator = (char*) NULL; entry.accelerator = (char*) NULL;
@@ -1172,15 +1139,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */
wxString path( mitem->GetFactoryPath() ); wxString path( mitem->GetFactoryPath() );
menuItem = gtk_item_factory_get_widget( m_factory, path.mb_str() ); menuItem = gtk_item_factory_get_widget( m_factory, wxGTK_CONV( path ) );
#else // GTK+ 1.0
menuItem = checkable ? gtk_check_menu_item_new_with_label( mitem->GetText().mb_str() )
: gtk_menu_item_new_with_label( mitem->GetText().mb_str() );
gtk_signal_connect( GTK_OBJECT(menuItem), "activate",
GTK_SIGNAL_FUNC(gtk_menu_clicked_callback),
(gpointer)this );
#endif // GTK+ 1.2/1.0
} }
if ( !mitem->IsSeparator() ) if ( !mitem->IsSeparator() )
@@ -1194,22 +1153,12 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem)
(gpointer)this ); (gpointer)this );
} }
#if !GTK_CHECK_VERSION(1, 2, 0)
if (!appended)
{
gtk_menu_append( GTK_MENU(m_menu), menuItem );
gtk_widget_show( menuItem );
}
#endif // GTK+ 1.0
mitem->SetMenuItem(menuItem); mitem->SetMenuItem(menuItem);
#if GTK_CHECK_VERSION(1, 2, 0)
if ( endOfRadioGroup ) if ( endOfRadioGroup )
{ {
m_pathLastRadio.clear(); m_pathLastRadio.clear();
} }
#endif // GTK+ >= 1.2
return TRUE; return TRUE;
} }

View File

@@ -19,6 +19,7 @@
#include "gtk/gtk.h" #include "gtk/gtk.h"
#include "wx/gtk/win_gtk.h" #include "wx/gtk/win_gtk.h"
#include "wx/gtk/private.h"
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gdk/gdkprivate.h> #include <gdk/gdkprivate.h>
@@ -100,7 +101,7 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g
gdk_draw_string( pizza->bin_window, font, gc, gdk_draw_string( pizza->bin_window, font, gc,
6, 6,
3+font->ascent, 3+font->ascent,
win->m_title.mb_str() ); wxGTK_CONV( win->m_title ) );
gdk_gc_unref( gc ); gdk_gc_unref( gc );
} }
@@ -144,7 +145,7 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU
gdk_draw_string( pizza->bin_window, font, gc, gdk_draw_string( pizza->bin_window, font, gc,
6, 6,
3+font->ascent, 3+font->ascent,
win->m_title.mb_str() ); wxGTK_CONV( win->m_title ) );
gdk_gc_unref( gc ); gdk_gc_unref( gc );
} }

View File

@@ -394,7 +394,7 @@ bool wxNotebook::SetPageText( int page, const wxString &text )
nb_page->m_text = text; nb_page->m_text = text;
gtk_label_set( nb_page->m_label, nb_page->m_text.mbc_str() ); gtk_label_set( nb_page->m_label, wxGTK_CONV( nb_page->m_text ) );
return TRUE; return TRUE;
} }
@@ -617,7 +617,7 @@ bool wxNotebook::InsertPage( int position,
page->m_text = text; page->m_text = text;
if (page->m_text.IsEmpty()) page->m_text = wxT(""); if (page->m_text.IsEmpty()) page->m_text = wxT("");
page->m_label = GTK_LABEL( gtk_label_new(page->m_text.mbc_str()) ); page->m_label = GTK_LABEL( gtk_label_new( wxGTK_CONV( page->m_text ) ) );
gtk_box_pack_end( GTK_BOX(page->m_box), GTK_WIDGET(page->m_label), FALSE, FALSE, 3 ); gtk_box_pack_end( GTK_BOX(page->m_box), GTK_WIDGET(page->m_label), FALSE, FALSE, 3 );
/* show the label */ /* show the label */

View File

@@ -180,7 +180,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
return FALSE; return FALSE;
} }
m_widget = gtk_frame_new( title.mbc_str() ); m_widget = gtk_frame_new( wxGTK_CONV( title ) );
// majorDim may be 0 if all trailing parameters were omitted, so don't // majorDim may be 0 if all trailing parameters were omitted, so don't
// assert here but just use the correct value for it // assert here but just use the correct value for it
@@ -202,7 +202,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title,
label += *pc; label += *pc;
} }
m_radio = GTK_RADIO_BUTTON( gtk_radio_button_new_with_label( radio_button_group, label.mbc_str() ) ); m_radio = GTK_RADIO_BUTTON( gtk_radio_button_new_with_label( radio_button_group, wxGTK_CONV( label ) ) );
gtk_signal_connect( GTK_OBJECT(m_radio), "key_press_event", gtk_signal_connect( GTK_OBJECT(m_radio), "key_press_event",
GTK_SIGNAL_FUNC(gtk_radiobox_keypress_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_radiobox_keypress_callback), (gpointer)this );
@@ -514,7 +514,7 @@ void wxRadioBox::SetLabel( const wxString& label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_frame_set_label( GTK_FRAME(m_widget), wxControl::GetLabel().mbc_str() ); gtk_frame_set_label( GTK_FRAME(m_widget), wxGTK_CONV( wxControl::GetLabel() ) );
} }
void wxRadioBox::SetString( int item, const wxString& label ) void wxRadioBox::SetString( int item, const wxString& label )
@@ -527,7 +527,7 @@ void wxRadioBox::SetString( int item, const wxString& label )
GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(node->Data()) ); GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(node->Data()) );
gtk_label_set( g_label, label.mbc_str() ); gtk_label_set( g_label, wxGTK_CONV( label ) );
} }
bool wxRadioBox::Enable( bool enable ) bool wxRadioBox::Enable( bool enable )

View File

@@ -118,7 +118,7 @@ bool wxRadioButton::Create( wxWindow *parent,
} }
} }
m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, label.mbc_str() ); m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, wxGTK_CONV( label ) );
SetLabel(label); SetLabel(label);
@@ -154,7 +154,7 @@ void wxRadioButton::SetLabel( const wxString& label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(m_widget) ); GtkLabel *g_label = GTK_LABEL( BUTTON_CHILD(m_widget) );
gtk_label_set( g_label, GetLabel().mbc_str() ); gtk_label_set( g_label, wxGTK_CONV( GetLabel() ) );
} }
void wxRadioButton::SetValue( bool val ) void wxRadioButton::SetValue( bool val )

View File

@@ -208,7 +208,7 @@ void wxSpinCtrl::SetValue( const wxString& value )
{ {
// invalid number - set text as is (wxMSW compatible) // invalid number - set text as is (wxMSW compatible)
GtkDisableEvents(); GtkDisableEvents();
gtk_entry_set_text( GTK_ENTRY(m_widget), value.mbc_str() ); gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) );
GtkEnableEvents(); GtkEnableEvents();
} }
} }

View File

@@ -16,6 +16,7 @@
#if wxUSE_STATBOX #if wxUSE_STATBOX
#include "wx/statbox.h" #include "wx/statbox.h"
#include "wx/gtk/private.h"
#include "gdk/gdk.h" #include "gdk/gdk.h"
#include "gtk/gtk.h" #include "gtk/gtk.h"
@@ -60,7 +61,7 @@ bool wxStaticBox::Create( wxWindow *parent,
wxControl::SetLabel(label); wxControl::SetLabel(label);
m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : m_label.mbc_str()); m_widget = gtk_frame_new(m_label.empty() ? (char *)NULL : (const char*) wxGTK_CONV( m_label ) );
m_parent->DoAddChild( this ); m_parent->DoAddChild( this );
@@ -90,7 +91,7 @@ void wxStaticBox::SetLabel( const wxString &label )
wxControl::SetLabel( label ); wxControl::SetLabel( label );
gtk_frame_set_label( GTK_FRAME( m_widget ), gtk_frame_set_label( GTK_FRAME( m_widget ),
m_label.empty() ? (char *)NULL : m_label.mbc_str() ); m_label.empty() ? (char *)NULL : (const char*) wxGTK_CONV( m_label ) );
} }
void wxStaticBox::ApplyWidgetStyle() void wxStaticBox::ApplyWidgetStyle()

View File

@@ -17,6 +17,7 @@
#if wxUSE_STATTEXT #if wxUSE_STATTEXT
#include "wx/stattext.h" #include "wx/stattext.h"
#include "wx/gtk/private.h"
#include "gdk/gdk.h" #include "gdk/gdk.h"
#include "gtk/gtk.h" #include "gtk/gtk.h"

View File

@@ -445,10 +445,10 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
widget, widget,
tool->GetLabel().empty() tool->GetLabel().empty()
? NULL ? NULL
: tool->GetLabel().mbc_str(), : (const char*) wxGTK_CONV( tool->GetLabel() ),
tool->GetShortHelp().empty() tool->GetShortHelp().empty()
? NULL ? NULL
: tool->GetShortHelp().mbc_str(), : (const char*) wxGTK_CONV( tool->GetShortHelp() ),
"", // tooltip_private_text (?) "", // tooltip_private_text (?)
tool->m_pixmap, tool->m_pixmap,
(GtkSignalFunc)gtk_toolbar_callback, (GtkSignalFunc)gtk_toolbar_callback,
@@ -526,14 +526,12 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable) void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable)
{ {
#if (GTK_MINOR_VERSION > 0)
wxToolBarTool *tool = (wxToolBarTool *)toolBase; wxToolBarTool *tool = (wxToolBarTool *)toolBase;
/* we don't disable the tools for GTK 1.0 as the bitmaps don't get
greyed anyway and this also disables tooltips */
if (tool->m_item) if (tool->m_item)
{
gtk_widget_set_sensitive( tool->m_item, enable ); gtk_widget_set_sensitive( tool->m_item, enable );
#endif }
} }
void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle ) void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
@@ -611,7 +609,7 @@ void wxToolBar::SetToolShortHelp( int id, const wxString& helpString )
{ {
(void)tool->SetShortHelp(helpString); (void)tool->SetShortHelp(helpString);
gtk_tooltips_set_tip(m_toolbar->tooltips, tool->m_item, gtk_tooltips_set_tip(m_toolbar->tooltips, tool->m_item,
helpString.mbc_str(), ""); wxGTK_CONV( helpString ), "");
} }
} }

View File

@@ -17,17 +17,13 @@
#include "wx/log.h" #include "wx/log.h"
#include "wx/settings.h" #include "wx/settings.h"
#include "wx/panel.h" #include "wx/panel.h"
#include "wx/strconv.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <ctype.h> #include <ctype.h>
#include <math.h> // for fabs #include <math.h> // for fabs
// TODO: reimplement wxTextCtrl using GtkTextView
#ifdef __WXGTK20__
#define GTK_ENABLE_BROKEN // need this to get GtkText at all
#endif // __WXGTK20__
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h>
@@ -55,6 +51,7 @@ static void wxGtkTextInsert(GtkWidget *text,
const char *txt, const char *txt,
size_t len) size_t len)
{ {
#ifndef __WXGTK__
GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont() GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont()
: NULL; : NULL;
@@ -66,6 +63,7 @@ static void wxGtkTextInsert(GtkWidget *text,
: NULL; : NULL;
gtk_text_insert( GTK_TEXT(text), font, colFg, colBg, txt, len ); gtk_text_insert( GTK_TEXT(text), font, colFg, colBg, txt, len );
#endif
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -122,10 +120,10 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win )
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
win->SetModified(); win->SetModified();
win->UpdateFontIfNeeded(); win->UpdateFontIfNeeded();
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
event.SetEventObject( win ); event.SetEventObject( win );
event.SetString( win->GetValue() ); event.SetString( win->GetValue() );
@@ -136,6 +134,7 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win )
// "changed" from vertical scrollbar // "changed" from vertical scrollbar
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#ifndef __WXGTK20__
static void static void
gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
{ {
@@ -146,6 +145,7 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
win->CalculateScrollbar(); win->CalculateScrollbar();
} }
#endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// redraw callback for multiline text // redraw callback for multiline text
@@ -248,20 +248,41 @@ bool wxTextCtrl::Create( wxWindow *parent,
m_vScrollbarVisible = FALSE; m_vScrollbarVisible = FALSE;
bool multi_line = (style & wxTE_MULTILINE) != 0; bool multi_line = (style & wxTE_MULTILINE) != 0;
if (multi_line)
{ #ifdef __WXGTK20__
#ifdef __WXGTK13__ GtkTextBuffer *buffer = NULL;
/* a multi-line edit control: create a vertical scrollbar by default and
horizontal if requested */
bool bHasHScrollbar = (style & wxHSCROLL) != 0;
#else
bool bHasHScrollbar = FALSE;
#endif #endif
/* create our control ... */ if (multi_line)
{
#ifdef __WXGTK20__
// Create view
m_text = gtk_text_view_new();
buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
// create scrolled window
m_widget = gtk_scrolled_window_new( NULL, NULL );
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( m_widget ),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
// Insert view into scrolled window
gtk_container_add( GTK_CONTAINER(m_widget), m_text );
// Global settings which can be overridden by tags, I guess.
if (HasFlag( wxHSCROLL ))
gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( m_text ), GTK_WRAP_NONE );
else
gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( m_text ), GTK_WRAP_WORD );
if (!HasFlag(wxNO_BORDER))
gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW(m_widget), GTK_SHADOW_IN );
#else
// create our control ...
m_text = gtk_text_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); m_text = gtk_text_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
/* ... and put into the upper left hand corner of the table */ // ... and put into the upper left hand corner of the table
bool bHasHScrollbar = FALSE;
m_widget = gtk_table_new(bHasHScrollbar ? 2 : 1, 2, FALSE); m_widget = gtk_table_new(bHasHScrollbar ? 2 : 1, 2, FALSE);
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
gtk_table_attach( GTK_TABLE(m_widget), m_text, 0, 1, 0, 1, gtk_table_attach( GTK_TABLE(m_widget), m_text, 0, 1, 0, 1,
@@ -269,37 +290,21 @@ bool wxTextCtrl::Create( wxWindow *parent,
(GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK),
0, 0); 0, 0);
/* always wrap words */ // always wrap words
gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE ); gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE );
#ifdef __WXGTK13__ // finally, put the vertical scrollbar in the upper right corner
/* put the horizontal scrollbar in the lower left hand corner */
if (bHasHScrollbar)
{
GtkWidget *hscrollbar = gtk_hscrollbar_new(GTK_TEXT(m_text)->hadj);
GTK_WIDGET_UNSET_FLAGS( hscrollbar, GTK_CAN_FOCUS );
gtk_table_attach(GTK_TABLE(m_widget), hscrollbar, 0, 1, 1, 2,
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
GTK_FILL,
0, 0);
gtk_widget_show(hscrollbar);
/* don't wrap lines, otherwise we wouldn't need the scrollbar */
gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
}
#endif
/* finally, put the vertical scrollbar in the upper right corner */
m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj ); m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1, gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1,
GTK_FILL, GTK_FILL,
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK),
0, 0); 0, 0);
#endif
} }
else else
{ {
/* a single-line text control: no need for scrollbars */ // a single-line text control: no need for scrollbars
m_widget = m_widget =
m_text = gtk_entry_new(); m_text = gtk_entry_new();
} }
@@ -324,12 +329,12 @@ bool wxTextCtrl::Create( wxWindow *parent,
if (multi_line) if (multi_line)
gtk_widget_show(m_text); gtk_widget_show(m_text);
#ifndef __WXGTK20__
if (multi_line) if (multi_line)
{ {
gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed", gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed",
(GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this ); (GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this );
#ifndef __WXGTK20__
// only initialize gs_gtk_text_draw once, starting from the next the // only initialize gs_gtk_text_draw once, starting from the next the
// klass::draw will already be wxgtk_text_draw // klass::draw will already be wxgtk_text_draw
if ( !gs_gtk_text_draw ) if ( !gs_gtk_text_draw )
@@ -341,12 +346,14 @@ bool wxTextCtrl::Create( wxWindow *parent,
draw = wxgtk_text_draw; draw = wxgtk_text_draw;
} }
#endif // GTK+ 1.x
} }
#endif // GTK+ 1.x
if (!value.IsEmpty()) if (!value.IsEmpty())
{ {
gint tmp = 0; #ifdef __WXGTK20__
SetValue( value );
#else
#if !GTK_CHECK_VERSION(1, 2, 0) #if !GTK_CHECK_VERSION(1, 2, 0)
// if we don't realize it, GTK 1.0.6 dies with a SIGSEGV in // if we don't realize it, GTK 1.0.6 dies with a SIGSEGV in
@@ -354,18 +361,21 @@ bool wxTextCtrl::Create( wxWindow *parent,
gtk_widget_realize(m_text); gtk_widget_realize(m_text);
#endif // GTK 1.0 #endif // GTK 1.0
gint tmp = 0;
#if wxUSE_UNICODE #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 ); gtk_editable_insert_text( GTK_EDITABLE(m_text), val, strlen(val), &tmp );
#else // !Unicode #else
gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &tmp ); gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &tmp );
#endif // Unicode/!Unicode #endif
if (multi_line) if (multi_line)
{ {
/* bring editable's cursor uptodate. bug in GTK. */ // Bring editable's cursor uptodate. Bug in GTK.
SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) ));
} }
#endif
} }
if (style & wxTE_PASSWORD) if (style & wxTE_PASSWORD)
@@ -378,19 +388,35 @@ bool wxTextCtrl::Create( wxWindow *parent,
{ {
if (!multi_line) if (!multi_line)
gtk_entry_set_editable( GTK_ENTRY(m_text), FALSE ); gtk_entry_set_editable( GTK_ENTRY(m_text), FALSE );
#ifdef __WXGTK20__
else
gtk_text_view_set_editable( GTK_TEXT_VIEW( m_text), FALSE);
}
#else
} }
else else
{ {
if (multi_line) if (multi_line)
gtk_text_set_editable( GTK_TEXT(m_text), 1 ); gtk_text_set_editable( GTK_TEXT(m_text), 1 );
} }
#endif
/* we want to be notified about text changes */ // We want to be notified about text changes.
#ifdef __WXGTK20__
if (multi_line)
{
g_signal_connect( G_OBJECT(buffer), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
}
else
#endif
{
gtk_signal_connect( GTK_OBJECT(m_text), "changed", gtk_signal_connect( GTK_OBJECT(m_text), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
}
/* we don't set a valid background colour, because the window // we don't set a valid background colour, because the window
manager should use a default one */ // manager should use a default one
m_backgroundColour = wxColour(); m_backgroundColour = wxColour();
wxColour colFg = parent->GetForegroundColour(); wxColour colFg = parent->GetForegroundColour();
@@ -398,8 +424,10 @@ bool wxTextCtrl::Create( wxWindow *parent,
m_cursor = wxCursor( wxCURSOR_IBEAM ); m_cursor = wxCursor( wxCURSOR_IBEAM );
#ifndef __WXGTK20__
wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() ); wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() );
SetDefaultStyle( attrDef ); SetDefaultStyle( attrDef );
#endif
Show( TRUE ); Show( TRUE );
@@ -408,6 +436,7 @@ bool wxTextCtrl::Create( wxWindow *parent,
void wxTextCtrl::CalculateScrollbar() void wxTextCtrl::CalculateScrollbar()
{ {
#ifndef __WXGTK20__
if ((m_windowStyle & wxTE_MULTILINE) == 0) return; if ((m_windowStyle & wxTE_MULTILINE) == 0) return;
GtkAdjustment *adj = GTK_TEXT(m_text)->vadj; GtkAdjustment *adj = GTK_TEXT(m_text)->vadj;
@@ -428,6 +457,7 @@ void wxTextCtrl::CalculateScrollbar()
m_vScrollbarVisible = TRUE; m_vScrollbarVisible = TRUE;
} }
} }
#endif
} }
wxString wxTextCtrl::GetValue() const wxString wxTextCtrl::GetValue() const
@@ -437,15 +467,35 @@ wxString wxTextCtrl::GetValue() const
wxString tmp; wxString tmp;
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter start;
gtk_text_buffer_get_start_iter( text_buffer, &start );
GtkTextIter end;
gtk_text_buffer_get_end_iter( text_buffer, &end );
gchar *text = gtk_text_buffer_get_text( text_buffer, &start, &end, TRUE );
#if wxUSE_UNICODE
wxWCharBuffer buffer( wxConvUTF8.cMB2WX( text ) );
#else
wxCharBuffer buffer( wxConvLocal.cWC2WX( wxConvUTF8.cMB2WC( text ) ) );
#endif
tmp = buffer;
g_free( text );
#else
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
tmp = wxString(text,*wxConvCurrent); tmp = text;
g_free( text ); g_free( text );
#endif
} }
else else
{ {
tmp = wxString(gtk_entry_get_text( GTK_ENTRY(m_text) ),*wxConvCurrent); tmp = wxGTK_CONV_BACK( gtk_entry_get_text( GTK_ENTRY(m_text) ) );
} }
return tmp; return tmp;
} }
@@ -455,26 +505,33 @@ void wxTextCtrl::SetValue( const wxString &value )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
#if wxUSE_UNICODE
wxCharBuffer buffer( wxConvUTF8.cWX2MB( value) );
#else
wxCharBuffer buffer( wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( value ) ) );
#endif
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
gtk_text_buffer_set_text( text_buffer, buffer, strlen(buffer) );
#else
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len ); gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len );
len = 0; len = 0;
#if wxUSE_UNICODE
wxWX2MBbuf tmpbuf = value.mbc_str();
gtk_editable_insert_text( GTK_EDITABLE(m_text), tmpbuf, strlen(tmpbuf), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), value.mbc_str(), value.Length(), &len ); gtk_editable_insert_text( GTK_EDITABLE(m_text), value.mbc_str(), value.Length(), &len );
#endif #endif
} }
else else
{ {
gtk_entry_set_text( GTK_ENTRY(m_text), value.mbc_str() ); gtk_entry_set_text( GTK_ENTRY(m_text), wxGTK_CONV( value ) );
} }
// GRG, Jun/2000: Changed this after a lot of discussion in // GRG, Jun/2000: Changed this after a lot of discussion in
// the lists. wxWindows 2.2 will have a set of flags to // the lists. wxWindows 2.2 will have a set of flags to
// customize this behaviour. // customize this behaviour.
SetInsertionPoint(0); SetInsertionPoint(0);
m_modified = FALSE; m_modified = FALSE;
} }
@@ -485,33 +542,48 @@ void wxTextCtrl::WriteText( const wxString &text )
if ( text.empty() ) if ( text.empty() )
return; return;
#if wxUSE_UNICODE
wxWX2MBbuf buf = text.mbc_str();
const char *txt = buf;
size_t txtlen = strlen(buf);
#else
const char *txt = text;
size_t txtlen = text.length();
#endif
if ( m_windowStyle & wxTE_MULTILINE ) if ( m_windowStyle & wxTE_MULTILINE )
{ {
#ifdef __WXGTK20__
#if wxUSE_UNICODE
wxCharBuffer buffer( wxConvUTF8.cWX2MB( text ) );
#else
wxCharBuffer buffer( wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) ) );
#endif
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
gtk_text_buffer_insert_at_cursor( text_buffer, buffer, strlen(buffer) );
#else
// After cursor movements, gtk_text_get_point() is wrong by one. // After cursor movements, gtk_text_get_point() is wrong by one.
gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) ); gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) );
// always use m_defaultStyle, even if it is empty as otherwise // always use m_defaultStyle, even if it is empty as otherwise
// resetting the style and appending some more text wouldn't work: if // resetting the style and appending some more text wouldn't work: if
// we don't specify the style explicitly, the old style would be used // we don't specify the style explicitly, the old style would be used
wxGtkTextInsert(m_text, m_defaultStyle, txt, txtlen); wxGtkTextInsert(m_text, m_defaultStyle, text.c_str(), text.Len());
// Bring editable's cursor back uptodate. // Bring editable's cursor back uptodate.
SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) ));
#endif
} }
else // single line else // single line
{ {
// This moves the cursor pos to behind the inserted text. // This moves the cursor pos to behind the inserted text.
gint len = GET_EDITABLE_POS(m_text); gint len = GET_EDITABLE_POS(m_text);
gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len );
#ifdef __WXGTK20__
#if wxUSE_UNICODE
wxCharBuffer buffer( wxConvUTF8.cWX2MB( text ) );
#else
wxCharBuffer buffer( wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) ) );
#endif
gtk_editable_insert_text( GTK_EDITABLE(m_text), buffer, strlen(buffer), &len );
#else
gtk_editable_insert_text( GTK_EDITABLE(m_text), text.c_str(), text.Len(), &len );
#endif
// Bring editable's cursor uptodate. // Bring editable's cursor uptodate.
len += text.Len(); len += text.Len();
@@ -533,6 +605,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
{ {
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifndef __WXGTK20__
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
@@ -553,6 +626,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
return buf; return buf;
} }
else else
#endif
{ {
return wxEmptyString; return wxEmptyString;
} }
@@ -634,6 +708,11 @@ int wxTextCtrl::GetNumberOfLines() const
{ {
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
GtkTextBuffer *buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
return gtk_text_buffer_get_line_count( buffer );
#else
gint len = gtk_text_get_length( GTK_TEXT(m_text) ); gint len = gtk_text_get_length( GTK_TEXT(m_text) );
char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
@@ -654,6 +733,7 @@ int wxTextCtrl::GetNumberOfLines() const
{ {
return 0; return 0;
} }
#endif
} }
else else
{ {
@@ -667,14 +747,17 @@ void wxTextCtrl::SetInsertionPoint( long pos )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
/* seems to be broken in GTK 1.0.X: #ifdef __WXGTK20__
gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */ GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset( text_buffer, &iter, pos );
gtk_text_buffer_place_cursor( text_buffer, &iter );
#else
gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* we fake a set_point by inserting and deleting. as the user /* we fake a set_point by inserting and deleting. as the user
isn't supposed to get to know about thos non-sense, we isn't supposed to get to know about this non-sense, we
disconnect so that no events are sent to the user program. */ disconnect so that no events are sent to the user program. */
gint tmp = (gint)pos; gint tmp = (gint)pos;
@@ -684,16 +767,15 @@ void wxTextCtrl::SetInsertionPoint( long pos )
gtk_signal_connect( GTK_OBJECT(m_text), "changed", gtk_signal_connect( GTK_OBJECT(m_text), "changed",
GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
/* bring editable's cursor uptodate. another bug in GTK. */ // bring editable's cursor uptodate. Bug in GTK.
SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) ));
#endif
} }
else else
{ {
gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos ); 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.
SET_EDITABLE_POS(m_text, (guint32)pos); SET_EDITABLE_POS(m_text, (guint32)pos);
} }
} }
@@ -703,9 +785,20 @@ void wxTextCtrl::SetInsertionPointEnd()
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter end;
gtk_text_buffer_get_end_iter( text_buffer, &end );
gtk_text_buffer_place_cursor( text_buffer, &end );
#else
SetInsertionPoint(gtk_text_get_length(GTK_TEXT(m_text))); SetInsertionPoint(gtk_text_get_length(GTK_TEXT(m_text)));
#endif
}
else else
{
gtk_entry_set_position( GTK_ENTRY(m_text), -1 ); gtk_entry_set_position( GTK_ENTRY(m_text), -1 );
}
} }
void wxTextCtrl::SetEditable( bool editable ) void wxTextCtrl::SetEditable( bool editable )
@@ -713,9 +806,17 @@ void wxTextCtrl::SetEditable( bool editable )
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
gtk_text_view_set_editable( GTK_TEXT_VIEW(m_text), editable );
#else
gtk_text_set_editable( GTK_TEXT(m_text), editable ); gtk_text_set_editable( GTK_TEXT(m_text), editable );
#endif
}
else else
{
gtk_entry_set_editable( GTK_ENTRY(m_text), editable ); gtk_entry_set_editable( GTK_ENTRY(m_text), editable );
}
} }
bool wxTextCtrl::Enable( bool enable ) bool wxTextCtrl::Enable( bool enable )
@@ -728,8 +829,12 @@ bool wxTextCtrl::Enable( bool enable )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifdef __WXGTK20__
SetEditable( enable );
#else
gtk_text_set_editable( GTK_TEXT(m_text), enable ); gtk_text_set_editable( GTK_TEXT(m_text), enable );
OnParentEnable(enable); OnParentEnable(enable);
#endif
} }
else else
{ {
@@ -823,6 +928,7 @@ void wxTextCtrl::SetSelection( long from, long to )
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
if ( (m_windowStyle & wxTE_MULTILINE) && if ( (m_windowStyle & wxTE_MULTILINE) &&
!GTK_TEXT(m_text)->line_start_cache ) !GTK_TEXT(m_text)->line_start_cache )
{ {
@@ -830,12 +936,25 @@ void wxTextCtrl::SetSelection( long from, long to )
wxLogDebug(_T("Can't call SetSelection() before realizing the control")); wxLogDebug(_T("Can't call SetSelection() before realizing the control"));
return; return;
} }
#endif
gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to ); if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
// ????
#else
gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
#endif
}
else
{
gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
}
} }
void wxTextCtrl::ShowPosition( long pos ) void wxTextCtrl::ShowPosition( long pos )
{ {
#ifndef __WXGTK20__
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
GtkAdjustment *vp = GTK_TEXT(m_text)->vadj; GtkAdjustment *vp = GTK_TEXT(m_text)->vadj;
@@ -847,13 +966,33 @@ void wxTextCtrl::ShowPosition( long pos )
float p = (posLine/totalLines)*(vp->upper - vp->lower) + vp->lower; float p = (posLine/totalLines)*(vp->upper - vp->lower) + vp->lower;
gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p); gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p);
} }
#endif
} }
long wxTextCtrl::GetInsertionPoint() const long wxTextCtrl::GetInsertionPoint() const
{ {
wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") ); wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") );
#ifdef __WXGTK20__
if (m_windowStyle & wxTE_MULTILINE)
{
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
// There is no direct accessor for the cursor, but
// internally, the cursor is the "mark" called
// "insert" in the text view's btree structure.
GtkTextMark *mark = gtk_text_buffer_get_insert( text_buffer );
GtkTextIter cursor;
gtk_text_buffer_get_iter_at_mark( text_buffer, &cursor, mark );
return gtk_text_iter_get_offset( &cursor );
}
else
#endif
{
return (long) GET_EDITABLE_POS(m_text); return (long) GET_EDITABLE_POS(m_text);
}
} }
long wxTextCtrl::GetLastPosition() const long wxTextCtrl::GetLastPosition() const
@@ -861,10 +1000,23 @@ long wxTextCtrl::GetLastPosition() const
wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") ); wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") );
int pos = 0; int pos = 0;
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) );
GtkTextIter end;
gtk_text_buffer_get_end_iter( text_buffer, &end );
pos = gtk_text_iter_get_offset( &end );
#else
pos = gtk_text_get_length( GTK_TEXT(m_text) ); pos = gtk_text_get_length( GTK_TEXT(m_text) );
#endif
}
else else
{
pos = GTK_ENTRY(m_text)->text_length; pos = GTK_ENTRY(m_text)->text_length;
}
return (long)pos; return (long)pos;
} }
@@ -873,13 +1025,16 @@ void wxTextCtrl::Remove( long from, long to )
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
#endif
} }
void wxTextCtrl::Replace( long from, long to, const wxString &value ) void wxTextCtrl::Replace( long from, long to, const wxString &value )
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
if (!value.IsEmpty()) if (!value.IsEmpty())
@@ -892,27 +1047,34 @@ void wxTextCtrl::Replace( long from, long to, const wxString &value )
gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos ); gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
#endif #endif
} }
#endif
} }
void wxTextCtrl::Cut() void wxTextCtrl::Cut()
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
#endif
} }
void wxTextCtrl::Copy() void wxTextCtrl::Copy()
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
#endif
} }
void wxTextCtrl::Paste() void wxTextCtrl::Paste()
{ {
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
#ifndef __WXGTK20__
gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
#endif
} }
// Undo/redo // Undo/redo
@@ -1045,9 +1207,17 @@ GtkWidget* wxTextCtrl::GetConnectWidget()
bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window ) bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window )
{ {
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{
#ifdef __WXGTK20__
return window == gtk_text_view_get_window( GTK_TEXT_VIEW( m_text ), GTK_TEXT_WINDOW_TEXT ); // pure guesswork
#else
return (window == GTK_TEXT(m_text)->text_area); return (window == GTK_TEXT(m_text)->text_area);
#endif
}
else else
{
return (window == GTK_ENTRY(m_text)->text_area); return (window == GTK_ENTRY(m_text)->text_area);
}
} }
// the font will change for subsequent text insertiongs // the font will change for subsequent text insertiongs
@@ -1130,12 +1300,14 @@ bool wxTextCtrl::SetBackgroundColour( const wxColour &colour )
if (m_windowStyle & wxTE_MULTILINE) if (m_windowStyle & wxTE_MULTILINE)
{ {
#ifndef __WXGTK__
GdkWindow *window = GTK_TEXT(m_text)->text_area; GdkWindow *window = GTK_TEXT(m_text)->text_area;
if (!window) if (!window)
return FALSE; return FALSE;
m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
gdk_window_set_background( window, m_backgroundColour.GetColor() ); gdk_window_set_background( window, m_backgroundColour.GetColor() );
gdk_window_clear( window ); gdk_window_clear( window );
#endif
} }
// change active background color too // change active background color too
@@ -1150,6 +1322,7 @@ bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr& style )
with styling (FIXME) */ with styling (FIXME) */
if ( m_windowStyle & wxTE_MULTILINE ) if ( m_windowStyle & wxTE_MULTILINE )
{ {
#ifndef __WXGTK20__
if ( style.IsDefault() ) if ( style.IsDefault() )
{ {
// nothing to do // nothing to do
@@ -1189,6 +1362,7 @@ bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr& style )
/* does not seem to help under GTK+ 1.2 !!! /* does not seem to help under GTK+ 1.2 !!!
gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */ gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */
SetInsertionPoint( old_pos ); SetInsertionPoint( old_pos );
#endif
return TRUE; return TRUE;
} }
else // singe line else // singe line
@@ -1268,6 +1442,7 @@ void wxTextCtrl::OnInternalIdle()
if (cursor.Ok()) if (cursor.Ok())
{ {
#ifndef __WXGTK20__
GdkWindow *window = (GdkWindow*) NULL; GdkWindow *window = (GdkWindow*) NULL;
if (HasFlag(wxTE_MULTILINE)) if (HasFlag(wxTE_MULTILINE))
window = GTK_TEXT(m_text)->text_area; window = GTK_TEXT(m_text)->text_area;
@@ -1283,6 +1458,7 @@ void wxTextCtrl::OnInternalIdle()
window = m_widget->window; window = m_widget->window;
if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget))) if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget)))
gdk_window_set_cursor( window, cursor.GetCursor() ); gdk_window_set_cursor( window, cursor.GetCursor() );
#endif
} }
if (g_delayedFocus == this) if (g_delayedFocus == this)
@@ -1310,20 +1486,24 @@ wxSize wxTextCtrl::DoGetBestSize() const
void wxTextCtrl::Freeze() void wxTextCtrl::Freeze()
{ {
#ifndef __WXGTK20__
if ( HasFlag(wxTE_MULTILINE) ) if ( HasFlag(wxTE_MULTILINE) )
{ {
gtk_text_freeze(GTK_TEXT(m_text)); gtk_text_freeze(GTK_TEXT(m_text));
} }
#endif
} }
void wxTextCtrl::Thaw() void wxTextCtrl::Thaw()
{ {
#ifndef __WXGTK20__
if ( HasFlag(wxTE_MULTILINE) ) if ( HasFlag(wxTE_MULTILINE) )
{ {
GTK_TEXT(m_text)->vadj->value = 0.0; GTK_TEXT(m_text)->vadj->value = 0.0;
gtk_text_thaw(GTK_TEXT(m_text)); gtk_text_thaw(GTK_TEXT(m_text));
} }
#endif
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -1332,11 +1512,16 @@ void wxTextCtrl::Thaw()
GtkAdjustment *wxTextCtrl::GetVAdj() const GtkAdjustment *wxTextCtrl::GetVAdj() const
{ {
#ifdef __WXGTK20__
return NULL;
#else
return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL; return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL;
#endif
} }
bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff) bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff)
{ {
#ifndef __WXGTK20__
float value = adj->value + diff; float value = adj->value + diff;
if ( value < 0 ) if ( value < 0 )
@@ -1357,11 +1542,15 @@ bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff)
gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed"); gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed");
#endif
return TRUE; return TRUE;
} }
bool wxTextCtrl::ScrollLines(int lines) bool wxTextCtrl::ScrollLines(int lines)
{ {
#ifdef __WXGTK20__
return FALSE;
#else
GtkAdjustment *adj = GetVAdj(); GtkAdjustment *adj = GetVAdj();
if ( !adj ) if ( !adj )
return FALSE; return FALSE;
@@ -1370,14 +1559,19 @@ bool wxTextCtrl::ScrollLines(int lines)
static const int KEY_SCROLL_PIXELS = 10; static const int KEY_SCROLL_PIXELS = 10;
return DoScroll(adj, lines*KEY_SCROLL_PIXELS); return DoScroll(adj, lines*KEY_SCROLL_PIXELS);
#endif
} }
bool wxTextCtrl::ScrollPages(int pages) bool wxTextCtrl::ScrollPages(int pages)
{ {
#ifdef __WXGTK20__
return FALSE;
#else
GtkAdjustment *adj = GetVAdj(); GtkAdjustment *adj = GetVAdj();
if ( !adj ) if ( !adj )
return FALSE; return FALSE;
return DoScroll(adj, (int)ceil(pages*adj->page_increment)); return DoScroll(adj, (int)ceil(pages*adj->page_increment));
#endif
} }

View File

@@ -63,7 +63,7 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
wxControl::SetLabel(label); wxControl::SetLabel(label);
// Create the gtk widget. // Create the gtk widget.
m_widget = gtk_toggle_button_new_with_label(m_label.mbc_str()); m_widget = gtk_toggle_button_new_with_label( wxGTK_CONV( m_label ) );
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
@@ -123,7 +123,7 @@ void wxToggleButton::SetLabel(const wxString& label)
wxControl::SetLabel(label); wxControl::SetLabel(label);
gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), GetLabel().mbc_str()); gtk_label_set(GTK_LABEL(BUTTON_CHILD(m_widget)), wxGTK_CONV( GetLabel() ) );
} }
bool wxToggleButton::Enable(bool enable /*=TRUE*/) bool wxToggleButton::Enable(bool enable /*=TRUE*/)

View File

@@ -29,6 +29,7 @@
#include "wx/control.h" #include "wx/control.h"
#include "wx/app.h" #include "wx/app.h"
#include "wx/dcclient.h" #include "wx/dcclient.h"
#include "wx/gtk/private.h"
#include <glib.h> #include <glib.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
@@ -368,9 +369,9 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
} }
if (!name.IsEmpty()) if (!name.IsEmpty())
gtk_window_set_wmclass( GTK_WINDOW(m_widget), name.mb_str(), name.mb_str() ); gtk_window_set_wmclass( GTK_WINDOW(m_widget), wxGTK_CONV( name ), wxGTK_CONV( name ) );
gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() ); gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event", gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
@@ -517,37 +518,38 @@ static Atom gs_XA_WIN_LAYER = 0;
static void wx_win_hints_set_layer(GtkWidget *window, int layer) static void wx_win_hints_set_layer(GtkWidget *window, int layer)
{ {
XEvent xev; #ifndef __WXGTK20__
GdkWindowPrivate *priv; XEvent xev;
gint prev_error; GdkWindowPrivate *priv;
gint prev_error;
prev_error = gdk_error_warnings; prev_error = gdk_error_warnings;
gdk_error_warnings = 0; gdk_error_warnings = 0;
priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window); priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window);
if (GTK_WIDGET_MAPPED(window)) if (GTK_WIDGET_MAPPED(window))
{ {
xev.type = ClientMessage; xev.type = ClientMessage;
xev.xclient.type = ClientMessage; xev.xclient.type = ClientMessage;
xev.xclient.window = priv->xwindow; xev.xclient.window = priv->xwindow;
xev.xclient.message_type = gs_XA_WIN_LAYER; xev.xclient.message_type = gs_XA_WIN_LAYER;
xev.xclient.format = 32; xev.xclient.format = 32;
xev.xclient.data.l[0] = (long)layer; xev.xclient.data.l[0] = (long)layer;
xev.xclient.data.l[1] = gdk_time_get(); xev.xclient.data.l[1] = gdk_time_get();
XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False,
SubstructureNotifyMask, (XEvent*) &xev); SubstructureNotifyMask, (XEvent*) &xev);
} }
else else
{ {
long data[1]; long data[1];
data[0] = layer; data[0] = layer;
XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER, XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER,
XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1);
1);
} }
gdk_error_warnings = prev_error; gdk_error_warnings = prev_error;
#endif
} }
bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style ) bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long style )
@@ -860,7 +862,7 @@ void wxTopLevelWindowGTK::SetTitle( const wxString &title )
wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") ); wxASSERT_MSG( (m_widget != NULL), wxT("invalid frame") );
m_title = title; m_title = title;
gtk_window_set_title( GTK_WINDOW(m_widget), title.mbc_str() ); gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( title ) );
} }
void wxTopLevelWindowGTK::DoSetIcon( const wxIcon &icon ) void wxTopLevelWindowGTK::DoSetIcon( const wxIcon &icon )

View File

@@ -54,6 +54,7 @@
#endif #endif
#include <math.h> #include <math.h>
#include <ctype.h>
#include "wx/gtk/private.h" #include "wx/gtk/private.h"
#include <gdk/gdkprivate.h> #include <gdk/gdkprivate.h>
@@ -3139,7 +3140,7 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") ); wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") );
GdkFont *font = fontToUse.GetInternalFont( 1.0 ); GdkFont *font = fontToUse.GetInternalFont( 1.0 );
if (x) (*x) = gdk_string_width( font, string.mbc_str() ); if (x) (*x) = gdk_string_width( font, wxGTK_CONV( string ) );
if (y) (*y) = font->ascent + font->descent; if (y) (*y) = font->ascent + font->descent;
if (descent) (*descent) = font->descent; if (descent) (*descent) = font->descent;
if (externalLeading) (*externalLeading) = 0; // ?? if (externalLeading) (*externalLeading) = 0; // ??
@@ -3411,7 +3412,8 @@ void wxWindowGTK::GtkSendPaintEvents()
// Clip to paint region in wxClientDC // Clip to paint region in wxClientDC
m_clipPaintRegion = TRUE; m_clipPaintRegion = TRUE;
#ifndef __WXGTK20__
if (GetThemeEnabled()) if (GetThemeEnabled())
{ {
// find ancestor from which to steal background // find ancestor from which to steal background
@@ -3443,7 +3445,10 @@ void wxWindowGTK::GtkSendPaintEvents()
} }
} }
else else
// if (!m_clearRegion.IsEmpty()) // always send an erase event #endif
#ifdef __WXGTK20__
if (!m_clearRegion.IsEmpty()) // Always send an erase event under GTK 1.2
#endif
{ {
wxWindowDC dc( (wxWindow*)this ); wxWindowDC dc( (wxWindow*)this );
if (m_clearRegion.IsEmpty()) if (m_clearRegion.IsEmpty())
@@ -3456,6 +3461,7 @@ void wxWindowGTK::GtkSendPaintEvents()
if (!GetEventHandler()->ProcessEvent(erase_event)) if (!GetEventHandler()->ProcessEvent(erase_event))
{ {
#ifndef __WXGTK20__
if (!g_eraseGC) if (!g_eraseGC)
{ {
g_eraseGC = gdk_gc_new( pizza->bin_window ); g_eraseGC = gdk_gc_new( pizza->bin_window );
@@ -3470,6 +3476,7 @@ void wxWindowGTK::GtkSendPaintEvents()
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
upd ++; upd ++;
} }
#endif
} }
m_clearRegion.Clear(); m_clearRegion.Clear();
} }