iup-stack/iup/src/emscripten/iupemscripten_common.js

200 lines
6.3 KiB
JavaScript
Executable File

var LibraryIupCommon = {
// $Common__deps: ['$CommonGlobals'],
$IupCommonGlobals: {
idCounter: 1,
objectIDMap: {},
},
$IupCommon: {
GetObjectForID: function(handle_id) {
return IupCommonGlobals.objectIDMap[handle_id];
},
SetObjectForID: function(the_object, handle_id) {
IupCommonGlobals.objectIDMap[handle_id] = the_object;
},
RegisterNewObject: function(the_object) {
var current_id = IupCommonGlobals.idCounter;
IupCommonGlobals.objectIDMap[current_id] = the_object;
the_object.handleID = current_id;
IupCommonGlobals.idCounter += 1;
return current_id;
},
InitializeObject: function(the_object) {
// any other useful properties for all objects should go here
the_object.style.position = 'absolute';
},
DeleteObject: function(handle_id) {
var the_object = IupCommonGlobals.objectIDMap[handle_id] = null;
the_object.handleID = null;
IupCommonGlobals.objectIDMap[handle_id] = null;
the_object = null;
},
},
emjsCommon_SetPosition: function(handle_id, x, y, width, height)
{
// var real_elem = document.getElementById(handle_id);
var elem = IupCommon.GetObjectForID(handle_id);
// elem.style.color = 'white';
elem.style.left = x + 'px';
console.log(elem.nodeName);
console.log("left: " + elem.style.left);
elem.style.top = y + 'px';
console.log("top: " + elem.style.top);
// elem.style.width =
console.log("width: " + width);
console.log("height: " + height);
console.log("actual width: " + elem.style.width);
console.log("actual height: " + elem.style.height);
// if (width != 0 && height != 0) {
elem.style.width = width + 'px';
elem.style.height = height + 'px';
// }
console.log("actual width after: " + elem.style.width);
console.log("actual height after: " + elem.style.height);
},
emjsCommon_AddWidgetToDialog: function(parent_id, child_id) {
console.log("AddWidgetToDialog");
var parent_dialog = IupCommon.GetObjectForID(parent_id);
var parent_body = parent_dialog.document.getElementsByTagName("body")[0];
var child_widget = IupCommon.GetObjectForID(child_id);
parent_body.appendChild(child_widget);
},
// <div> -- inject code -- </div>
emjsCommon_AddCompoundToDialog: function(parent_id, elem_array, num_elems) {
var parent_dialog = IupCommon.GetObjectForID(parent_id);
var parent_body = parent_dialog.document.getElementsByTagName("body")[0];
var child_widget;
for (var i = 0; i < num_elems; i++) {
var child_id = {{{ makeGetValue('elem_array', 'i*4', 'i32') }}};
child_widget = IupCommon.GetObjectForID(child_id);
parent_body.appendChild(child_widget);
}
},
emjsCommon_AddCompoundToWidget: function(parent_id, elem_array, num_elems) {
var parent_widget = IupCommon.GetObjectForID(parent_id);
var child_widget;
for (var i = 0; i < num_elems; i++) {
var child_id = {{{ makeGetValue('elem_array', 'i*4', 'i32') }}};
child_widget = IupCommon.GetObjectForID(child_id);
parent_body.appendChild(child_widget);
}
},
emjsCommon_AddWidgetToWidget: function(parent_id, child_id) {
console.log("AddWidgetToWidget");
var parent_widget = IupCommon.GetObjectForID(parent_id);
var child_widget = IupCommon.GetObjectForID(child_id);
parent_widget.appendChild(child_widget);
},
emjsCommon_Alert: function(message) {
console.log("alert message: ");
console.log(message);
alert(UTF8ToString(message));
},
emjsCommon_Log: function(message) {
// console.log("our log is working");
console.log(UTF8ToString(message));
},
emjsCommon_IupLog: function(priority, message)
{
var stringified_message = UTF8ToString(message);
/*
enum IUPLOG_LEVEL
{
IUPLOG_LEVEL_LOG = 0,
IUPLOG_LEVEL_DEBUG,
IUPLOG_LEVEL_INFO,
IUPLOG_LEVEL_WARN,
IUPLOG_LEVEL_ERROR
};
*/
switch(priority)
{
case 1:
console.debug(stringified_message);
break;
case 2:
console.info(stringified_message);
break;
case 3:
console.warn(stringified_message);
break;
case 4:
console.error(stringified_message);
break;
default:
console.log(stringified_message);
}
},
emjsCommon_SetFgColor: function(handle_id, r, g, b)
{
var current_widget = IupCommon.GetObjectForID(handle_id);
console.log(current_widget);
current_widget.style.color = "rgb(" + r + "," + g + "," + b + ")";
},
// Used only the the no-pthreads-path. I don't know how to conditionally compile JavaScript fragments here, so this always gets included, whether used or not.
emjsCommon_IupPostMessageNoThreads: function(ih, s, i, d, message_data)
{
var postMessageCallback = function(number_ih, str, number_i, number_d, number_message_data)
{
var c_callback = Module.cwrap('emscriptenIupPostMessageNoThreadsCallbackTrampoline', null, ['number', 'string', 'number', 'number', 'number']);
c_callback(number_ih, str, number_i, number_d, number_message_data);
}
// This was a lot of trial & error to figure out how to get the string parameter all the way through.
// Ultimately, I needed to use UTF8ToString on the char* to pass through the Trampoline as a 'string'.
// This allowed it to re-emerge properly as a string with the correct contents in the EMSCRIPTEN_KEEPALIVE trampoline callback.
// But additionally, I'm concerned about the life-cycle of the original char* s passed into the function since callback may happen after the user frees the original string.
// So I need to make a copy. But it gets hairy trying to manage the memory on the C side
// because if I strdup() initially, the pointer that surfaces in the trampoline may be different
// because we used UTF8ToString. And I'm also a little nervous about allocating memory on the C-side and _free()'ing it on the JS side.
// So instead, we can use UTF8ToString here, which should make a JavaScript copy of the string and we can let the system manage the life-cycle of that.
var stringified_s = UTF8ToString(s);
setTimeout(
postMessageCallback,
0,
ih,
stringified_s,
i,
d,
message_data
);
},
iupEmscriptenSetFgColor: function(handle_id, r, g, b) {
var sel_object = IupCommon.GetObjectForID(handle_id);
sel_object.style.color = "rgb(" + r + "," + g + "," + b + ")";
}
};
autoAddDeps(LibraryIupCommon, '$IupCommonGlobals');
autoAddDeps(LibraryIupCommon, '$IupCommon');
mergeInto(LibraryManager.library, LibraryIupCommon);