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

antoine monmayrant antoine.monmayrant at laas.fr
Fri Sep 28 21:00:25 CEST 2018


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




More information about the users mailing list