More changes to various controls for more reliably
preventing them from emitting event when their state was changed programatically. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12467 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
bc87fd68e3
commit
9864c56ded
@ -54,6 +54,8 @@ public:
|
||||
|
||||
GtkWidget *m_widgetCheckbox;
|
||||
GtkWidget *m_widgetLabel;
|
||||
|
||||
bool m_blockEvent;
|
||||
|
||||
protected:
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
@ -50,6 +50,8 @@ public:
|
||||
bool IsOwnGtkWindow( GdkWindow *window );
|
||||
void OnInternalIdle();
|
||||
|
||||
bool m_blockEvent;
|
||||
|
||||
protected:
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
||||
|
@ -62,7 +62,7 @@ public:
|
||||
GdkColor *m_fg;
|
||||
GdkColor *m_bg;
|
||||
|
||||
bool m_blockNextEvent;
|
||||
bool m_blockEvent;
|
||||
|
||||
void OnInternalIdle();
|
||||
|
||||
|
@ -63,12 +63,10 @@ public:
|
||||
void SetLabel(const wxString& label);
|
||||
bool Enable(bool enable = TRUE);
|
||||
|
||||
protected:
|
||||
// Callback function given to gtk
|
||||
static void gtk_togglebutton_clicked_callback(GtkWidget *widget,
|
||||
wxToggleButton *win);
|
||||
|
||||
// implementation
|
||||
bool m_blockEvent;
|
||||
|
||||
// wx stuff
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow(GdkWindow *window);
|
||||
|
||||
|
@ -54,6 +54,8 @@ public:
|
||||
|
||||
GtkWidget *m_widgetCheckbox;
|
||||
GtkWidget *m_widgetLabel;
|
||||
|
||||
bool m_blockEvent;
|
||||
|
||||
protected:
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
@ -50,6 +50,8 @@ public:
|
||||
bool IsOwnGtkWindow( GdkWindow *window );
|
||||
void OnInternalIdle();
|
||||
|
||||
bool m_blockEvent;
|
||||
|
||||
protected:
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
||||
|
@ -62,7 +62,7 @@ public:
|
||||
GdkColor *m_fg;
|
||||
GdkColor *m_bg;
|
||||
|
||||
bool m_blockNextEvent;
|
||||
bool m_blockEvent;
|
||||
|
||||
void OnInternalIdle();
|
||||
|
||||
|
@ -63,12 +63,10 @@ public:
|
||||
void SetLabel(const wxString& label);
|
||||
bool Enable(bool enable = TRUE);
|
||||
|
||||
protected:
|
||||
// Callback function given to gtk
|
||||
static void gtk_togglebutton_clicked_callback(GtkWidget *widget,
|
||||
wxToggleButton *win);
|
||||
|
||||
// implementation
|
||||
bool m_blockEvent;
|
||||
|
||||
// wx stuff
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow(GdkWindow *window);
|
||||
|
||||
|
@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
|
||||
if (!cb->m_hasVMT) return;
|
||||
|
||||
if (g_blockEventsOnDrag) return;
|
||||
|
||||
if (cb->m_blockEvent) return;
|
||||
|
||||
wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId());
|
||||
event.SetInt( cb->GetValue() );
|
||||
@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent,
|
||||
{
|
||||
m_needParent = TRUE;
|
||||
m_acceptsFocus = TRUE;
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation( parent, pos, size ) ||
|
||||
!CreateBase( parent, id, pos, size, style, validator, name ))
|
||||
@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state )
|
||||
if (state == GetValue())
|
||||
return;
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox),
|
||||
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
|
||||
(gpointer *)this );
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox),
|
||||
"clicked",
|
||||
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
|
||||
(gpointer *)this );
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
bool wxCheckBox::GetValue() const
|
||||
|
@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r
|
||||
if (g_blockEventsOnDrag) return;
|
||||
|
||||
if (!button->active) return;
|
||||
|
||||
if (rb->m_blockEvent) return;
|
||||
|
||||
wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
|
||||
event.SetInt( rb->GetValue() );
|
||||
@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
|
||||
m_acceptsFocus = TRUE;
|
||||
m_needParent = TRUE;
|
||||
m_isRadioButton = TRUE;
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation( parent, pos, size ) ||
|
||||
!CreateBase( parent, id, pos, size, style, validator, name ))
|
||||
{
|
||||
wxFAIL_MSG( wxT("wxRadioButton creation failed") );
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (HasFlag(wxRB_GROUP))
|
||||
{
|
||||
/* start a new group */
|
||||
// start a new group
|
||||
m_radioButtonGroup = (GSList*) NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* search backward for last group start */
|
||||
// search backward for last group start
|
||||
wxRadioButton *chief = (wxRadioButton*) NULL;
|
||||
wxWindowList::Node *node = parent->GetChildren().GetLast();
|
||||
while (node)
|
||||
@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
|
||||
}
|
||||
if (chief)
|
||||
{
|
||||
/* we are part of the group started by chief */
|
||||
// we are part of the group started by chief
|
||||
m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* start a new group */
|
||||
// start a new group
|
||||
m_radioButtonGroup = (GSList*) NULL;
|
||||
}
|
||||
}
|
||||
@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val )
|
||||
if (val == GetValue())
|
||||
return;
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget),
|
||||
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
if (val)
|
||||
{
|
||||
@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val )
|
||||
// as FALSE. Failing silently is probably TRTTD here.
|
||||
}
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
|
||||
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
bool wxRadioButton::GetValue() const
|
||||
|
@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
|
||||
wxapp_install_idle_handler();
|
||||
|
||||
wxToolBar *tbar = (wxToolBar *)tool->GetToolBar();
|
||||
if ( tbar->m_blockNextEvent )
|
||||
{
|
||||
tbar->m_blockNextEvent = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (tbar->m_blockEvent) return;
|
||||
|
||||
if (g_blockEventsOnDrag) return;
|
||||
if (!tool->IsEnabled()) return;
|
||||
@ -196,7 +193,7 @@ void wxToolBar::Init()
|
||||
m_fg =
|
||||
m_bg = (GdkColor *)NULL;
|
||||
m_toolbar = (GtkToolbar *)NULL;
|
||||
m_blockNextEvent = FALSE;
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
wxToolBar::~wxToolBar()
|
||||
@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
|
||||
gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
|
||||
}
|
||||
|
||||
m_blockNextEvent = TRUE; // we cannot use gtk_signal_disconnect here
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle );
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -24,13 +24,15 @@ extern wxCursor g_globalCursor;
|
||||
|
||||
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
|
||||
// Callback function given to gtk.
|
||||
void wxToggleButton::gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
|
||||
static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
|
||||
{
|
||||
if (g_isIdle)
|
||||
wxapp_install_idle_handler();
|
||||
|
||||
if (!cb->m_hasVMT || g_blockEventsOnDrag)
|
||||
return;
|
||||
|
||||
if (cb->m_blockEvent) return;
|
||||
|
||||
// Generate a wx event.
|
||||
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId());
|
||||
@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
|
||||
{
|
||||
m_needParent = TRUE;
|
||||
m_acceptsFocus = TRUE;
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation(parent, pos, size) ||
|
||||
!CreateBase(parent, id, pos, size, style, validator, name )) {
|
||||
@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state)
|
||||
if (state == GetValue())
|
||||
return;
|
||||
|
||||
gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget),
|
||||
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
|
||||
(gpointer *)this);
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
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),
|
||||
(gpointer *)this);
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
// bool GetValue() const
|
||||
|
@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
|
||||
if (!cb->m_hasVMT) return;
|
||||
|
||||
if (g_blockEventsOnDrag) return;
|
||||
|
||||
if (cb->m_blockEvent) return;
|
||||
|
||||
wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId());
|
||||
event.SetInt( cb->GetValue() );
|
||||
@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent,
|
||||
{
|
||||
m_needParent = TRUE;
|
||||
m_acceptsFocus = TRUE;
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation( parent, pos, size ) ||
|
||||
!CreateBase( parent, id, pos, size, style, validator, name ))
|
||||
@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state )
|
||||
if (state == GetValue())
|
||||
return;
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox),
|
||||
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
|
||||
(gpointer *)this );
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox),
|
||||
"clicked",
|
||||
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
|
||||
(gpointer *)this );
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
bool wxCheckBox::GetValue() const
|
||||
|
@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r
|
||||
if (g_blockEventsOnDrag) return;
|
||||
|
||||
if (!button->active) return;
|
||||
|
||||
if (rb->m_blockEvent) return;
|
||||
|
||||
wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
|
||||
event.SetInt( rb->GetValue() );
|
||||
@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
|
||||
m_acceptsFocus = TRUE;
|
||||
m_needParent = TRUE;
|
||||
m_isRadioButton = TRUE;
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation( parent, pos, size ) ||
|
||||
!CreateBase( parent, id, pos, size, style, validator, name ))
|
||||
{
|
||||
wxFAIL_MSG( wxT("wxRadioButton creation failed") );
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (HasFlag(wxRB_GROUP))
|
||||
{
|
||||
/* start a new group */
|
||||
// start a new group
|
||||
m_radioButtonGroup = (GSList*) NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* search backward for last group start */
|
||||
// search backward for last group start
|
||||
wxRadioButton *chief = (wxRadioButton*) NULL;
|
||||
wxWindowList::Node *node = parent->GetChildren().GetLast();
|
||||
while (node)
|
||||
@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
|
||||
}
|
||||
if (chief)
|
||||
{
|
||||
/* we are part of the group started by chief */
|
||||
// we are part of the group started by chief
|
||||
m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* start a new group */
|
||||
// start a new group
|
||||
m_radioButtonGroup = (GSList*) NULL;
|
||||
}
|
||||
}
|
||||
@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val )
|
||||
if (val == GetValue())
|
||||
return;
|
||||
|
||||
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget),
|
||||
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
if (val)
|
||||
{
|
||||
@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val )
|
||||
// as FALSE. Failing silently is probably TRTTD here.
|
||||
}
|
||||
|
||||
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
|
||||
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
bool wxRadioButton::GetValue() const
|
||||
|
@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
|
||||
wxapp_install_idle_handler();
|
||||
|
||||
wxToolBar *tbar = (wxToolBar *)tool->GetToolBar();
|
||||
if ( tbar->m_blockNextEvent )
|
||||
{
|
||||
tbar->m_blockNextEvent = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (tbar->m_blockEvent) return;
|
||||
|
||||
if (g_blockEventsOnDrag) return;
|
||||
if (!tool->IsEnabled()) return;
|
||||
@ -196,7 +193,7 @@ void wxToolBar::Init()
|
||||
m_fg =
|
||||
m_bg = (GdkColor *)NULL;
|
||||
m_toolbar = (GtkToolbar *)NULL;
|
||||
m_blockNextEvent = FALSE;
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
wxToolBar::~wxToolBar()
|
||||
@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
|
||||
gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
|
||||
}
|
||||
|
||||
m_blockNextEvent = TRUE; // we cannot use gtk_signal_disconnect here
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle );
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -24,13 +24,15 @@ extern wxCursor g_globalCursor;
|
||||
|
||||
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
|
||||
// Callback function given to gtk.
|
||||
void wxToggleButton::gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
|
||||
static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
|
||||
{
|
||||
if (g_isIdle)
|
||||
wxapp_install_idle_handler();
|
||||
|
||||
if (!cb->m_hasVMT || g_blockEventsOnDrag)
|
||||
return;
|
||||
|
||||
if (cb->m_blockEvent) return;
|
||||
|
||||
// Generate a wx event.
|
||||
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId());
|
||||
@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
|
||||
{
|
||||
m_needParent = TRUE;
|
||||
m_acceptsFocus = TRUE;
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation(parent, pos, size) ||
|
||||
!CreateBase(parent, id, pos, size, style, validator, name )) {
|
||||
@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state)
|
||||
if (state == GetValue())
|
||||
return;
|
||||
|
||||
gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget),
|
||||
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
|
||||
(gpointer *)this);
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
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),
|
||||
(gpointer *)this);
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
// bool GetValue() const
|
||||
|
Loading…
Reference in New Issue
Block a user