Two questions about lablgtk2 and callbacks
Samuel Cederlund <[email protected]> Sun, 20 Sep 2015 14:38:26 +0000 (UTC)
| Newsgroups | gmane.comp.lang.ocaml.lib.gtk |
|---|---|
| Message-ID | <[email protected]> |
--===============5032535281593803600==
Content-Type: multipart/alternative;
boundary="----=_Part_321438_2101639573.1442759906672"
------=_Part_321438_2101639573.1442759906672
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Hi,
I am working on a musical gui in Ocaml and Linux and right now am implement=
ing the lv2 gui. When you instantiate a lv2 plugin gui you pass to it an op=
aque pointer known as an LV2UI_Controller and a 'write function' that sends=
back this controller along with a port index and a floating-point value. T=
he simple way could be to use a ocaml callback valueas the controller and t=
hen call callback2(controller, port index, value) in the write function. Th=
is does not work, however, it segfaults. Can you use a separate thread for =
this?
Also, how do you declare an opaque (void *) in ml? in the lablgtk2 file gob=
ject.ml it says type -'a obj. Is this the correct way do declare opaque poi=
nters?
Appreciate any help I can get on this.
Best regards,Samuel
file lv2.ml:type -'a tttype ui =3D unit tt
(* protect setter from gc *)let uis =3D ref []
external add_ui : (* box binary plugin set map *)=C2=A0 =C2=A0 =C2=A0 'a Gt=
k.obj -> string -> string -> (int -> float -> unit) ->=C2=A0 (string -> int=
) -> ui =3D "lv2_ml_add_ui"
(* protect set from gc *)
let add obj binary uri set =3D=C2=A0 let ui =3D add_ui obj binary uri set m=
ap in
=C2=A0 uis :=3D (ui, set) :: !uis;=C2=A0 ui
file c.c:
static void write_function(LV2UI_Controller controller, uint32_t port_index=
, =C2=A0 uint32_t buffer_size, uint32_t port_protocol, =C2=A0 const void =
*buffer){=C2=A0 CAMLparam0();=C2=A0 CAMLlocal2(i, fv);=C2=A0 fprintf(stderr=
, "set %p\n", Val_bp(controller));=C2=A0 if (port_protocol =3D=3D 0) {=C2=
=A0 =C2=A0 printf("write_function port %d value %g\n", port_index, *(float =
*)buffer);=C2=A0 =C2=A0 float f =3D *(float *)buffer;=C2=A0 =C2=A0 i =3D Va=
l_long(port_index);=C2=A0 =C2=A0 fv =3D caml_copy_double((double)f);=C2=A0 =
=C2=A0 callback2(Val_bp(controller), i, fv);=C2=A0 } else=C2=A0 =C2=A0 prin=
tf("write_function %d bytes prot %d index %d\n", buffer_size, =C2=A0 port_=
protocol, port_index);}
CAMLprim value lv2_ml_add_ui(value obj, value binary, value uri, =C2=A0 =
=C2=A0 value set, value map){=C2=A0 callback2(set, Val_long(3), caml_copy_d=
ouble(5.));=C2=A0 char *b =3D String_val(binary), *u =3D String_val(uri), b=
undle[1000];
=C2=A0 void *lib =3D dlopen(b, RTLD_NOW | RTLD_LOCAL), *handle;=C2=A0 GtkWi=
dget *parent =3D GTK_WIDGET(Field(obj, 1));=C2=A0 if (!lib)=C2=A0 =C2=A0 ca=
ml_failwith("lv2ui load binary");=C2=A0 if (!(handle =3D dlsym(lib, "lv2ui_=
descriptor")))=C2=A0 =C2=A0 caml_failwith("lv2ui_descriptor");=C2=A0 strcpy=
(bundle, b); /* bundle never used */=C2=A0 strrchr(bundle, '/')[1] =3D 0;=
=C2=A0 LV2UI_DescriptorFunction f =3D (LV2UI_DescriptorFunction)handle;=C2=
=A0 const LV2UI_Descriptor *d =3Df(0);=C2=A0 LV2UI_Widget widget;=C2=A0 LV2=
UI_Handle lh =3D=C2=A0 =C2=A0 d->instantiate(d, u, bundle, write_function, =
=C2=A0 (LV2UI_Controller)(Bp_val(set)), &widget, NULL);=C2=A0 if (!lh)=C2=
=A0 =C2=A0 caml_failwith("lv2ui instantiate");=C2=A0 gtk_container_add(GTK_=
CONTAINER(parent), GTK_WIDGET(widget));=C2=A0 gtk_widget_show_all(GTK_WIDGE=
T(parent));=C2=A0 value result =3D caml_alloc_tuple(2);=C2=A0 Field(result,=
0) =3D Val_unit;=C2=A0 Field(result, 1) =3D Val_bp((void *)lh);=C2=A0 retu=
rn result;}
------=_Part_321438_2101639573.1442759906672
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<html><body><div style=3D"color:#000; background-color:#fff; font-family:ti=
mes new roman, new york, times, serif;font-size:16px"><div id=3D"yiv4998574=
972"><div id=3D"yui_3_16_0_1_1442759315848_4919"><div style=3D"color:#000;b=
ackground-color:#fff;font-family:times new roman, new york, times, serif;fo=
nt-size:16px;" id=3D"yui_3_16_0_1_1442759315848_4918"><div id=3D"yiv4998574=
972"><div id=3D"yiv4998574972yui_3_16_0_1_1442759315848_2560"><div style=3D=
"background-color:rgb(255, 255, 255);" id=3D"yiv4998574972yui_3_16_0_1_1442=
759315848_2559"><div id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2824" st=
yle=3D"color:rgb(0, 0, 0);font-family:'times new roman', 'new york', times,=
serif;font-size:16px;">Hi,</div><div id=3D"yiv4998574972yui_3_16_0_1_14427=
58466679_2595" style=3D"color:rgb(0, 0, 0);font-family:'times new roman', '=
new york', times, serif;font-size:16px;"><br></div><div dir=3D"ltr" id=3D"y=
iv4998574972yui_3_16_0_1_1442758466679_2822" style=3D"color:rgb(0, 0, 0);fo=
nt-family:'times new roman', 'new york', times, serif;font-size:16px;">I am=
working on a musical gui in Ocaml and Linux and right now am implementing =
the lv2 gui. When you instantiate a lv2 plugin gui you pass to it an opaque=
pointer known as an LV2UI_Controller and a 'write function' that sends bac=
k this controller along with a port index and a floating-point value. The s=
imple way could be to use a ocaml callback value</div><div dir=3D"ltr" id=
=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" style=3D"color:rgb(0, 0, =
0);font-family:'times new roman', 'new york', times, serif;font-size:16px;"=
>as the controller and then call callback2(controller, port index, value) i=
n the write function. This does not work, however, it segfaults. Can you us=
e a separate thread for this?</div><div dir=3D"ltr" id=3D"yiv4998574972yui_=
3_16_0_1_1442758466679_2825" style=3D"color:rgb(0, 0, 0);font-family:'times=
new roman', 'new york', times, serif;font-size:16px;"><br></div><div dir=
=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" style=3D"color=
:rgb(0, 0, 0);font-family:'times new roman', 'new york', times, serif;font-=
size:16px;">Also, how do you declare an opaque (void *) in ml? in the lablg=
tk2 file gobject.ml it says type -'a obj. Is this the correct way do declar=
e opaque pointers?<br></div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_=
1_1442758466679_2825" style=3D"color:rgb(0, 0, 0);font-family:'times new ro=
man', 'new york', times, serif;font-size:16px;"><br></div><div dir=3D"ltr" =
id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" style=3D"color:rgb(0, 0=
, 0);font-family:'times new roman', 'new york', times, serif;font-size:16px=
;">Appreciate any help I can get on this.</div><div dir=3D"ltr" id=3D"yiv49=
98574972yui_3_16_0_1_1442758466679_2825" style=3D"color:rgb(0, 0, 0);font-f=
amily:'times new roman', 'new york', times, serif;font-size:16px;"><br></di=
v><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" styl=
e=3D"color:rgb(0, 0, 0);font-family:'times new roman', 'new york', times, s=
erif;font-size:16px;">Best regards,</div><div dir=3D"ltr" id=3D"yiv49985749=
72yui_3_16_0_1_1442758466679_2825" style=3D"color:rgb(0, 0, 0);font-family:=
'times new roman', 'new york', times, serif;font-size:16px;">Samuel</div><d=
iv dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" style=3D=
"color:rgb(0, 0, 0);font-family:'times new roman', 'new york', times, serif=
;font-size:16px;"><br></div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_=
1_1442758466679_2825" style=3D"color:rgb(0, 0, 0);font-family:'times new ro=
man', 'new york', times, serif;font-size:16px;">file lv2.ml:</div><div dir=
=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825"><div dir=3D"lt=
r" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv49985749=
72">type -'a tt</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_14427=
58466679_2825" class=3D"yiv4998574972">type ui =3D unit tt</div><div style=
=3D"color:rgb(0, 0, 0);font-family:'times new roman', 'new york', times, se=
rif;font-size:16px;" dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442759315=
848_2825" class=3D"yiv4998574972"><br id=3D"yiv4998574972yui_3_16_0_1_14427=
59315848_2827" class=3D"yiv4998574972"></div></div><div dir=3D"ltr" id=3D"y=
iv4998574972yui_3_16_0_1_1442758466679_2825"><div dir=3D"ltr" id=3D"yiv4998=
574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972">(* protect s=
etter from gc *)</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442=
758466679_2825" class=3D"yiv4998574972">let uis =3D ref []</div><div dir=3D=
"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv49985=
74972"><br id=3D"yiv4998574972yui_3_16_0_1_1442759315848_2701" class=3D"yiv=
4998574972"></div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_14427584=
66679_2825" class=3D"yiv4998574972">external add_ui : (* box binary plugin =
set map *)</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466=
679_2825" class=3D"yiv4998574972"> 'a Gtk.obj -> str=
ing -> string -> (int -> float -> unit) -> </div><div d=
ir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv=
4998574972"><span class=3D"yiv4998574972" style=3D"white-space:pre-wrap;" i=
d=3D"yiv4998574972yui_3_16_0_1_1442759315848_2706">=09</span>(string -> =
int) -> ui =3D</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_144=
2758466679_2825" class=3D"yiv4998574972"><span class=3D"yiv4998574972" styl=
e=3D"white-space:pre-wrap;" id=3D"yiv4998574972yui_3_16_0_1_1442759315848_2=
709">=09</span>"lv2_ml_add_ui"</div><div dir=3D"ltr" id=3D"yiv4998574972yui=
_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"><br id=3D"yiv49985749=
72yui_3_16_0_1_1442759315848_2712" class=3D"yiv4998574972"></div><div dir=
=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv49=
98574972">(* protect set from gc *)</div><div dir=3D"ltr" id=3D"yiv49985749=
72yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"><br></div><div d=
ir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv=
4998574972">let add obj binary uri set =3D</div><div dir=3D"ltr" id=3D"yiv4=
998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> le=
t ui =3D add_ui obj binary uri set map in<br></div><div dir=3D"ltr" id=3D"y=
iv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> =
uis :=3D (ui, set) :: !uis;</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3=
_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> ui</div><div sty=
le=3D"color:rgb(0, 0, 0);font-family:'times new roman', 'new york', times, =
serif;font-size:16px;" dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_14427593=
15848_2729" class=3D"yiv4998574972"><br id=3D"yiv4998574972yui_3_16_0_1_144=
2759315848_2731" class=3D"yiv4998574972"></div></div><div dir=3D"ltr" id=3D=
"yiv4998574972yui_3_16_0_1_1442758466679_2825" style=3D"color:rgb(0, 0, 0);=
font-family:'times new roman', 'new york', times, serif;font-size:16px;">fi=
le c.c:</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679=
_2825" style=3D"color:rgb(0, 0, 0);font-family:'times new roman', 'new york=
', times, serif;font-size:16px;"><br></div><div dir=3D"ltr" id=3D"yiv499857=
4972yui_3_16_0_1_1442758466679_2825"><div dir=3D"ltr" id=3D"yiv4998574972yu=
i_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972">static void write_fu=
nction(LV2UI_Controller controller, uint32_t port_index,</div><div dir=3D"l=
tr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574=
972"><span class=3D"yiv4998574972" style=3D"white-space:pre-wrap;" id=3D"yi=
v4998574972yui_3_16_0_1_1442759315848_3072">=09=09=09</span> uint32_=
t buffer_size, uint32_t port_protocol,</div><div dir=3D"ltr" id=3D"yiv49985=
74972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"><span class=
=3D"yiv4998574972" style=3D"white-space:pre-wrap;" id=3D"yiv4998574972yui_3=
_16_0_1_1442759315848_3075">=09=09=09</span> const void *buffer)</di=
v><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" clas=
s=3D"yiv4998574972">{</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1=
_1442758466679_2825" class=3D"yiv4998574972"> CAMLparam0();</div><div=
dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"y=
iv4998574972"> CAMLlocal2(i, fv);</div><div dir=3D"ltr" id=3D"yiv4998=
574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> fprin=
tf(stderr, "set %p\n", Val_bp(controller));</div><div dir=3D"ltr" id=3D"yiv=
4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> i=
f (port_protocol =3D=3D 0) {</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3=
_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> printf("w=
rite_function port %d value %g\n", port_index, *(float *)buffer);</div><div=
dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"y=
iv4998574972"> float f =3D *(float *)buffer;</div><div dir=3D"=
ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv499857=
4972"> i =3D Val_long(port_index);</div><div dir=3D"ltr" id=3D=
"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972">&nbs=
p; fv =3D caml_copy_double((double)f);</div><div dir=3D"ltr" id=3D"y=
iv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> =
callback2(Val_bp(controller), i, fv);</div><div dir=3D"ltr" id=3D"y=
iv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> =
} else</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679=
_2825" class=3D"yiv4998574972"> printf("write_function %d byte=
s prot %d index %d\n", buffer_size,</div><div dir=3D"ltr" id=3D"yiv49985749=
72yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"><span class=3D"y=
iv4998574972" style=3D"white-space:pre-wrap;" id=3D"yiv4998574972yui_3_16_0=
_1_1442759315848_3090">=09</span> port_protocol, port_index);</div><=
div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=
=3D"yiv4998574972">}</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_=
1442758466679_2825" class=3D"yiv4998574972"><br id=3D"yiv4998574972yui_3_16=
_0_1_1442759315848_3094" class=3D"yiv4998574972"></div><div dir=3D"ltr" id=
=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"><=
br id=3D"yiv4998574972yui_3_16_0_1_1442759315848_3097" class=3D"yiv49985749=
72"></div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_28=
25" class=3D"yiv4998574972">CAMLprim value lv2_ml_add_ui(value obj, value b=
inary, value uri,</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_144=
2758466679_2825" class=3D"yiv4998574972"><span class=3D"yiv4998574972" styl=
e=3D"white-space:pre-wrap;" id=3D"yiv4998574972yui_3_16_0_1_1442759315848_3=
101">=09=09=09</span> value set, value map)</div><div dir=3D"=
ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv499857=
4972">{</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679=
_2825" class=3D"yiv4998574972"> callback2(set, Val_long(3), caml_copy=
_double(5.));</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758=
466679_2825" class=3D"yiv4998574972"> char *b =3D String_val(binary),=
*u =3D String_val(uri), bundle[1000];<br></div><div dir=3D"ltr" id=3D"yiv4=
998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> vo=
id *lib =3D dlopen(b, RTLD_NOW | RTLD_LOCAL), *handle;</div><div dir=3D"ltr=
" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv499857497=
2"> GtkWidget *parent =3D GTK_WIDGET(Field(obj, 1));</div><div dir=3D=
"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv49985=
74972"> if (!lib)</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0=
_1_1442758466679_2825" class=3D"yiv4998574972"> caml_failwith(=
"lv2ui load binary");</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1=
_1442758466679_2825" class=3D"yiv4998574972"> if (!(handle =3D dlsym(=
lib, "lv2ui_descriptor")))</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_1=
6_0_1_1442758466679_2825" class=3D"yiv4998574972"> caml_failwi=
th("lv2ui_descriptor");</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0=
_1_1442758466679_2825" class=3D"yiv4998574972"> strcpy(bundle, b);<sp=
an class=3D"yiv4998574972" style=3D"white-space:pre-wrap;" id=3D"yiv4998574=
972yui_3_16_0_1_1442759315848_3114">=09=09</span>/* bundle never used */</d=
iv><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" cla=
ss=3D"yiv4998574972"> strrchr(bundle, '/')[1] =3D 0;</div><div dir=3D=
"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv49985=
74972"> LV2UI_DescriptorFunction f =3D (LV2UI_DescriptorFunction)hand=
le;</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_282=
5" class=3D"yiv4998574972"> const LV2UI_Descriptor *d =3Df(0);</div><=
div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=
=3D"yiv4998574972"> LV2UI_Widget widget;</div><div dir=3D"ltr" id=3D"=
yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> =
; LV2UI_Handle lh =3D</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1=
_1442758466679_2825" class=3D"yiv4998574972"> d->instantiat=
e(d, u, bundle, write_function,</div><div dir=3D"ltr" id=3D"yiv4998574972yu=
i_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"><span class=3D"yiv49=
98574972" style=3D"white-space:pre-wrap;" id=3D"yiv4998574972yui_3_16_0_1_1=
442759315848_3125">=09=09</span> (LV2UI_Controller)(Bp_val(set)), &a=
mp;widget, NULL);</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_144=
2758466679_2825" class=3D"yiv4998574972"> if (!lh)</div><div dir=3D"l=
tr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574=
972"> caml_failwith("lv2ui instantiate");</div><div dir=3D"ltr=
" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv499857497=
2"> gtk_container_add(GTK_CONTAINER(parent), GTK_WIDGET(widget));</di=
v><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" clas=
s=3D"yiv4998574972"> gtk_widget_show_all(GTK_WIDGET(parent));</div><d=
iv dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D=
"yiv4998574972"> value result =3D caml_alloc_tuple(2);</div><div dir=
=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv49=
98574972"> Field(result, 0) =3D Val_unit;</div><div dir=3D"ltr" id=3D=
"yiv4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972">&nbs=
p; Field(result, 1) =3D Val_bp((void *)lh);</div><div dir=3D"ltr" id=3D"yiv=
4998574972yui_3_16_0_1_1442758466679_2825" class=3D"yiv4998574972"> r=
eturn result;</div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758=
466679_2825" class=3D"yiv4998574972">}</div><div style=3D"color:rgb(0, 0, 0=
);font-family:'times new roman', 'new york', times, serif;font-size:16px;" =
dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442759315848_3136" class=3D"yi=
v4998574972"><br id=3D"yiv4998574972yui_3_16_0_1_1442759315848_3138" class=
=3D"yiv4998574972"></div><div style=3D"color:rgb(0, 0, 0);font-family:'time=
s new roman', 'new york', times, serif;font-size:16px;" dir=3D"ltr" id=3D"y=
iv4998574972yui_3_16_0_1_1442759315848_3136" class=3D"yiv4998574972"><br></=
div></div><div dir=3D"ltr" id=3D"yiv4998574972yui_3_16_0_1_1442758466679_28=
25" style=3D"color:rgb(0, 0, 0);font-family:'times new roman', 'new york', =
times, serif;font-size:16px;"><br></div></div></div></div></div></div></div=
></div></body></html>
------=_Part_321438_2101639573.1442759906672--
--===============5032535281593803600==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Lablgtk-list mailing list
[email protected]
https://lists.ocamlcore.org/cgi-bin/listinfo/lablgtk-list
--===============5032535281593803600==--