Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | * Allowed for emulation of <script> ... now runTclScripts will callback to eval |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | ferrieux-nacl |
Files: | files | file ages | folders |
SHA1: |
5ee1aa409f272db219aefcb63cdcc959 |
User & Date: | colin 2011-05-06 01:30:16 |
Context
2011-05-08
| ||
04:14 | * implemented entry and label widgets check-in: d16e74cd46 user: colin tags: ferrieux-nacl | |
2011-05-06
| ||
01:30 | * Allowed for emulation of <script> ... now runTclScripts will callback to eval check-in: 5ee1aa409f user: colin tags: ferrieux-nacl | |
2011-05-05
| ||
07:53 | * added initial NaTk support - won't yet run without symlink lib/ to Wub/ and symlink to tcllib/ check-in: 5262e46c8d user: colin tags: ferrieux-nacl | |
Changes
Changes to nacl/demo/NaTk/NaTk.html.
︙ | ︙ | |||
11 12 13 14 15 16 17 | id='tcl' width=0 height=0 nacl='tcl.nmf' type='application/x-nacl' onload='moduleDidLoad();' verbose=0 source='NaTk.tcl' | < > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | id='tcl' width=0 height=0 nacl='tcl.nmf' type='application/x-nacl' onload='moduleDidLoad();' verbose=0 source='NaTk.tcl' toplevel='toplevel'/> <div id="toplevel">Loading ...</div> <script id='script' type="text/tcl"> # this script will be evaluated by NaTk button .b -text "Hello, Tk!" -command {alert HELLO} -grid {0 0} </script> </body> </html> |
Changes to nacl/demo/NaTk/NaTk.tcl.
︙ | ︙ | |||
198 199 200 201 202 203 204 | checkbutton radiobutton scale select combobox frame } { Interp alias $n [self] mkwidget $n } Interp alias $n grid [self] grid | | | 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | checkbutton radiobutton scale select combobox frame } { Interp alias $n [self] mkwidget $n } Interp alias $n grid [self] grid #::dom get [dict get $::argv script] [self] start } } class create ::NaTk::Widget { variable id props widget interp parent connection method js {} {return ""} |
︙ | ︙ | |||
1243 1244 1245 1246 1247 1248 1249 | } Debug on form Debug on widgets Debug on widget Debug on interp | > | > > > | 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 | } Debug on form Debug on widgets Debug on widget Debug on interp set ::nacl::verbose 1 # fetch all the <script> elements which are type text/tcl # pass them as one big string to the NaTk object for evaluation. ::nacl js "runTclScripts('[::NaTk new] start')" |
Changes to nacl/demo/loader.js.
︙ | ︙ | |||
54 55 56 57 58 59 60 61 62 63 64 65 66 67 | try { eval(t); } catch(err) { //printf("JS-err:", err); setTimeout('tcl("::nacl::bgerror,"'+ err + ',' + t + ')',0); } } // --- tclsource starts an XHR, and calls the given 'tcb' (Tcl // --- Callback) on completion. A catchable Tcl-level error is raised // --- in case of not-200. Used by [source]. function tclsource(url,tcb) { //printf('tclsource'); xs = new XMLHttpRequest(); | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | try { eval(t); } catch(err) { //printf("JS-err:", err); setTimeout('tcl("::nacl::bgerror,"'+ err + ',' + t + ')',0); } } function serialT (thing) { alert("serialT " + thing.type + " " + thing.toString()); var result = '{'; switch (thing.type) { case 'string': return tclEsc(thing); break; case 'array': for (var i=0; i < thing.length(); i++) { result = result + " " + serialT(thing[i]); } result = result + '}'; break; case 'object': for (var prop in thing) { result = result + " " + serialT(prop) + " " + serialT(thing[prop]); } result = result + '}'; break; case 'function': result = thing.toString(); break; default: return undefined; break; } return result; } function callback(to,js) { alert("callback " + to + " " + js); try { tclDo(to + " " + serialT(eval(js))); } catch (err) { alert("JS-error " + err); //printf("JS-err:", err); setTimeout('tcl("::nacl::bgerror,"'+ err + ',' + js + ')',0); } } // --- tclsource starts an XHR, and calls the given 'tcb' (Tcl // --- Callback) on completion. A catchable Tcl-level error is raised // --- in case of not-200. Used by [source]. function tclsource(url,tcb) { //printf('tclsource'); xs = new XMLHttpRequest(); |
︙ | ︙ | |||
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | tclDo(tcb+" {"+xs.responseText+"}"); } else { tclDo(tcb+" {error \"Can't source -- "+xs.statusText+"\"}"); } } }; } // ---------- GUI and standard NaCl-loading machinery -------- function moduleDidLoad() { tclModule = document.getElementById('tcl'); // tcl('lappend', '::JS', "alert('ARGV:[join $::argv]')"); tcl('eval', 'coroutine', '::main_coro', 'source', '[dict get $::argv source]'); } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | tclDo(tcb+" {"+xs.responseText+"}"); } else { tclDo(tcb+" {error \"Can't source -- "+xs.statusText+"\"}"); } } }; } // traverse - apply function to subtree of dom returning object function traverse(fn) { var result; var target; if (arguments.length() > 1) { target = arguments[1]; } else { target = document; } result[target]=fn.apply(target); for (var i=0; i<target.childNodes.length; i++) { var child = target.childNodes[i]; var traversal = traverse(fn, child); for (var prop in traversal) { result[prop] = traversal[prop]; } } return result; } // ---------- GUI and standard NaCl-loading machinery -------- function moduleDidLoad() { tclModule = document.getElementById('tcl'); // tcl('lappend', '::JS', "alert('ARGV:[join $::argv]')"); tcl('eval', 'coroutine', '::main_coro', 'source', '[dict get $::argv source]'); } // runTclScripts - collect all <script> elements with type text/tcl // Pass them to the Tcl header given in 'where' (or uplevel) function runTclScripts(where) { if (where == undefined) { where = "uplevel #0"; } var scripts = document.getElementsByTagName('script'); var script = ""; for (var i = 0; i < scripts.length; i++) { if (scripts[i].getAttribute('type') == 'text/tcl') { script = script + '\n' + scripts[i].innerHTML; } } tclDo(where + " {" + tclEsc(script)+ "}"); } |
Changes to nacl/naclMain.c.
︙ | ︙ | |||
343 344 345 346 347 348 349 | uint32_t len = 0; int i; args[0] = Tcl_NewStringObj("::nacl::evall",-1); Tcl_IncrRefCount(args[0]); for (i = 0; i < argc; i++) { | | < < > > > > | 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 | uint32_t len = 0; int i; args[0] = Tcl_NewStringObj("::nacl::evall",-1); Tcl_IncrRefCount(args[0]); for (i = 0; i < argc; i++) { if (argv[i].type == PP_VARTYPE_STRING) { const char *bytes = var_interface->VarToUtf8(argv[i], &len); args[i+1] = Tcl_NewStringObj(bytes, len); Tcl_IncrRefCount(args[i+1]); if (verbose) { printf("NaTcl(%d): EVALL arg: '%s'\n",pid, bytes); } } else { v = StrToVar("Arg from Javascript is not a string!"); } } Tcl_EvalObjv(interp, argc+1, args, 0); if (verbose) { printf("NaTcl(%d): EVALL result: '%s'\n",pid, Tcl_GetStringResult(interp)); } for (i = 0; i < argc+1; i++) { Tcl_DecrRefCount(args[i]); } |
︙ | ︙ |