#ifndef WX_PRECOMP
#include "wx/textctrl.h" // for wxEVT_COMMAND_TEXT_UPDATED
#include "wx/utils.h"
+ #include "wx/wxcrtvararg.h"
#endif
#include "wx/gtk/private.h"
static void
gtk_value_changed(GtkSpinButton* spinbutton, wxSpinCtrl* win)
{
- if (g_isIdle) wxapp_install_idle_handler();
-
win->m_pos = int(gtk_spin_button_get_value(spinbutton));
- if (!win->m_hasVMT || g_blockEventsOnDrag || win->m_blockScrollEvent)
+ if (!win->m_hasVMT || g_blockEventsOnDrag)
return;
wxCommandEvent event( wxEVT_COMMAND_SPINCTRL_UPDATED, win->GetId());
static void
gtk_changed(GtkSpinButton* spinbutton, wxSpinCtrl* win)
{
- if (g_isIdle)
- wxapp_install_idle_handler();
-
- if (!win->m_hasVMT || win->m_blockScrollEvent)
+ if (!win->m_hasVMT)
return;
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
event.SetEventObject( win );
+ event.SetString( GTK_ENTRY(spinbutton)->text );
// see above
event.SetInt(win->m_pos);
int min, int max, int initial,
const wxString& name)
{
- m_needParent = true;
- m_acceptsFocus = true;
-
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
{
}
m_widget = gtk_spin_button_new_with_range(min, max, 1);
- gtk_spin_button_set_value((GtkSpinButton*)m_widget, initial);
- m_pos = int(gtk_spin_button_get_value((GtkSpinButton*)m_widget));
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(m_widget), initial);
+ m_pos = (int) gtk_spin_button_get_value( GTK_SPIN_BUTTON(m_widget));
gtk_spin_button_set_wrap( GTK_SPIN_BUTTON(m_widget),
(int)(m_windowStyle & wxSP_WRAP) );
- g_signal_connect(m_widget, "value_changed", G_CALLBACK(gtk_value_changed), this);
- g_signal_connect(m_widget, "changed", G_CALLBACK(gtk_changed), this);
+ g_signal_connect_after(m_widget, "value_changed", G_CALLBACK(gtk_value_changed), this);
+ g_signal_connect_after(m_widget, "changed", G_CALLBACK(gtk_changed), this);
m_parent->DoAddChild( this );
wxCHECK_MSG( (m_widget != NULL), 0, wxT("invalid spin button") );
double min;
- gtk_spin_button_get_range((GtkSpinButton*)m_widget, &min, NULL);
+ gtk_spin_button_get_range( GTK_SPIN_BUTTON(m_widget), &min, NULL);
return int(min);
}
wxCHECK_MSG( (m_widget != NULL), 0, wxT("invalid spin button") );
double max;
- gtk_spin_button_get_range((GtkSpinButton*)m_widget, NULL, &max);
+ gtk_spin_button_get_range( GTK_SPIN_BUTTON(m_widget), NULL, &max);
return int(max);
}
{
wxCHECK_MSG( (m_widget != NULL), 0, wxT("invalid spin button") );
- wx_const_cast(wxSpinCtrl*, this)->BlockScrollEvent();
+ GtkDisableEvents();
gtk_spin_button_update( GTK_SPIN_BUTTON(m_widget) );
- wx_const_cast(wxSpinCtrl*, this)->UnblockScrollEvent();
+ wx_const_cast(wxSpinCtrl*, this)->m_pos =
+ int(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_widget)));
+ GtkEnableEvents();
return m_pos;
}
else
{
// invalid number - set text as is (wxMSW compatible)
- BlockScrollEvent();
+ GtkDisableEvents();
gtk_entry_set_text( GTK_ENTRY(m_widget), wxGTK_CONV( value ) );
- UnblockScrollEvent();
+ GtkEnableEvents();
}
}
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid spin button") );
- BlockScrollEvent();
- gtk_spin_button_set_value((GtkSpinButton*)m_widget, value);
- UnblockScrollEvent();
+ GtkDisableEvents();
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON(m_widget), value);
+ m_pos = (int) gtk_spin_button_get_value( GTK_SPIN_BUTTON(m_widget));
+ GtkEnableEvents();
}
void wxSpinCtrl::SetSelection(long from, long to)
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid spin button") );
- BlockScrollEvent();
- gtk_spin_button_set_range((GtkSpinButton*)m_widget, minVal, maxVal);
- UnblockScrollEvent();
+ GtkDisableEvents();
+ gtk_spin_button_set_range( GTK_SPIN_BUTTON(m_widget), minVal, maxVal);
+ m_pos = int(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_widget)));
+ GtkEnableEvents();
+}
+
+
+void wxSpinCtrl::GtkDisableEvents() const
+{
+ g_signal_handlers_block_by_func( m_widget,
+ (gpointer)gtk_value_changed, (void*) this);
+
+ g_signal_handlers_block_by_func(m_widget,
+ (gpointer)gtk_changed, (void*) this);
+}
+
+void wxSpinCtrl::GtkEnableEvents() const
+{
+ g_signal_handlers_unblock_by_func(m_widget,
+ (gpointer)gtk_value_changed, (void*) this);
+
+ g_signal_handlers_unblock_by_func(m_widget,
+ (gpointer)gtk_changed, (void*) this);
}
void wxSpinCtrl::OnChar( wxKeyEvent &event )
event.Skip();
}
-bool wxSpinCtrl::IsOwnGtkWindow( GdkWindow *window )
+GdkWindow *wxSpinCtrl::GTKGetWindow(wxArrayGdkWindows& windows) const
{
GtkSpinButton* spinbutton = GTK_SPIN_BUTTON(m_widget);
- return window == spinbutton->entry.text_area || window == spinbutton->panel;
+
+ windows.push_back(spinbutton->entry.text_area);
+ windows.push_back(spinbutton->panel);
+
+ return NULL;
}
wxSize wxSpinCtrl::DoGetBestSize() const
{
wxSize ret( wxControl::DoGetBestSize() );
- wxSize best(95, ret.y);
+ wxSize best(95, ret.y); // FIXME: 95?
CacheBestSize(best);
return best;
}