Re: GTK signals question.



I was actually writing that testcase when I found a correlation: I'm using gcc and my callbacks were nested functions. Pull the callbacks out and make them normal, top-level, functions, and it all works even without no blocking of any kind. So, if this is a bug at all, I suppose it could be a compiler bug.

One way or the other, thanks for all the responses.

-cm

On 03/05/14 04:21, A. Walton wrote:
On Tue, Mar 4, 2014 at 10:43 PM, Chris Moller <moller mollerware com <mailto:moller mollerware com>> wrote:

    Okay, I'm out of ideas...

    I'm writing an app, that among a lot of other stuff, has three
    mutually interacting spinbuttuns, i.e., if I increment spinbutton
    A, its callback then updates values in B and C.  B and then would
    try to update A, and C, etc., resulting in a bottomless recursion.
     So, what I need to do is, while I'm in A's callback, block the B
    and C callbacks; while in in B, block A and C and so on.

    Every combination of g_signal_handler_block(),
    g_signal_handlers_block_matched(), etc, I've tried just results in
    seg faults--all that stuff works fine outside the callbacks, but
    the moment I stick them in a callback, death happens.

    Any suggestions?


I'm surprised g_signal_handler_block() or g_signal_stop_emission() didn't work. This was actually a concern when we added the GBinding code to GObject - making sure that these kinds of signal loops were well documented and that you have to prevent against them yourself using one of these methods.

My first suggestion would be to post a minimal test case demonstrating how this failed for you - might have stepped on a bug, but either way it'd make it easier to see why it failed for you.

My second suggestion is along the same line as Tristan's suggestion: create a GObject that holds the value as a property (the model), and bind the property to the views instead of binding the views' values together. (I think this object would be more boilerplate than code, woe is our lives as Gtk+ C developers.) You can use the GBinding code with an appropriate GBindingTransformFunc applied to scale the value correctly for each view, which cuts down the amount of code this approach would take. If these controls are in the same place in the UI, you could bake it all (the three spin buttons, any labels, and the one true value property) into one composite GtkWidget and save yourself a bit of boilerplate too.

-A. Walton

    Thanks.
    _______________________________________________
    gtk-app-devel-list mailing list
    gtk-app-devel-list gnome org <mailto:gtk-app-devel-list gnome org>
    https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list






[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]