2017-11-10 22 views
1

내 웹 페이지 (WebGL로 변환 됨)에서 실행되고 이미지를 렌더링하는 emscripten 컴파일 된 C++ 코드 (OpenGL 사용)가 있습니다. 모든 것은 훌륭하게 작동합니다. Emscripten 컴파일 된 자바 스크립트는 웹 페이지에서 textarea을 입력 할 때 "삭제" "백 스페이스" "탭"키를 사용하지 않습니다. 모든 문자 키와 "space"는 잘 작동합니다. 대부분Emscripten 컴파일 된 JavaScript가 특정 키 입력을 차단하지 못하도록합니다.

var Module = { 
preRun: [], 

postRun: [], 

print: (function() { 
    var element = document.getElementById('emscriptenOutput'); 
    if (element) element.value = ''; // clear browser cache 
     return function(text) { 
    if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' '); 
     // These replacements are necessary if you render to raw HTML 
     //text = text.replace(/&/g, "&"); 
     //text = text.replace(/</g, "<"); 
     //text = text.replace(/>/g, ">"); 
     //text = text.replace('\n', '<br>', 'g'); 
     console.log(text); 
     if (element) { 
      element.value += text + "\n"; 
      element.scrollTop = element.scrollHeight; // focus on bottom 
     } 
    }; 
})(), 

printErr: function(text) { 
    if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' '); 
     if (0) { // XXX disabled for safety typeof dump == 'function') { 
      dump(text + '\n'); // fast, straight to the real console 
     } else { 
      console.error(text); 
    } 
}, 

canvas: (function() { 
    var canvas = document.getElementById('canvas'); 

    // As a default initial behavior, pop up an alert when webgl context is lost. To make your 
    // application robust, you may want to override this behavior before shipping! 
    // See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2 
    canvas.addEventListener("webglcontextlost", function(e) { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false); 
    return canvas; 
})(), 

totalDependencies: 0, 

    //doNotCaptureKeyboard: true, 

    monitorRunDependencies: function(left) { 
     this.totalDependencies = Math.max(this.totalDependencies, left); 
     // Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.'); 
    } 
}; 

    (function() { 
     var memoryInitializer = 'renderer.js.mem'; 
     if (typeof Module['locateFile'] === 'function') { 
      memoryInitializer = Module['locateFile'](memoryInitializer); 
     } else if (Module['memoryInitializerPrefixURL']) { 
      memoryInitializer = Module['memoryInitializerPrefixURL'] + memoryInitializer; 
     } 
     var meminitXHR = Module['memoryInitializerRequest'] = new XMLHttpRequest(); 
     meminitXHR.open('GET', memoryInitializer, true); 
     meminitXHR.responseType = 'arraybuffer'; 
     meminitXHR.send(null); 
    })(); 

    var script = document.createElement('script'); 
    script.src = "renderer.js"; 
    document.body.appendChild(script); 

당연히, 자바 스크립트는 인간의 눈에 횡설수설이다 컴파일 emscripten하지만 범인 : 참고로

, 나는 내 자바 스크립트 코드에서 인스턴스화 한 모듈은 거의 정확하게 기본 모듈과 동일 거기에있다.

내 생각에 WebGL 컨텍스트가 키보드 이벤트를 먹고 있지만 잘 모르겠습니다. 나는이 링크를보고 "doNotCaptureKeyboard : true"를 모듈 요소에 포함하려고 시도했지만 성공하지는 못했습니다.

https://forum.unity.com/threads/disable-enable-keyboard-in-runtime-webgl.286557/#post-1892527 https://github.com/kripken/emscripten/issues/2668#event-154218404

사람은 문제의 같은 종류의 어떤 경험이 있습니까? 나는 잃어 버렸다.

답변

0

궁금한 사람들에게는 해결책이 있지만 최선인지 확실하지 않습니다. 방금 컴파일 된 JavaScript 코드의 이벤트 리스너를 차단하기 위해 자체 이벤트 리스너를 추가했습니다.

/* code to prevent emscripten compiled code from eating key input */ 
window.addEventListener('keydown', function(event){ 
    event.stopImmediatePropagation(); 
}, true); 

window.addEventListener('keyup', function(event){ 
    event.stopImmediatePropagation(); 
}, true);