From e2762ff06a5e84c82242d0883d24d21042e5a97e Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 8 Nov 2001 23:24:16 +0000 Subject: [PATCH] wxListBox mouse events now report coords relative to the whole list box. wxRadioButton doesn't emit any event when unpressed. Similar correction to wxRadioBox and wxToggleButton. Upported change to wxMenuEvent so that the id is set in the constructor. Otherwise the EVT_MENU macro is pretty useless. Already in 2.2.8. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12358 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/event.h | 2 +- include/wx/gtk/window.h | 1 + include/wx/gtk1/window.h | 1 + src/gtk/listbox.cpp | 1 + src/gtk/radiobox.cpp | 15 ++++-------- src/gtk/radiobut.cpp | 50 +++++++++++++++++++++------------------- src/gtk/tglbtn.cpp | 2 +- src/gtk/window.cpp | 17 ++++++++++++++ src/gtk1/listbox.cpp | 1 + src/gtk1/radiobox.cpp | 15 ++++-------- src/gtk1/radiobut.cpp | 50 +++++++++++++++++++++------------------- src/gtk1/tglbtn.cpp | 2 +- src/gtk1/window.cpp | 17 ++++++++++++++ 13 files changed, 101 insertions(+), 73 deletions(-) diff --git a/include/wx/event.h b/include/wx/event.h index 760e675e55..8189e16628 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -1027,7 +1027,7 @@ class WXDLLEXPORT wxMenuEvent : public wxEvent public: wxMenuEvent(wxEventType type = wxEVT_NULL, int id = 0) - { m_eventType = type; m_menuId = id; } + { m_eventType = type; m_menuId = id; m_id = id; } int GetMenuId() const { return m_menuId; } diff --git a/include/wx/gtk/window.h b/include/wx/gtk/window.h index cfb1e5af1b..0e9f17f19e 100644 --- a/include/wx/gtk/window.h +++ b/include/wx/gtk/window.h @@ -193,6 +193,7 @@ public: bool m_resizing:1; bool m_isStaticBox:1; // faster than IS_KIND_OF bool m_isRadioButton:1; // faster than IS_KIND_OF + bool m_isListBox:1; // faster than IS_KIND_OF bool m_isFrame:1; // faster than IS_KIND_OF bool m_acceptsFocus:1; // not wxStaticBox, not wxStaticBitmap etc. bool m_isScrolling; diff --git a/include/wx/gtk1/window.h b/include/wx/gtk1/window.h index cfb1e5af1b..0e9f17f19e 100644 --- a/include/wx/gtk1/window.h +++ b/include/wx/gtk1/window.h @@ -193,6 +193,7 @@ public: bool m_resizing:1; bool m_isStaticBox:1; // faster than IS_KIND_OF bool m_isRadioButton:1; // faster than IS_KIND_OF + bool m_isListBox:1; // faster than IS_KIND_OF bool m_isFrame:1; // faster than IS_KIND_OF bool m_acceptsFocus:1; // not wxStaticBox, not wxStaticBitmap etc. bool m_isScrolling; diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index ea20374c2d..449d4fbe01 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -333,6 +333,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, { m_needParent = TRUE; m_acceptsFocus = TRUE; + m_isListBox = TRUE; m_prevSelection = 0; // or -1 ?? if (!PreCreation( parent, pos, size ) || diff --git a/src/gtk/radiobox.cpp b/src/gtk/radiobox.cpp index 64881d7cfc..20d1af4563 100644 --- a/src/gtk/radiobox.cpp +++ b/src/gtk/radiobox.cpp @@ -44,20 +44,14 @@ extern bool g_blockEventsOnDrag; // "clicked" //----------------------------------------------------------------------------- -static void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioBox *rb ) +static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBox *rb ) { if (g_isIdle) wxapp_install_idle_handler(); if (!rb->m_hasVMT) return; if (g_blockEventsOnDrag) return; - if (rb->m_alreadySent) - { - rb->m_alreadySent = FALSE; - return; - } - - rb->m_alreadySent = TRUE; + if (!button->active) return; wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, rb->GetId() ); event.SetInt( rb->GetSelection() ); @@ -166,7 +160,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl) void wxRadioBox::Init() { - m_alreadySent = FALSE; m_needParent = TRUE; m_acceptsFocus = TRUE; @@ -184,7 +177,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxRadioBox creation failed") ); - return FALSE; + return FALSE; } m_widget = gtk_frame_new( title.mbc_str() ); @@ -478,7 +471,7 @@ void wxRadioBox::SetSelection( int n ) GtkDisableEvents(); - gtk_toggle_button_set_state( button, 1 ); + gtk_toggle_button_set_active( button, 1 ); GtkEnableEvents(); } diff --git a/src/gtk/radiobut.cpp b/src/gtk/radiobut.cpp index 278af7b0d4..69897c451a 100644 --- a/src/gtk/radiobut.cpp +++ b/src/gtk/radiobut.cpp @@ -4,7 +4,7 @@ // Author: Robert Roebling // Id: $Id$ // Copyright: (c) 1998 Robert Roebling -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -40,7 +40,7 @@ extern wxCursor g_globalCursor; //----------------------------------------------------------------------------- static -void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButton *rb ) +void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *rb ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -48,6 +48,8 @@ void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButto if (g_blockEventsOnDrag) return; + if (!button->active) return; + wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId()); event.SetInt( rb->GetValue() ); event.SetEventObject( rb ); @@ -72,7 +74,7 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxRadioButton creation failed") ); - return FALSE; + return FALSE; } if (HasFlag(wxRB_GROUP)) @@ -86,25 +88,25 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab wxRadioButton *chief = (wxRadioButton*) NULL; wxWindowList::Node *node = parent->GetChildren().GetLast(); while (node) - { - wxWindow *child = node->GetData(); - if (child->m_isRadioButton) - { - chief = (wxRadioButton*) child; - if (child->HasFlag(wxRB_GROUP)) break; - } - node = node->GetPrevious(); + { + wxWindow *child = node->GetData(); + if (child->m_isRadioButton) + { + chief = (wxRadioButton*) child; + if (child->HasFlag(wxRB_GROUP)) break; + } + node = node->GetPrevious(); } - if (chief) - { + if (chief) + { /* we are part of the group started by chief */ - m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) ); - } - else - { + m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) ); + } + else + { /* start a new group */ m_radioButtonGroup = (GSList*) NULL; - } + } } m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, label.mbc_str() ); @@ -159,7 +161,7 @@ void wxRadioButton::SetValue( bool val ) if (val) { - gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widget), TRUE ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widget), TRUE ); } else { @@ -209,11 +211,11 @@ void wxRadioButton::OnInternalIdle() if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok()) { /* I now set the cursor the anew in every OnInternalIdle call - as setting the cursor in a parent window also effects the - windows above so that checking for the current cursor is - not possible. */ - - gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() ); + as setting the cursor in a parent window also effects the + windows above so that checking for the current cursor is + not possible. */ + + gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() ); } UpdateWindowUI(); diff --git a/src/gtk/tglbtn.cpp b/src/gtk/tglbtn.cpp index 28497c76ce..cfa6e1efdf 100644 --- a/src/gtk/tglbtn.cpp +++ b/src/gtk/tglbtn.cpp @@ -106,7 +106,7 @@ void wxToggleButton::SetValue(bool state) GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), (gpointer *)this); - gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(m_widget), state); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 5792525800..2d74acd135 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1333,6 +1333,14 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton event.m_y = (wxCoord)gdk_event->y; AdjustEventButtonState(event); + + // wxListBox actually get mouse events from the item + + if (win->m_isListBox) + { + event.m_x += widget->allocation.x; + event.m_y += widget->allocation.y; + } // Some control don't have their own X window and thus cannot get // any events. @@ -1466,6 +1474,14 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto AdjustEventButtonState(event); + // wxListBox actually get mouse events from the item + + if (win->m_isListBox) + { + event.m_x += widget->allocation.x; + event.m_y += widget->allocation.y; + } + // Some control don't have their own X window and thus cannot get // any events. @@ -2366,6 +2382,7 @@ void wxWindowGTK::Init() m_isStaticBox = FALSE; m_isRadioButton = FALSE; + m_isListBox = FALSE; m_isFrame = FALSE; m_acceptsFocus = FALSE; diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index ea20374c2d..449d4fbe01 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -333,6 +333,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, { m_needParent = TRUE; m_acceptsFocus = TRUE; + m_isListBox = TRUE; m_prevSelection = 0; // or -1 ?? if (!PreCreation( parent, pos, size ) || diff --git a/src/gtk1/radiobox.cpp b/src/gtk1/radiobox.cpp index 64881d7cfc..20d1af4563 100644 --- a/src/gtk1/radiobox.cpp +++ b/src/gtk1/radiobox.cpp @@ -44,20 +44,14 @@ extern bool g_blockEventsOnDrag; // "clicked" //----------------------------------------------------------------------------- -static void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioBox *rb ) +static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBox *rb ) { if (g_isIdle) wxapp_install_idle_handler(); if (!rb->m_hasVMT) return; if (g_blockEventsOnDrag) return; - if (rb->m_alreadySent) - { - rb->m_alreadySent = FALSE; - return; - } - - rb->m_alreadySent = TRUE; + if (!button->active) return; wxCommandEvent event( wxEVT_COMMAND_RADIOBOX_SELECTED, rb->GetId() ); event.SetInt( rb->GetSelection() ); @@ -166,7 +160,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl) void wxRadioBox::Init() { - m_alreadySent = FALSE; m_needParent = TRUE; m_acceptsFocus = TRUE; @@ -184,7 +177,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxRadioBox creation failed") ); - return FALSE; + return FALSE; } m_widget = gtk_frame_new( title.mbc_str() ); @@ -478,7 +471,7 @@ void wxRadioBox::SetSelection( int n ) GtkDisableEvents(); - gtk_toggle_button_set_state( button, 1 ); + gtk_toggle_button_set_active( button, 1 ); GtkEnableEvents(); } diff --git a/src/gtk1/radiobut.cpp b/src/gtk1/radiobut.cpp index 278af7b0d4..69897c451a 100644 --- a/src/gtk1/radiobut.cpp +++ b/src/gtk1/radiobut.cpp @@ -4,7 +4,7 @@ // Author: Robert Roebling // Id: $Id$ // Copyright: (c) 1998 Robert Roebling -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -40,7 +40,7 @@ extern wxCursor g_globalCursor; //----------------------------------------------------------------------------- static -void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButton *rb ) +void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *rb ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -48,6 +48,8 @@ void gtk_radiobutton_clicked_callback( GtkWidget *WXUNUSED(widget), wxRadioButto if (g_blockEventsOnDrag) return; + if (!button->active) return; + wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId()); event.SetInt( rb->GetValue() ); event.SetEventObject( rb ); @@ -72,7 +74,7 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxRadioButton creation failed") ); - return FALSE; + return FALSE; } if (HasFlag(wxRB_GROUP)) @@ -86,25 +88,25 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab wxRadioButton *chief = (wxRadioButton*) NULL; wxWindowList::Node *node = parent->GetChildren().GetLast(); while (node) - { - wxWindow *child = node->GetData(); - if (child->m_isRadioButton) - { - chief = (wxRadioButton*) child; - if (child->HasFlag(wxRB_GROUP)) break; - } - node = node->GetPrevious(); + { + wxWindow *child = node->GetData(); + if (child->m_isRadioButton) + { + chief = (wxRadioButton*) child; + if (child->HasFlag(wxRB_GROUP)) break; + } + node = node->GetPrevious(); } - if (chief) - { + if (chief) + { /* we are part of the group started by chief */ - m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) ); - } - else - { + m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) ); + } + else + { /* start a new group */ m_radioButtonGroup = (GSList*) NULL; - } + } } m_widget = gtk_radio_button_new_with_label( m_radioButtonGroup, label.mbc_str() ); @@ -159,7 +161,7 @@ void wxRadioButton::SetValue( bool val ) if (val) { - gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widget), TRUE ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widget), TRUE ); } else { @@ -209,11 +211,11 @@ void wxRadioButton::OnInternalIdle() if (GTK_TOGGLE_BUTTON(m_widget)->event_window && cursor.Ok()) { /* I now set the cursor the anew in every OnInternalIdle call - as setting the cursor in a parent window also effects the - windows above so that checking for the current cursor is - not possible. */ - - gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() ); + as setting the cursor in a parent window also effects the + windows above so that checking for the current cursor is + not possible. */ + + gdk_window_set_cursor( GTK_TOGGLE_BUTTON(m_widget)->event_window, cursor.GetCursor() ); } UpdateWindowUI(); diff --git a/src/gtk1/tglbtn.cpp b/src/gtk1/tglbtn.cpp index 28497c76ce..cfa6e1efdf 100644 --- a/src/gtk1/tglbtn.cpp +++ b/src/gtk1/tglbtn.cpp @@ -106,7 +106,7 @@ void wxToggleButton::SetValue(bool state) GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), (gpointer *)this); - gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(m_widget), state); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 5792525800..2d74acd135 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1333,6 +1333,14 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton event.m_y = (wxCoord)gdk_event->y; AdjustEventButtonState(event); + + // wxListBox actually get mouse events from the item + + if (win->m_isListBox) + { + event.m_x += widget->allocation.x; + event.m_y += widget->allocation.y; + } // Some control don't have their own X window and thus cannot get // any events. @@ -1466,6 +1474,14 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto AdjustEventButtonState(event); + // wxListBox actually get mouse events from the item + + if (win->m_isListBox) + { + event.m_x += widget->allocation.x; + event.m_y += widget->allocation.y; + } + // Some control don't have their own X window and thus cannot get // any events. @@ -2366,6 +2382,7 @@ void wxWindowGTK::Init() m_isStaticBox = FALSE; m_isRadioButton = FALSE; + m_isListBox = FALSE; m_isFrame = FALSE; m_acceptsFocus = FALSE; -- 2.45.2