[Gtk-sharp-list] Gtk.SpinButton recursive signals create segfault

Fabian Sturm f@rtfs.org
Wed, 09 Mar 2005 00:49:19 +0100

Content-Type: text/plain
Content-Transfer-Encoding: 7bit


Hmm replying to myself is bad but I got lots of help in IRC, thanks for
that! And now I could nail down the problem a little bit.

I now produced a proper testcase which compiles and runs.
If you run it and click on the Spinbutton to increase the value you
will get a wrong value displayed.

Why is this so? What is a proper fix to this?

Thanks a lot, Fabian (being quite puzzled about this one)

Content-Disposition: attachment; filename=spinbutton.cs
Content-Type: text/x-csharp; name=spinbutton.cs; charset=ANSI_X3.4-1968
Content-Transfer-Encoding: 7bit

using Gtk;
using System;

public class MainClass
  public delegate void EventHandler (object o);
  // This class holds all data  
  public class Data
    public event EventHandler Changed;
    private int num;
    public int Num {
      get { return num; }
      set { if (num != value) { num = value; OnChanged (); } }
    // methods
    protected void OnChanged ()
      if (Changed != null) {
        Changed (this);

  // This class generates a gui displaying the data
  public class Gui
    private Data d;
    private SpinButton sb;
    public Gui (Data d)
      Application.Init ();
      this.d = d;
      Window w = new Window ("MainWindow");
      w.Show ();
      sb = new SpinButton (0, 10, 1);
      sb.Changed += on_spinbutton_changed;
      w.Add (sb);
      sb.Show ();
      d.Changed += new EventHandler (OnDataChanged);
      Application.Run ();
    public void OnDataChanged (System.Object o)
      sb.Value = d.Num;
    // gtk# signal handler
    public void on_spinbutton_changed (object o, EventArgs args)
      Console.WriteLine ("Spinbutton changed");
      d.Num = ((SpinButton)o).ValueAsInt;


  public static void Main (string[] args)
    Data d = new Data ();
    Gui g = new Gui (d);