From fab591c5cceff41c0bedaa89af34cd039e2c44e1 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 5 Aug 2002 17:59:20 +0000 Subject: [PATCH] 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 --- src/gtk/app.cpp | 2 +- src/gtk/button.cpp | 4 +- src/gtk/checkbox.cpp | 6 +- src/gtk/checklst.cpp | 7 +- src/gtk/choice.cpp | 14 +- src/gtk/clipbrd.cpp | 2 +- src/gtk/combobox.cpp | 9 +- src/gtk/font.cpp | 6 +- src/gtk/fontdlg.cpp | 12 +- src/gtk/joystick.cpp | 8 +- src/gtk/listbox.cpp | 9 +- src/gtk/mdi.cpp | 3 +- src/gtk/menu.cpp | 99 +++--------- src/gtk/minifram.cpp | 5 +- src/gtk/notebook.cpp | 4 +- src/gtk/radiobox.cpp | 8 +- src/gtk/radiobut.cpp | 4 +- src/gtk/spinctrl.cpp | 2 +- src/gtk/statbox.cpp | 5 +- src/gtk/stattext.cpp | 1 + src/gtk/tbargtk.cpp | 12 +- src/gtk/textctrl.cpp | 342 +++++++++++++++++++++++++++++++++--------- src/gtk/tglbtn.cpp | 4 +- src/gtk/toplevel.cpp | 56 +++---- src/gtk/window.cpp | 13 +- src/gtk1/app.cpp | 2 +- src/gtk1/button.cpp | 4 +- src/gtk1/checkbox.cpp | 6 +- src/gtk1/checklst.cpp | 7 +- src/gtk1/choice.cpp | 14 +- src/gtk1/clipbrd.cpp | 2 +- src/gtk1/combobox.cpp | 9 +- src/gtk1/font.cpp | 6 +- src/gtk1/fontdlg.cpp | 12 +- src/gtk1/joystick.cpp | 8 +- src/gtk1/listbox.cpp | 9 +- src/gtk1/mdi.cpp | 3 +- src/gtk1/menu.cpp | 99 +++--------- src/gtk1/minifram.cpp | 5 +- src/gtk1/notebook.cpp | 4 +- src/gtk1/radiobox.cpp | 8 +- src/gtk1/radiobut.cpp | 4 +- src/gtk1/spinctrl.cpp | 2 +- src/gtk1/statbox.cpp | 5 +- src/gtk1/stattext.cpp | 1 + src/gtk1/tbargtk.cpp | 12 +- src/gtk1/textctrl.cpp | 342 +++++++++++++++++++++++++++++++++--------- src/gtk1/tglbtn.cpp | 4 +- src/gtk1/toplevel.cpp | 56 +++---- src/gtk1/window.cpp | 13 +- 50 files changed, 796 insertions(+), 478 deletions(-) diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index db8547b840..93e2ee3d05 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -544,7 +544,7 @@ bool wxApp::SendIdleEvents( wxWindow* win ) event.SetEventObject(win); win->GetEventHandler()->ProcessEvent(event); - + if (event.MoreRequested()) needMore = TRUE; diff --git a/src/gtk/button.cpp b/src/gtk/button.cpp index 31fd1bd089..fc88afb789 100644 --- a/src/gtk/button.cpp +++ b/src/gtk/button.cpp @@ -109,10 +109,8 @@ bool wxButton::Create( wxWindow *parent, wxWindowID id, const wxString &label, SetLabel( label ); -#if (GTK_MINOR_VERSION > 0) if (style & wxNO_BORDER) gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE ); -#endif gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this ); @@ -162,7 +160,7 @@ void wxButton::SetLabel( const wxString &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 ) diff --git a/src/gtk/checkbox.cpp b/src/gtk/checkbox.cpp index 5e0dcb88f2..0916de575b 100644 --- a/src/gtk/checkbox.cpp +++ b/src/gtk/checkbox.cpp @@ -94,7 +94,7 @@ bool wxCheckBox::Create(wxWindow *parent, // left of it 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); m_widget = gtk_hbox_new(FALSE, 0); @@ -106,7 +106,7 @@ bool wxCheckBox::Create(wxWindow *parent, } 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_widget = m_widgetCheckbox; } @@ -166,7 +166,7 @@ void wxCheckBox::SetLabel( const wxString& 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 ) diff --git a/src/gtk/checklst.cpp b/src/gtk/checklst.cpp index 01e3bc7c54..5a4f2469f5 100644 --- a/src/gtk/checklst.cpp +++ b/src/gtk/checklst.cpp @@ -16,6 +16,7 @@ #if wxUSE_CHECKLISTBOX #include "wx/checklst.h" +#include "wx/gtk/private.h" #include #include @@ -54,7 +55,7 @@ bool wxCheckListBox::IsChecked( int index ) const GtkBin *bin = GTK_BIN( child->data ); 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; } @@ -73,14 +74,14 @@ void wxCheckListBox::Check( int index, bool check ) GtkBin *bin = GTK_BIN( child->data ); 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)) return; str.SetChar( 1, check ? wxCHECKLBOX_CHECKED : wxCHECKLBOX_UNCHECKED ); - gtk_label_set( label, str.mbc_str() ); + gtk_label_set( label, wxGTK_CONV( str ) ); return; } diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index f62387d9b5..c456577ce3 100644 --- a/src/gtk/choice.cpp +++ b/src/gtk/choice.cpp @@ -256,8 +256,9 @@ int wxChoice::FindString( const wxString &string ) const label = GTK_LABEL( BUTTON_CHILD(m_widget) ); 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; child = child->next; @@ -312,7 +313,7 @@ wxString wxChoice::GetString( int n ) const wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); - return wxString(label->label,*wxConvCurrent); + return wxString( wxGTK_CONV_BACK(label->label) ); } child = child->next; count++; @@ -375,7 +376,7 @@ void wxChoice::ApplyWidgetStyle() 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; if ( m_strings ) @@ -439,7 +440,8 @@ wxSize wxChoice::DoGetBestSize() const size_t count = GetCount(); 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 ) ret.x = width; } @@ -461,7 +463,7 @@ wxSize wxChoice::DoGetBestSize() const if ( 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; } diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index c6edc527b1..9f9c3f827f 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -256,7 +256,7 @@ selection_handler( GtkWidget *WXUNUSED(widget), { const wchar_t *wstr = (const wchar_t *)d; size_t len = wxConvCurrent->WC2MB(NULL, wstr, 0); - char *str = malloc(len + 1); + char *str = (char*) malloc(len + 1); wxConvCurrent->WC2MB(str, wstr, len); str[len] = '\0'; diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 55cbde6983..99c554c5bd 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -139,7 +139,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, inserting the first item */ 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_clientObjectList.Append( (wxObject*)NULL ); @@ -213,7 +213,7 @@ void wxComboBox::AppendCommon( const wxString &item ) 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 ); @@ -483,7 +483,7 @@ void wxComboBox::SetValue( const wxString& value ) GtkWidget *entry = GTK_COMBO(m_widget)->entry; wxString tmp = wxT(""); 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() @@ -541,6 +541,7 @@ void wxComboBox::Replace( long from, long to, const wxString& value ) { wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); // FIXME: not quite sure how to do this method right in multibyte mode + // FIXME GTK 2.0 GtkWidget *entry = GTK_COMBO(m_widget)->entry; gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); @@ -713,7 +714,7 @@ wxSize wxComboBox::DoGetBestSize() const size_t count = Number(); 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 ) ret.x = width; } diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 79921f481a..8e1b604d0d 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -214,9 +214,9 @@ wxFontRefData::wxFontRefData(const wxString& fontname) { // the test below catches all of BOLD, EXTRABOLD, DEMIBOLD, ULTRABOLD // and BLACK - if ( ((w[0u] == _T('B') && (!strcmp(w.c_str() + 1, _T("OLD")) || - !strcmp(w.c_str() + 1, _T("LACK"))))) || - strstr(w.c_str() + 1, _T("BOLD")) ) + if ( ((w[0u] == _T('B') && (!wxStrcmp(w.c_str() + 1, wxT("OLD")) || + !wxStrcmp(w.c_str() + 1, wxT("LACK"))))) || + wxStrstr(w.c_str() + 1, _T("BOLD")) ) { m_weight = wxFONTWEIGHT_BOLD; } diff --git a/src/gtk/fontdlg.cpp b/src/gtk/fontdlg.cpp index 6206f9934d..3444d52f6a 100644 --- a/src/gtk/fontdlg.cpp +++ b/src/gtk/fontdlg.cpp @@ -57,7 +57,6 @@ bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUN // "clicked" for OK-button //----------------------------------------------------------------------------- -#ifdef __WXGTK12__ static 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 ); dialog->GetEventHandler()->ProcessEvent( event ); } -#endif // GTK+ 1.2 and later only //----------------------------------------------------------------------------- // "clicked" for Cancel-button @@ -120,7 +118,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent) } 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 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_FUNC(gtk_fontdialog_ok_callback), (gpointer*)this ); +#ifndef __WXGTK20__ // 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_FUNC(gtk_fontdialog_cancel_callback), (gpointer*)this ); +#ifndef __WXGTK20__ // 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_FUNC(gtk_fontdialog_delete_callback), (gpointer)this ); diff --git a/src/gtk/joystick.cpp b/src/gtk/joystick.cpp index eaf094acdf..e53af61ccf 100644 --- a/src/gtk/joystick.cpp +++ b/src/gtk/joystick.cpp @@ -39,9 +39,9 @@ wxJoystick::wxJoystick(int joystick) { wxString dev_name; // 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); for (int i=0;i<15;i++) m_axe[i] = 0; @@ -186,8 +186,8 @@ int wxJoystick::GetNumberJoysticks(void) const int fd, j; for (j=0;j<2;j++) { - dev_name.Printf("/dev/js%d", j); - fd = open(dev_name, O_RDONLY); + dev_name.Printf(wxT("/dev/js%d"), j); + fd = open(dev_name.fn_str(), O_RDONLY); if (fd == -1) return j; close(fd); diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index c63ba920e3..98e2f3b09d 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -21,6 +21,7 @@ #include "wx/intl.h" #include "wx/checklst.h" #include "wx/settings.h" +#include "wx/gtk/private.h" #if wxUSE_TOOLTIPS #include "wx/tooltip.h" @@ -537,7 +538,7 @@ void wxListBox::GtkAddItem( const wxString &item, int pos ) } #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 (); gitem_list->data = list_item; @@ -737,7 +738,7 @@ void wxListBox::SetString( int n, const wxString &string ) #endif // wxUSE_CHECKLISTBOX str += string; - gtk_label_set( label, str.mbc_str() ); + gtk_label_set( label, wxGTK_CONV( str ) ); } else { @@ -755,7 +756,7 @@ wxString wxListBox::GetString( int n ) const GtkBin *bin = GTK_BIN( child->data ); 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; } @@ -784,7 +785,7 @@ int wxListBox::FindString( const wxString &item ) const GtkBin *bin = GTK_BIN( child->data ); 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) return count; diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 958a372944..999be74c6e 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -18,6 +18,7 @@ #include "wx/dialog.h" #include "wx/menu.h" #include "wx/intl.h" +#include "wx/gtk/private.h" #include #include @@ -399,7 +400,7 @@ void wxMDIChildFrame::SetTitle( const wxString &title ) wxMDIParentFrame* parent = (wxMDIParentFrame*) GetParent(); 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 ) ); } //----------------------------------------------------------------------------- diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index d74c9b2ca6..6250455059 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -241,14 +241,12 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) { menu->SetInvokingWindow( (wxWindow*) NULL ); -#if GTK_CHECK_VERSION(1, 2, 0) wxWindow *top_frame = win; while (top_frame->GetParent() && !(top_frame->IsTopLevel())) 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) ); -#endif wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst(); 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. */ #if GTK_CHECK_VERSION(1, 2, 1) - /* local buffer in multibyte form */ wxString buf; buf << wxT('/') << str.c_str(); - char *cbuf = new char[buf.Length()+1]; - strcpy(cbuf, buf.mbc_str()); + /* local buffer in multibyte form */ + char cbuf[400]; + strcpy(cbuf, wxGTK_CONV(buf) ); GtkItemFactoryEntry entry; entry.path = (gchar *)cbuf; // const_cast @@ -374,12 +372,11 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title) 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 ); - delete [] cbuf; #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_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) ) return FALSE; -#if __WXGTK12__ // 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 // 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); 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) @@ -564,7 +552,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const wxString label; wxString text( menu->GetTitle() ); -#if GTK_CHECK_VERSION(1, 2, 0) for ( const wxChar *pc = text.c_str(); *pc; pc++ ) { if ( *pc == wxT('_') || *pc == wxT('&') ) @@ -576,9 +563,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const label += *pc; } -#else // GTK+ 1.0 - label = text; -#endif // GTK+ 1.2/1.0 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 ); /* set new text */ - gtk_label_set( label, str.mb_str()); + gtk_label_set( label, wxGTK_CONV( str ) ); /* 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) ); } @@ -805,10 +789,10 @@ void wxMenuItem::SetText( const wxString& str ) label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); /* set new text */ - gtk_label_set( label, m_text.mb_str()); + gtk_label_set( label, wxGTK_CONV( m_text ) ); /* 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) ); } } @@ -854,16 +838,13 @@ void wxMenuItem::DoSetText( const wxString& str ) m_text << *pc; } - /* only GTK 1.2 knows about hot keys */ m_hotKey = wxT(""); -#if GTK_CHECK_VERSION(1, 2, 0) if(*pc == wxT('\t')) { pc++; m_hotKey = pc; } -#endif // GTK+ 1.2.0+ } #if wxUSE_ACCEL @@ -952,17 +933,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler) void wxMenu::Init() { -#if GTK_CHECK_VERSION(1, 2, 0) m_accel = gtk_accel_group_new(); m_factory = gtk_item_factory_new( GTK_TYPE_MENU, "
", m_accel ); m_menu = gtk_item_factory_get_widget( m_factory, "
" ); -#else - m_menu = gtk_menu_new(); // Do not show! -#endif m_owner = (GtkWidget*) NULL; -#if GTK_CHECK_VERSION(1, 2, 0) /* Tearoffs are entries, just like separators. So if we want this menu to be a tear-off one, we just append a tearoff entry immediately. */ @@ -977,7 +953,6 @@ void wxMenu::Init() gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ //GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "
/tearoff" ); } -#endif // GTK+ 1.2.0+ // append the title as the very first entry if we have it if ( !!m_title ) @@ -1004,14 +979,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) bool appended = FALSE; #endif -#if GTK_CHECK_VERSION(1, 2, 0) // does this item terminate the current radio group? bool endOfRadioGroup = TRUE; -#endif // GTK+ >= 1.2 if ( mitem->IsSeparator() ) { -#if GTK_CHECK_VERSION(1, 2, 0) GtkItemFactoryEntry entry; entry.path = (char *)"/sep"; entry.callback = (GtkItemFactoryCallback) NULL; @@ -1026,20 +998,16 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) // we might have a separator inside a radio group endOfRadioGroup = FALSE; -#else // GTK+ 1.0 - menuItem = gtk_menu_item_new(); -#endif // GTK 1.2/1.0 } else if ( mitem->IsSubMenu() ) { -#if GTK_CHECK_VERSION(1, 2, 0) /* text has "_" instead of "&" after mitem->SetText() */ wxString text( mitem->GetText() ); /* local buffer in multibyte form */ char buf[200]; strcpy( buf, "/" ); - strcat( buf, text.mb_str() ); + strcat( buf, wxGTK_CONV( text ) ); GtkItemFactoryEntry entry; 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 ? */ wxString path( mitem->GetFactoryPath() ); - menuItem = gtk_item_factory_get_item( m_factory, path.mb_str() ); -#else // GTK+ 1.0 - menuItem = gtk_menu_item_new_with_label(mitem->GetText().mbc_str()); -#endif // GTK 1.2/1.0 + menuItem = gtk_item_factory_get_item( m_factory, wxGTK_CONV( path ) ); 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(); 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_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); if (accel_key != GDK_VoidSymbol) { @@ -1103,14 +1068,13 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) #endif // USE_MENU_BITMAPS else // a normal item { -#if GTK_CHECK_VERSION(1, 2, 0) /* text has "_" instead of "&" after mitem->SetText() */ wxString text( mitem->GetText() ); /* local buffer in multibyte form */ char buf[200]; strcpy( buf, "/" ); - strncat( buf, text.mb_str(), WXSIZEOF(buf) - 2 ); + strncat( buf, wxGTK_CONV(text), WXSIZEOF(buf) - 2 ); buf[WXSIZEOF(buf) - 1] = '\0'; GtkItemFactoryEntry entry; @@ -1119,6 +1083,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) entry.callback_action = 0; wxString pathRadio; + char buf2[200]; const char *item_type; switch ( mitem->GetKind() ) { @@ -1136,9 +1101,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) else // continue the radio group { pathRadio = m_pathLastRadio; - pathRadio.Replace("_", ""); - pathRadio.Prepend("
/"); - item_type = pathRadio; + pathRadio.Replace(wxT("_"), wxT("")); + pathRadio.Prepend(wxT("
/")); + strncat( buf2, wxGTK_CONV(pathRadio), WXSIZEOF(buf2) - 2 ); + buf2[WXSIZEOF(buf2) - 1] = '\0'; + item_type = buf2; } // 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 - // otherwise GTK+ 1.2.2 manages to override the memory we pass to it // somehow! (VZ) - static char s_accel[50]; // must be big enougg + static char s_accel[50]; // must be big enough 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; #else // !wxUSE_ACCEL 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 ? */ wxString path( mitem->GetFactoryPath() ); - menuItem = gtk_item_factory_get_widget( m_factory, path.mb_str() ); -#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 + menuItem = gtk_item_factory_get_widget( m_factory, wxGTK_CONV( path ) ); } if ( !mitem->IsSeparator() ) @@ -1194,22 +1153,12 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) (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); -#if GTK_CHECK_VERSION(1, 2, 0) if ( endOfRadioGroup ) { m_pathLastRadio.clear(); } -#endif // GTK+ >= 1.2 return TRUE; } diff --git a/src/gtk/minifram.cpp b/src/gtk/minifram.cpp index 6f0c63d0d3..2e98dd832e 100644 --- a/src/gtk/minifram.cpp +++ b/src/gtk/minifram.cpp @@ -19,6 +19,7 @@ #include "gtk/gtk.h" #include "wx/gtk/win_gtk.h" +#include "wx/gtk/private.h" #include #include @@ -100,7 +101,7 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g gdk_draw_string( pizza->bin_window, font, gc, 6, 3+font->ascent, - win->m_title.mb_str() ); + wxGTK_CONV( win->m_title ) ); 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, 6, 3+font->ascent, - win->m_title.mb_str() ); + wxGTK_CONV( win->m_title ) ); gdk_gc_unref( gc ); } diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index 08fc2ca89d..edd5093685 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -394,7 +394,7 @@ bool wxNotebook::SetPageText( int page, const wxString &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; } @@ -617,7 +617,7 @@ bool wxNotebook::InsertPage( int position, page->m_text = text; 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 ); /* show the label */ diff --git a/src/gtk/radiobox.cpp b/src/gtk/radiobox.cpp index 98e57717ad..26240cc004 100644 --- a/src/gtk/radiobox.cpp +++ b/src/gtk/radiobox.cpp @@ -180,7 +180,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, 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 // 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; } - 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_FUNC(gtk_radiobox_keypress_callback), (gpointer)this ); @@ -514,7 +514,7 @@ void wxRadioBox::SetLabel( const wxString& 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 ) @@ -527,7 +527,7 @@ void wxRadioBox::SetString( int item, const wxString& label ) 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 ) diff --git a/src/gtk/radiobut.cpp b/src/gtk/radiobut.cpp index c523b49eef..fad83bc1b1 100644 --- a/src/gtk/radiobut.cpp +++ b/src/gtk/radiobut.cpp @@ -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); @@ -154,7 +154,7 @@ void wxRadioButton::SetLabel( const wxString& label ) wxControl::SetLabel( label ); 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 ) diff --git a/src/gtk/spinctrl.cpp b/src/gtk/spinctrl.cpp index 87acf9dcb6..f04242957b 100644 --- a/src/gtk/spinctrl.cpp +++ b/src/gtk/spinctrl.cpp @@ -208,7 +208,7 @@ void wxSpinCtrl::SetValue( const wxString& value ) { // invalid number - set text as is (wxMSW compatible) GtkDisableEvents(); - gtk_entry_set_text( GTK_ENTRY(m_widget), value.mbc_str() ); + gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) ); GtkEnableEvents(); } } diff --git a/src/gtk/statbox.cpp b/src/gtk/statbox.cpp index 3884e299b7..5777e99153 100644 --- a/src/gtk/statbox.cpp +++ b/src/gtk/statbox.cpp @@ -16,6 +16,7 @@ #if wxUSE_STATBOX #include "wx/statbox.h" +#include "wx/gtk/private.h" #include "gdk/gdk.h" #include "gtk/gtk.h" @@ -60,7 +61,7 @@ bool wxStaticBox::Create( wxWindow *parent, 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 ); @@ -90,7 +91,7 @@ void wxStaticBox::SetLabel( const wxString &label ) wxControl::SetLabel( label ); 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() diff --git a/src/gtk/stattext.cpp b/src/gtk/stattext.cpp index f10c32753c..e574807714 100644 --- a/src/gtk/stattext.cpp +++ b/src/gtk/stattext.cpp @@ -17,6 +17,7 @@ #if wxUSE_STATTEXT #include "wx/stattext.h" +#include "wx/gtk/private.h" #include "gdk/gdk.h" #include "gtk/gtk.h" diff --git a/src/gtk/tbargtk.cpp b/src/gtk/tbargtk.cpp index 38a8fde253..0494319d44 100644 --- a/src/gtk/tbargtk.cpp +++ b/src/gtk/tbargtk.cpp @@ -445,10 +445,10 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) widget, tool->GetLabel().empty() ? NULL - : tool->GetLabel().mbc_str(), + : (const char*) wxGTK_CONV( tool->GetLabel() ), tool->GetShortHelp().empty() ? NULL - : tool->GetShortHelp().mbc_str(), + : (const char*) wxGTK_CONV( tool->GetShortHelp() ), "", // tooltip_private_text (?) tool->m_pixmap, (GtkSignalFunc)gtk_toolbar_callback, @@ -526,14 +526,12 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable) { -#if (GTK_MINOR_VERSION > 0) 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) + { gtk_widget_set_sensitive( tool->m_item, enable ); -#endif + } } void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle ) @@ -611,7 +609,7 @@ void wxToolBar::SetToolShortHelp( int id, const wxString& helpString ) { (void)tool->SetShortHelp(helpString); gtk_tooltips_set_tip(m_toolbar->tooltips, tool->m_item, - helpString.mbc_str(), ""); + wxGTK_CONV( helpString ), ""); } } diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 46345f1820..675eafd62e 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -17,17 +17,13 @@ #include "wx/log.h" #include "wx/settings.h" #include "wx/panel.h" +#include "wx/strconv.h" #include #include #include #include // 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 @@ -55,6 +51,7 @@ static void wxGtkTextInsert(GtkWidget *text, const char *txt, size_t len) { +#ifndef __WXGTK__ GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont() : NULL; @@ -66,6 +63,7 @@ static void wxGtkTextInsert(GtkWidget *text, : NULL; 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) wxapp_install_idle_handler(); - + win->SetModified(); win->UpdateFontIfNeeded(); - + wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); event.SetEventObject( win ); event.SetString( win->GetValue() ); @@ -136,6 +134,7 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win ) // "changed" from vertical scrollbar //----------------------------------------------------------------------------- +#ifndef __WXGTK20__ static void gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) { @@ -146,6 +145,7 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) win->CalculateScrollbar(); } +#endif // ---------------------------------------------------------------------------- // redraw callback for multiline text @@ -248,20 +248,41 @@ bool wxTextCtrl::Create( wxWindow *parent, m_vScrollbarVisible = FALSE; bool multi_line = (style & wxTE_MULTILINE) != 0; + +#ifdef __WXGTK20__ + GtkTextBuffer *buffer = NULL; +#endif + if (multi_line) { -#ifdef __WXGTK13__ - /* 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 +#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 ); - /* create our control ... */ + 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 ); - /* ... 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); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); 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), 0, 0); - /* always wrap words */ + // always wrap words gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE ); -#ifdef __WXGTK13__ - /* 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 */ + // finally, put the vertical scrollbar in the upper right corner m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj ); GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS ); gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1, GTK_FILL, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK), 0, 0); +#endif } else { - /* a single-line text control: no need for scrollbars */ + // a single-line text control: no need for scrollbars m_widget = m_text = gtk_entry_new(); } @@ -324,12 +329,12 @@ bool wxTextCtrl::Create( wxWindow *parent, if (multi_line) gtk_widget_show(m_text); +#ifndef __WXGTK20__ if (multi_line) { gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed", (GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this ); -#ifndef __WXGTK20__ // only initialize gs_gtk_text_draw once, starting from the next the // klass::draw will already be wxgtk_text_draw if ( !gs_gtk_text_draw ) @@ -341,12 +346,14 @@ bool wxTextCtrl::Create( wxWindow *parent, draw = wxgtk_text_draw; } -#endif // GTK+ 1.x } +#endif // GTK+ 1.x if (!value.IsEmpty()) { - gint tmp = 0; +#ifdef __WXGTK20__ + SetValue( value ); +#else #if !GTK_CHECK_VERSION(1, 2, 0) // 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); #endif // GTK 1.0 + gint tmp = 0; #if wxUSE_UNICODE wxWX2MBbuf val = value.mbc_str(); 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 ); -#endif // Unicode/!Unicode +#endif 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) )); } + +#endif } if (style & wxTE_PASSWORD) @@ -378,19 +388,35 @@ bool wxTextCtrl::Create( wxWindow *parent, { if (!multi_line) 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 { if (multi_line) 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_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 - manager should use a default one */ + // we don't set a valid background colour, because the window + // manager should use a default one m_backgroundColour = wxColour(); wxColour colFg = parent->GetForegroundColour(); @@ -398,8 +424,10 @@ bool wxTextCtrl::Create( wxWindow *parent, m_cursor = wxCursor( wxCURSOR_IBEAM ); +#ifndef __WXGTK20__ wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() ); SetDefaultStyle( attrDef ); +#endif Show( TRUE ); @@ -408,6 +436,7 @@ bool wxTextCtrl::Create( wxWindow *parent, void wxTextCtrl::CalculateScrollbar() { +#ifndef __WXGTK20__ if ((m_windowStyle & wxTE_MULTILINE) == 0) return; GtkAdjustment *adj = GTK_TEXT(m_text)->vadj; @@ -428,6 +457,7 @@ void wxTextCtrl::CalculateScrollbar() m_vScrollbarVisible = TRUE; } } +#endif } wxString wxTextCtrl::GetValue() const @@ -437,15 +467,35 @@ wxString wxTextCtrl::GetValue() const wxString tmp; 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) ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); - tmp = wxString(text,*wxConvCurrent); + tmp = text; g_free( text ); +#endif } 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; } @@ -455,26 +505,33 @@ void wxTextCtrl::SetValue( const wxString &value ) 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) ); gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len ); 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 ); #endif } 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 // the lists. wxWindows 2.2 will have a set of flags to // customize this behaviour. SetInsertionPoint(0); - + m_modified = FALSE; } @@ -485,33 +542,48 @@ void wxTextCtrl::WriteText( const wxString &text ) if ( text.empty() ) 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 ) { +#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. gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) ); // always use m_defaultStyle, even if it is empty as otherwise // 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 - wxGtkTextInsert(m_text, m_defaultStyle, txt, txtlen); + wxGtkTextInsert(m_text, m_defaultStyle, text.c_str(), text.Len()); // Bring editable's cursor back uptodate. SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); +#endif } else // single line { // This moves the cursor pos to behind the inserted 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. len += text.Len(); @@ -533,6 +605,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const { if (m_windowStyle & wxTE_MULTILINE) { +#ifndef __WXGTK20__ gint len = gtk_text_get_length( GTK_TEXT(m_text) ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); @@ -553,6 +626,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const return buf; } else +#endif { return wxEmptyString; } @@ -634,6 +708,11 @@ int wxTextCtrl::GetNumberOfLines() const { 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) ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); @@ -654,6 +733,7 @@ int wxTextCtrl::GetNumberOfLines() const { return 0; } +#endif } else { @@ -667,14 +747,17 @@ void wxTextCtrl::SetInsertionPoint( long pos ) if (m_windowStyle & wxTE_MULTILINE) { - /* seems to be broken in GTK 1.0.X: - gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */ - +#ifdef __WXGTK20__ + 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_FUNC(gtk_text_changed_callback), (gpointer)this); /* we fake a set_point by inserting and deleting. as the user - isn't supposed to get to know about thos non-sense, we + isn't supposed to get to know about this non-sense, we disconnect so that no events are sent to the user program. */ gint tmp = (gint)pos; @@ -684,16 +767,15 @@ void wxTextCtrl::SetInsertionPoint( long pos ) gtk_signal_connect( GTK_OBJECT(m_text), "changed", GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); - /* bring editable's cursor uptodate. another bug in GTK. */ - + // bring editable's cursor uptodate. Bug in GTK. SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); +#endif } else { gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos ); - /* bring editable's cursor uptodate. bug in GTK. */ - + // Bring editable's cursor uptodate. Bug in GTK. SET_EDITABLE_POS(m_text, (guint32)pos); } } @@ -703,9 +785,20 @@ void wxTextCtrl::SetInsertionPointEnd() wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); 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))); +#endif + } else + { gtk_entry_set_position( GTK_ENTRY(m_text), -1 ); + } } void wxTextCtrl::SetEditable( bool editable ) @@ -713,9 +806,17 @@ void wxTextCtrl::SetEditable( bool editable ) wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); 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 ); +#endif + } else + { gtk_entry_set_editable( GTK_ENTRY(m_text), editable ); + } } bool wxTextCtrl::Enable( bool enable ) @@ -728,8 +829,12 @@ bool wxTextCtrl::Enable( bool enable ) if (m_windowStyle & wxTE_MULTILINE) { +#ifdef __WXGTK20__ + SetEditable( enable ); +#else gtk_text_set_editable( GTK_TEXT(m_text), enable ); OnParentEnable(enable); +#endif } else { @@ -823,6 +928,7 @@ void wxTextCtrl::SetSelection( long from, long to ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ if ( (m_windowStyle & wxTE_MULTILINE) && !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")); 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 ) { +#ifndef __WXGTK20__ if (m_windowStyle & wxTE_MULTILINE) { 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; gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p); } +#endif } long wxTextCtrl::GetInsertionPoint() const { 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); + } } long wxTextCtrl::GetLastPosition() const @@ -861,10 +1000,23 @@ long wxTextCtrl::GetLastPosition() const wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") ); int pos = 0; + 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) ); +#endif + } else + { pos = GTK_ENTRY(m_text)->text_length; + } return (long)pos; } @@ -873,13 +1025,16 @@ void wxTextCtrl::Remove( long from, long to ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); +#endif } void wxTextCtrl::Replace( long from, long to, const wxString &value ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); 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 ); #endif } +#endif } void wxTextCtrl::Cut() { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); +#endif } void wxTextCtrl::Copy() { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); +#endif } void wxTextCtrl::Paste() { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); +#endif } // Undo/redo @@ -1045,9 +1207,17 @@ GtkWidget* wxTextCtrl::GetConnectWidget() bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window ) { 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); +#endif + } else + { return (window == GTK_ENTRY(m_text)->text_area); + } } // the font will change for subsequent text insertiongs @@ -1130,12 +1300,14 @@ bool wxTextCtrl::SetBackgroundColour( const wxColour &colour ) if (m_windowStyle & wxTE_MULTILINE) { +#ifndef __WXGTK__ GdkWindow *window = GTK_TEXT(m_text)->text_area; if (!window) return FALSE; m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); gdk_window_set_background( window, m_backgroundColour.GetColor() ); gdk_window_clear( window ); +#endif } // change active background color too @@ -1150,6 +1322,7 @@ bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr& style ) with styling (FIXME) */ if ( m_windowStyle & wxTE_MULTILINE ) { +#ifndef __WXGTK20__ if ( style.IsDefault() ) { // 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 !!! gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */ SetInsertionPoint( old_pos ); +#endif return TRUE; } else // singe line @@ -1268,6 +1442,7 @@ void wxTextCtrl::OnInternalIdle() if (cursor.Ok()) { +#ifndef __WXGTK20__ GdkWindow *window = (GdkWindow*) NULL; if (HasFlag(wxTE_MULTILINE)) window = GTK_TEXT(m_text)->text_area; @@ -1283,6 +1458,7 @@ void wxTextCtrl::OnInternalIdle() window = m_widget->window; if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget))) gdk_window_set_cursor( window, cursor.GetCursor() ); +#endif } if (g_delayedFocus == this) @@ -1310,20 +1486,24 @@ wxSize wxTextCtrl::DoGetBestSize() const void wxTextCtrl::Freeze() { +#ifndef __WXGTK20__ if ( HasFlag(wxTE_MULTILINE) ) { gtk_text_freeze(GTK_TEXT(m_text)); } +#endif } void wxTextCtrl::Thaw() { +#ifndef __WXGTK20__ if ( HasFlag(wxTE_MULTILINE) ) { GTK_TEXT(m_text)->vadj->value = 0.0; gtk_text_thaw(GTK_TEXT(m_text)); } +#endif } // ---------------------------------------------------------------------------- @@ -1332,11 +1512,16 @@ void wxTextCtrl::Thaw() GtkAdjustment *wxTextCtrl::GetVAdj() const { +#ifdef __WXGTK20__ + return NULL; +#else return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL; +#endif } bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff) { +#ifndef __WXGTK20__ float value = adj->value + diff; if ( value < 0 ) @@ -1357,11 +1542,15 @@ bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff) gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed"); +#endif return TRUE; } bool wxTextCtrl::ScrollLines(int lines) { +#ifdef __WXGTK20__ + return FALSE; +#else GtkAdjustment *adj = GetVAdj(); if ( !adj ) return FALSE; @@ -1370,14 +1559,19 @@ bool wxTextCtrl::ScrollLines(int lines) static const int KEY_SCROLL_PIXELS = 10; return DoScroll(adj, lines*KEY_SCROLL_PIXELS); +#endif } bool wxTextCtrl::ScrollPages(int pages) { +#ifdef __WXGTK20__ + return FALSE; +#else GtkAdjustment *adj = GetVAdj(); if ( !adj ) return FALSE; return DoScroll(adj, (int)ceil(pages*adj->page_increment)); +#endif } diff --git a/src/gtk/tglbtn.cpp b/src/gtk/tglbtn.cpp index e6ca7ff17c..2a913203a7 100644 --- a/src/gtk/tglbtn.cpp +++ b/src/gtk/tglbtn.cpp @@ -63,7 +63,7 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, wxControl::SetLabel(label); // 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_FUNC(gtk_togglebutton_clicked_callback), @@ -123,7 +123,7 @@ void wxToggleButton::SetLabel(const wxString& 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*/) diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 7175f78411..7b4d04a2db 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -29,6 +29,7 @@ #include "wx/control.h" #include "wx/app.h" #include "wx/dcclient.h" +#include "wx/gtk/private.h" #include #include @@ -368,9 +369,9 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, } 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_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) { - XEvent xev; - GdkWindowPrivate *priv; - gint prev_error; +#ifndef __WXGTK20__ + XEvent xev; + GdkWindowPrivate *priv; + gint prev_error; - prev_error = gdk_error_warnings; - gdk_error_warnings = 0; - priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window); + prev_error = gdk_error_warnings; + gdk_error_warnings = 0; + priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window); - if (GTK_WIDGET_MAPPED(window)) - { - xev.type = ClientMessage; - xev.xclient.type = ClientMessage; - xev.xclient.window = priv->xwindow; - xev.xclient.message_type = gs_XA_WIN_LAYER; - xev.xclient.format = 32; - xev.xclient.data.l[0] = (long)layer; - xev.xclient.data.l[1] = gdk_time_get(); + if (GTK_WIDGET_MAPPED(window)) + { + xev.type = ClientMessage; + xev.xclient.type = ClientMessage; + xev.xclient.window = priv->xwindow; + xev.xclient.message_type = gs_XA_WIN_LAYER; + xev.xclient.format = 32; + xev.xclient.data.l[0] = (long)layer; + xev.xclient.data.l[1] = gdk_time_get(); - XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, - SubstructureNotifyMask, (XEvent*) &xev); + XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, + SubstructureNotifyMask, (XEvent*) &xev); } - else + else { - long data[1]; + long data[1]; - data[0] = layer; - XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER, - XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, - 1); + data[0] = layer; + XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER, + XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); } - gdk_error_warnings = prev_error; + gdk_error_warnings = prev_error; +#endif } 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") ); 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 ) diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 2786d91934..c12e2fad49 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -54,6 +54,7 @@ #endif #include +#include #include "wx/gtk/private.h" #include @@ -3139,7 +3140,7 @@ void wxWindowGTK::GetTextExtent( const wxString& string, wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") ); 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 (descent) (*descent) = font->descent; if (externalLeading) (*externalLeading) = 0; // ?? @@ -3411,7 +3412,8 @@ void wxWindowGTK::GtkSendPaintEvents() // Clip to paint region in wxClientDC m_clipPaintRegion = TRUE; - + +#ifndef __WXGTK20__ if (GetThemeEnabled()) { // find ancestor from which to steal background @@ -3443,7 +3445,10 @@ void wxWindowGTK::GtkSendPaintEvents() } } 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 ); if (m_clearRegion.IsEmpty()) @@ -3456,6 +3461,7 @@ void wxWindowGTK::GtkSendPaintEvents() if (!GetEventHandler()->ProcessEvent(erase_event)) { +#ifndef __WXGTK20__ if (!g_eraseGC) { g_eraseGC = gdk_gc_new( pizza->bin_window ); @@ -3470,6 +3476,7 @@ void wxWindowGTK::GtkSendPaintEvents() upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); upd ++; } +#endif } m_clearRegion.Clear(); } diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index db8547b840..93e2ee3d05 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -544,7 +544,7 @@ bool wxApp::SendIdleEvents( wxWindow* win ) event.SetEventObject(win); win->GetEventHandler()->ProcessEvent(event); - + if (event.MoreRequested()) needMore = TRUE; diff --git a/src/gtk1/button.cpp b/src/gtk1/button.cpp index 31fd1bd089..fc88afb789 100644 --- a/src/gtk1/button.cpp +++ b/src/gtk1/button.cpp @@ -109,10 +109,8 @@ bool wxButton::Create( wxWindow *parent, wxWindowID id, const wxString &label, SetLabel( label ); -#if (GTK_MINOR_VERSION > 0) if (style & wxNO_BORDER) gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE ); -#endif gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", GTK_SIGNAL_FUNC(gtk_button_clicked_callback), (gpointer*)this ); @@ -162,7 +160,7 @@ void wxButton::SetLabel( const wxString &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 ) diff --git a/src/gtk1/checkbox.cpp b/src/gtk1/checkbox.cpp index 5e0dcb88f2..0916de575b 100644 --- a/src/gtk1/checkbox.cpp +++ b/src/gtk1/checkbox.cpp @@ -94,7 +94,7 @@ bool wxCheckBox::Create(wxWindow *parent, // left of it 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); m_widget = gtk_hbox_new(FALSE, 0); @@ -106,7 +106,7 @@ bool wxCheckBox::Create(wxWindow *parent, } 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_widget = m_widgetCheckbox; } @@ -166,7 +166,7 @@ void wxCheckBox::SetLabel( const wxString& 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 ) diff --git a/src/gtk1/checklst.cpp b/src/gtk1/checklst.cpp index 01e3bc7c54..5a4f2469f5 100644 --- a/src/gtk1/checklst.cpp +++ b/src/gtk1/checklst.cpp @@ -16,6 +16,7 @@ #if wxUSE_CHECKLISTBOX #include "wx/checklst.h" +#include "wx/gtk/private.h" #include #include @@ -54,7 +55,7 @@ bool wxCheckListBox::IsChecked( int index ) const GtkBin *bin = GTK_BIN( child->data ); 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; } @@ -73,14 +74,14 @@ void wxCheckListBox::Check( int index, bool check ) GtkBin *bin = GTK_BIN( child->data ); 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)) return; str.SetChar( 1, check ? wxCHECKLBOX_CHECKED : wxCHECKLBOX_UNCHECKED ); - gtk_label_set( label, str.mbc_str() ); + gtk_label_set( label, wxGTK_CONV( str ) ); return; } diff --git a/src/gtk1/choice.cpp b/src/gtk1/choice.cpp index f62387d9b5..c456577ce3 100644 --- a/src/gtk1/choice.cpp +++ b/src/gtk1/choice.cpp @@ -256,8 +256,9 @@ int wxChoice::FindString( const wxString &string ) const label = GTK_LABEL( BUTTON_CHILD(m_widget) ); 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; child = child->next; @@ -312,7 +313,7 @@ wxString wxChoice::GetString( int n ) const wxASSERT_MSG( label != NULL , wxT("wxChoice: invalid label") ); - return wxString(label->label,*wxConvCurrent); + return wxString( wxGTK_CONV_BACK(label->label) ); } child = child->next; count++; @@ -375,7 +376,7 @@ void wxChoice::ApplyWidgetStyle() 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; if ( m_strings ) @@ -439,7 +440,8 @@ wxSize wxChoice::DoGetBestSize() const size_t count = GetCount(); 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 ) ret.x = width; } @@ -461,7 +463,7 @@ wxSize wxChoice::DoGetBestSize() const if ( 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; } diff --git a/src/gtk1/clipbrd.cpp b/src/gtk1/clipbrd.cpp index c6edc527b1..9f9c3f827f 100644 --- a/src/gtk1/clipbrd.cpp +++ b/src/gtk1/clipbrd.cpp @@ -256,7 +256,7 @@ selection_handler( GtkWidget *WXUNUSED(widget), { const wchar_t *wstr = (const wchar_t *)d; size_t len = wxConvCurrent->WC2MB(NULL, wstr, 0); - char *str = malloc(len + 1); + char *str = (char*) malloc(len + 1); wxConvCurrent->WC2MB(str, wstr, len); str[len] = '\0'; diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 55cbde6983..99c554c5bd 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -139,7 +139,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, inserting the first item */ 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_clientObjectList.Append( (wxObject*)NULL ); @@ -213,7 +213,7 @@ void wxComboBox::AppendCommon( const wxString &item ) 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 ); @@ -483,7 +483,7 @@ void wxComboBox::SetValue( const wxString& value ) GtkWidget *entry = GTK_COMBO(m_widget)->entry; wxString tmp = wxT(""); 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() @@ -541,6 +541,7 @@ void wxComboBox::Replace( long from, long to, const wxString& value ) { wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); // FIXME: not quite sure how to do this method right in multibyte mode + // FIXME GTK 2.0 GtkWidget *entry = GTK_COMBO(m_widget)->entry; gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to ); @@ -713,7 +714,7 @@ wxSize wxComboBox::DoGetBestSize() const size_t count = Number(); 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 ) ret.x = width; } diff --git a/src/gtk1/font.cpp b/src/gtk1/font.cpp index 79921f481a..8e1b604d0d 100644 --- a/src/gtk1/font.cpp +++ b/src/gtk1/font.cpp @@ -214,9 +214,9 @@ wxFontRefData::wxFontRefData(const wxString& fontname) { // the test below catches all of BOLD, EXTRABOLD, DEMIBOLD, ULTRABOLD // and BLACK - if ( ((w[0u] == _T('B') && (!strcmp(w.c_str() + 1, _T("OLD")) || - !strcmp(w.c_str() + 1, _T("LACK"))))) || - strstr(w.c_str() + 1, _T("BOLD")) ) + if ( ((w[0u] == _T('B') && (!wxStrcmp(w.c_str() + 1, wxT("OLD")) || + !wxStrcmp(w.c_str() + 1, wxT("LACK"))))) || + wxStrstr(w.c_str() + 1, _T("BOLD")) ) { m_weight = wxFONTWEIGHT_BOLD; } diff --git a/src/gtk1/fontdlg.cpp b/src/gtk1/fontdlg.cpp index 6206f9934d..3444d52f6a 100644 --- a/src/gtk1/fontdlg.cpp +++ b/src/gtk1/fontdlg.cpp @@ -57,7 +57,6 @@ bool gtk_fontdialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUN // "clicked" for OK-button //----------------------------------------------------------------------------- -#ifdef __WXGTK12__ static 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 ); dialog->GetEventHandler()->ProcessEvent( event ); } -#endif // GTK+ 1.2 and later only //----------------------------------------------------------------------------- // "clicked" for Cancel-button @@ -120,7 +118,7 @@ bool wxFontDialog::DoCreate(wxWindow *parent) } 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 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_FUNC(gtk_fontdialog_ok_callback), (gpointer*)this ); +#ifndef __WXGTK20__ // 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_FUNC(gtk_fontdialog_cancel_callback), (gpointer*)this ); +#ifndef __WXGTK20__ // 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_FUNC(gtk_fontdialog_delete_callback), (gpointer)this ); diff --git a/src/gtk1/joystick.cpp b/src/gtk1/joystick.cpp index eaf094acdf..e53af61ccf 100644 --- a/src/gtk1/joystick.cpp +++ b/src/gtk1/joystick.cpp @@ -39,9 +39,9 @@ wxJoystick::wxJoystick(int joystick) { wxString dev_name; // 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); for (int i=0;i<15;i++) m_axe[i] = 0; @@ -186,8 +186,8 @@ int wxJoystick::GetNumberJoysticks(void) const int fd, j; for (j=0;j<2;j++) { - dev_name.Printf("/dev/js%d", j); - fd = open(dev_name, O_RDONLY); + dev_name.Printf(wxT("/dev/js%d"), j); + fd = open(dev_name.fn_str(), O_RDONLY); if (fd == -1) return j; close(fd); diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index c63ba920e3..98e2f3b09d 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -21,6 +21,7 @@ #include "wx/intl.h" #include "wx/checklst.h" #include "wx/settings.h" +#include "wx/gtk/private.h" #if wxUSE_TOOLTIPS #include "wx/tooltip.h" @@ -537,7 +538,7 @@ void wxListBox::GtkAddItem( const wxString &item, int pos ) } #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 (); gitem_list->data = list_item; @@ -737,7 +738,7 @@ void wxListBox::SetString( int n, const wxString &string ) #endif // wxUSE_CHECKLISTBOX str += string; - gtk_label_set( label, str.mbc_str() ); + gtk_label_set( label, wxGTK_CONV( str ) ); } else { @@ -755,7 +756,7 @@ wxString wxListBox::GetString( int n ) const GtkBin *bin = GTK_BIN( child->data ); 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; } @@ -784,7 +785,7 @@ int wxListBox::FindString( const wxString &item ) const GtkBin *bin = GTK_BIN( child->data ); 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) return count; diff --git a/src/gtk1/mdi.cpp b/src/gtk1/mdi.cpp index 958a372944..999be74c6e 100644 --- a/src/gtk1/mdi.cpp +++ b/src/gtk1/mdi.cpp @@ -18,6 +18,7 @@ #include "wx/dialog.h" #include "wx/menu.h" #include "wx/intl.h" +#include "wx/gtk/private.h" #include #include @@ -399,7 +400,7 @@ void wxMDIChildFrame::SetTitle( const wxString &title ) wxMDIParentFrame* parent = (wxMDIParentFrame*) GetParent(); 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 ) ); } //----------------------------------------------------------------------------- diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index d74c9b2ca6..6250455059 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -241,14 +241,12 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) { menu->SetInvokingWindow( (wxWindow*) NULL ); -#if GTK_CHECK_VERSION(1, 2, 0) wxWindow *top_frame = win; while (top_frame->GetParent() && !(top_frame->IsTopLevel())) 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) ); -#endif wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst(); 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. */ #if GTK_CHECK_VERSION(1, 2, 1) - /* local buffer in multibyte form */ wxString buf; buf << wxT('/') << str.c_str(); - char *cbuf = new char[buf.Length()+1]; - strcpy(cbuf, buf.mbc_str()); + /* local buffer in multibyte form */ + char cbuf[400]; + strcpy(cbuf, wxGTK_CONV(buf) ); GtkItemFactoryEntry entry; entry.path = (gchar *)cbuf; // const_cast @@ -374,12 +372,11 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title) 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 ); - delete [] cbuf; #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_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) ) return FALSE; -#if __WXGTK12__ // 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 // 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); 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) @@ -564,7 +552,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const wxString label; wxString text( menu->GetTitle() ); -#if GTK_CHECK_VERSION(1, 2, 0) for ( const wxChar *pc = text.c_str(); *pc; pc++ ) { if ( *pc == wxT('_') || *pc == wxT('&') ) @@ -576,9 +563,6 @@ wxString wxMenuBar::GetLabelTop( size_t pos ) const label += *pc; } -#else // GTK+ 1.0 - label = text; -#endif // GTK+ 1.2/1.0 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 ); /* set new text */ - gtk_label_set( label, str.mb_str()); + gtk_label_set( label, wxGTK_CONV( str ) ); /* 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) ); } @@ -805,10 +789,10 @@ void wxMenuItem::SetText( const wxString& str ) label = GTK_LABEL( GTK_BIN(m_menuItem)->child ); /* set new text */ - gtk_label_set( label, m_text.mb_str()); + gtk_label_set( label, wxGTK_CONV( m_text ) ); /* 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) ); } } @@ -854,16 +838,13 @@ void wxMenuItem::DoSetText( const wxString& str ) m_text << *pc; } - /* only GTK 1.2 knows about hot keys */ m_hotKey = wxT(""); -#if GTK_CHECK_VERSION(1, 2, 0) if(*pc == wxT('\t')) { pc++; m_hotKey = pc; } -#endif // GTK+ 1.2.0+ } #if wxUSE_ACCEL @@ -952,17 +933,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler) void wxMenu::Init() { -#if GTK_CHECK_VERSION(1, 2, 0) m_accel = gtk_accel_group_new(); m_factory = gtk_item_factory_new( GTK_TYPE_MENU, "
", m_accel ); m_menu = gtk_item_factory_get_widget( m_factory, "
" ); -#else - m_menu = gtk_menu_new(); // Do not show! -#endif m_owner = (GtkWidget*) NULL; -#if GTK_CHECK_VERSION(1, 2, 0) /* Tearoffs are entries, just like separators. So if we want this menu to be a tear-off one, we just append a tearoff entry immediately. */ @@ -977,7 +953,6 @@ void wxMenu::Init() gtk_item_factory_create_item( m_factory, &entry, (gpointer) this, 2 ); /* what is 2 ? */ //GtkWidget *menuItem = gtk_item_factory_get_widget( m_factory, "
/tearoff" ); } -#endif // GTK+ 1.2.0+ // append the title as the very first entry if we have it if ( !!m_title ) @@ -1004,14 +979,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) bool appended = FALSE; #endif -#if GTK_CHECK_VERSION(1, 2, 0) // does this item terminate the current radio group? bool endOfRadioGroup = TRUE; -#endif // GTK+ >= 1.2 if ( mitem->IsSeparator() ) { -#if GTK_CHECK_VERSION(1, 2, 0) GtkItemFactoryEntry entry; entry.path = (char *)"/sep"; entry.callback = (GtkItemFactoryCallback) NULL; @@ -1026,20 +998,16 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) // we might have a separator inside a radio group endOfRadioGroup = FALSE; -#else // GTK+ 1.0 - menuItem = gtk_menu_item_new(); -#endif // GTK 1.2/1.0 } else if ( mitem->IsSubMenu() ) { -#if GTK_CHECK_VERSION(1, 2, 0) /* text has "_" instead of "&" after mitem->SetText() */ wxString text( mitem->GetText() ); /* local buffer in multibyte form */ char buf[200]; strcpy( buf, "/" ); - strcat( buf, text.mb_str() ); + strcat( buf, wxGTK_CONV( text ) ); GtkItemFactoryEntry entry; 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 ? */ wxString path( mitem->GetFactoryPath() ); - menuItem = gtk_item_factory_get_item( m_factory, path.mb_str() ); -#else // GTK+ 1.0 - menuItem = gtk_menu_item_new_with_label(mitem->GetText().mbc_str()); -#endif // GTK 1.2/1.0 + menuItem = gtk_item_factory_get_item( m_factory, wxGTK_CONV( path ) ); 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(); 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_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); if (accel_key != GDK_VoidSymbol) { @@ -1103,14 +1068,13 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) #endif // USE_MENU_BITMAPS else // a normal item { -#if GTK_CHECK_VERSION(1, 2, 0) /* text has "_" instead of "&" after mitem->SetText() */ wxString text( mitem->GetText() ); /* local buffer in multibyte form */ char buf[200]; strcpy( buf, "/" ); - strncat( buf, text.mb_str(), WXSIZEOF(buf) - 2 ); + strncat( buf, wxGTK_CONV(text), WXSIZEOF(buf) - 2 ); buf[WXSIZEOF(buf) - 1] = '\0'; GtkItemFactoryEntry entry; @@ -1119,6 +1083,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) entry.callback_action = 0; wxString pathRadio; + char buf2[200]; const char *item_type; switch ( mitem->GetKind() ) { @@ -1136,9 +1101,11 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) else // continue the radio group { pathRadio = m_pathLastRadio; - pathRadio.Replace("_", ""); - pathRadio.Prepend("
/"); - item_type = pathRadio; + pathRadio.Replace(wxT("_"), wxT("")); + pathRadio.Prepend(wxT("
/")); + strncat( buf2, wxGTK_CONV(pathRadio), WXSIZEOF(buf2) - 2 ); + buf2[WXSIZEOF(buf2) - 1] = '\0'; + item_type = buf2; } // 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 - // otherwise GTK+ 1.2.2 manages to override the memory we pass to it // somehow! (VZ) - static char s_accel[50]; // must be big enougg + static char s_accel[50]; // must be big enough 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; #else // !wxUSE_ACCEL 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 ? */ wxString path( mitem->GetFactoryPath() ); - menuItem = gtk_item_factory_get_widget( m_factory, path.mb_str() ); -#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 + menuItem = gtk_item_factory_get_widget( m_factory, wxGTK_CONV( path ) ); } if ( !mitem->IsSeparator() ) @@ -1194,22 +1153,12 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem) (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); -#if GTK_CHECK_VERSION(1, 2, 0) if ( endOfRadioGroup ) { m_pathLastRadio.clear(); } -#endif // GTK+ >= 1.2 return TRUE; } diff --git a/src/gtk1/minifram.cpp b/src/gtk1/minifram.cpp index 6f0c63d0d3..2e98dd832e 100644 --- a/src/gtk1/minifram.cpp +++ b/src/gtk1/minifram.cpp @@ -19,6 +19,7 @@ #include "gtk/gtk.h" #include "wx/gtk/win_gtk.h" +#include "wx/gtk/private.h" #include #include @@ -100,7 +101,7 @@ static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *g gdk_draw_string( pizza->bin_window, font, gc, 6, 3+font->ascent, - win->m_title.mb_str() ); + wxGTK_CONV( win->m_title ) ); 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, 6, 3+font->ascent, - win->m_title.mb_str() ); + wxGTK_CONV( win->m_title ) ); gdk_gc_unref( gc ); } diff --git a/src/gtk1/notebook.cpp b/src/gtk1/notebook.cpp index 08fc2ca89d..edd5093685 100644 --- a/src/gtk1/notebook.cpp +++ b/src/gtk1/notebook.cpp @@ -394,7 +394,7 @@ bool wxNotebook::SetPageText( int page, const wxString &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; } @@ -617,7 +617,7 @@ bool wxNotebook::InsertPage( int position, page->m_text = text; 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 ); /* show the label */ diff --git a/src/gtk1/radiobox.cpp b/src/gtk1/radiobox.cpp index 98e57717ad..26240cc004 100644 --- a/src/gtk1/radiobox.cpp +++ b/src/gtk1/radiobox.cpp @@ -180,7 +180,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, 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 // 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; } - 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_FUNC(gtk_radiobox_keypress_callback), (gpointer)this ); @@ -514,7 +514,7 @@ void wxRadioBox::SetLabel( const wxString& 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 ) @@ -527,7 +527,7 @@ void wxRadioBox::SetString( int item, const wxString& label ) 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 ) diff --git a/src/gtk1/radiobut.cpp b/src/gtk1/radiobut.cpp index c523b49eef..fad83bc1b1 100644 --- a/src/gtk1/radiobut.cpp +++ b/src/gtk1/radiobut.cpp @@ -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); @@ -154,7 +154,7 @@ void wxRadioButton::SetLabel( const wxString& label ) wxControl::SetLabel( label ); 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 ) diff --git a/src/gtk1/spinctrl.cpp b/src/gtk1/spinctrl.cpp index 87acf9dcb6..f04242957b 100644 --- a/src/gtk1/spinctrl.cpp +++ b/src/gtk1/spinctrl.cpp @@ -208,7 +208,7 @@ void wxSpinCtrl::SetValue( const wxString& value ) { // invalid number - set text as is (wxMSW compatible) GtkDisableEvents(); - gtk_entry_set_text( GTK_ENTRY(m_widget), value.mbc_str() ); + gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) ); GtkEnableEvents(); } } diff --git a/src/gtk1/statbox.cpp b/src/gtk1/statbox.cpp index 3884e299b7..5777e99153 100644 --- a/src/gtk1/statbox.cpp +++ b/src/gtk1/statbox.cpp @@ -16,6 +16,7 @@ #if wxUSE_STATBOX #include "wx/statbox.h" +#include "wx/gtk/private.h" #include "gdk/gdk.h" #include "gtk/gtk.h" @@ -60,7 +61,7 @@ bool wxStaticBox::Create( wxWindow *parent, 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 ); @@ -90,7 +91,7 @@ void wxStaticBox::SetLabel( const wxString &label ) wxControl::SetLabel( label ); 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() diff --git a/src/gtk1/stattext.cpp b/src/gtk1/stattext.cpp index f10c32753c..e574807714 100644 --- a/src/gtk1/stattext.cpp +++ b/src/gtk1/stattext.cpp @@ -17,6 +17,7 @@ #if wxUSE_STATTEXT #include "wx/stattext.h" +#include "wx/gtk/private.h" #include "gdk/gdk.h" #include "gtk/gtk.h" diff --git a/src/gtk1/tbargtk.cpp b/src/gtk1/tbargtk.cpp index 38a8fde253..0494319d44 100644 --- a/src/gtk1/tbargtk.cpp +++ b/src/gtk1/tbargtk.cpp @@ -445,10 +445,10 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) widget, tool->GetLabel().empty() ? NULL - : tool->GetLabel().mbc_str(), + : (const char*) wxGTK_CONV( tool->GetLabel() ), tool->GetShortHelp().empty() ? NULL - : tool->GetShortHelp().mbc_str(), + : (const char*) wxGTK_CONV( tool->GetShortHelp() ), "", // tooltip_private_text (?) tool->m_pixmap, (GtkSignalFunc)gtk_toolbar_callback, @@ -526,14 +526,12 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable) { -#if (GTK_MINOR_VERSION > 0) 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) + { gtk_widget_set_sensitive( tool->m_item, enable ); -#endif + } } void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle ) @@ -611,7 +609,7 @@ void wxToolBar::SetToolShortHelp( int id, const wxString& helpString ) { (void)tool->SetShortHelp(helpString); gtk_tooltips_set_tip(m_toolbar->tooltips, tool->m_item, - helpString.mbc_str(), ""); + wxGTK_CONV( helpString ), ""); } } diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 46345f1820..675eafd62e 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -17,17 +17,13 @@ #include "wx/log.h" #include "wx/settings.h" #include "wx/panel.h" +#include "wx/strconv.h" #include #include #include #include // 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 @@ -55,6 +51,7 @@ static void wxGtkTextInsert(GtkWidget *text, const char *txt, size_t len) { +#ifndef __WXGTK__ GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont() : NULL; @@ -66,6 +63,7 @@ static void wxGtkTextInsert(GtkWidget *text, : NULL; 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) wxapp_install_idle_handler(); - + win->SetModified(); win->UpdateFontIfNeeded(); - + wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); event.SetEventObject( win ); event.SetString( win->GetValue() ); @@ -136,6 +134,7 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win ) // "changed" from vertical scrollbar //----------------------------------------------------------------------------- +#ifndef __WXGTK20__ static void gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) { @@ -146,6 +145,7 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) win->CalculateScrollbar(); } +#endif // ---------------------------------------------------------------------------- // redraw callback for multiline text @@ -248,20 +248,41 @@ bool wxTextCtrl::Create( wxWindow *parent, m_vScrollbarVisible = FALSE; bool multi_line = (style & wxTE_MULTILINE) != 0; + +#ifdef __WXGTK20__ + GtkTextBuffer *buffer = NULL; +#endif + if (multi_line) { -#ifdef __WXGTK13__ - /* 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 +#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 ); - /* create our control ... */ + 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 ); - /* ... 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); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); 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), 0, 0); - /* always wrap words */ + // always wrap words gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE ); -#ifdef __WXGTK13__ - /* 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 */ + // finally, put the vertical scrollbar in the upper right corner m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj ); GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS ); gtk_table_attach(GTK_TABLE(m_widget), m_vScrollbar, 1, 2, 0, 1, GTK_FILL, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK), 0, 0); +#endif } else { - /* a single-line text control: no need for scrollbars */ + // a single-line text control: no need for scrollbars m_widget = m_text = gtk_entry_new(); } @@ -324,12 +329,12 @@ bool wxTextCtrl::Create( wxWindow *parent, if (multi_line) gtk_widget_show(m_text); +#ifndef __WXGTK20__ if (multi_line) { gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed", (GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this ); -#ifndef __WXGTK20__ // only initialize gs_gtk_text_draw once, starting from the next the // klass::draw will already be wxgtk_text_draw if ( !gs_gtk_text_draw ) @@ -341,12 +346,14 @@ bool wxTextCtrl::Create( wxWindow *parent, draw = wxgtk_text_draw; } -#endif // GTK+ 1.x } +#endif // GTK+ 1.x if (!value.IsEmpty()) { - gint tmp = 0; +#ifdef __WXGTK20__ + SetValue( value ); +#else #if !GTK_CHECK_VERSION(1, 2, 0) // 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); #endif // GTK 1.0 + gint tmp = 0; #if wxUSE_UNICODE wxWX2MBbuf val = value.mbc_str(); 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 ); -#endif // Unicode/!Unicode +#endif 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) )); } + +#endif } if (style & wxTE_PASSWORD) @@ -378,19 +388,35 @@ bool wxTextCtrl::Create( wxWindow *parent, { if (!multi_line) 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 { if (multi_line) 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_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 - manager should use a default one */ + // we don't set a valid background colour, because the window + // manager should use a default one m_backgroundColour = wxColour(); wxColour colFg = parent->GetForegroundColour(); @@ -398,8 +424,10 @@ bool wxTextCtrl::Create( wxWindow *parent, m_cursor = wxCursor( wxCURSOR_IBEAM ); +#ifndef __WXGTK20__ wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() ); SetDefaultStyle( attrDef ); +#endif Show( TRUE ); @@ -408,6 +436,7 @@ bool wxTextCtrl::Create( wxWindow *parent, void wxTextCtrl::CalculateScrollbar() { +#ifndef __WXGTK20__ if ((m_windowStyle & wxTE_MULTILINE) == 0) return; GtkAdjustment *adj = GTK_TEXT(m_text)->vadj; @@ -428,6 +457,7 @@ void wxTextCtrl::CalculateScrollbar() m_vScrollbarVisible = TRUE; } } +#endif } wxString wxTextCtrl::GetValue() const @@ -437,15 +467,35 @@ wxString wxTextCtrl::GetValue() const wxString tmp; 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) ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); - tmp = wxString(text,*wxConvCurrent); + tmp = text; g_free( text ); +#endif } 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; } @@ -455,26 +505,33 @@ void wxTextCtrl::SetValue( const wxString &value ) 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) ); gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len ); 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 ); #endif } 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 // the lists. wxWindows 2.2 will have a set of flags to // customize this behaviour. SetInsertionPoint(0); - + m_modified = FALSE; } @@ -485,33 +542,48 @@ void wxTextCtrl::WriteText( const wxString &text ) if ( text.empty() ) 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 ) { +#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. gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) ); // always use m_defaultStyle, even if it is empty as otherwise // 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 - wxGtkTextInsert(m_text, m_defaultStyle, txt, txtlen); + wxGtkTextInsert(m_text, m_defaultStyle, text.c_str(), text.Len()); // Bring editable's cursor back uptodate. SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); +#endif } else // single line { // This moves the cursor pos to behind the inserted 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. len += text.Len(); @@ -533,6 +605,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const { if (m_windowStyle & wxTE_MULTILINE) { +#ifndef __WXGTK20__ gint len = gtk_text_get_length( GTK_TEXT(m_text) ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); @@ -553,6 +626,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const return buf; } else +#endif { return wxEmptyString; } @@ -634,6 +708,11 @@ int wxTextCtrl::GetNumberOfLines() const { 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) ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); @@ -654,6 +733,7 @@ int wxTextCtrl::GetNumberOfLines() const { return 0; } +#endif } else { @@ -667,14 +747,17 @@ void wxTextCtrl::SetInsertionPoint( long pos ) if (m_windowStyle & wxTE_MULTILINE) { - /* seems to be broken in GTK 1.0.X: - gtk_text_set_point( GTK_TEXT(m_text), (int)pos ); */ - +#ifdef __WXGTK20__ + 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_FUNC(gtk_text_changed_callback), (gpointer)this); /* we fake a set_point by inserting and deleting. as the user - isn't supposed to get to know about thos non-sense, we + isn't supposed to get to know about this non-sense, we disconnect so that no events are sent to the user program. */ gint tmp = (gint)pos; @@ -684,16 +767,15 @@ void wxTextCtrl::SetInsertionPoint( long pos ) gtk_signal_connect( GTK_OBJECT(m_text), "changed", GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); - /* bring editable's cursor uptodate. another bug in GTK. */ - + // bring editable's cursor uptodate. Bug in GTK. SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); +#endif } else { gtk_entry_set_position( GTK_ENTRY(m_text), (int)pos ); - /* bring editable's cursor uptodate. bug in GTK. */ - + // Bring editable's cursor uptodate. Bug in GTK. SET_EDITABLE_POS(m_text, (guint32)pos); } } @@ -703,9 +785,20 @@ void wxTextCtrl::SetInsertionPointEnd() wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); 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))); +#endif + } else + { gtk_entry_set_position( GTK_ENTRY(m_text), -1 ); + } } void wxTextCtrl::SetEditable( bool editable ) @@ -713,9 +806,17 @@ void wxTextCtrl::SetEditable( bool editable ) wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); 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 ); +#endif + } else + { gtk_entry_set_editable( GTK_ENTRY(m_text), editable ); + } } bool wxTextCtrl::Enable( bool enable ) @@ -728,8 +829,12 @@ bool wxTextCtrl::Enable( bool enable ) if (m_windowStyle & wxTE_MULTILINE) { +#ifdef __WXGTK20__ + SetEditable( enable ); +#else gtk_text_set_editable( GTK_TEXT(m_text), enable ); OnParentEnable(enable); +#endif } else { @@ -823,6 +928,7 @@ void wxTextCtrl::SetSelection( long from, long to ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ if ( (m_windowStyle & wxTE_MULTILINE) && !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")); 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 ) { +#ifndef __WXGTK20__ if (m_windowStyle & wxTE_MULTILINE) { 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; gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p); } +#endif } long wxTextCtrl::GetInsertionPoint() const { 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); + } } long wxTextCtrl::GetLastPosition() const @@ -861,10 +1000,23 @@ long wxTextCtrl::GetLastPosition() const wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") ); int pos = 0; + 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) ); +#endif + } else + { pos = GTK_ENTRY(m_text)->text_length; + } return (long)pos; } @@ -873,13 +1025,16 @@ void wxTextCtrl::Remove( long from, long to ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); +#endif } void wxTextCtrl::Replace( long from, long to, const wxString &value ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); 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 ); #endif } +#endif } void wxTextCtrl::Cut() { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); +#endif } void wxTextCtrl::Copy() { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); +#endif } void wxTextCtrl::Paste() { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); +#ifndef __WXGTK20__ gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); +#endif } // Undo/redo @@ -1045,9 +1207,17 @@ GtkWidget* wxTextCtrl::GetConnectWidget() bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window ) { 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); +#endif + } else + { return (window == GTK_ENTRY(m_text)->text_area); + } } // the font will change for subsequent text insertiongs @@ -1130,12 +1300,14 @@ bool wxTextCtrl::SetBackgroundColour( const wxColour &colour ) if (m_windowStyle & wxTE_MULTILINE) { +#ifndef __WXGTK__ GdkWindow *window = GTK_TEXT(m_text)->text_area; if (!window) return FALSE; m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); gdk_window_set_background( window, m_backgroundColour.GetColor() ); gdk_window_clear( window ); +#endif } // change active background color too @@ -1150,6 +1322,7 @@ bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr& style ) with styling (FIXME) */ if ( m_windowStyle & wxTE_MULTILINE ) { +#ifndef __WXGTK20__ if ( style.IsDefault() ) { // 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 !!! gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */ SetInsertionPoint( old_pos ); +#endif return TRUE; } else // singe line @@ -1268,6 +1442,7 @@ void wxTextCtrl::OnInternalIdle() if (cursor.Ok()) { +#ifndef __WXGTK20__ GdkWindow *window = (GdkWindow*) NULL; if (HasFlag(wxTE_MULTILINE)) window = GTK_TEXT(m_text)->text_area; @@ -1283,6 +1458,7 @@ void wxTextCtrl::OnInternalIdle() window = m_widget->window; if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget))) gdk_window_set_cursor( window, cursor.GetCursor() ); +#endif } if (g_delayedFocus == this) @@ -1310,20 +1486,24 @@ wxSize wxTextCtrl::DoGetBestSize() const void wxTextCtrl::Freeze() { +#ifndef __WXGTK20__ if ( HasFlag(wxTE_MULTILINE) ) { gtk_text_freeze(GTK_TEXT(m_text)); } +#endif } void wxTextCtrl::Thaw() { +#ifndef __WXGTK20__ if ( HasFlag(wxTE_MULTILINE) ) { GTK_TEXT(m_text)->vadj->value = 0.0; gtk_text_thaw(GTK_TEXT(m_text)); } +#endif } // ---------------------------------------------------------------------------- @@ -1332,11 +1512,16 @@ void wxTextCtrl::Thaw() GtkAdjustment *wxTextCtrl::GetVAdj() const { +#ifdef __WXGTK20__ + return NULL; +#else return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL; +#endif } bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff) { +#ifndef __WXGTK20__ float value = adj->value + diff; if ( value < 0 ) @@ -1357,11 +1542,15 @@ bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff) gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed"); +#endif return TRUE; } bool wxTextCtrl::ScrollLines(int lines) { +#ifdef __WXGTK20__ + return FALSE; +#else GtkAdjustment *adj = GetVAdj(); if ( !adj ) return FALSE; @@ -1370,14 +1559,19 @@ bool wxTextCtrl::ScrollLines(int lines) static const int KEY_SCROLL_PIXELS = 10; return DoScroll(adj, lines*KEY_SCROLL_PIXELS); +#endif } bool wxTextCtrl::ScrollPages(int pages) { +#ifdef __WXGTK20__ + return FALSE; +#else GtkAdjustment *adj = GetVAdj(); if ( !adj ) return FALSE; return DoScroll(adj, (int)ceil(pages*adj->page_increment)); +#endif } diff --git a/src/gtk1/tglbtn.cpp b/src/gtk1/tglbtn.cpp index e6ca7ff17c..2a913203a7 100644 --- a/src/gtk1/tglbtn.cpp +++ b/src/gtk1/tglbtn.cpp @@ -63,7 +63,7 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, wxControl::SetLabel(label); // 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_FUNC(gtk_togglebutton_clicked_callback), @@ -123,7 +123,7 @@ void wxToggleButton::SetLabel(const wxString& 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*/) diff --git a/src/gtk1/toplevel.cpp b/src/gtk1/toplevel.cpp index 7175f78411..7b4d04a2db 100644 --- a/src/gtk1/toplevel.cpp +++ b/src/gtk1/toplevel.cpp @@ -29,6 +29,7 @@ #include "wx/control.h" #include "wx/app.h" #include "wx/dcclient.h" +#include "wx/gtk/private.h" #include #include @@ -368,9 +369,9 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, } 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_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) { - XEvent xev; - GdkWindowPrivate *priv; - gint prev_error; +#ifndef __WXGTK20__ + XEvent xev; + GdkWindowPrivate *priv; + gint prev_error; - prev_error = gdk_error_warnings; - gdk_error_warnings = 0; - priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window); + prev_error = gdk_error_warnings; + gdk_error_warnings = 0; + priv = (GdkWindowPrivate*)(GTK_WIDGET(window)->window); - if (GTK_WIDGET_MAPPED(window)) - { - xev.type = ClientMessage; - xev.xclient.type = ClientMessage; - xev.xclient.window = priv->xwindow; - xev.xclient.message_type = gs_XA_WIN_LAYER; - xev.xclient.format = 32; - xev.xclient.data.l[0] = (long)layer; - xev.xclient.data.l[1] = gdk_time_get(); + if (GTK_WIDGET_MAPPED(window)) + { + xev.type = ClientMessage; + xev.xclient.type = ClientMessage; + xev.xclient.window = priv->xwindow; + xev.xclient.message_type = gs_XA_WIN_LAYER; + xev.xclient.format = 32; + xev.xclient.data.l[0] = (long)layer; + xev.xclient.data.l[1] = gdk_time_get(); - XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, - SubstructureNotifyMask, (XEvent*) &xev); + XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, + SubstructureNotifyMask, (XEvent*) &xev); } - else + else { - long data[1]; + long data[1]; - data[0] = layer; - XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER, - XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, - 1); + data[0] = layer; + XChangeProperty(GDK_DISPLAY(), priv->xwindow, gs_XA_WIN_LAYER, + XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); } - gdk_error_warnings = prev_error; + gdk_error_warnings = prev_error; +#endif } 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") ); 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 ) diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 2786d91934..c12e2fad49 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -54,6 +54,7 @@ #endif #include +#include #include "wx/gtk/private.h" #include @@ -3139,7 +3140,7 @@ void wxWindowGTK::GetTextExtent( const wxString& string, wxCHECK_RET( fontToUse.Ok(), wxT("invalid font") ); 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 (descent) (*descent) = font->descent; if (externalLeading) (*externalLeading) = 0; // ?? @@ -3411,7 +3412,8 @@ void wxWindowGTK::GtkSendPaintEvents() // Clip to paint region in wxClientDC m_clipPaintRegion = TRUE; - + +#ifndef __WXGTK20__ if (GetThemeEnabled()) { // find ancestor from which to steal background @@ -3443,7 +3445,10 @@ void wxWindowGTK::GtkSendPaintEvents() } } 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 ); if (m_clearRegion.IsEmpty()) @@ -3456,6 +3461,7 @@ void wxWindowGTK::GtkSendPaintEvents() if (!GetEventHandler()->ProcessEvent(erase_event)) { +#ifndef __WXGTK20__ if (!g_eraseGC) { g_eraseGC = gdk_gc_new( pizza->bin_window ); @@ -3470,6 +3476,7 @@ void wxWindowGTK::GtkSendPaintEvents() upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); upd ++; } +#endif } m_clearRegion.Clear(); } -- 2.45.2