DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 36efc2473f9023a7a0cc0ea1fddcf249847958d3
parent 8a2eb6cdb64913e884332e351afd255c87872a80
Author: falkTX <falktx@falktx.com>
Date:   Sat,  9 Jul 2022 19:23:42 +0100

Make wasm file dialogs properly namespaced

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdistrho/extra/FileBrowserDialogImpl.cpp | 133+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
1 file changed, 76 insertions(+), 57 deletions(-)

diff --git a/distrho/extra/FileBrowserDialogImpl.cpp b/distrho/extra/FileBrowserDialogImpl.cpp @@ -74,77 +74,98 @@ static constexpr int toHexChar(const char c) noexcept } #endif +// -------------------------------------------------------------------------------------------------------------------- + #ifdef DISTRHO_OS_WASM # define DISTRHO_WASM_NAMESPACE_MACRO_HELPER(NS, SEP, FUNCTION) NS ## SEP ## FUNCTION # define DISTRHO_WASM_NAMESPACE_MACRO(NS, FUNCTION) DISTRHO_WASM_NAMESPACE_MACRO_HELPER(NS, _, FUNCTION) # define DISTRHO_WASM_NAMESPACE_HELPER(NS) #NS # define DISTRHO_WASM_NAMESPACE(NS) DISTRHO_WASM_NAMESPACE_HELPER(NS) +# define fileBrowserSetPathNamespaced DISTRHO_WASM_NAMESPACE_MACRO(FILE_BROWSER_DIALOG_NAMESPACE, fileBrowserSetPath) +# define fileBrowserSetPathFuncName DISTRHO_WASM_NAMESPACE(FILE_BROWSER_DIALOG_NAMESPACE) "_fileBrowserSetPath" + // FIXME use world class name as prefix -EM_JS(bool, DISTRHO_WASM_NAMESPACE_MACRO(FILE_BROWSER_DIALOG_NAMESPACE, openWebBrowserFileDialog), (const char* funcname, void* handle), { - var canvasFileOpenElem = document.getElementById('canvas_file_open'); - var jsfuncname = UTF8ToString(funcname); - var jsfunc = Module.cwrap(jsfuncname, 'null', ['number', 'string']); +static bool openWebBrowserFileDialog(const char* const funcname, void* const handle) +{ + const char* const nameprefix = DISTRHO_WASM_NAMESPACE(FILE_BROWSER_DIALOG_NAMESPACE); - if (!canvasFileOpenElem) { - jsfunc(handle, ""); - return false; - } + return EM_ASM_INT({ + var canvasFileObjName = UTF8ToString($0) + "_file_open"; + var canvasFileOpenElem = document.getElementById(canvasFileObjName); - canvasFileOpenElem.onchange = function(e) { - if (!canvasFileOpenElem.files) { - jsfunc(handle, ""); - return; + var jsfuncname = UTF8ToString($1); + var jsfunc = Module.cwrap(jsfuncname, 'null', ['number', 'string']); + + if (canvasFileOpenElem) { + document.body.removeChild(canvasFileOpenElem); } - var file = canvasFileOpenElem.files[0]; - var filename = '/' + file.name; - var reader = new FileReader(); + canvasFileOpenElem = document.createElement('input'); + canvasFileOpenElem.type = 'file'; + canvasFileOpenElem.id = canvasFileObjName; + canvasFileOpenElem.style.display = 'none'; + document.body.appendChild(canvasFileOpenElem); + + canvasFileOpenElem.onchange = function(e) { + if (!canvasFileOpenElem.files) { + jsfunc($2, ""); + return; + } + + var file = canvasFileOpenElem.files[0]; + var filename = '/' + file.name; + var reader = new FileReader(); + + reader.onloadend = function(e) { + var content = new Uint8Array(reader.result); + Module.FS.writeFile(filename, content); + jsfunc($2, filename); + }; - reader.onloadend = function(e) { - var content = new Uint8Array(reader.result); - Module.FS.writeFile(filename, content); - jsfunc(handle, filename); + reader.readAsArrayBuffer(file); }; - reader.readAsArrayBuffer(file); - }; + canvasFileOpenElem.click(); + return 1; + }, nameprefix, funcname, handle) != 0; +} - canvasFileOpenElem.click(); - return true; -}); -EM_JS(bool, DISTRHO_WASM_NAMESPACE_MACRO(FILE_BROWSER_DIALOG_NAMESPACE, downloadWebBrowserFile), (const char* nameprefix, const char* filename), { - var canvasFileObjName = UTF8ToString(nameprefix) + "_file_save"; - var jsfilename = UTF8ToString(filename); +static bool downloadWebBrowserFile(const char* const filename) +{ + const char* const nameprefix = DISTRHO_WASM_NAMESPACE(FILE_BROWSER_DIALOG_NAMESPACE); - var canvasFileSaveElem = document.getElementById(canvasFileObjName); - if (canvasFileSaveElem) { - // only 1 file save allowed at once - console.warn("One file save operation already in progress, refusing to open another"); - return false; - } + return EM_ASM_INT({ + var canvasFileObjName = UTF8ToString($0) + "_file_save"; + var jsfilename = UTF8ToString($1); - canvasFileSaveElem = document.createElement('a'); - canvasFileSaveElem.download = jsfilename; - canvasFileSaveElem.id = canvasFileObjName; - canvasFileSaveElem.style.display = 'none'; - document.body.appendChild(canvasFileSaveElem); - - var content = Module.FS.readFile('/' + jsfilename); - canvasFileSaveElem.href = URL.createObjectURL(new Blob([content])); - canvasFileSaveElem.click(); - - setTimeout(function() { - URL.revokeObjectURL(canvasFileSaveElem.href); - document.body.removeChild(canvasFileSaveElem); - }, 2000); - return true; -}); -# define openWebBrowserFileDialogNamespaced DISTRHO_WASM_NAMESPACE_MACRO(FILE_BROWSER_DIALOG_NAMESPACE, openWebBrowserFileDialog) -# define downloadWebBrowserFileNamespaced DISTRHO_WASM_NAMESPACE_MACRO(FILE_BROWSER_DIALOG_NAMESPACE, downloadWebBrowserFile) -# define fileBrowserSetPathNamespaced DISTRHO_WASM_NAMESPACE_MACRO(FILE_BROWSER_DIALOG_NAMESPACE, fileBrowserSetPath) -# define fileBrowserSetPathFuncName DISTRHO_WASM_NAMESPACE(FILE_BROWSER_DIALOG_NAMESPACE) "_fileBrowserSetPath" + var canvasFileSaveElem = document.getElementById(canvasFileObjName); + if (canvasFileSaveElem) { + // only 1 file save allowed at once + console.warn("One file save operation already in progress, refusing to open another"); + return 0; + } + + canvasFileSaveElem = document.createElement('a'); + canvasFileSaveElem.download = jsfilename; + canvasFileSaveElem.id = canvasFileObjName; + canvasFileSaveElem.style.display = 'none'; + document.body.appendChild(canvasFileSaveElem); + + var content = Module.FS.readFile('/' + jsfilename); + canvasFileSaveElem.href = URL.createObjectURL(new Blob([content])); + canvasFileSaveElem.click(); + + setTimeout(function() { + URL.revokeObjectURL(canvasFileSaveElem.href); + document.body.removeChild(canvasFileSaveElem); + }, 2000); + return 1; + }, nameprefix, filename) != 0; +} #endif +// -------------------------------------------------------------------------------------------------------------------- + struct FileBrowserData { const char* selectedFile; @@ -488,7 +509,7 @@ FileBrowserHandle fileBrowserCreate(const bool isEmbed, } const char* const funcname = fileBrowserSetPathFuncName; - if (openWebBrowserFileDialogNamespaced(funcname, handle.get())) + if (openWebBrowserFileDialog(funcname, handle.get())) return handle.release(); return nullptr; @@ -784,7 +805,7 @@ void fileBrowserClose(const FileBrowserHandle handle) { #ifdef DISTRHO_OS_WASM if (handle->saving && fileBrowserGetPath(handle) != nullptr) - downloadWebBrowserFileNamespaced(DISTRHO_WASM_NAMESPACE(FILE_BROWSER_DIALOG_NAMESPACE), handle->defaultName); + downloadWebBrowserFile(handle->defaultName); #endif #ifdef HAVE_X11 @@ -819,7 +840,5 @@ END_NAMESPACE_DISTRHO #undef FILE_BROWSER_DIALOG_DGL_NAMESPACE #undef FILE_BROWSER_DIALOG_NAMESPACE -#undef openWebBrowserFileDialogNamespaced -#undef downloadWebBrowserFileNamespaced #undef fileBrowserSetPathNamespaced #undef fileBrowserSetPathFuncName