From 828f655fd31ac19d83cf7ec14d0b207e9b254977 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 28 Feb 1999 18:03:27 +0000 Subject: [PATCH] added wxMenu::Append( wxMenuItem ) added keyboard hooks to glcanvas fixed probs with slider/spin button etc git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1830 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/menu.h | 1 + include/wx/gtk1/menu.h | 1 + src/gtk/menu.cpp | 41 +++++++++++++++++++++++++++++++-- src/gtk/scrolbar.cpp | 1 + src/gtk/slider.cpp | 5 ++-- src/gtk/spinbutt.cpp | 5 ++-- src/gtk/textctrl.cpp | 1 + src/gtk/window.cpp | 6 ++++- src/gtk1/menu.cpp | 41 +++++++++++++++++++++++++++++++-- src/gtk1/scrolbar.cpp | 1 + src/gtk1/slider.cpp | 5 ++-- src/gtk1/spinbutt.cpp | 5 ++-- src/gtk1/textctrl.cpp | 1 + src/gtk1/window.cpp | 6 ++++- utils/glcanvas/gtk/glcanvas.cpp | 3 +++ 15 files changed, 109 insertions(+), 14 deletions(-) diff --git a/include/wx/gtk/menu.h b/include/wx/gtk/menu.h index 08a63b914e..008be7e58a 100644 --- a/include/wx/gtk/menu.h +++ b/include/wx/gtk/menu.h @@ -98,6 +98,7 @@ public: const wxString &helpStr = "", bool checkable = FALSE); void Append(int id, const wxString &item, wxMenu *subMenu, const wxString &helpStr = "" ); + void Append(wxMenuItem *pItem); void Break() {}; // find item by name/id diff --git a/include/wx/gtk1/menu.h b/include/wx/gtk1/menu.h index 08a63b914e..008be7e58a 100644 --- a/include/wx/gtk1/menu.h +++ b/include/wx/gtk1/menu.h @@ -98,6 +98,7 @@ public: const wxString &helpStr = "", bool checkable = FALSE); void Append(int id, const wxString &item, wxMenu *subMenu, const wxString &helpStr = "" ); + void Append(wxMenuItem *pItem); void Break() {}; // find item by name/id diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index aff2211922..0c0d9b98a5 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -62,7 +62,7 @@ wxMenuBar::wxMenuBar() m_menubar = gtk_menu_bar_new(); - m_widget = GTK_WIDGET(m_menubar); + m_widget = GTK_WIDGET(m_menubar); PostCreation(); @@ -494,9 +494,9 @@ void wxMenu::Append( int id, const wxString &text, wxMenu *subMenu, const wxStri wxMenuItem *mitem = new wxMenuItem(); mitem->SetId(id); mitem->SetText(text); + mitem->SetHelp(helpStr); GtkWidget *menuItem = gtk_menu_item_new_with_label(mitem->GetText()); - mitem->SetHelp(helpStr); mitem->SetMenuItem(menuItem); mitem->SetSubMenu(subMenu); @@ -514,6 +514,43 @@ void wxMenu::Append( int id, const wxString &text, wxMenu *subMenu, const wxStri m_items.Append( mitem ); } +void wxMenu::Append( wxMenuItem *item ) +{ + m_items.Append( item ); + + GtkWidget *menuItem = (GtkWidget*) NULL; + + if (item->IsSeparator()) + menuItem = gtk_menu_item_new(); + else if (item->IsSubMenu()) + menuItem = gtk_menu_item_new_with_label(item->GetText()); + else + menuItem = item->IsCheckable() ? gtk_check_menu_item_new_with_label(item->GetText()) + : gtk_menu_item_new_with_label(item->GetText()); + + if (!item->IsSeparator()) + { + gtk_signal_connect( GTK_OBJECT(menuItem), "select", + GTK_SIGNAL_FUNC(gtk_menu_hilight_callback), + (gpointer*)this ); + + gtk_signal_connect( GTK_OBJECT(menuItem), "deselect", + GTK_SIGNAL_FUNC(gtk_menu_nolight_callback), + (gpointer*)this ); + + if (!item->IsSubMenu()) + { + gtk_signal_connect( GTK_OBJECT(menuItem), "activate", + GTK_SIGNAL_FUNC(gtk_menu_clicked_callback), + (gpointer*)this ); + } + } + + gtk_menu_append( GTK_MENU(m_menu), menuItem ); + gtk_widget_show( menuItem ); + item->SetMenuItem(menuItem); +} + int wxMenu::FindItem( const wxString itemString ) const { wxString s( itemString ); diff --git a/src/gtk/scrolbar.cpp b/src/gtk/scrolbar.cpp index ee6d3eec70..39aba4ce46 100644 --- a/src/gtk/scrolbar.cpp +++ b/src/gtk/scrolbar.cpp @@ -37,6 +37,7 @@ static void gtk_scrollbar_callback( GtkWidget *WXUNUSED(widget), wxScrollBar *wi float diff = win->m_adjust->value - win->m_oldPos; if (fabs(diff) < 0.2) return; + win->m_oldPos = win->m_adjust->value; wxEventType command = wxEVT_NULL; diff --git a/src/gtk/slider.cpp b/src/gtk/slider.cpp index 5f9c8915b6..08a4da1d19 100644 --- a/src/gtk/slider.cpp +++ b/src/gtk/slider.cpp @@ -35,6 +35,7 @@ static void gtk_slider_callback( GtkWidget *WXUNUSED(widget), wxSlider *win ) float diff = win->m_adjust->value - win->m_oldPos; if (fabs(diff) < 0.2) return; + win->m_oldPos = win->m_adjust->value; wxEventType command = wxEVT_NULL; @@ -56,11 +57,11 @@ static void gtk_slider_callback( GtkWidget *WXUNUSED(widget), wxSlider *win ) wxScrollEvent event( command, win->GetId(), value, orient ); event.SetEventObject( win ); - win->ProcessEvent( event ); + win->GetEventHandler()->ProcessEvent( event ); wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, win->GetId() ); cevent.SetEventObject( win ); - win->ProcessEvent( cevent ); + win->GetEventHandler()->ProcessEvent( cevent ); } //----------------------------------------------------------------------------- diff --git a/src/gtk/spinbutt.cpp b/src/gtk/spinbutt.cpp index dfe03b27a1..392310c3f9 100644 --- a/src/gtk/spinbutt.cpp +++ b/src/gtk/spinbutt.cpp @@ -33,9 +33,10 @@ static void gtk_spinbutt_callback( GtkWidget *WXUNUSED(widget), wxSpinButton *wi { if (!win->HasVMT()) return; if (g_blockEventsOnDrag) return; - + float diff = win->m_adjust->value - win->m_oldPos; if (fabs(diff) < 0.2) return; + win->m_oldPos = win->m_adjust->value; wxEventType command = wxEVT_NULL; @@ -55,7 +56,7 @@ static void gtk_spinbutt_callback( GtkWidget *WXUNUSED(widget), wxSpinButton *wi event.SetOrientation( wxVERTICAL ); event.SetEventObject( win ); - win->ProcessEvent( event ); + win->GetEventHandler()->ProcessEvent( event ); } //----------------------------------------------------------------------------- diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index d7f0dcd96e..7c6817aa3e 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -300,6 +300,7 @@ void wxTextCtrl::WriteText( const wxString &text ) { /* this moves the cursor pos to behind the inserted text */ gint len = GTK_EDITABLE(m_text)->current_pos; + gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len ); /* bring editable's cursor uptodate. bug in GTK. */ diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 39a203d804..89b75f8a9d 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1081,6 +1081,7 @@ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float diff = win->m_vAdjust->value - win->m_oldVerticalPos; if (fabs(diff) < 0.2) return; + win->m_oldVerticalPos = win->m_vAdjust->value; wxEventType command = wxEVT_NULL; @@ -1128,6 +1129,7 @@ static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float diff = win->m_hAdjust->value - win->m_oldHorizontalPos; if (fabs(diff) < 0.2) return; + win->m_oldHorizontalPos = win->m_hAdjust->value; wxEventType command = wxEVT_NULL; @@ -2835,7 +2837,9 @@ bool wxWindow::IsOwnGtkWindow( GdkWindow *window ) void wxWindow::SetFont( const wxFont &font ) { wxCHECK_RET( m_widget != NULL, "invalid window" ); - + + if (m_font == font) return; + if (((wxFont*)&font)->Ok()) m_font = font; else diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index aff2211922..0c0d9b98a5 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -62,7 +62,7 @@ wxMenuBar::wxMenuBar() m_menubar = gtk_menu_bar_new(); - m_widget = GTK_WIDGET(m_menubar); + m_widget = GTK_WIDGET(m_menubar); PostCreation(); @@ -494,9 +494,9 @@ void wxMenu::Append( int id, const wxString &text, wxMenu *subMenu, const wxStri wxMenuItem *mitem = new wxMenuItem(); mitem->SetId(id); mitem->SetText(text); + mitem->SetHelp(helpStr); GtkWidget *menuItem = gtk_menu_item_new_with_label(mitem->GetText()); - mitem->SetHelp(helpStr); mitem->SetMenuItem(menuItem); mitem->SetSubMenu(subMenu); @@ -514,6 +514,43 @@ void wxMenu::Append( int id, const wxString &text, wxMenu *subMenu, const wxStri m_items.Append( mitem ); } +void wxMenu::Append( wxMenuItem *item ) +{ + m_items.Append( item ); + + GtkWidget *menuItem = (GtkWidget*) NULL; + + if (item->IsSeparator()) + menuItem = gtk_menu_item_new(); + else if (item->IsSubMenu()) + menuItem = gtk_menu_item_new_with_label(item->GetText()); + else + menuItem = item->IsCheckable() ? gtk_check_menu_item_new_with_label(item->GetText()) + : gtk_menu_item_new_with_label(item->GetText()); + + if (!item->IsSeparator()) + { + gtk_signal_connect( GTK_OBJECT(menuItem), "select", + GTK_SIGNAL_FUNC(gtk_menu_hilight_callback), + (gpointer*)this ); + + gtk_signal_connect( GTK_OBJECT(menuItem), "deselect", + GTK_SIGNAL_FUNC(gtk_menu_nolight_callback), + (gpointer*)this ); + + if (!item->IsSubMenu()) + { + gtk_signal_connect( GTK_OBJECT(menuItem), "activate", + GTK_SIGNAL_FUNC(gtk_menu_clicked_callback), + (gpointer*)this ); + } + } + + gtk_menu_append( GTK_MENU(m_menu), menuItem ); + gtk_widget_show( menuItem ); + item->SetMenuItem(menuItem); +} + int wxMenu::FindItem( const wxString itemString ) const { wxString s( itemString ); diff --git a/src/gtk1/scrolbar.cpp b/src/gtk1/scrolbar.cpp index ee6d3eec70..39aba4ce46 100644 --- a/src/gtk1/scrolbar.cpp +++ b/src/gtk1/scrolbar.cpp @@ -37,6 +37,7 @@ static void gtk_scrollbar_callback( GtkWidget *WXUNUSED(widget), wxScrollBar *wi float diff = win->m_adjust->value - win->m_oldPos; if (fabs(diff) < 0.2) return; + win->m_oldPos = win->m_adjust->value; wxEventType command = wxEVT_NULL; diff --git a/src/gtk1/slider.cpp b/src/gtk1/slider.cpp index 5f9c8915b6..08a4da1d19 100644 --- a/src/gtk1/slider.cpp +++ b/src/gtk1/slider.cpp @@ -35,6 +35,7 @@ static void gtk_slider_callback( GtkWidget *WXUNUSED(widget), wxSlider *win ) float diff = win->m_adjust->value - win->m_oldPos; if (fabs(diff) < 0.2) return; + win->m_oldPos = win->m_adjust->value; wxEventType command = wxEVT_NULL; @@ -56,11 +57,11 @@ static void gtk_slider_callback( GtkWidget *WXUNUSED(widget), wxSlider *win ) wxScrollEvent event( command, win->GetId(), value, orient ); event.SetEventObject( win ); - win->ProcessEvent( event ); + win->GetEventHandler()->ProcessEvent( event ); wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, win->GetId() ); cevent.SetEventObject( win ); - win->ProcessEvent( cevent ); + win->GetEventHandler()->ProcessEvent( cevent ); } //----------------------------------------------------------------------------- diff --git a/src/gtk1/spinbutt.cpp b/src/gtk1/spinbutt.cpp index dfe03b27a1..392310c3f9 100644 --- a/src/gtk1/spinbutt.cpp +++ b/src/gtk1/spinbutt.cpp @@ -33,9 +33,10 @@ static void gtk_spinbutt_callback( GtkWidget *WXUNUSED(widget), wxSpinButton *wi { if (!win->HasVMT()) return; if (g_blockEventsOnDrag) return; - + float diff = win->m_adjust->value - win->m_oldPos; if (fabs(diff) < 0.2) return; + win->m_oldPos = win->m_adjust->value; wxEventType command = wxEVT_NULL; @@ -55,7 +56,7 @@ static void gtk_spinbutt_callback( GtkWidget *WXUNUSED(widget), wxSpinButton *wi event.SetOrientation( wxVERTICAL ); event.SetEventObject( win ); - win->ProcessEvent( event ); + win->GetEventHandler()->ProcessEvent( event ); } //----------------------------------------------------------------------------- diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index d7f0dcd96e..7c6817aa3e 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -300,6 +300,7 @@ void wxTextCtrl::WriteText( const wxString &text ) { /* this moves the cursor pos to behind the inserted text */ gint len = GTK_EDITABLE(m_text)->current_pos; + gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len ); /* bring editable's cursor uptodate. bug in GTK. */ diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 39a203d804..89b75f8a9d 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1081,6 +1081,7 @@ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float diff = win->m_vAdjust->value - win->m_oldVerticalPos; if (fabs(diff) < 0.2) return; + win->m_oldVerticalPos = win->m_vAdjust->value; wxEventType command = wxEVT_NULL; @@ -1128,6 +1129,7 @@ static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float diff = win->m_hAdjust->value - win->m_oldHorizontalPos; if (fabs(diff) < 0.2) return; + win->m_oldHorizontalPos = win->m_hAdjust->value; wxEventType command = wxEVT_NULL; @@ -2835,7 +2837,9 @@ bool wxWindow::IsOwnGtkWindow( GdkWindow *window ) void wxWindow::SetFont( const wxFont &font ) { wxCHECK_RET( m_widget != NULL, "invalid window" ); - + + if (m_font == font) return; + if (((wxFont*)&font)->Ok()) m_font = font; else diff --git a/utils/glcanvas/gtk/glcanvas.cpp b/utils/glcanvas/gtk/glcanvas.cpp index 47a21717e9..3ee6ca77c0 100644 --- a/utils/glcanvas/gtk/glcanvas.cpp +++ b/utils/glcanvas/gtk/glcanvas.cpp @@ -227,6 +227,9 @@ bool wxGLCanvas::Create( wxWindow *parent, wxWindowID id, gtk_signal_connect( GTK_OBJECT(m_glWidget), "draw", GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); + /* connect to key press and mouse handlers etc. */ + ConnectWidget( m_glWidget ); + gtk_widget_show( m_glWidget ); m_glContext = new wxGLContext( TRUE, this, palette ); -- 2.45.2