React (frp) interface: which code organization?
Adrien <[email protected]> Mon, 23 Aug 2010 21:44:17 +0200
| Newsgroups | gmane.comp.lang.ocaml.lib.gtk |
|---|---|
| Message-ID | <[email protected]> |
Hi,
I've started playing with react and lablgtk and got a working prototype
with one small limitation. And it's the occasion to ask for input.
Currently, I'm 'tracking' properties with a generic function. Whenever a
property is defined, a glib signal which name starts with 'notify::' is
emitted. For instance, when the 'progress' property of a WebKitWebView
is modified, the signal 'notify::progress' is emitted. Simply attaching
a callback to this signal allows updating the react side.
A short note: in react parlance, a 'signal' is a value that is always
defined while an 'event' is discrete. Thus, glib properties map to react
signals and glib signals map to react events.
The generic function I mentionned is the following:
let react_track obj prop =
let module S = GtkSignal in
let prop_r, prop_set = React.S.create (get prop obj) in
let sgn_name = "notify::" ^ prop.name in
let classe = `webview in (* XXX: not generic *)
let callback () = prop_set (get prop obj) in
let sgn = {S.name=sgn_name; classe=classe; marshaller=S.marshal_unit} in
ignore (S.connect ~sgn ~callback obj);
prop_r, prop_set
Actually, the 'let classe = `webview in' line isn't generic: I haven't
found how to get this information. Is there anything against adding this
to properties? It will probably break a few things but it shouldn't be
hard to fix.
For instance, the 'progress' property:
let progress : ([>`webview], _) property =
{ name = "progress"; conv = double }
would become:
let progress : ([>`webview], _) property =
{ name = "progress"; conv = double; classe = `webview }
Another possibility is to change propcc: properties and signals are
already generated by propcc, it'd be relatively easy to expand it to
generate react-compatible modules and classes. However, it means adding
a lot of lines of code to the final code and that's I prefer the first
solution.
A final note: you can find my example my test code, along with the
'react_track' function on [1]. It is the browser using the webkit-gtk
bindings that I mentionned a few days ago on the caml-list.
Note that a .cmi file is not being copied during the installation of the
current lablwebkit bindings. You can update to the tarballs I've
uploaded[2] or use Obj.magic on the two errors (it's guaranteed safe).
Does anyone has a preference? Or maybe a reason not to expand the
record? Thanks.
[1] http://notk.org/~adrien/webkit_test.ml.html
[2] https://forge.ocamlcore.org/frs/?group_id=157
--
Adrien Nader