[Scilab-users] bug when setting gcbo field in a callback function ?

antoine monmayrant antoine.monmayrant at laas.fr
Sat Sep 29 00:31:08 CEST 2018


Hello Stéphane,

Well, I tried exactly this trick with mixed results: it kind of works 
most of the time, but sometimes it fails.
I did not manage to reproduce the issue with my minimum working example 
though.

It's weird, no?
Why would gcbo behave differently than h?

As for why "set" is working, while "gcbo.whatever=something" is failing, 
I think it's because something goes wrong when scilab is parsing 
"gcbo.whatever=something".
It is as if scilab forgot about the fact that gcbo exists and does what 
we expect when creating a struct:
     doesnotexists.whatever=something;
creates a "doesnotexists" struct with one field==something.

Antoine


Le 29/09/2018 à 00:04, Stéphane Mottelet a écrit :
> Hello Antoine,
>
> Never trust the life time of gcbo, and first copy the value of gcbo 
> like this:
>
> function  funcb1()
>     h=gcbo
>     disp(typeof(h));
>     h.callback_type=-1;
>     disp(typeof(h));
>     h.callback_type=0;
> endfunction
>
> With this trick the type of h is always a handle. However, I cannot 
> explain why the second syntax using set() always works...
>
> S.
>
> Le 28/09/2018 à 21:00, antoine monmayrant a écrit :
>> Hi all,
>>
>> In a callback function, gcbo is a handle to the calling uicontrol.
>> There are 2 ways to set one of the fields of this handle (let's take 
>> "callback_type" as an example):
>>     (1)    gcbo.callback_type=-1;
>> or equivalently
>>     (2)    set(gcbo, "callback_type",-1);
>>
>> In theory, both are perfectly equivalent.
>> In practice however, (1) leads to recurrent issues where gcbo is no 
>> longer a handle, but a structure!
>>
>> See below  an example script showing the difference:
>> - two slides with equivalent callback functions funcb1 and funcb2, 
>> but for the different syntactic sugar (1) or (2).
>> - if you play with the top slider in the figure, everything's fine, 
>> gcbo remains a handle (see output on the console).
>> - if you play with the bottom slider in the figure, gcbo turns into a 
>> struct (see output on the console).
>>
>> Needless to say, this kind of issue made my GUI debugging session 
>> really fun.
>> To make things even more fun, if you "pause" then execute "funcb1()" 
>> step by step, you don't necessarily trigger the bug, it's quite 
>> random and fairly unfrequent.
>>
>> Can you try to reproduce this bug on your computer?
>>
>> Cheers,
>>
>> Antoine
>>
>>
>> // BUG_gcbo_set.sce //
>> h=scf();
>>
>> hs1=uicontrol(h, ...
>>     "style", "slider", ...
>>     "tag", "slide1", ...
>>     "backgroundcolor", [1 1 1], ...
>>     "value", 0, ...
>>     "min", -100, ...
>>     "max", 100, ...
>>     "sliderstep", [1, 10], ...
>>     "position", [20,40,200,20], ...
>>     "constraints", createConstraints("border", "top"), ...
>>     "callback", "funcb1");
>>
>> function  funcb1()
>>     disp(typeof(gcbo));
>>     gcbo.callback_type=-1;
>>     disp(typeof(gcbo));
>>     gcbo.callback_type=0;
>> endfunction
>>
>>
>> hs2=uicontrol(h, ...
>>     "style", "slider", ...
>>     "tag", "slide1", ...
>>     "backgroundcolor", [1 1 1], ...
>>     "value", 0, ...
>>     "min", -100, ...
>>     "max", 100, ...
>>     "sliderstep", [1, 10], ...
>>     "position", [20,80,200,20], ...
>>     "constraints", createConstraints("border", "top"), ...
>>     "callback", "funcb2");
>>
>> function  funcb2()
>>     disp(typeof(gcbo));
>>     set(gcbo, "callback_type",-1);
>>     disp(typeof(gcbo));
>>     set(gcbo, "callback_type",0)
>> endfunction
>>
>> _______________________________________________
>> users mailing list
>> users at lists.scilab.org
>> https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users 
>>
>
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users
>




More information about the users mailing list