diff --git a/.gitignore b/.gitignore index 39a4f9c..d36c594 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ compiled/ # Dependency tracking files *.dep +webui +/*.bak diff --git a/boilerplate.js b/boilerplate.js new file mode 100644 index 0000000..3319a1f --- /dev/null +++ b/boilerplate.js @@ -0,0 +1,132 @@ + +window._web_wire_evt_queue = []; + +window._web_wire_queue_worker = function() { + if (typeof web_ui_wire_handle_event === 'function') { + while (window._web_wire_evt_queue.length > 0) { + let evt = window._web_wire_evt_queue.shift(); + web_ui_wire_handle_event(JSON.stringify(evt)); + } + } + window.setTimeout(window._web_wire_queue_worker, 5); +}; +window.setTimeout(window._web_wire_queue_worker, 15); + +window._web_wire_put_evt = function(evt) { window._web_wire_evt_queue.push(evt); }; + +window._web_wire_event_info = function(e, id, evt) { + let obj = {}; + if (e == 'input') { + obj['data'] = evt.data; + obj['dataTransfer'] = evt.dataTransfer; + obj['inputType'] = evt.inputType; + obj['isComposing'] = evt.isComposing; + obj['value'] = document.getElementById(id).value; + } else if (e == 'change') { + obj['value'] = document.getElementById(id).value; + } else if (e == 'mousemove' || e == 'mouseover' || e == 'mouseenter' || + e == 'mouseleave' || e == 'click' || e == 'dblclick' || e == 'contextmenu' || + e == 'mousedown' || e == 'mouseup' ) { + obj['altKey'] = evt.altKey; + obj['buttons'] = evt.buttons; + obj['clientX'] = evt.clientX; + obj['clientY'] = evt.clientY; + obj['ctrlKey'] = evt.ctrlKey; + obj['metaKey'] = evt.metaKey; + obj['movementX'] = evt.movementX; + obj['movementY'] = evt.movementY; + obj['screenX'] = evt.screenX; + obj['screenY'] = evt.screenY; + obj['shiftKey'] = evt.shiftKey; + obj['x'] = evt.x; + obj['y'] = evt.y; + } else if (e == 'keydown' || e == 'keyup' || e == 'keypress') { + obj['key'] = evt.key; + obj['code'] = evt.code; + obj['altKey'] = evt.altKey; + obj['ctrlKey'] = evt.ctrlKey; + obj['metaKey'] = evt.metaKey; + obj['repeat'] = evt.repeat; + obj['shiftKey'] = evt.shiftKey; + } + // More events can be added like pointerEvent, clipboardEvent, etc. + return obj; +}; + +window._web_wire_get_evts = function() { + let v = _web_wire_evt_queue; + _web_wire_evt_queue = []; + return JSON.stringify(v); // This needs no extra type info, as it is internally used only +}; + +window._web_wire_bind_evt_ids = function(win_nr, selector, event_kind) { + try { + let nodelist = document.querySelectorAll(selector); + if (nodelist === undefined || nodelist === null) { + return 'json:[]'; + } + let ids = []; + nodelist.forEach(function(el) { + let el_id = el.getAttribute('id'); + let el_tag = el.nodeName; + let el_type = el.getAttribute('type'); + if (el_type === null) { el_type = ''; } + if (el_id !== null) { + el.addEventListener(event_kind, + function(e) { + let obj = {evt: event_kind, id: el_id, selector: selector, window: win_nr, + js_evt: window._web_wire_event_info(event_kind, el_id, e) }; + window._web_wire_put_evt(obj); + } + ); + let info = [ el_id, el_tag, el_type ]; + ids.push(info); + } + }); + return 'json:' + JSON.stringify(ids); + } catch(e) { + return 'json:[]'; + } +}; + +window._web_wire_resize_timeout = false; +window.addEventListener('resize', function() { + clearTimeout(window._web_wire_resize_timeout); + let f = function() { + let obj = { selector: 'global', evt: 'window-resize', h: window.outerWidth, w: window.outerHeight }; + window._web_wire_put_evt(obj); + }; + window._web_wire_resize_timeout = setTimeout(f, 250); +}); + +window._web_wire_x = window.screenX; +window._web_wire_y = window.screenY; +window._web_wire_move_interval = setInterval(function() { + let x = window.screenX; + let y = window.screenY; + if (x != window._web_wire_x || y != window._web_wire_y) { + window._web_wire_x = x; + window._web_wire_y = y; + let obj = { selector: 'global', evt: 'window-move', x: x, y: y }; + window._web_wire_put_evt(obj); + } +}, 500); + + +document.addEventListener('readystatechange', event => { + + // When HTML/DOM elements are ready: + //if (event.target.readyState === "interactive") { //does same as: ..addEventListener("DOMContentLoaded".. + // alert("hi 1"); + //} + + // When window loaded ( external resources are loaded too- `css`,`src`, etc...) + if (event.target.readyState === "complete") { + let obj = { selector: 'global', evt: 'html-loaded' }; + window._web_wire_put_evt(obj); + } +}); +//document.body.onload = function() { +// let obj = { selector: 'global', evt: 'html-loaded' }; +// window._web_wire_put_evt(obj); +//}; diff --git a/lib/dll/webui-2-static.dll b/lib/dll/webui-2-static.dll new file mode 100644 index 0000000..06cd80a Binary files /dev/null and b/lib/dll/webui-2-static.dll differ diff --git a/lib/dll/webui-2-static.exp b/lib/dll/webui-2-static.exp new file mode 100644 index 0000000..5f9ffe5 Binary files /dev/null and b/lib/dll/webui-2-static.exp differ diff --git a/lib/dll/webui-2-static.lib b/lib/dll/webui-2-static.lib new file mode 100644 index 0000000..b3eaf81 Binary files /dev/null and b/lib/dll/webui-2-static.lib differ diff --git a/lib/dll/webui-2.dll b/lib/dll/webui-2.dll new file mode 100644 index 0000000..033cca4 Binary files /dev/null and b/lib/dll/webui-2.dll differ diff --git a/test.html b/test.html new file mode 100644 index 0000000..d01664f --- /dev/null +++ b/test.html @@ -0,0 +1,19 @@ + + + + + test + + + + +

Test

+

Use this button + +

+

And you will be blessed

+

+ You can click something else. +

+ + \ No newline at end of file diff --git a/test.log b/test.log new file mode 100644 index 0000000..ea16ad1 --- /dev/null +++ b/test.log @@ -0,0 +1,668 @@ +(1 0.0 [User] webui_new_window() +)(1 0.0 [User] webui_get_new_window_id() +)(1 0.0 [User] webui_new_window_id([1]) +)(0 0.0 [Core] _webui_malloc([2621904]) +)(0 0.001 [Core] _webui_ptr_add(0x00000000298C8070) +)(0 0.001 [Core] _webui_ptr_exist() +)(0 0.001 [Core] _webui_ptr_add(0x00000000298C8070) -> Pointer #2 saved (2621904 + 1 bytes) +)(0 0.001 [Core] _webui_malloc([260]) +)(0 0.001 [Core] _webui_ptr_add(0x0000000000779330) +)(0 0.001 [Core] _webui_ptr_exist() +)(0 0.001 [Core] _webui_ptr_add(0x0000000000779330) -> Pointer #3 saved (260 + 1 bytes) +)(0 0.001 [Core] _webui_malloc([260]) +)(0 0.001 [Core] _webui_ptr_add(0x0000000000779720) +)(0 0.001 [Core] _webui_ptr_exist() +)(0 0.001 [Core] _webui_ptr_add(0x0000000000779720) -> Pointer #4 saved (260 + 1 bytes) +)(1 0.001 [User] webui_set_center(1) +)(1 0.001 [User] webui_set_center() -> Screen dimensions: width=1920, height=1200 +)(1 0.001 [User] webui_set_center() -> Window dimensions: width=800, height=600 +)(1 0.001 [User] webui_set_center() -> Calculated center positions: x=560, y=300 +)(1 0.001 [User] webui_set_position(1, 560, 300) +)(1 0.001 [User] webui_bind([1]) +)(0 0.001 [Core] _webui_get_cb_index([1]) +)(0 0.001 [Core] _webui_get_cb_index() -> Element: [__webui_core_api__] +)(0 0.001 [Core] _webui_get_cb_index() -> Not found +)(0 0.001 [Core] _webui_free_mem(0x0000000000000000) +)(0 0.001 [Core] _webui_malloc([18]) +)(0 0.001 [Core] _webui_ptr_add(0x000000000902E9D0) +)(0 0.001 [Core] _webui_ptr_exist() +)(0 0.001 [Core] _webui_ptr_add(0x000000000902E9D0) -> Pointer #5 saved (18 + 1 bytes) +)(1 0.001 [User] webui_bind() -> Save bind index 0, address 0x00007FFB61E47EB0 +)(0 0.001 [Core] _webui_send_all() +)(1 0.001 [User] webui_new_window_id() -> New window #1 @ 0x00000000298C8070 +)(1 0.001 [User] webui_bind([1]) +)(0 0.001 [Core] _webui_get_cb_index([1]) +)(0 0.001 [Core] _webui_get_cb_index() -> Element: [web_ui_wire_handle_event] +)(0 0.001 [Core] _webui_get_cb_index() -> Not found +)(0 0.001 [Core] _webui_free_mem(0x0000000000000000) +)(0 0.001 [Core] _webui_malloc([24]) +)(0 0.001 [Core] _webui_ptr_add(0x0000000009083A60) +)(0 0.001 [Core] _webui_ptr_exist() +)(0 0.001 [Core] _webui_ptr_add(0x0000000009083A60) -> Pointer #6 saved (24 + 1 bytes) +)(1 0.001 [User] webui_bind() -> Save bind index 1, address 0x00000000336201F0 +)(0 0.001 [Core] _webui_send_all() +)(1 0.001 [User] webui_set_root_folder([1], [c:/devel/racket/racket-webui]) +)(0 0.001 [Core] _webui_folder_exist([c:/devel/racket/racket-webui]) +)(1 0.001 [User] webui_set_root_folder() -> Success +)(1 0.001 [User] webui_show_browser([1], [1]) +)(0 0.001 [Core] _webui_show([1]) +)(0 0.001 [Core] _webui_malloc([9]) +)(0 0.001 [Core] _webui_ptr_add(0x000000000902E4D0) +)(0 0.001 [Core] _webui_ptr_exist() +)(0 0.001 [Core] _webui_ptr_add(0x000000000902E4D0) -> Pointer #7 saved (9 + 1 bytes) +)(0 0.001 [Core] _webui_is_valid_url([test.htm...]) +)(0 0.001 [Core] _webui_folder_exist([test.html]) +)(0 0.001 [Core] _webui_show() -> File: [test.html] +)(0 0.001 [Core] _webui_show_window(FILE, [1]) +)(0 0.001 [Core] _webui_show_window() -> This is UI reload, reusing the same server thread. +)(0 0.001 [Core] _webui_get_free_port() +)(0 0.001 [Core] _webui_port_is_used([41399]) +)(0 0.001 [Core] _webui_socket_test_listen_win32([41399]) +)(0 0.002 [Core] _webui_malloc([32]) +)(0 0.002 [Core] _webui_ptr_add(0x00000000090841E0) +)(0 0.002 [Core] _webui_ptr_exist() +)(0 0.002 [Core] _webui_ptr_add(0x00000000090841E0) -> Pointer #8 saved (32 + 1 bytes) +)(0 0.002 [Core] _webui_url_encode() +)(0 0.002 [Core] _webui_malloc([37]) +)(0 0.002 [Core] _webui_ptr_add(0x0000000008FF7D10) +)(0 0.002 [Core] _webui_ptr_exist() +)(0 0.002 [Core] _webui_ptr_add(0x0000000008FF7D10) -> Pointer #9 saved (37 + 1 bytes) +)(0 0.002 [Core] _webui_malloc([73]) +)(0 0.002 [Core] _webui_ptr_add(0x0000000008FEFD90) +)(0 0.002 [Core] _webui_ptr_exist() +)(0 0.002 [Core] _webui_ptr_add(0x0000000008FEFD90) -> Pointer #10 saved (73 + 1 bytes) +)(0 0.002 [Core] _webui_browser_start([http://localhost:41399/test.html], [1]) +)(0 0.002 [Core] _webui_find_the_best_browser() +)(0 0.002 [Core] _webui_is_process_running([chrome.exe]) +)(0 0.007 [Core] _webui_is_process_running([msedge.exe]) +)(0 0.011 [Core] _webui_is_process_running([epic.exe]) +)(0 0.016 [Core] _webui_is_process_running([vivaldi.exe]) +)(0 0.02 [Core] _webui_is_process_running([brave.exe]) +)(0 0.025 [Core] _webui_is_process_running([firefox.exe]) +)(0 0.029 [Core] _webui_browser_exist([3]) +)(0 0.029 [Core] _webui_custom_browser_exist([3]) +)(0 0.029 [Core] _webui_get_windows_reg_value([Software\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe]) +)(0 0.029 [Core] _webui_file_exist([C:\Program Files\Mozilla Firefox\firefox.exe]) +)(0 0.029 [Core] _webui_file_exist() -> Parsed to [C:\Program Files\Mozilla Firefox\firefox.exe] +)(0 0.029 [Core] _webui_malloc([90]) +)(0 0.029 [Core] _webui_ptr_add(0x0000000008FE1E70) +)(0 0.029 [Core] _webui_ptr_exist() +)(0 0.029 [Core] _webui_ptr_add(0x0000000008FE1E70) -> Pointer #11 saved (90 + 1 bytes) +)(0 0.029 [Core] _webui_free_mem(0x0000000008FE1E70) +)(0 0.029 [Core] _webui_free_mem(0x0000000008FE1E70) -> Pointer #11 freed (90 + 1 bytes) +)(0 0.029 [Core] _webui_browser_start_firefox([http://localhost:41399/test.html]) +)(0 0.029 [Core] _webui_browser_exist([3]) +)(0 0.029 [Core] _webui_browser_create_new_profile(3) +)(0 0.029 [Core] _webui_malloc([260]) +)(0 0.029 [Core] _webui_ptr_add(0x00000000090807E0) +)(0 0.029 [Core] _webui_ptr_exist() +)(0 0.029 [Core] _webui_ptr_add(0x00000000090807E0) -> Pointer #11 saved (260 + 1 bytes) +)(0 0.029 [Core] _webui_malloc([260]) +)(0 0.029 [Core] _webui_ptr_add(0x0000000009080FC0) +)(0 0.029 [Core] _webui_ptr_exist() +)(0 0.029 [Core] _webui_ptr_add(0x0000000009080FC0) -> Pointer #12 saved (260 + 1 bytes) +)(0 0.029 [Core] _webui_browser_create_new_profile(3) -> Generating WebUI profile +)(0 0.029 [Core] _webui_get_temp_path() +)(0 0.029 [Core] _webui_folder_exist([C:\Users\hans\.WebUI\WebUIFirefoxProfile-NoHC]) +)(0 0.029 [Core] _webui_is_firefox_ini_profile_exist([%APPDATA%\Mozilla\Firefox\profiles.ini], [WebUI]) +)(0 0.029 [Core] _webui_is_firefox_ini_profile_exist() -> Opening [C:\Users\hans\AppData\Roaming\Mozilla\Firefox\profiles.ini] +)(0 0.029 [Core] _webui_is_firefox_ini_profile_exist() -> Target found +)(0 0.03 [Core] _webui_get_browser_args([3]) +)(0 0.03 [Core] _webui_run_browser() +)(0 0.03 [Core] _webui_cmd_async() +)(0 0.03 [Core] _webui_cmd_async() -> Running [cmd /c "START "" "C:\Program Files\Mozilla Firefox\firefox.exe" -P WebUI -purgecaches -new-window http://localhost:41399/test.html" > nul 2>&1] +)(0 0.03 [Core] _webui_system_win32() +)(0 0.03 [Core] _webui_malloc([286]) +)(0 0.03 [Core] _webui_ptr_add(0x000000001A512C00) +)(0 0.03 [Core] _webui_ptr_exist() +)(0 0.03 [Core] _webui_ptr_add(0x000000001A512C00) -> Pointer #13 saved (286 + 1 bytes) +)(0 0.082 [Core] _webui_free_mem(0x000000001A512C00) +)(0 0.082 [Core] _webui_free_mem(0x000000001A512C00) -> Pointer #13 freed (286 + 1 bytes) +)(0 0.082 [Core] _webui_show_window() -> App-mode browser succeeded +)(0 0.082 [Core] _webui_free_mem(0x0000000008FEFD90) +)(0 0.082 [Core] _webui_free_mem(0x0000000008FEFD90) -> Pointer #10 freed (73 + 1 bytes) +)(0 0.082 [Core] _webui_show_window() -> Waiting for window connection & token validation +)(0 0.082 [Core] _webui_timer_start() +)(0 0.082 [Core] _webui_timer_start() end +)(0 15.091 [Core] _webui_server_thread() +)(0 15.111 [Core] _webui_server_thread([1]) -> URL: [http://localhost:41399] +)(0 15.111 [Core] _webui_malloc([64]) +)(0 15.113 [Core] _webui_ptr_add(0x0000000009041C60) +)(0 15.114 [Core] _webui_ptr_exist() +)(0 15.12 [Core] _webui_ptr_add(0x0000000009041C60) -> Pointer #10 saved (64 + 1 bytes) +)(0 15.128 [Core] _webui_server_thread([1]) -> Listening Success +)(0 15.17 [Core] _webui_server_thread([1]) -> HTTP/WS Port: 127.0.0.1:41399 +)(0 15.171 [Core] _webui_server_thread([1]) -> Root path: c:/devel/racket/racket-webui +)(0 15.172 [Core] _webui_server_thread([1]) -> Timeout is 15 seconds +)(0 15.172 [Core] _webui_server_thread([1]) -> Waiting for connection +)(0 15.175 [Core] _webui_timer_start() +)(0 15.176 [Core] _webui_timer_start() end +)(0 17.021 [Core] _webui_http_handler() +)(0 17.022 [Core] _webui_http_handler() -> GET [/test.html] +)(0 17.022 [Core] _webui_get_cookies() +)(0 17.022 [Core] _webui_http_handler() -> Client cookies [] +)(0 17.022 [Core] _webui_client_cookies_get_id() +)(0 17.022 [Core] _webui_http_handler() -> Client ID not found +)(0 17.022 [Core] _webui_get_full_path([/test.html]) +)(0 17.023 [Core] _webui_malloc([38]) +)(0 17.023 [Core] _webui_ptr_add(0x000000001A550E70) +)(0 17.023 [Core] _webui_ptr_exist() +)(0 17.023 [Core] _webui_ptr_add(0x000000001A550E70) -> Pointer #13 saved (38 + 1 bytes) +)(0 17.023 [Core] _webui_get_full_path() -> Full path: [c:\devel\racket\racket-webui\test.html] +)(0 17.023 [Core] _webui_file_exist([c:\devel\racket\racket-webui\test.html]) +)(0 17.024 [Core] _webui_file_exist() -> Parsed to [c:\devel\racket\racket-webui\test.html] +)(0 17.024 [Core] _webui_malloc([78]) +)(0 17.024 [Core] _webui_ptr_add(0x0000000008FEFF40) +)(0 17.025 [Core] _webui_ptr_exist() +)(0 17.025 [Core] _webui_ptr_add(0x0000000008FEFF40) -> Pointer #14 saved (78 + 1 bytes) +)(0 17.025 [Core] _webui_free_mem(0x0000000008FEFF40) +)(0 17.025 [Core] _webui_free_mem(0x0000000008FEFF40) -> Pointer #14 freed (78 + 1 bytes) +)(0 17.026 [Core] _webui_http_handler() -> Local file +)(0 17.026 [Core] _webui_serve_file() +)(0 17.033 [Core] _webui_serve_file() -> Looking for file locally +)(0 17.033 [Core] _webui_get_file_name_from_url([/test.html]) +)(0 17.033 [Core] _webui_malloc([9]) +)(0 17.033 [Core] _webui_ptr_add(0x000000000902E020) +)(0 17.033 [Core] _webui_ptr_exist() +)(0 17.034 [Core] _webui_ptr_add(0x000000000902E020) -> Pointer #14 saved (9 + 1 bytes) +)(0 17.034 [Core] _webui_get_file_name_from_url() -> File name: [test.html] +)(0 17.034 [Core] _webui_get_full_path([test.html]) +)(0 17.034 [Core] _webui_malloc([38]) +)(0 17.034 [Core] _webui_ptr_add(0x000000001A550BD0) +)(0 17.034 [Core] _webui_ptr_exist() +)(0 17.034 [Core] _webui_ptr_add(0x000000001A550BD0) -> Pointer #15 saved (38 + 1 bytes) +)(0 17.034 [Core] _webui_get_full_path() -> Full path: [c:\devel\racket\racket-webui\test.html] +)(0 17.034 [Core] _webui_file_exist([c:\devel\racket\racket-webui\test.html]) +)(0 17.035 [Core] _webui_file_exist() -> Parsed to [c:\devel\racket\racket-webui\test.html] +)(0 17.035 [Core] _webui_malloc([78]) +)(0 17.035 [Core] _webui_ptr_add(0x0000000008FEE170) +)(0 17.036 [Core] _webui_ptr_exist() +)(0 17.036 [Core] _webui_ptr_add(0x0000000008FEE170) -> Pointer #16 saved (78 + 1 bytes) +)(0 17.037 [Core] _webui_free_mem(0x0000000008FEE170) +)(0 17.037 [Core] _webui_free_mem(0x0000000008FEE170) -> Pointer #16 freed (78 + 1 bytes) +)(0 17.037 [Core] _webui_http_send_file([1]) +)(0 17.04 [Core] _webui_http_send_header([1]) +)(0 17.04 [Core] _webui_http_send_header() -> mime_type: [text/html] +)(0 17.04 [Core] _webui_http_send_header() -> body_len: [386] +)(0 17.04 [Core] _webui_http_send_header() -> cache: [0] +)(0 17.04 [Core] _webui_get_cookies() +)(0 17.041 [Core] _webui_generate_cookies() +)(0 17.041 [Core] _webui_client_cookies_save() +)(0 17.041 [Core] _webui_malloc([33]) +)(0 17.041 [Core] _webui_ptr_add(0x000000001A54FF60) +)(0 17.041 [Core] _webui_ptr_exist() +)(0 17.042 [Core] _webui_ptr_add(0x000000001A54FF60) -> Pointer #16 saved (33 + 1 bytes) +)(0 17.042 [Core] _webui_http_send() -> New auth cookies [1_UtHv3I8YX794RzGRjbSPGm3wTHGuejY] +)(0 17.043 ---[ HTTP Header ]----------------- +)(0 17.043 [Core] _webui_malloc([282]) +)(0 17.043 [Core] _webui_ptr_add(0x000000001A5131B0) +)(0 17.043 [Core] _webui_ptr_exist() +)(0 17.043 [Core] _webui_ptr_add(0x000000001A5131B0) -> Pointer #17 saved (282 + 1 bytes) +)(0 17.043 HTTP/1.1 200 OK +Set-Cookie: webui_auth=1_UtHv3I8YX794RzGRjbSPGm3wTHGuejY; Path=/; HttpOnly; SameSite=Strict +Access-Control-Allow-Origin: * +Cache-Control: no-cache, no-store, must-revalidate, private, max-age=0 +Content-Type: text/html +Content-Length: 386 +Connection: close + +)(0 17.043 [Core] _webui_free_mem(0x000000001A5131B0) +)(0 17.044 [Core] _webui_free_mem(0x000000001A5131B0) -> Pointer #17 freed (282 + 1 bytes) +)(0 17.044 +----------------------------------- +)(0 17.044 [Core] _webui_free_mem(0x000000001A550BD0) +)(0 17.045 [Core] _webui_free_mem(0x000000001A550BD0) -> Pointer #15 freed (38 + 1 bytes) +)(0 17.045 [Core] _webui_free_mem(0x000000000902E020) +)(0 17.045 [Core] _webui_free_mem(0x000000000902E020) -> Pointer #14 freed (9 + 1 bytes) +)(0 17.045 [Core] _webui_free_mem(0x000000001A550E70) +)(0 17.045 [Core] _webui_free_mem(0x000000001A550E70) -> Pointer #13 freed (38 + 1 bytes) +)(0 17.046 [Core] _webui_http_handler() -> HTTP Status Code: 200 +)(0 17.054 [Core] _webui_http_handler() +)(0 17.055 [Core] _webui_http_handler() -> GET [/webui.js] +)(0 17.055 [Core] _webui_get_cookies() +)(0 17.055 [Core] _webui_http_handler() -> Client cookies [1_UtHv3I8YX794RzGRjbSPGm3wTHGuejY] +)(0 17.055 [Core] _webui_client_cookies_get_id() +)(0 17.055 [Core] _webui_http_handler() -> Client ID found [0] +)(0 17.055 [Core] _webui_http_handler() -> WebUI-Bridge +)(0 17.055 [Core] _webui_http_handler() +)(0 17.055 [Core] _webui_generate_js_bridge() +)(0 17.055 [Core] _webui_malloc([18996]) +)(0 17.055 [Core] _webui_ptr_add(0x000000001A561ED0) +)(0 17.056 [Core] _webui_ptr_exist() +)(0 17.056 [Core] _webui_ptr_add(0x000000001A561ED0) -> Pointer #13 saved (18996 + 1 bytes) +)(0 17.056 [Core] _webui_http_send([1]) +)(0 17.056 [Core] _webui_http_send_header([1]) +)(0 17.056 [Core] _webui_http_send_header() -> mime_type: [application/javascript] +)(0 17.056 [Core] _webui_http_send_header() -> body_len: [18947] +)(0 17.057 [Core] _webui_http_send_header() -> cache: [0] +)(0 17.057 [Core] _webui_get_cookies() +)(0 17.057 [Core] _webui_client_cookies_get_id() +)(0 17.057 ---[ HTTP Header ]----------------- +)(0 17.058 HTTP/1.1 200 OK +Access-Control-Allow-Origin: * +Cache-Control: no-cache, no-store, must-revalidate, private, max-age=0 +Content-Type: application/javascript +Content-Length: 18947 +Connection: close + +)(0 17.058 +----------------------------------- +)(0 17.058 [Core] _webui_free_mem(0x000000001A561ED0) +)(0 17.058 [Core] _webui_free_mem(0x000000001A561ED0) -> Pointer #13 freed (18996 + 1 bytes) +)(0 17.059 [Core] _webui_http_handler() -> HTTP Status Code: 200 +)(0 17.059 [Core] _webui_http_handler() -> GET [/boilerplate.js] +)(0 17.059 [Core] _webui_get_cookies() +)(0 17.06 [Core] _webui_http_handler() -> Client cookies [1_UtHv3I8YX794RzGRjbSPGm3wTHGuejY] +)(0 17.06 [Core] _webui_client_cookies_get_id() +)(0 17.06 [Core] _webui_http_handler() -> Client ID found [0] +)(0 17.06 [Core] _webui_get_full_path([/boilerplate.js]) +)(0 17.06 [Core] _webui_malloc([43]) +)(0 17.061 [Core] _webui_ptr_add(0x000000001A550BD0) +)(0 17.061 [Core] _webui_ptr_exist() +)(0 17.061 [Core] _webui_ptr_add(0x000000001A550BD0) -> Pointer #13 saved (43 + 1 bytes) +)(0 17.061 [Core] _webui_get_full_path() -> Full path: [c:\devel\racket\racket-webui\boilerplate.js] +)(0 17.061 [Core] _webui_file_exist([c:\devel\racket\racket-webui\boilerplate.js]) +)(0 17.061 [Core] _webui_file_exist() -> Parsed to [c:\devel\racket\racket-webui\boilerplate.js] +)(0 17.061 [Core] _webui_malloc([88]) +)(0 17.061 [Core] _webui_ptr_add(0x0000000008FE2370) +)(0 17.061 [Core] _webui_ptr_exist() +)(0 17.061 [Core] _webui_ptr_add(0x0000000008FE2370) -> Pointer #14 saved (88 + 1 bytes) +)(0 17.061 [Core] _webui_free_mem(0x0000000008FE2370) +)(0 17.061 [Core] _webui_free_mem(0x0000000008FE2370) -> Pointer #14 freed (88 + 1 bytes) +)(0 17.061 [Core] _webui_http_handler() -> Local file +)(0 17.061 [Core] _webui_serve_file() +)(0 17.061 [Core] _webui_serve_file() -> Looking for file locally +)(0 17.062 [Core] _webui_get_file_name_from_url([/boilerplate.js]) +)(0 17.062 [Core] _webui_malloc([14]) +)(0 17.062 [Core] _webui_ptr_add(0x000000000902DD00) +)(0 17.062 [Core] _webui_ptr_exist() +)(0 17.062 [Core] _webui_ptr_add(0x000000000902DD00) -> Pointer #14 saved (14 + 1 bytes) +)(0 17.062 [Core] _webui_get_file_name_from_url() -> File name: [boilerplate.js] +)(0 17.062 [Core] _webui_get_full_path([boilerplate.js]) +)(0 17.062 [Core] _webui_malloc([43]) +)(0 17.062 [Core] _webui_ptr_add(0x000000001A551110) +)(0 17.062 [Core] _webui_ptr_exist() +)(0 17.062 [Core] _webui_ptr_add(0x000000001A551110) -> Pointer #15 saved (43 + 1 bytes) +)(0 17.062 [Core] _webui_get_full_path() -> Full path: [c:\devel\racket\racket-webui\boilerplate.js] +)(0 17.062 [Core] _webui_file_exist([c:\devel\racket\racket-webui\boilerplate.js]) +)(0 17.062 [Core] _webui_file_exist() -> Parsed to [c:\devel\racket\racket-webui\boilerplate.js] +)(0 17.062 [Core] _webui_malloc([88]) +)(0 17.062 [Core] _webui_ptr_add(0x0000000008FE1830) +)(0 17.062 [Core] _webui_ptr_exist() +)(0 17.062 [Core] _webui_ptr_add(0x0000000008FE1830) -> Pointer #17 saved (88 + 1 bytes) +)(0 17.062 [Core] _webui_free_mem(0x0000000008FE1830) +)(0 17.062 [Core] _webui_free_mem(0x0000000008FE1830) -> Pointer #17 freed (88 + 1 bytes) +)(0 17.062 [Core] _webui_http_send_file([1]) +)(0 17.063 [Core] _webui_http_send_header([1]) +)(0 17.063 [Core] _webui_http_send_header() -> mime_type: [application/javascript] +)(0 17.063 [Core] _webui_http_send_header() -> body_len: [4624] +)(0 17.063 [Core] _webui_http_send_header() -> cache: [0] +)(0 17.063 [Core] _webui_get_cookies() +)(0 17.063 [Core] _webui_client_cookies_get_id() +)(0 17.063 ---[ HTTP Header ]----------------- +)(0 17.064 HTTP/1.1 200 OK +Access-Control-Allow-Origin: * +Cache-Control: no-cache, no-store, must-revalidate, private, max-age=0 +Content-Type: application/javascript +Content-Length: 4624 +Connection: close + +)(0 17.064 +----------------------------------- +)(0 17.064 [Core] _webui_free_mem(0x000000001A551110) +)(0 17.064 [Core] _webui_free_mem(0x000000001A551110) -> Pointer #15 freed (43 + 1 bytes) +)(0 17.064 [Core] _webui_free_mem(0x000000000902DD00) +)(0 17.064 [Core] _webui_free_mem(0x000000000902DD00) -> Pointer #14 freed (14 + 1 bytes) +)(0 17.065 [Core] _webui_free_mem(0x000000001A550BD0) +)(0 17.065 [Core] _webui_free_mem(0x000000001A550BD0) -> Pointer #13 freed (43 + 1 bytes) +)(0 17.065 [Core] _webui_http_handler() -> HTTP Status Code: 200 +)(0 17.068 [Core] _webui_http_handler() +)(0 17.069 [Core] _webui_http_handler() -> GET [/favicon.ico] +)(0 17.069 [Core] _webui_get_cookies() +)(0 17.069 [Core] _webui_http_handler() -> Client cookies [1_UtHv3I8YX794RzGRjbSPGm3wTHGuejY] +)(0 17.069 [Core] _webui_client_cookies_get_id() +)(0 17.069 [Core] _webui_http_handler() -> Client ID found [0] +)(0 17.069 [Core] _webui_file_exist_mg() +)(0 17.069 [Core] _webui_malloc([12]) +)(0 17.069 [Core] _webui_ws_connect_handler() +)(0 17.069 [Core] _webui_ptr_add(0x000000000902DC10) +)(0 17.069 [Core] _webui_get_cookies() +)(0 17.069 [Core] _webui_ptr_exist() +)(0 17.069 [Core] _webui_ws_connect_handler() -> Client cookies [1_UtHv3I8YX794RzGRjbSPGm3wTHGuejY] +)(0 17.069 [Core] _webui_client_cookies_get_id() +)(0 17.069 [Core] _webui_ptr_add(0x000000000902DC10) -> Pointer #13 saved (12 + 1 bytes) +)(0 17.069 [Core] _webui_malloc([40]) +)(0 17.069 [Core] _webui_ws_connect_handler() -> Client ID found [0] +)(0 17.069 [Core] _webui_ptr_add(0x000000001A5517A0) +)(0 17.069 [Core] _webui_ws_connect_handler() -> Connection authentication OK +)(0 17.069 [Core] _webui_ptr_exist() +)(0 17.069 [Core] _webui_ptr_add(0x000000001A5517A0) -> Pointer #14 saved (40 + 1 bytes) +)(0 17.069 [Core] _webui_file_exist([c:/devel/racket/racket-webui\favicon.ico]) +)(0 17.069 [Core] _webui_file_exist() -> Parsed to [c:/devel/racket/racket-webui\favicon.ico] +)(0 17.069 [Core] _webui_malloc([82]) +)(0 17.069 [Core] _webui_ws_ready_handler() +)(0 17.069 [Core] _webui_get_ws_process_number() +)(0 17.069 [Core] _webui_ptr_add(0x0000000008FEEB90) +)(0 17.069 [Core] _webui_ptr_exist() +)(0 17.069 [Core] [WS #0] _webui_receive([1], [2], [0]) +)(0 17.069 [Core] _webui_ptr_add(0x0000000008FEEB90) -> Pointer #15 saved (82 + 1 bytes) +)(0 17.069 [Core] _webui_connection_save([1]) +)(0 17.069 [Core] _webui_free_mem(0x0000000008FEEB90) +)(0 17.069 [Core] _webui_free_mem(0x0000000008FEEB90) -> Pointer #15 freed (82 + 1 bytes) +)(0 17.07 [Core] _webui_free_mem(0x000000000902DC10) +)(0 17.07 [Core] _webui_connection_save() -> Registering client #0 +)(0 17.07 [Core] _webui_free_mem(0x000000000902DC10) -> Pointer #13 freed (12 + 1 bytes) +)(0 17.07 [Core] [WS #0] _webui_receive(1) -> Connection #0 registered +)(0 17.07 [Core] _webui_free_mem(0x000000001A5517A0) +)(0 17.07 [Core] _webui_malloc([56]) +)(0 17.07 [Core] _webui_ptr_add(0x0000000009042660) +)(0 17.07 [Core] _webui_ptr_exist() +)(0 17.07 [Core] _webui_ptr_add(0x0000000009042660) -> Pointer #13 saved (56 + 1 bytes) +)(0 17.07 [Core] _webui_free_mem(0x000000001A5517A0) -> Pointer #14 freed (40 + 1 bytes) +)(0 17.07 [Core] [Thread .] _webui_ws_process_thread() +)(0 17.07 [Core] _webui_http_handler() -> HTTP Status Code: 302 +)(0 17.07 [Core] [WS #0] _webui_ws_process() +)(0 17.07 [Core] [WS #0] _webui_ws_process() -> Start +)(0 17.07 [Core] [WS #0] _webui_ws_process() -> WEBUI_WS_OPEN +)(0 17.07 [Core] [WS #0] _webui_ws_process() -> Finished. +)(0 17.071 [Core] _webui_free_mem(0x0000000000000000) +)(0 17.071 [Core] _webui_free_mem(0x0000000009042660) +)(0 17.071 [Core] _webui_free_mem(0x0000000009042660) -> Pointer #13 freed (56 + 1 bytes) +)(0 17.072 [Core] _webui_server_thread([1]) -> Window Connected. +)(0 17.076 [Core] _webui_ws_data_handler() +)(0 17.076 [Core] _webui_get_ws_process_number() +)(0 17.076 [Core] [WS #1] _webui_receive([1], [1], [9]) +)(0 17.076 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 17.076 [Core] _webui_malloc([9]) +)(0 17.076 [Core] _webui_ptr_add(0x000000000902E0C0) +)(0 17.076 [Core] _webui_ptr_exist() +)(0 17.077 [Core] _webui_ptr_add(0x000000000902E0C0) -> Pointer #13 saved (9 + 1 bytes) +)(0 17.077 [Core] _webui_malloc([56]) +)(0 17.077 [Core] _webui_http_handler() +)(0 17.077 [Core] _webui_ptr_add(0x0000000009042AE0) +)(0 17.077 [Core] _webui_http_handler() -> GET [/favicon.svg] +)(0 17.077 [Core] _webui_get_cookies() +)(0 17.077 [Core] _webui_ptr_exist() +)(0 17.077 [Core] _webui_http_handler() -> Client cookies [1_UtHv3I8YX794RzGRjbSPGm3wTHGuejY] +)(0 17.077 [Core] _webui_client_cookies_get_id() +)(0 17.077 [Core] _webui_ptr_add(0x0000000009042AE0) -> Pointer #14 saved (56 + 1 bytes) +)(0 17.077 [Core] _webui_http_handler() -> Client ID found [0] +)(0 17.077 [Core] _webui_ws_data_handler() -> Finished +)(0 17.077 [Core] _webui_file_exist_mg() +)(0 17.077 [Core] [Thread .] _webui_ws_process_thread() +)(0 17.077 [Core] [WS #1] _webui_ws_process() +)(0 17.077 [Core] [WS #1] _webui_ws_process() -> Start +)(0 17.077 [Core] _webui_malloc([12]) +)(0 17.077 [Core] _webui_ptr_add(0x000000000902D530) +)(0 17.077 [Core] _webui_get_token() +)(0 17.077 [Core] _webui_ptr_exist() +)(0 17.077 [Core] _webui_get_token() -> 0xC05015C9 +)(0 17.077 [Core] _webui_get_id() +)(0 17.077 [Core] _webui_get_id() -> 0x0000 +)(0 17.077 [Core] [WS #1] _webui_ws_process() -> Data received +)(0 17.077 [Core] [WS #1] _webui_ws_process() -> Packet Size : 9 bytes +)(0 17.077 [Core] [WS #1] _webui_ws_process() -> Packet Header : [ )(0 17.077 0xDD )(0 17.077 0xC9 )(0 17.077 0x15 )(0 17.077 [Core] _webui_ptr_add(0x000000000902D530) -> Pointer #15 saved (12 + 1 bytes) +)(0 17.077 0x50 )(0 17.077 0xC0 )(0 17.077 0x00 )(0 17.077 [Core] _webui_malloc([40]) +)(0 17.078 [Core] _webui_ptr_add(0x000000001A550D90) +)(0 17.078 0x00 )(0 17.078 [Core] _webui_ptr_exist() +)(0 17.078 0xF5 )(0 17.078 ] +)(0 17.078 [Core] _webui_ptr_add(0x000000001A550D90) -> Pointer #17 saved (40 + 1 bytes) +)(0 17.078 [Core] [WS #1] _webui_ws_process() -> Packet Token: 0xC05015C9 (3226473929) +)(0 17.078 [Core] _webui_file_exist([c:/devel/racket/racket-webui\favicon.svg]) +)(0 17.078 [Core] [WS #1] _webui_ws_process() -> Packet ID: 0x0000 (0) +)(0 17.078 [Core] [WS #1] _webui_ws_process() -> Packet Data: [)(0 17.078 [Core] _webui_file_exist() -> Parsed to [c:/devel/racket/racket-webui\favicon.svg] +)(0 17.078 ] +)(0 17.078 [Core] [WS #1] _webui_ws_process() -> WEBUI_CMD_CHECK_TK +)(0 17.078 [Core] _webui_malloc([82]) +)(0 17.078 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 17.078 [Core] [WS #1] _webui_ws_process() -> Token accepted. Sending bind list +)(0 17.078 [Core] _webui_ptr_add(0x0000000008FEEC20) +)(0 17.079 [Core] _webui_ptr_exist() +)(0 17.079 [Core] _webui_malloc([45]) +)(0 17.079 [Core] _webui_ptr_add(0x0000000008FEEC20) -> Pointer #18 saved (82 + 1 bytes) +)(0 17.079 [Core] _webui_ptr_add(0x000000001A551260) +)(0 17.079 [Core] _webui_free_mem(0x0000000008FEEC20) +)(0 17.079 [Core] _webui_ptr_exist() +)(0 17.079 [Core] _webui_ptr_add(0x000000001A551260) -> Pointer #19 saved (45 + 1 bytes) +)(0 17.079 [Core] _webui_free_mem(0x0000000008FEEC20) -> Pointer #18 freed (82 + 1 bytes) +)(0 17.079 [Core] _webui_send_client() +)(0 17.079 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 17.079 [Core] _webui_free_mem(0x000000000902D530) +)(0 17.08 [Core] _webui_send_client() -> Connection ID = 0 +)(0 17.08 [Core] _webui_send_client() -> Packet ID = 0x0000 +)(0 17.08 [Core] _webui_free_mem(0x000000000902D530) -> Pointer #15 freed (12 + 1 bytes) +)(0 17.08 [Core] _webui_send_client() -> Packet CMD = 0xf5 +)(0 17.08 [Core] _webui_free_mem(0x000000001A550D90) +)(0 17.08 [Core] _webui_send_client() -> Packet Data = 45 bytes +)(0 17.08 [Core] _webui_free_mem(0x000000001A550D90) -> Pointer #17 freed (40 + 1 bytes) +)(0 17.08 [Core] _webui_malloc([54]) +)(0 17.08 [Core] _webui_http_send([1]) +)(0 17.08 [Core] _webui_ptr_add(0x0000000009042EE0) +)(0 17.08 [Core] _webui_http_send_header([1]) +)(0 17.08 [Core] _webui_ptr_exist() +)(0 17.08 [Core] _webui_ptr_add(0x0000000009042EE0) -> Pointer #15 saved (54 + 1 bytes) +)(0 17.08 [Core] _webui_send_client_ws() +)(0 17.08 [Core] _webui_send_client_ws() -> Client #0 +)(0 17.08 [Core] _webui_http_send_header() -> mime_type: [image/svg+xml] +)(0 17.08 [Core] _webui_send_client_ws() -> Packet size: 54 bytes +)(0 17.08 [Core] _webui_http_send_header() -> body_len: [561] +)(0 17.08 [Core] _webui_send_client_ws() -> Packet hex : [ )(0 17.08 0xDD )(0 17.08 [Core] _webui_http_send_header() -> cache: [0] +)(0 17.08 0xFF )(0 17.08 [Core] _webui_get_cookies() +)(0 17.08 0xFF )(0 17.08 [Core] _webui_client_cookies_get_id() +)(0 17.08 ---[ HTTP Header ]----------------- +)(0 17.08 0xFF )(0 17.081 HTTP/1.1 200 OK +Access-Control-Allow-Origin: * +Cache-Control: no-cache, no-store, must-revalidate, private, max-age=0 +Content-Type: image/svg+xml +Content-Length: 561 +Connection: close + +)(0 17.081 0xFF )(0 17.081 0x00 )(0 17.081 +----------------------------------- +)(0 17.081 0x00 )(0 17.081 0xF5 )(0 17.081 0x01 )(0 17.081 0x5F )(0 17.081 0x5F )(0 17.081 [Core] _webui_http_handler() -> HTTP Status Code: 200 +)(0 17.081 0x77 )(0 17.081 0x65 )(0 17.081 0x62 )(0 17.081 0x75 )(0 17.081 0x69 )(0 17.082 0x5F )(0 17.082 0x63 )(0 17.082 0x6F )(0 17.082 0x72 )(0 17.082 0x65 )(0 17.082 0x5F )(0 17.082 0x61 )(0 17.082 0x70 )(0 17.082 0x69 )(0 17.082 0x5F )(0 17.082 0x5F )(0 17.083 0x2C )(0 17.083 0x77 )(0 17.083 0x65 )(0 17.083 0x62 )(0 17.083 0x5F )(0 17.083 0x75 )(0 17.083 0x69 )(0 17.083 0x5F )(0 17.083 0x77 )(0 17.083 0x69 )(0 17.083 0x72 )(0 17.083 0x65 )(0 17.083 0x5F )(0 17.083 0x68 )(0 17.083 0x61 )(0 17.083 0x6E )(0 17.083 0x64 )(0 17.083 0x6C )(0 17.083 0x65 )(0 17.083 0x5F )(0 17.083 0x65 )(0 17.083 0x76 )(0 17.083 0x65 )(0 17.083 0x6E )(0 17.083 0x74 )(0 17.083 0x2C )(0 17.083 0x00 )(0 17.083 ] +)(0 17.084 [Core] _webui_send_client_ws() -> 54 bytes sent. +)(0 17.084 [Core] _webui_free_mem(0x0000000009042EE0) +)(0 17.084 [Core] _webui_free_mem(0x0000000009042EE0) -> Pointer #15 freed (54 + 1 bytes) +)(0 17.084 [Core] _webui_free_mem(0x000000001A551260) +)(0 17.084 [Core] _webui_free_mem(0x000000001A551260) -> Pointer #19 freed (45 + 1 bytes) +)(0 17.084 [Core] [WS #1] _webui_ws_process() -> Finished. +)(0 17.084 [Core] _webui_free_mem(0x000000000902E0C0) +)(0 17.084 [Core] _webui_free_mem(0x000000000902E0C0) -> Pointer #13 freed (9 + 1 bytes) +)(0 17.084 [Core] _webui_free_mem(0x0000000009042AE0) +)(0 17.084 [Core] _webui_free_mem(0x0000000009042AE0) -> Pointer #14 freed (56 + 1 bytes) +)(0 17.086 [Core] _webui_ws_data_handler() +)(0 17.086 [Core] _webui_get_ws_process_number() +)(0 17.086 [Core] [WS #2] _webui_receive([1], [1], [78]) +)(0 17.086 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 17.086 [Core] _webui_malloc([78]) +)(0 17.086 [Core] _webui_ptr_add(0x0000000008FEE0E0) +)(0 17.086 [Core] _webui_ptr_exist() +)(0 17.087 [Core] _webui_ptr_add(0x0000000008FEE0E0) -> Pointer #13 saved (78 + 1 bytes) +)(0 17.087 [Core] _webui_malloc([56]) +)(0 17.087 [Core] _webui_ptr_add(0x0000000009043760) +)(0 17.087 [Core] _webui_ptr_exist() +)(0 17.087 [Core] _webui_ptr_add(0x0000000009043760) -> Pointer #14 saved (56 + 1 bytes) +)(0 17.087 [Core] _webui_ws_data_handler() -> Finished +)(0 17.087 [Core] [Thread .] _webui_ws_process_thread() +)(0 17.087 [Core] [WS #2] _webui_ws_process() +)(0 17.088 [Core] [WS #2] _webui_ws_process() -> Start +)(0 17.088 [Core] _webui_get_token() +)(0 17.088 [Core] _webui_get_token() -> 0xC05015C9 +)(0 17.088 [Core] _webui_get_id() +)(0 17.088 [Core] _webui_get_id() -> 0xFFFF +)(0 17.088 [Core] [WS #2] _webui_ws_process() -> Data received +)(0 17.088 [Core] [WS #2] _webui_ws_process() -> Packet Size : 78 bytes +)(0 17.088 [Core] [WS #2] _webui_ws_process() -> Packet Header : [ )(0 17.088 0xDD )(0 17.088 0xC9 )(0 17.088 0x15 )(0 17.088 0x50 )(0 17.088 0xC0 )(0 17.089 0xFF )(0 17.089 0xFF )(0 17.089 0xF9 )(0 17.089 ] +)(0 17.089 [Core] [WS #2] _webui_ws_process() -> Packet Token: 0xC05015C9 (3226473929) +)(0 17.089 [Core] [WS #2] _webui_ws_process() -> Packet ID: 0xFFFF (65535) +)(0 17.089 [Core] [WS #2] _webui_ws_process() -> Packet Data: [)(0 17.089 ] +)(0 17.09 [Core] [WS #2] _webui_ws_process() -> WEBUI_CMD_CALL_FUNC +)(0 17.09 [Core] [WS #2] _webui_ws_process() -> Call ID: [65535] +)(0 17.09 [Core] [WS #2] _webui_ws_process() -> Element: [web_ui_wire_handle_event] +)(0 17.09 [Core] _webui_malloc([312]) +)(0 17.09 [Core] _webui_ptr_add(0x000000001A5131B0) +)(0 17.09 [Core] _webui_ptr_exist() +)(0 17.09 [Core] _webui_ptr_add(0x000000001A5131B0) -> Pointer #15 saved (312 + 1 bytes) +)(0 17.09 [Core] [WS #2] _webui_ws_process() -> Argument 0: 41 bytes +)(0 17.09 [Core] [WS #2] _webui_ws_process() -> Expected and received 42 bytes of data. +)(0 17.09 [Core] _webui_client_get_id() +)(0 17.09 [Core] _webui_get_cookies() +)(0 17.09 [Core] _webui_client_cookies_get_id() +)(0 17.09 [Core] _webui_get_cookies_full() +)(0 17.09 [Core] _webui_get_cb_index([1]) +)(0 17.09 [Core] _webui_get_cb_index() -> Element: [web_ui_wire_handle_event] +)(0 17.09 [Core] _webui_get_cb_index() -> Found at 1 +)(0 17.09 [Core] [WS #2] _webui_ws_process() -> Calling user callback at address 0x00000000336201F0 +[Call] +)(1 17.09 [User] webui_get_count() +)(1 17.09 [User] webui_get_string_at([0]) +)(0 17.09 [Core] [WS #2] _webui_ws_process() -> Waiting for asynchronous response... +)(1 17.09 [User] webui_run([1]) +)(1 17.09 [User] webui_run([1]) -> Script: [window._web_wire_bind_evt_ids(1, 'button', 'click');] +)(0 17.09 [Core] _webui_send_all() +)(0 17.09 [Core] _webui_send_client() +)(0 17.09 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 17.09 [Core] _webui_send_client() -> Connection ID = 0 +)(0 17.09 [Core] _webui_send_client() -> Packet ID = 0x0000 +)(0 17.091 [Core] _webui_send_client() -> Packet CMD = 0xfd +)(0 17.091 [Core] _webui_send_client() -> Packet Data = 52 bytes +)(0 17.091 [Core] _webui_malloc([61]) +)(0 17.091 [Core] _webui_ptr_add(0x0000000009042AE0) +)(0 17.091 [Core] _webui_ptr_exist() +)(0 17.091 [Core] _webui_ptr_add(0x0000000009042AE0) -> Pointer #17 saved (61 + 1 bytes) +)(0 17.091 [Core] _webui_send_client_ws() +)(0 17.091 [Core] _webui_send_client_ws() -> Client #0 +)(0 17.091 [Core] _webui_send_client_ws() -> Packet size: 61 bytes +)(0 17.091 [Core] _webui_send_client_ws() -> Packet hex : [ )(0 17.091 0xDD )(0 17.091 0xFF )(0 17.091 0xFF )(0 17.091 0xFF )(0 17.091 0xFF )(0 17.091 0x00 )(0 17.091 0x00 )(0 17.091 0xFD )(0 17.091 0x77 )(0 17.091 0x69 )(0 17.091 0x6E )(0 17.091 0x64 )(0 17.091 0x6F )(0 17.091 0x77 )(0 17.091 0x2E )(0 17.091 0x5F )(0 17.091 0x77 )(0 17.091 0x65 )(0 17.091 0x62 )(0 17.091 0x5F )(0 17.091 0x77 )(0 17.091 0x69 )(0 17.091 0x72 )(0 17.091 0x65 )(0 17.091 0x5F )(0 17.091 0x62 )(0 17.091 0x69 )(0 17.091 0x6E )(0 17.091 0x64 )(0 17.091 0x5F )(0 17.091 0x65 )(0 17.091 0x76 )(0 17.091 0x74 )(0 17.091 0x5F )(0 17.091 0x69 )(0 17.091 0x64 )(0 17.091 0x73 )(0 17.091 0x28 )(0 17.091 0x31 )(0 17.091 0x2C )(0 17.091 0x20 )(0 17.091 0x27 )(0 17.091 0x62 )(0 17.091 0x75 )(0 17.091 0x74 )(0 17.091 0x74 )(0 17.091 0x6F )(0 17.091 0x6E )(0 17.091 0x27 )(0 17.091 0x2C )(0 17.091 0x20 )(0 17.091 0x27 )(0 17.091 0x63 )(0 17.091 0x6C )(0 17.091 0x69 )(0 17.091 0x63 )(0 17.091 0x6B )(0 17.091 0x27 )(0 17.091 0x29 )(0 17.091 0x3B )(0 17.091 0x00 )(0 17.091 ] +)(0 17.091 [Core] _webui_send_client_ws() -> 61 bytes sent. +)(0 17.091 [Core] _webui_free_mem(0x0000000009042AE0) +)(0 17.091 [Core] _webui_free_mem(0x0000000009042AE0) -> Pointer #17 freed (61 + 1 bytes) +)(0 18.565 [Core] _webui_ws_data_handler() +)(0 18.565 [Core] _webui_get_ws_process_number() +)(0 18.566 [Core] [WS #3] _webui_receive([1], [1], [280]) +)(0 18.566 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 18.566 [Core] _webui_malloc([280]) +)(0 18.566 [Core] _webui_ptr_add(0x000000001A4ED9D0) +)(0 18.566 [Core] _webui_ptr_exist() +)(0 18.567 [Core] _webui_ptr_add(0x000000001A4ED9D0) -> Pointer #17 saved (280 + 1 bytes) +)(0 18.567 [Core] _webui_malloc([56]) +)(0 18.567 [Core] _webui_ptr_add(0x00000000090435E0) +)(0 18.567 [Core] _webui_ptr_exist() +)(0 18.568 [Core] _webui_ptr_add(0x00000000090435E0) -> Pointer #18 saved (56 + 1 bytes) +)(0 18.568 [Core] _webui_ws_data_handler() -> Finished +)(0 18.568 [Core] [Thread .] _webui_ws_process_thread() +)(0 18.568 [Core] [WS #3] _webui_ws_process() +)(0 18.569 [Core] [WS #3] _webui_ws_process() -> Start +)(0 18.569 [Core] _webui_get_token() +)(0 18.569 [Core] _webui_get_token() -> 0xC05015C9 +)(0 18.569 [Core] _webui_get_id() +)(0 18.569 [Core] _webui_get_id() -> 0xFFFE +)(0 18.57 [Core] [WS #3] _webui_ws_process() -> Data received +)(0 18.57 [Core] [WS #3] _webui_ws_process() -> Packet Size : 280 bytes +)(0 18.57 [Core] [WS #3] _webui_ws_process() -> Packet Header : [ )(0 18.57 0xDD )(0 18.57 0xC9 )(0 18.57 0x15 )(0 18.57 0x50 )(0 18.57 0xC0 )(0 18.571 0xFE )(0 18.571 0xFF )(0 18.571 0xF9 )(0 18.571 ] +)(0 18.571 [Core] [WS #3] _webui_ws_process() -> Packet Token: 0xC05015C9 (3226473929) +)(0 18.571 [Core] [WS #3] _webui_ws_process() -> Packet ID: 0xFFFE (65534) +)(0 18.571 [Core] [WS #3] _webui_ws_process() -> Packet Data: [)(0 18.572 ] +)(0 18.572 [Core] [WS #3] _webui_ws_process() -> WEBUI_CMD_CALL_FUNC +)(0 18.572 [Core] [WS #3] _webui_ws_process() -> Call ID: [65534] +)(0 18.572 [Core] [WS #3] _webui_ws_process() -> Element: [web_ui_wire_handle_event] +)(0 18.573 [Core] _webui_malloc([312]) +)(0 18.573 [Core] _webui_ptr_add(0x00000000007C8230) +)(0 18.573 [Core] _webui_ptr_exist() +)(0 18.573 [Core] _webui_ptr_add(0x00000000007C8230) -> Pointer #19 saved (312 + 1 bytes) +)(0 18.573 [Core] [WS #3] _webui_ws_process() -> Argument 0: 242 bytes +)(0 18.574 [Core] [WS #3] _webui_ws_process() -> Expected and received 243 bytes of data. +)(0 18.574 [Core] _webui_client_get_id() +)(0 18.574 [Core] _webui_get_cookies() +)(0 18.574 [Core] _webui_client_cookies_get_id() +)(0 18.574 [Core] _webui_get_cookies_full() +)(0 18.575 [Core] _webui_get_cb_index([1]) +)(0 18.575 [Core] _webui_get_cb_index() -> Element: [web_ui_wire_handle_event] +)(0 18.575 [Core] _webui_get_cb_index() -> Found at 1 +)(0 18.575 [Core] [WS #3] _webui_ws_process() -> Calling user callback at address 0x00000000336201F0 +[Call] +)(1 18.576 [User] webui_get_count() +)(1 18.576 [User] webui_get_string_at([0]) +)(0 18.576 [Core] [WS #3] _webui_ws_process() -> Waiting for asynchronous response... +)(0 19.288 [Core] _webui_ws_data_handler() +)(0 19.288 [Core] _webui_get_ws_process_number() +)(0 19.288 [Core] [WS #4] _webui_receive([1], [1], [279]) +)(0 19.289 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 19.289 [Core] _webui_malloc([279]) +)(0 19.289 [Core] _webui_ptr_add(0x00000000007C83B0) +)(0 19.289 [Core] _webui_ptr_exist() +)(0 19.29 [Core] _webui_ptr_add(0x00000000007C83B0) -> Pointer #20 saved (279 + 1 bytes) +)(0 19.29 [Core] _webui_malloc([56]) +)(0 19.29 [Core] _webui_ptr_add(0x0000000009042AE0) +)(0 19.29 [Core] _webui_ptr_exist() +)(0 19.291 [Core] _webui_ptr_add(0x0000000009042AE0) -> Pointer #21 saved (56 + 1 bytes) +)(0 19.291 [Core] _webui_ws_data_handler() -> Finished +)(0 19.291 [Core] [Thread .] _webui_ws_process_thread() +)(0 19.291 [Core] [WS #4] _webui_ws_process() +)(0 19.291 [Core] [WS #4] _webui_ws_process() -> Start +)(0 19.292 [Core] _webui_get_token() +)(0 19.292 [Core] _webui_get_token() -> 0xC05015C9 +)(0 19.292 [Core] _webui_get_id() +)(0 19.292 [Core] _webui_get_id() -> 0xFFFD +)(0 19.293 [Core] [WS #4] _webui_ws_process() -> Data received +)(0 19.293 [Core] [WS #4] _webui_ws_process() -> Packet Size : 279 bytes +)(0 19.293 [Core] [WS #4] _webui_ws_process() -> Packet Header : [ )(0 19.293 0xDD )(0 19.293 0xC9 )(0 19.294 0x15 )(0 19.294 0x50 )(0 19.294 0xC0 )(0 19.294 0xFD )(0 19.294 0xFF )(0 19.295 0xF9 )(0 19.295 ] +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Packet Token: 0xC05015C9 (3226473929) +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Packet ID: 0xFFFD (65533) +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Packet Data: [)(0 19.295 ] +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> WEBUI_CMD_CALL_FUNC +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Call ID: [65533] +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Element: [web_ui_wire_handle_event] +)(0 19.295 [Core] _webui_malloc([312]) +)(0 19.295 [Core] _webui_ptr_add(0x000000001A5708F0) +)(0 19.295 [Core] _webui_ptr_exist() +)(0 19.295 [Core] _webui_ptr_add(0x000000001A5708F0) -> Pointer #22 saved (312 + 1 bytes) +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Argument 0: 241 bytes +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Expected and received 242 bytes of data. +)(0 19.295 [Core] _webui_client_get_id() +)(0 19.295 [Core] _webui_get_cookies() +)(0 19.295 [Core] _webui_client_cookies_get_id() +)(0 19.295 [Core] _webui_get_cookies_full() +)(0 19.295 [Core] _webui_get_cb_index([1]) +)(0 19.295 [Core] _webui_get_cb_index() -> Element: [web_ui_wire_handle_event] +)(0 19.295 [Core] _webui_get_cb_index() -> Found at 1 +)(0 19.295 [Core] [WS #4] _webui_ws_process() -> Calling user callback at address 0x00000000336201F0 +[Call] +)(1 19.295 [User] webui_get_count() +)(1 19.295 [User] webui_get_string_at([0]) +)(0 19.296 [Core] [WS #4] _webui_ws_process() -> Waiting for asynchronous response... +)(0 21.001 [Core] _webui_ws_data_handler() +)(0 21.001 [Core] _webui_ws_close_handler() +)(0 21.002 [Core] _webui_get_ws_process_number() +)(0 21.002 [Core] [WS #5] _webui_receive([1], [3], [0]) +)(0 21.002 [Core] _webui_connection_get_id([1], [000000001A520C20]) +)(0 21.002 [Core] _webui_connection_remove([1]) +)(0 21.003 [Core] _webui_connection_remove() -> Removing client #0 +)(0 21.004 [Core] [WS #5] _webui_receive(1) -> Connection #0 Closed +)(0 21.004 [Core] _webui_malloc([56]) +)(0 21.004 [Core] _webui_ptr_add(0x0000000009041BE0) +)(0 21.004 [Core] _webui_ptr_exist() +)(0 21.005 [Core] _webui_ptr_add(0x0000000009041BE0) -> Pointer #23 saved (56 + 1 bytes) +)(0 21.006 [Core] [Thread .] _webui_ws_process_thread() +)(0 21.006 [Core] _webui_server_thread([1]) -> Window disconnected +)(0 21.006 [Core] [WS #5] _webui_ws_process() +)(0 21.006 [Core] _webui_server_thread([1]) -> Waiting for reconnection +)(0 21.006 [Core] [WS #5] _webui_ws_process() -> Start +)(0 21.006 [Core] _webui_timer_start() +)(0 21.007 [Core] _webui_timer_start() end +)(0 21.007 [Core] [WS #5] _webui_ws_process() -> WEBUI_WS_CLOSE +)(0 21.007 [Core] _webui_make_window_reusable(1) +)(0 21.008 [Core] [WS #5] _webui_ws_process() -> Finished. +)(0 21.008 [Core] _webui_free_mem(0x0000000000000000) +)(0 21.008 [Core] _webui_free_mem(0x0000000009041BE0) +)(0 21.008 [Core] _webui_free_mem(0x0000000009041BE0) -> Pointer #23 freed (56 + 1 bytes) +)(0 22.507 [Core] _webui_server_thread([1]) -> Server stopping... +)(0 22.519 [Core] _webui_free_port([41399]) +)(0 22.519 [Core] _webui_free_mem(0x0000000009041C60) +)(0 22.519 [Core] _webui_free_mem(0x0000000009041C60) -> Pointer #10 freed (64 + 1 bytes) +)(0 22.519 [Core] _webui_server_thread([1]) -> Server stopped. +)(0 22.519 [Core] _webui_make_window_reusable(1) +)(0 22.519 [Core] _webui_server_thread([1]) -> Breaking main loop... +)(0 22.519 [Core] _webui_condition_signal() +) \ No newline at end of file diff --git a/test1.html b/test1.html new file mode 100644 index 0000000..032f0f7 --- /dev/null +++ b/test1.html @@ -0,0 +1,19 @@ + + + + + test + + + + +

Test 1

+

Use this button + +

+

And you will be blessed

+

+ You can click something else. +

+ + \ No newline at end of file diff --git a/web-racket.rkt b/web-racket.rkt new file mode 100644 index 0000000..7bc35af --- /dev/null +++ b/web-racket.rkt @@ -0,0 +1 @@ +#lang racket/base diff --git a/webui-ffi.rkt b/webui-ffi.rkt new file mode 100644 index 0000000..f9cd879 --- /dev/null +++ b/webui-ffi.rkt @@ -0,0 +1,525 @@ +#lang racket/base + +(require ffi/unsafe + ffi/unsafe/define + ffi/unsafe/atomic + racket/runtime-path + racket/port + data/queue + json + racket/string + ) + +(provide webui-new-window + webui-show + webui-bind + webui-wait-async + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; FFI Library +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define-runtime-path lib-dir "lib") + +(define libname (let ((os (system-type 'os*))) + (cond ((eq? os 'windows) "dll/webui-2.dll") + (else (error (format "OS ~a not supported" os))))) + ) + +(define webui-lib-file (build-path lib-dir libname)) + +(set! webui-lib-file "C:/devel/racket/racket-webui/webui/build/Debug/webui-2.dll") + + +(define webui-lib (ffi-lib webui-lib-file)) +(define-ffi-definer define-webui webui-lib) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Types +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define _size_t _int64) + +(define _webui_config_t + (_enum '(show-wait-connection = 0 + ui-event-blocking + folder-monitor + multi-client + use-cookies + asynchronous-response + ))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Handling events +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define event-queue (make-queue)) +(define webui-event-queue (make-queue)) + +;typedef struct webui_event_t { +; size_t window; // The window object number +; size_t event_type; // Event type +; char* element; // HTML element ID +; size_t event_number; // Internal WebUI +; size_t bind_id; // Bind ID +; size_t client_id; // Client's unique ID +; size_t connection_id; // Client's connection ID +; char* cookies; // Client's full cookies +;} webui_event_t; + +(define-cstruct _Webui_event_t + ( + [win _size_t] + [event_type _size_t] + [element _string/utf-8] + [event_number _size_t] + [bind_id _size_t] + [client_id _size_t] + [connection_id _size_t] + [cookies _string/utf-8] + )) + +(define-struct webui-evt + (win event-type element event_number bind-id client-id connection-id cookies + (data #:mutable)) + #:transparent + ) + +(define (queue-event c-evt-ptr) + (let ((evt (make-webui-evt + (Webui_event_t-win c-evt-ptr) + (Webui_event_t-event_type c-evt-ptr) + (Webui_event_t-element c-evt-ptr) + (Webui_event_t-event_number c-evt-ptr) + (Webui_event_t-bind_id c-evt-ptr) + (Webui_event_t-client_id c-evt-ptr) + (Webui_event_t-connection_id c-evt-ptr) + (Webui_event_t-cookies c-evt-ptr) + #f + ))) + (let ((count (webui_get_count c-evt-ptr))) + (when (> count 0) + (set-webui-evt-data! evt (webui_get_string_at c-evt-ptr 0)))) + (enqueue! event-queue evt) + ) + ) + +(define dispatcher-sem (make-semaphore)) + +(define (enqueue-applyer queue-event-closure) + (start-atomic) + (queue-event-closure) + (end-atomic) + (semaphore-post dispatcher-sem) + ) + +(define callbacks (make-hash)) + +(define (event-dispatcher) + (thread + (λ () + (letrec ((dispatcher + (λ () + (semaphore-wait dispatcher-sem) + (let* ((evt (dequeue! event-queue)) + (data (webui-evt-data evt))) + (with-handlers ([exn:fail? + (λ (e) + (displayln (format + "Event dispatching failed for: ~a" data)))]) + (let ((e (with-input-from-string + data + (λ () (read-json))))) + (let ((id (hash-ref e 'id #f)) + (sel (hash-ref e 'selector 'any)) + (event (hash-ref e 'evt #f)) + (win (webui-evt-win evt))) + (let ((cb-id (string->symbol (format "sel-~a-~a" sel event)))) + (let ((cbs (hash-ref callbacks win #f))) + (if (eq? cbs #f) + (displayln (format "No callbacks registered for window: ~a" win)) + (let ((evt-handler (hash-ref cbs cb-id #f))) + (if (eq? evt-handler #f) + (displayln (format "No callback registered for ~a" cb-id)) + (evt-handler win id e) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (dispatcher) + ) + )) + (dispatcher)) + ) + ) + ) + +(event-dispatcher) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Log applier +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define debug-log (make-queue)) + +(define (log-applier thunk) + (start-atomic) + (thunk) + (end-atomic) + ) + +(define (do-log level message data) + (enqueue! debug-log (list level (timer-display #f) message))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Serving virtual files... +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define timer-display (λ displ #t)) + +(define request-sem (make-semaphore)) + +(define (filehandler-applier thunk) + (start-atomic) + (thunk) + (end-atomic) + (semaphore-post request-sem) + ) + +(define requested-files (make-queue)) + +(define (fh-callback win filename length-ptr) + (enqueue! requested-files (list win filename (timer-display #f))) + #f) + +(define (make-reply file) + (if (file-exists? file) + (if (or (string-suffix? file ".html") + (string-suffix? file ".htm")) + (let* ((size (file-size file)) + (fin (open-input-file file)) + (str (read-string size fin))) + (let ((reply (string-append + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html\r\n" + (format "Content-Length: ~a\r\n\r\n" size) + str))) + (close-input-port fin) + (list #t (string-length reply) reply))) + (list #f 0 "")) + (list #f 0 "") + ) + ) + +(define (http-req-dispatcher) + (thread + (λ () + (letrec ((dispatcher + (λ () + (semaphore-wait request-sem) + (timer-display) + (let* ((req (dequeue! requested-files)) + (win (car req)) + (filename (cadr req)) + (time (caddr req)) + (reply (make-reply filename))) + (displayln (format "http-req: ~a at ~a" filename time)) + (let ((valid-reply (car reply)) + (length (cadr reply)) + (content (caddr reply))) + (if valid-reply + (webui_interface_set_response_file_handler win + content + length) + (webui_interface_set_response_file_handler win #f 0)) + ) + ) + (dispatcher)) + )) + (dispatcher)) + ) + ) + ) + +(http-req-dispatcher) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; FFI functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define _Webui_Bind_Callback (_fun #:async-apply enqueue-applyer + _Webui_event_t-pointer -> _void)) + +(define _int-pointer (_ptr i _int)) + +(define _Webui_FileHandler_Callback + (_fun #:async-apply filehandler-applier _string/utf-8 _int-pointer -> _pointer)) + +(define _Webui_FileHandlerWin_Callback + (_fun #:async-apply filehandler-applier _size_t _string/utf-8 _int-pointer -> _pointer)) + + +;WEBUI_EXPORT bool webui_wait_async(void); +(define-webui webui_wait_async (_fun -> _int)) + +;WEBUI_EXPORT size_t webui_new_window(void); +(define-webui webui_new_window (_fun -> _size_t)) + +;WEBUI_EXPORT size_t webui_bind(size_t window, const char* element, void (*func)(webui_event_t* e)); +(define-webui webui_bind (_fun _size_t _string/utf-8 _Webui_Bind_Callback -> _size_t)) + +;WEBUI_EXPORT bool webui_show(size_t window, const char* content); +(define-webui webui_show (_fun _size_t _string/utf-8 -> _int)) + +;WEBUI_EXPORT bool webui_show_browser(size_t window, const char* content, size_t browser); +(define-webui webui_show_browser (_fun _size_t _string/utf-8 _size_t -> _int)) + +;WEBUI_EXPORT void webui_exit(void); +(define-webui webui_exit (_fun -> _void)) + +;WEBUI_EXPORT void webui_destroy(size_t window); +(define-webui webui_destroy (_fun _size_t -> _void)) + +;WEBUI_EXPORT void webui_close(size_t window); +(define-webui webui_close (_fun _size_t -> _void)) + +;WEBUI_EXPORT bool webui_set_root_folder(size_t window, const char* path); +(define-webui webui_set_root_folder (_fun _size_t _string/utf-8 -> _int)) + +;WEBUI_EXPORT void webui_run(size_t window, const char* script); +(define-webui webui_run (_fun _size_t _string/utf-8 -> _void)) + +;WEBUI_EXPORT size_t webui_get_count(webui_event_t* e); +(define-webui webui_get_count (_fun _Webui_event_t-pointer -> _size_t)) + +;WEBUI_EXPORT long long int webui_get_int_at(webui_event_t* e, size_t index); +(define-webui webui_get_int_at (_fun _Webui_event_t-pointer _size_t -> _int64)) + +;WEBUI_EXPORT double webui_get_float_at(webui_event_t* e, size_t index); +(define-webui webui_get_float_at (_fun _Webui_event_t-pointer _size_t -> _double)) + +;WEBUI_EXPORT const char* webui_get_string_at(webui_event_t* e, size_t index); +(define-webui webui_get_string_at (_fun _Webui_event_t-pointer _size_t -> _string/utf-8)) + +;WEBUI_EXPORT void webui_set_file_handler(size_t window, const void* (*handler)(const char* filename, int* length)); +(define-webui webui_set_file_handler + (_fun _size_t _Webui_FileHandler_Callback -> _void)) + +;WEBUI_EXPORT void webui_set_file_handler_window(size_t window, const void* (*handler)(size_t window, const char* filename, int* length)); +(define-webui webui_set_file_handler_window + (_fun _size_t _Webui_FileHandlerWin_Callback -> _void)) + +;WEBUI_EXPORT void webui_interface_set_response_file_handler(size_t window, const void* response, int length); +(define-webui webui_interface_set_response_file_handler + (_fun _size_t _pointer _int -> _void)) + +;WEBUI_EXPORT void webui_set_config(webui_config option, bool status); +(define-webui webui_set_config + (_fun _webui_config_t _int -> _void)) + +;WEBUI_EXPORT void webui_set_logger(void (*func)(size_t level, const char* log, void* user_data), void *user_data); +(define-webui webui_set_logger + (_fun + (_fun #:async-apply log-applier + _size_t _string/utf-8 _pointer -> _void) + _pointer -> _void)) + +;WEBUI_EXPORT const char* webui_start_server(size_t window, const char* content); +(define-webui webui_start_server + (_fun _size_t _string/utf-8 -> _string/utf-8)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Configure +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(webui_set_config 'asynchronous-response 1) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Async Wait loop as co-routine +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define run-async-thread #f) +(define log-fh (open-output-file "test.log" #:exists 'replace)) + +(define (add-to-log) + (if (> (queue-length debug-log) 0) + (begin + (display (dequeue! debug-log) log-fh) + (add-to-log)) + (flush-output log-fh))) + +(define (logger) + (thread (λ () + (add-to-log) + (sleep 0.1) + ))) + +(define log-thread (logger)) + +(define (finish-log) + (kill-thread log-thread) + (add-to-log) + (close-output-port log-fh)) + + +(define (run-async-wait) + (when (or (eq? run-async-thread #f) + (not (thread-running? run-async-thread))) + (set! run-async-thread + (thread (λ () + (letrec ((wait-loop + (λ () + (let ((r (webui_wait_async))) ; Returns true if windows are open + (when (eq? r #t) + (sleep 0.1) + (wait-loop)))))) + (wait-loop))) + #:pool #f + ) + ) + ) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Provided functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define (webui-new-window) + (let ((win (webui_new_window))) + ;(webui_bind win "" queue-webui-event) + (webui_bind win "web_ui_wire_handle_event" queue-event) + win)) + +(define (webui-show win html) + (webui_show win html) + (run-async-wait) + ) + +(define (webui-show-browser win html) + (webui_show_browser win html 1) + (run-async-wait) + ) + +(define (webui-run win js) + (webui_run win js)) + +(define (webui-set-config option status) + (webui_set_config option status)) + +(define (webui-bind win selector event callback) + (let ((sel (if (symbol? selector) + (format "#~a" selector) + selector)) + (evt (if (symbol? event) + (format "~a" event) + event)) + ) + (webui-run win + (string-append "window._web_wire_bind_evt_ids(" + (format "~a" win) + ", '" + sel + "', '" + evt + "');" + )) + (let ((cbs (hash-ref callbacks win (make-hash)))) + (hash-set! cbs (string->symbol (format "sel-~a-~a" sel event)) callback) + (hash-set! callbacks win cbs)) + ) + ) + +(define (webui-register-move-callback win callback) + (let ((cbs (hash-ref callbacks win (make-hash)))) + (hash-set! cbs (string->symbol "sel-global-window-move") callback) + (hash-set! callbacks win cbs)) + ) + +(define (webui-register-resize-callback win callback) + (let ((cbs (hash-ref callbacks win (make-hash)))) + (hash-set! cbs (string->symbol "sel-global-window-resize") callback) + (hash-set! callbacks win cbs)) + ) + +(define (webui-register-onload-callback win callback) + (let ((cbs (hash-ref callbacks win (make-hash)))) + (hash-set! cbs (string->symbol "sel-global-html-loaded") callback) + (hash-set! callbacks win cbs)) + ) + +(define (webui-wait-async) + (webui_wait_async)) + +(define (webui-close win) + (webui_close win)) + +(define (webui-destroy win) + (webui_destroy win) + ;(hash-remove! callbacks win) + ) + +(define (webui-start-server win url) + (webui_start_server win url)) + +(define (webui-exit) + (webui_exit)) + +(define (webui-set-root-folder win path) + (let ((p (if (path? path) (path->string path) path))) + (webui_set_root_folder win p))) + +(define (timer) + (let ((ms (current-milliseconds))) + (λ displ + (let* ((dms (- (current-milliseconds) ms)) + (s (exact->inexact (/ dms 1000)))) + (when (null? displ) + (displayln (format "~a" s))) + s)))) + +(webui_set_logger do-log #f) + +(define win #f) +(define (test) + (let ((tm (timer))) + (set! timer-display tm) + (tm) + (set! win (webui-new-window)) + (tm) + (webui-set-root-folder win "c:/devel/racket/racket-webui") + (tm) + ;(webui_set_file_handler_window win fh-callback) + (tm) + (webui-register-onload-callback + win + (λ (win id data) + (webui-bind win "button" 'click + (λ (win id data) + (displayln (format "~a: ~a" id data))) + ) + ) + ) + (tm) + (webui-register-move-callback win (λ (win id data) + (displayln data))) + (webui-register-resize-callback win (λ (win id data) + (displayln data))) + (tm) + ;(displayln (webui-start-server win "test.html")) + (tm) + (webui-show-browser win "test.html") + (tm) + ) + ) + + +(define (test-close) + (webui-close win) + (webui-destroy win)) +